spring mvc執(zhí)行流程
請(qǐng)求旅行的第一站是Spring的前端控制器 DispacherServlet,DispacherServlet的任務(wù)是將請(qǐng)求發(fā)送給Spring MVC控制器(Controller)化撕。控制器是一個(gè)用于處理請(qǐng)求的Spring組件。在典型的應(yīng)用中可能會(huì)有多個(gè)控制器了牛,DispacherServlet需要知道應(yīng)該將請(qǐng)求發(fā)送給哪個(gè)控制器觅捆,所以DispacherServlet會(huì)查詢一個(gè)或多個(gè)處理器映射(handler mapping)來確定請(qǐng)求的下一站會(huì)是在哪里盗飒。處理器映射會(huì)根據(jù)請(qǐng)求所攜帶的URL信息來進(jìn)行決策置鼻。
一旦選中了合適的控制器,DispacherServlet會(huì)將請(qǐng)求發(fā)送給選中的控制器取逾。到了控制器庆械,請(qǐng)求會(huì)卸下其負(fù)載(用戶提交的信息)并耐心等待控制器處理這些信息。(實(shí)際上設(shè)計(jì)良好的控制器本身只處理很少菌赖,甚至不處理工作缭乘,而是將業(yè)務(wù)邏輯委托給一個(gè)或多個(gè)服務(wù)對(duì)象進(jìn)行處理)
控制器在完成邏輯處理后,通常會(huì)產(chǎn)生一些信息琉用,這些信息需要返回給用戶并在瀏覽器上顯示堕绩。這些信息被稱為模型(model)。不過僅僅給用戶返回原始的信息是不夠的邑时。這些信息需要以用戶友好的方式進(jìn)行格式化奴紧,一般會(huì)是HTML。所以晶丘,信息需要發(fā)送給一個(gè)視圖(view),通常會(huì)是JSP黍氮。
控制器所做的最后一件事就是將模型數(shù)據(jù)打包,并且標(biāo)示出用于渲染輸出的視圖名浅浮。它接下來會(huì)將請(qǐng)求連同模型和視圖名發(fā)送回DispacerServlet沫浆。
這樣,控制器就不會(huì)與特定的視圖相耦合滚秩,傳遞給DispacherServlet的視圖名并不直接表示某個(gè)特定的JSP,實(shí)際上专执,它并不能確定視圖就是JSP,相反,它僅僅傳遞了一個(gè)邏輯名稱郁油,這個(gè)名字將會(huì)用來查找產(chǎn)生結(jié)果的真正視圖本股。DispacherServlet將會(huì)使用視圖解析器(view resolver)來將邏輯視圖名匹配為一個(gè)特定的視圖實(shí)現(xiàn),它可能是也可能不是JSP桐腌。
既然DispacherServlet已經(jīng)知道由哪個(gè)視圖渲染結(jié)果拄显,那請(qǐng)求的任務(wù)也就基本完成了,它的最后一站是視圖的實(shí)現(xiàn)(可能是JSP)案站,在這里它交付模型數(shù)據(jù)躬审。請(qǐng)求的任務(wù)就完成了。視圖使用模型數(shù)據(jù)渲染輸出,這個(gè)輸出會(huì)通過響應(yīng)對(duì)象傳遞給客戶端(不會(huì)像聽上去那樣硬編碼)
配置前端控制器
web.xml中配置前端控制器
<!--spring mvc 前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframe.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置spring mvc 加載的配置文件盒件,在加載的配置文件中需要配置處理器映射器蹬碧、適配器等等,如果不配置的話,默認(rèn)加載的WEB-INFO目錄下的servlet名稱-serlvet.xml炒刁。此處不配置的話默認(rèn)加載WEB-INFO/springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value><!--配置文件所在的路徑-->
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
第一種:*.action 訪問以.action結(jié)尾由DispatcherServlet進(jìn)行解析
第二種:/ 所有訪問的地址都由DispacherServlet進(jìn)行解析恩沽,對(duì)于靜態(tài)文件(圖片、js等文件)的解析需要配置不讓DispacherServlet進(jìn)行解析翔始,使用此種方法可以實(shí)現(xiàn)RESTful風(fēng)格的url
第三種:/* 這樣配置不對(duì)罗心,使用這種配置,最終要轉(zhuǎn)發(fā)到一個(gè)jsp頁(yè)面時(shí)城瞎,仍然會(huì)由DispacherServlet解析jsp地址渤闷,不能根據(jù)jsp頁(yè)面找到hander,會(huì)報(bào)錯(cuò)
-->
<url-pattern>*.action</url-pattern>
<servlet-mapping>
配置處理器映射器脖镀、處理器適配器飒箭、Handler、視圖解析器
在classpath下的springmvc.xml中配置處理器映射器
<!--beans此處省去約束內(nèi)容蜒灰,代碼中需要寫上-->
<beans>
<!--處理器映射器
將bean的name作為url進(jìn)行查找弦蹂,需要在配置Handler時(shí)指定beanname(就是url)
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--處理器適配器
所有處理器適配器都實(shí)現(xiàn)HandlerAdapter接口,框架將會(huì)根據(jù)這個(gè)接口判斷它是不是一個(gè)適配器
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--視圖解析器
需要配置解析jsp的視圖解析器,默認(rèn)使用jstl標(biāo)簽强窖,classpath下面要由jstl的包
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置Handler-->
<bean name="/queryItems.action" class="com.zhangjinbang.springmvcdemo.controller.ItemsController"></bean>
</beans>
通過查看源代碼
public class SimpleControllerHandlerAdapter implements HandlerAdapter{
public boolean support(Object handler){
return (handler instanceof Controller)
}
}
此適配器能執(zhí)行實(shí)現(xiàn)Controller接口的Handler
public interface Controller{
ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception;
}
編寫Handler
Handler需要實(shí)現(xiàn)Controller接口凸椿,才能被SimpleControllerHandlerAdapter適配器執(zhí)行
package com.zhangjinbang.springmvcdemo.controller;
//實(shí)現(xiàn)Controller接口的處理器
public class ItemsController implements Controller{
@Override
public ModeAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception{
//調(diào)用service查詢數(shù)據(jù)庫(kù),查詢商品列表翅溺,這里作為示例使用靜態(tài)數(shù)據(jù)模擬
List<Items> itemsList =new ArrayList<Items>();
//向List中填充靜態(tài)數(shù)據(jù)
...省略n行代碼...
//返回ModelAndView
ModelAndView modelAndView =new ModelAndView();
//相當(dāng)于request.setAttribut方法,在jsp頁(yè)面中通過itemsList取數(shù)據(jù)
modelAndView.addObject("itemsList",itemsList);//指定數(shù)據(jù)
//指定視圖
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp" );
return modelAndView;
}
}
視圖編寫
省略n行關(guān)于jsp的筆記脑漫,過