springmvc是spring的一部分,是一個基於mvc設計模式的前端框架
工作流程
前端控制器(DispacherServlet):負責轉發請求,接受用戶的請求,申請處理後,將響應返回給客戶
處理器映射器(HandlerMapping):前端控制器把請求轉發給處理器映射器。處理器映射器根據請求中的URL,找到對應的Handler(相當於struts2的Action),返回給前端控制器。
處理器適配器(HandlerAdapter):前端控制器知道要執行哪個Handler,但是它只是把信息轉發給處理器適配器,處理器適配器調用程序寫好的Handler,Handler執行完,返回一個ModelAndView對象給適配器,處理器適配器再把這個對象返回給前端控制器
處理器(Handler):編寫handler按照適配器的規則來編寫,比如實現哪個接口,這樣適配器纔可以正確執行handler
視圖解析器(View resolver):前端控制器會把邏輯視圖發送給視圖解析器請求解析,視圖解析器處理後返圖物理視圖(view)給前端控制器
視圖view:前端控制器請求進行視圖渲染,把model數據填充到request域,返回視圖(jsp、html等)
前端控制器把視圖響應返回給用戶
配置前端控制器
前端控制器就整個框架最中心的組件,負責組織其他組件正常工作,那既然是一個servlet,就在web.xml文件中配置,我們知道應用程序部署到tomcat上,web.xml是程序執行的入口點,所以我們要在這裏配置我們的前端控制器,用來接收用戶請求。類似於在學習struts2時,我們在web.xml裏配置的filter,它的作用和這裏的前端控制器類似。
那首先我們得配置springmvc的運行環境,就是導入所需要的jar包
主要多了兩個包
(1)配置servlet的名字和類
(2)配置inti-param參數,使得前端控制器找到處理器映射器和適配器等。默認會在WEB-INF目錄下查找,並且要求配置文件的名字爲servlet名字-servlet.xml。所以通過配置可以自己指定配置文件。我們在classpath下面創建config目錄,裏面新建springmvc.xml.
(3)配置servlet-mapping,通過url找到servlet。
- <url-pattern>*.do</url-pattern> 根據後綴來找
- <url-pattern>/</url-pattern> 所有url都會讓這個前端控制器解析
- <url-pattern>/*do</url-pattern>有錯誤,不能這樣配置
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 控制器通過配置文件找到處理器映射器,處理器適配器,這些都配置在springmvc.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>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
配置處理器適配器
配置好前端控制器,我們在springmvc.xml中配置處理器映射器。
(1)引入約束,與spring的配置文件約束一致
(2)在springmvc的xml配置適配器,也是以bean的形式配置
我們知道適配器是去執行Handler的,打開SimpleControllerHandlerAdapter源代碼,有一個supports()方法,意思只有這個Handler是Controller對象時這個適配器纔可以執行這個Handler,那麼我們就根據這個規則編寫Handler類
編寫Handler
(1)創建controller包,編寫controller
(2)實現controller接口,重寫public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 方法
(3)方法返回的是ModelAndView對象,在方法裏調用service方法,執行數據庫操作,這裏模擬靜態數據
(4)modelAndView.addObject("itemsList", itemsList); //request的setAttribut,在jsp頁面中通過itemsList取數據,在jsp頁面根據itemsList獲取數據
modelAndView.setViewName("itemsList.jsp"); //設置view頁面
package xidian.lili.controller;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import xidian.lili.po.Items;
public class ItemsController1 implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//裏面實現servcie方法,相當於在action裏調用service
ArrayList<Items> itemsList=new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("聯想筆記本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");
Items items_2 = new Items();
items_2.setName("蘋果手機");
items_2.setPrice(5000f);
items_2.setDetail("iphone6蘋果手機!");
itemsList.add(items_1);
itemsList.add(items_2);
//返回modelandview
ModelAndView modelAndView=new ModelAndView();
//相當 於request的setAttribut,在jsp頁面中通過itemsList取數據
modelAndView.addObject("itemsList", itemsList);
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
配置處理器映射器
映射器的作用是根據url來找到調用哪個Handler,根據這個映射器的名字,我們可以知道url就是Handler對象的 name 屬性,那麼順便配置Handler
配置Handler
(1)Handler對象的class屬性就是編寫的controller類,name屬性我們可以自己定義,但是最後要以.action結尾,因爲我們在web.xml文件中配置前端控制器的時候,servlet-mapping中url-pattern中的配置,前端控制器只能解析.action結尾的url。這纔會把url給處理器適配器。
(2)這樣當用戶請求的url是以/queryItem.action結尾,映射器掃描配置文件中的所有bean的name屬性,找到對象的name屬性,也就找到了要執行的Handler
配置視圖解析器
配置視圖解析器,發現默認使用jstl視圖標籤,所以要有jstl的jar包