一.SpringMVC是什么
Spring Web MVC是一種基于Java的實現(xiàn)了Web MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架幔托,即使用了MVC架構(gòu)模式的思想,將web層進行職責解耦肉迫,基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),Spring Web MVC也是要簡化我們?nèi)粘eb開發(fā)的
二.SpringMVC能幫我們做什么
- 讓我們能非常簡單的設(shè)計出干凈的Web層和薄薄的Web層磷账;
- 進行更簡潔的Web層的開發(fā);
- 天生與Spring框架集成(如IoC容器贾虽、AOP等)逃糟;
- 提供強大的約定大于配置的契約式編程支持;
- 能簡單的進行Web層的單元測試蓬豁;
- 支持靈活的URL到頁面控制器的映射绰咽;
- 非常容易與其他視圖技術(shù)集成,如Velocity地粪、FreeMarker等等取募,因為模型數(shù)據(jù)不放在特定的API里,而是放在一個Model里(Map數(shù)據(jù)結(jié)構(gòu)實現(xiàn)蟆技,因此很容易被其他框架使用)玩敏;
- 非常靈活的數(shù)據(jù)驗證、格式化和數(shù)據(jù)綁定機制质礼,能使用任何對象進行數(shù)據(jù)綁定旺聚,不必實現(xiàn)特定框架的API;
- 提供一套強大的JSP標簽庫眶蕉,簡化JSP開發(fā)砰粹;
- 支持靈活的本地化、主題等解析妻坝;
- 更加簡單的異常處理伸眶;
- 對靜態(tài)資源的支持;
- 支持Restful風格刽宪。
三.Spring Web MVC架構(gòu)
- SpringMVC處理請求的流程
1厘贼、 首先用戶發(fā)送請求————>前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它圣拄,即以前的控制器的控制邏輯部分嘴秸;圖2-1中的1、2步驟;
2岳掐、 頁面控制器接收到請求后凭疮,進行功能處理,首先需要收集和綁定請求參數(shù)到一個對象串述,這個對象在Spring Web MVC中叫命令對象执解,并進行驗證,然后將命令對象委托給業(yè)務(wù)對象進行處理纲酗;處理完畢后返回一個ModelAndView(模型數(shù)據(jù)和邏輯視圖名)衰腌;圖2-1中的3、4觅赊、5步驟右蕊;
3、 前端控制器收回控制權(quán)吮螺,然后根據(jù)返回的邏輯視圖名饶囚,選擇相應(yīng)的視圖進行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染鸠补;圖2-1中的步驟6萝风、7;
4莫鸭、 前端控制器再次收回控制權(quán)闹丐,將響應(yīng)返回給用戶,圖2-1中的步驟8被因;至此整個結(jié)束
- SpringMVC架構(gòu)
核心架構(gòu)的具體流程步驟如下:
1卿拴、 首先用戶發(fā)送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理梨与,而是委托給其他的解析器進行處理堕花,作為統(tǒng)一訪問點,進行全局的流程控制粥鞋;
2缘挽、 DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象呻粹、多個HandlerInterceptor攔截器)對象壕曼,通過這種策略模式,很容易添加新的映射策略等浊;
3腮郊、 DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器筹燕,從而支持多種類型的處理器轧飞,即適配器設(shè)計模式的應(yīng)用衅鹿,從而很容易支持很多類型的處理器;
4过咬、 HandlerAdapter——>處理器功能處理方法的調(diào)用大渤,HandlerAdapter將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理掸绞;并返回一個ModelAndView對象(包含模型數(shù)據(jù)泵三、邏輯視圖名);
5集漾、 ModelAndView的邏輯視圖名——> ViewResolver切黔, ViewResolver將把邏輯視圖名解析為具體的View砸脊,通過這種策略模式具篇,很容易更換其他視圖技術(shù);
6凌埂、 View——>渲染驱显,View會根據(jù)傳進來的Model模型數(shù)據(jù)進行渲染,此處的Model實際是一個Map數(shù)據(jù)結(jié)構(gòu)瞳抓,因此很容易支持其他視圖技術(shù)埃疫;
7、返回控制權(quán)給DispatcherServlet孩哑,由DispatcherServlet返回響應(yīng)給用戶栓霜,到此一個流程結(jié)束
- SpringMVC優(yōu)勢
1、清晰的角色劃分:前端控制器(DispatcherServlet)横蜒、請求到處理器映射(HandlerMapping)胳蛮、處理器適配器(HandlerAdapter)、視圖解析器(ViewResolver)丛晌、處理器或頁面控制器(Controller)仅炊、驗證器( Validator)、命令對象(Command 請求參數(shù)綁定到的對象就叫命令對象)澎蛛、表單對象(Form Object 提供給表單展示和提交到的對象就叫表單對象)抚垄。
2、分工明確谋逻,而且擴展點相當靈活呆馁,可以很容易擴展,雖然幾乎不需要毁兆;
3浙滤、由于命令對象就是一個POJO,無需繼承框架特定API荧恍,可以使用命令對象直接作為業(yè)務(wù)對象瓷叫;
4屯吊、和Spring 其他框架無縫集成,是其它Web框架所不具備的摹菠;
5盒卸、可適配,通過HandlerAdapter可以支持任意的類作為處理器次氨;
6蔽介、可定制性,HandlerMapping煮寡、ViewResolver等能夠非常簡單的定制虹蓄;
7、功能強大的數(shù)據(jù)驗證幸撕、格式化薇组、綁定機制;
8坐儿、利用Spring提供的Mock對象能夠非常簡單的進行Web層單元測試律胀;
9、本地化貌矿、主題的解析的支持炭菌,使我們更容易進行國際化和主題的切換。
10逛漫、強大的JSP標簽庫黑低,使JSP編寫更容易
四.Hello World入門
- web.xm配置 加入SpringMVC配置
<!-- 加入SpringMVC配置 begin-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- end -->
- dispatcher-servlet.xml 配置
<!-- 注解主持 -->
<mvc:annotation-driven>
<!-- 配置防止亂碼 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 注解掃描 -->
<context:component-scan base-package="com.zlb.controller" />
<!-- 定義首頁 -->
<mvc:view-controller path="/" view-name="redirect:/user/login"/>
<!-- 靜態(tài)資源映射 -->
<mvc:resources mapping="/css/**" location="/WEB-INF/css/" />
<mvc:resources mapping="/images/**" location="/WEB-INF/images/" />
<mvc:resources mapping="/js/**" location="/WEB-INF/js/" />
<mvc:resources mapping="/resources/**" location="/WEB-INF/resources/"/>
<!-- 視圖前綴與后綴 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- SpringMVC上傳文件時,需要配置MultipartResolver處理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上傳文件的總大小不能超過50MB酌毡。注意maxUploadSize屬性的限制不是針對單個文件克握,而是所有文件的容量之和 -->
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="50000000" />
<property name="maxInMemorySize" value="40960" />
</bean>
- UserController
@Controller("userController")
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/login")
public String login(User user, ModelMap model) {
return "login";
}
@RequestMapping(value = "/doLogin",method=RequestMethod.POST)
public String doLogin(User user,ModelMap model){
if(!user.getUserName().equals("admin") || user.getUserName() == null){
model.addAttribute("error", "用戶名錯誤");
return "login";
}
if(!user.getUserPass().equals("123") || user.getUserPass() == null){
model.addAttribute("error", "用戶密碼錯誤");
return "login";
}
model.addAttribute("user", user);
return "success";
}
}
-
視圖資源 按照dispatcher-servlet.xml 配置
視圖資源