一、SPRing Web MVC簡(jiǎn)介
Spring Web MVC是一種基于java的實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將web層進(jìn)行職責(zé)解耦,基于請(qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開發(fā),Spring Web MVC也是要簡(jiǎn)化我們?nèi)粘eb開發(fā)的。
二、Spring Web MVC優(yōu)勢(shì)
1、清晰的角色劃分:前端控制器(DispatcherServlet)、請(qǐng)求到處理器映射(HandlerMapping)、處理器適配器(HandlerAdapter)、視圖解析器(ViewResolver)、處理器或頁(yè)面控制器(Controller)、驗(yàn)證器( Validator)、命令對(duì)象(Command 請(qǐng)求參數(shù)綁定到的對(duì)象就叫命令對(duì)象)、表單對(duì)象(Form Object 提供給表單展示和提交到的對(duì)象就叫表單對(duì)象)。
2、分工明確,而且擴(kuò)展點(diǎn)相當(dāng)靈活,可以很容易擴(kuò)展,雖然幾乎不需要;
3、由于命令對(duì)象就是一個(gè)POJO,無(wú)需繼承框架特定API,可以使用命令對(duì)象直接作為業(yè)務(wù)對(duì)象;
4、和Spring 其他框架無(wú)縫集成,是其它Web框架所不具備的;
5、可適配,通過(guò)HandlerAdapter可以支持任意的類作為處理器;
6、可定制性,HandlerMapping、ViewResolver等能夠非常簡(jiǎn)單的定制;
7、功能強(qiáng)大的數(shù)據(jù)驗(yàn)證、格式化、綁定機(jī)制;
8、利用Spring提供的Mock對(duì)象能夠非常簡(jiǎn)單的進(jìn)行Web層單元測(cè)試;
9、本地化、主題的解析的支持,使我們更容易進(jìn)行國(guó)際化和主題的切換。
10、強(qiáng)大的jsp標(biāo)簽庫(kù),使JSP編寫更容易。
三、Spring Web MVC處理請(qǐng)求的流程
1用戶發(fā)送請(qǐng)求給前端控制器(DispatcherServlet) 2前端控制器講請(qǐng)求委托給頁(yè)面控制器/處理器 3處理器調(diào)用業(yè)務(wù)對(duì)象處理請(qǐng)求,業(yè)務(wù)對(duì)象處理完成請(qǐng)求后返回模型數(shù)據(jù)給處理器 4處理器將得到的ModelAndView(模型數(shù)據(jù)和試圖邏輯名)返回給前端控制器 5前端控制器將模型數(shù)據(jù)傳給視圖并渲染視圖 6前端控制器收回控制權(quán),并將視圖響應(yīng)給用戶
四、Hello World入門
1、前端控制器的配置
在web.xml中添加如下配置:
<servlet> <servlet-name>chapter2</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>chapter2</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
load-on-startup:表示啟動(dòng)容器時(shí)初始化該Servlet; url-pattern:表示哪些請(qǐng)求交給Spring Web MVC處理, “/” 是用來(lái)定義默認(rèn)servlet映射的。也可以如“*.html”表示攔截所有以html為擴(kuò)展名的請(qǐng)求。 自此請(qǐng)求已交給Spring Web MVC框架處理,因此我們需要配置Spring的配置文件,默認(rèn)DispatcherServlet會(huì)加載WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置文件。本示例為WEB-INF/ chapter2-servlet.xml。
2、Spring配置文件中配置HandlerMapping、HandlerAdapter 具體配置在WEB-INF/ chapter2-servlet.xml文件中
<!-- HandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
BeanNameUrlHandlerMapping:表示將請(qǐng)求的URL和Bean名字映射,如URL為 “上下文/hello”,則Spring配置文件必須有一個(gè)名字為“/hello”的Bean,上下文默認(rèn)忽略。 SimpleControllerHandlerAdapter:表示所有實(shí)現(xiàn)了org.springframework.web.servlet.mvc.Controller接口的Bean可以作為Spring Web MVC中的處理器。如果需要其他類型的處理器可以通過(guò)實(shí)現(xiàn)HadlerAdapter來(lái)解決。
3、在Spring配置文件中配置ViewResolver
具體配置在WEB-INF/ chapter2-servlet.xml文件中:
<!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
InternalResourceViewResolver:用于支持Servlet、JSP視圖解析; viewClass:JstlView表示JSP模板頁(yè)面需要使用JSTL標(biāo)簽庫(kù),classpath中必須包含jstl的相關(guān)jar包; prefix和suffix:查找視圖頁(yè)面的前綴和后綴(前綴[邏輯視圖名]后綴),比如傳進(jìn)來(lái)的邏輯視圖名為hello,則該該jsp視圖頁(yè)面應(yīng)該存放在“WEB-INF/jsp/hello.jsp”;
4、開發(fā)處理器/頁(yè)面控制器
package cn.javass.chapter2.web.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class HelloWorldController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { //1、收集參數(shù)、驗(yàn)證參數(shù) //2、綁定參數(shù)到命令對(duì)象 //3、將命令對(duì)象傳入業(yè)務(wù)對(duì)象進(jìn)行業(yè)務(wù)處理 //4、選擇下一個(gè)頁(yè)面 ModelAndView mv = new ModelAndView(); //添加模型數(shù)據(jù) 可以是任意的POJO對(duì)象 mv.addObject("message", "Hello World!"); //設(shè)置邏輯視圖名,視圖解析器會(huì)根據(jù)該名字解析到具體的視圖頁(yè)面 mv.setViewName("hello"); return mv; } }
org.springframework.web.servlet.mvc.Controller:頁(yè)面控制器/處理器必須實(shí)現(xiàn)Controller接口,注意別選錯(cuò)了;后邊我們會(huì)學(xué)習(xí)其他的處理器實(shí)現(xiàn)方式; public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) :功能處理方法,實(shí)現(xiàn)相應(yīng)的功能處理,比如收集參數(shù)、驗(yàn)證參數(shù)、綁定參數(shù)到命令對(duì)象、將命令對(duì)象傳入業(yè)務(wù)對(duì)象進(jìn)行業(yè)務(wù)處理、最后返回ModelAndView對(duì)象; ModelAndView:包含了視圖要實(shí)現(xiàn)的模型數(shù)據(jù)和邏輯視圖名;“mv.addObject("message", "Hello World!"); ”表示添加模型數(shù)據(jù),此處可以是任意POJO對(duì)象;“mv.setViewName("hello");”表示設(shè)置邏輯視圖名為“hello”,視圖解析器會(huì)將其解析為具體的視圖,如前邊的視圖解析器InternalResourceVi。wResolver會(huì)將其解析為“WEB-INF/jsp/hello.jsp”。
我們需要將其添加到Spring配置文件(WEB-INF/chapter2-servlet.xml),讓其接受Spring IoC容器管理:
<!-- 處理器 --> <bean name="/hello" class="cn.javass.chapter2.web.controller.HelloWorldController"/>
name="/hello":前邊配置的BeanNameUrlHandlerMapping,表示如過(guò)請(qǐng)求的URL為 “上下文/hello”,則將會(huì)交給該Bean進(jìn)行處理。
5、開發(fā)視圖頁(yè)面 創(chuàng)建 /WEB-INF/jsp/hello.jsp視圖頁(yè)面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World</title> </head> <body> ${message} </body> </html>
${message}:表示顯示由HelloWorldController處理器傳過(guò)來(lái)的模型數(shù)據(jù)。
通過(guò)請(qǐng)求:http://localhost:9080/springmvc-chapter2/hello,如果頁(yè)面輸出“Hello World! ”就表明我們成功了!
五、Spring MVC核心開發(fā)步驟:
1、 DispatcherServlet在web.xml中的部署描述,從而攔截請(qǐng)求到Spring Web MVC
2、 HandlerMapping的配置,從而將請(qǐng)求映射到處理器
3、 HandlerAdapter的配置,從而支持多種類型的處理器
4、 ViewResolver的配置,從而將邏輯視圖名解析為具體視圖技術(shù)
5、處理器(頁(yè)面控制器)的配置,從而進(jìn)行功能處理
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注