Model-View-Controller,一種軟件設計思想,將軟件分為三層:模型層、視圖層、控制層。
模型層:負責處理具體的業務。
視圖層:與用戶交互的界面。
控制層:將請求分發給指定的業務邏輯。
Spring MVC是Spring對MVC思想的一種實現,建立在Spring核心功能之上,功能強大,使用方便。
SpringMVC框架的優勢
1)SpringMVC簡化web程序開發;
2)SpringMVC效率很好(單例模式);
3)SpringMVC提供了大量擴展點,方便程序員自定義功能;
①.DispatcherServlet:核心控制器(SpringMVC的心臟)中轉作用;
②.HandlerMapping:映射處理器(處理請求,找到對應的Handler);
③.HandlerAdapter:處理器適配,(Handler實現有兩種方法,所以必須適配時候才能運行);
④.Handler:(Controller層):處理器
⑤.ViewResolver:視圖解析器 通過視圖的名稱,解析具體的視圖對象(jsp文件);
⑥.View:具體的視圖技術進行渲染;
使用SpringMVC框架
添加依賴
IOC+AOP
<dependency> <groupid>org.springframework/<groupid> <artifactid>spring-webmvc/<artifactid> <version>${spring.version}/<version>/<dependency>配置
1.配置核心控制器 (web.xml)
<servlet> <servlet-name>springMVC/<servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet/<servlet-class> <load-on-startup>1/<load-on-startup>/<servlet><servlet-mapping> <servlet-name>springMVC/<servlet-name> <url-pattern>//<url-pattern>/<servlet-mapping>2. springMVC的配置文件
默認在WEB-INF/servlet名稱-servlet.xml,如springMVC-servlet.xml文件
3.配置HandlerAdapter
<bean>4.配置Handler
<bean>5.視圖解析器
<bean> <property> <property>/<bean>6.使用具體的視圖技術渲染
<property>基於註解方式使用SpringMVC
添加依賴
IOC+AOP
<dependency> <groupid>org.springframework/<groupid> <artifactid>spring-webmvc/<artifactid> <version>${spring.version}/<version>/<dependency>可以採用<annotation-driver>替代上述“使用SpringMVC框架->配置”項的配置內容。
靜態資源配置
1.如果DispatcherServlet配置了url-pattern '/' ,那麼靜態資源放在webapp下也訪問不到,DispatcherServlet覆蓋了Tomcat提供的用於訪問靜態資源的servlet(DefaultServlet);
可以用<default-servlet-handler>去打開靜態資源訪問方式;
①.只能訪問webapp下的靜態資源;
②.和tomcat耦合(和服務器耦合);
2.springMVC提供靜態資源訪問:
<resources>
直接跳轉頁面
<view-controller>等同於:
@RequestMapping("/showRegister")public String showRegister(){ return "register";}
常用註解
@Controller 將一個類映射為Controller層
@RestController //將一個類映射為Controller層(方法返回的都是數據模型)
@RequestMapping //將一個方法映射到URL上
@GetMapping //將一個方法映射到URL上(只能為Get請求)
@PostMapping //將一個方法映射到URL上(只能為Post請求)
@RequestParam //將請求參數封裝到方法參數上
@RequestHeader //將請求頭部封裝到方法參數上
@CookieValue //將Cookie封裝到方法參數上
@PathVariable //將URL中的值封裝到方法參數上
@RequestBody //將請求體(POST請求)中的值封裝到方法參數上
@ModelAttrubite //將請求參數封裝為對象(在請求作用域中,參數和方法級別)
@SessionAttributes//將請求參數封裝為對象(在Session作用域中,類級別)
@Valid //後臺校驗
@InitBinder //(Spring2.5及之前版本會使用)
@ResponseBody //將方法返回值寫入到ResponseBody中
@ExceptionHandler //同一異常處理
@ControllerAdvice //Controller的通知
Controller層方法的寫法
1.方法的返回值
ModelAndView 模型和視圖 String 視圖 字符串 -->視圖名 forward:url -->轉發 redirect:url -->重定向 void 視圖(用於請求url為視圖名稱)Object 模型
2.URL的寫法
@RequestMapping()
可以添加在類上-->表示包的概念,訪問這個類下的所有的方法都需要添加一個前綴
1.直接寫URL 如@RequestMapping("/m1")
2.ant風格
* 單層路徑** 多層路徑? 單個字符3.rest風格
{name}{name:正則表達式}
@RequestMapping(path={"/url1","/url2"})
@RequestMapping(path="/url",method=RequestMethod.POST)
method指定請求方式
@RequestMapping(path="/url",params={"name"})
表示該請求必須帶一個name的參數
@RequestMapping(path="/url",headers={"User-Agent"})
表示該請求必須帶一個頭部信息User-Agent(瀏覽器信息)
Controller層方法參數
1.JAVA EE主鍵
HttpServletRequest/HttpServletResponseHttpSession
2.IO流
InputStreamOutputStreamReaderWriter
3.Spring組件
SessionStatusWebRequestNativeWebRequest4.自定義類型,如User (請求參數中的key需要和對象中的setter方法一致)
5.獲取錯誤信息,Errors/BindingResult
6.用於傳遞數據,Model Map ModelMap
7.基本類型和字符串類型
默認來源請求參數 (@RequestParam)
如果想要參數來源於請求頭部可以使用@RequestHeader
如果想要參數來源於cookie可以使用@CookieValue
如果想要參數來源於URL可以使用註解@PathVariable
如果想要參數來源於請求體可以使用註解@RequestBody
數據轉換
方案一:spring2.5及之前版本使用
1.需要在Controller添加一個方法,方法採用@InitBinder
2.這個方法需要一個參數DataBinder
3.DataBinder.registerCustomEditor(Class> clazz,PropertyEditor propEditor>)
方案二:(只能做字符串到其他類型的轉換)
Formatter
1.實現接口Formtter
2.註冊到IOC容器中
- 管理系統中formatter
<bean> <property> <bean> <constructor-arg> /<bean> /<property> /<bean>- 將該coversion交個springMVC使用
<annotation-driven>方法三:(能做任意類型到其他類型的轉換)
Converter
1.實現接口Converter
2.註冊到IOC容器中
統一異常處理
1.編寫一個類,編寫方法
@ExceptionHandler(Exception.class)public String exception(Exception ex){ return "500";}2.這個類上添加一個@ControllerAdvice
方法返回json以及xml數據格式
1.方法的返回值為Object,方法需要註解@ResponseBody
2.需要添加一個方法返回值的轉換器(使用的是jackson)
<annotation-driven> <message-converters> <bean> /<message-converters>/<annotation-driven>3.提供json處理包
<dependency> <groupid>com.fasterxml.jackson.core/<groupid> <artifactid>jackson-core/<artifactid>/<dependency><dependency> <groupid>com.fasterxml.jackson.core/<groupid> <artifactid>jackson-databind/<artifactid>/<dependency>使用gson
1.將消息轉換器換為
<bean>2.將json處理的依賴修改為
<dependency> <groupid>com.google.code.gson/<groupid> <artifactid>gson/<artifactid>/<dependency>使用fastjson
1.將消息轉換器換為
2.將json處理的依賴包
<dependency> <groupid>com.alibaba/<groupid> <artifactid>fastjson/<artifactid>/<dependency>返回xml數據
1.方法返回Object,需要註解@ResponseBody,還需要在@RequestMapping(produces="application/xml")
2.需要添加消息轉換器(這個轉換需要在json轉換器的前面)
<class>3.需要添加一個依賴
<dependency> <groupid>org.springframework/<groupid> <artifactid>spring-oxm/<artifactid>/<dependency>注意:如果配置了json轉換器,這個時候以前返回為String的方法,返回的時候會默認添加一對引號。
可以在消息轉換器中添加一個字符串的轉換器(這個轉換需要在json轉換器的前面)
<bean>自定義消息轉換器
1.繼承抽象類AbstractHttpMessageConverter
2.將消息轉換器配置到SpringMVC中
攔截器
實現接口
HandlerInterceptor/WebRequestInterceptor
preHandler 在handler方法之前調用。返回值表示true,不攔截false, 攔截(不進入handler方法)
postHandler 在handler方法之後調用
afterCompleition 在handler方法完成之後
配置
在mvc的配置文件中
1.表示攔截系統中所有的請求
<interceptors> <bean>/<interceptors>2.只需要攔截某些URL
<interceptors> <interceptor> <mapping> <bean> /<interceptor>/<interceptors>3.排除一些url
<interceptors> <interceptor> <mapping> <exclude-mapping> <bean> /<interceptor>/<interceptors>
文件上傳下載
1.jsp需要二進制提交
enctype="multipart/form-data"
2.Controller方法需要參數接收,參數的類型CommonsMultipartFile
3.需要文件上傳的解析器
<bean> <property> <property>/<bean>4.需要添加依賴commons-fileupload
<dependency> <groupid>commons-fileupload/<groupid> <artifactid>commons-fileupload/<artifactid>/<dependency>文件下載
PS:只要mvc最後url是帶後綴的,SpringMVC會將其截取掉。
//告訴瀏覽器拿到資源不要打開,下載
response.addHeader("Content-Disposition","attachment;filename="+fileName);