springmvc(一)原理分析及配置前端控制器,處理器映射器,處理器適配器

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包

顯示結果
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章