1. 程式人生 > >【SpringMVC框架】非註解的處理器對映器和介面卡

【SpringMVC框架】非註解的處理器對映器和介面卡

非註解的處理器對映器和介面卡

1.非註解的處理器對映器
之前的處理器對映器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
<!-- 配置Handler -->
	<bean name="/queryItems_test.action" class="cn.edu.hpu.ssm.controller.ItemsController1" />
	<!-- 配置另外一個Handler -->
	
	<!-- 處理器對映器 將bean的name作為url進行查詢 ,需要在配置Handler時指定beanname(就是url) 
	所有的對映器都實現 HandlerMapping介面。
	-->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

介紹另一個對映器:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
<!-- 配置Handler -->
	<bean id="itemsController1" name="/queryItems_test.action" class="cn.edu.hpu.ssm.controller.ItemsController1" />
	<!-- 配置另外一個Handler -->
	
	<!-- 處理器對映器 將bean的name作為url進行查詢 ,需要在配置Handler時指定beanname(就是url) 
	所有的對映器都實現 HandlerMapping介面。
	-->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
	
	<!--簡單url對映  -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<!-- 對itemsController1進行url對映,url是/queryItems1.action,1個bean可以配多個url -->
				<prop key="/queryItems1.action">itemsController1</prop>
				<prop key="/queryItems2.action">itemsController1</prop>
		</property>
	</bean>

現在同時存在兩個對映器,我們分別進行測試,發現訪問/queryItems_test.action與訪問/queryItems1.action與/queryItems2.action都可以得到正確檢視

說明:
多個對映器可以並存,前端控制器判斷url能讓哪些對映器對映,就讓正確的對映器處理。

2.非註解的處理器介面卡
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求編寫的Handler實現 Controller介面。
<!-- 處理器介面卡 
	所有的處理器介面卡都實現HandlerAdapter介面-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求編寫的Handler實現 HttpRequestHandler介面。 
<!-- 另一個非註解的介面卡 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
ItemsController2:
package cn.edu.hpu.ssm.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.HttpRequestHandler;

import cn.edu.hpu.ssn.po.Items;

//實現Contorller介面的介面卡
public class ItemsController2 implements HttpRequestHandler{


	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//呼叫Service查詢資料庫,查詢商品列表,這裡使用靜態資料模擬
		List<Items> itemsList=new ArrayList<Items>();
		//向List中填充靜態資料
		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);
		
		//設定模型資料
		request.setAttribute("itemsList",itemsList);
		
		//設定轉發檢視
		request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);
	}
}

測試:
先別忘記在springmvc.xml中配置Handler和處理器對映器
<!-- 配置另外一個Handler -->
	<bean id="itemsController2" class="cn.edu.hpu.ssm.controller.ItemsController2" />

<!--簡單url對映  -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<!-- 對itemsController1進行url對映,url是/queryItems1.action,1個bean可以配多個url -->
				<prop key="/queryItems1.action">itemsController1</prop>
				<prop key="/queryItems2.action">itemsController1</prop>
				<prop key="/queryItems3.action">itemsController2</prop>
			</props>
		</property>
	</bean>

測試結果如圖

新處理器介面卡執行結果



//使用此方法可以通過修改response,設定響應的資料格式,比如響應json資料
<pre name="code" class="java">response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");

現在腦子裡應該慢慢清晰起來,處理器對映器就是根據URL來找Handler,處理器介面卡就是按照它要求的規則(handler instanceof XXX介面)去執行Handler。但是我們發現有些麻煩的就是,一個Handler類中都是一個方法。下次我們就來說註解的對映器和介面卡。

4.DispatcherSerlvet.properties

通過以前咱們寫的樣例,會發現,多個介面卡和多個對映器可以並存但是其實你不在springmvc.xml中配置介面卡,也可以正常執行程式。因為在SpringMVC的jar包中含有一個預設配置檔案,如果沒有在springmvc.xml配置,就預設使用DispatcherSerlvet.properties的配置如圖

開啟DispatcherSerlvet.properties:

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

可以看到,其中BeanNameUrlHandlerMapping和HttpRequestHandlerAdapter咱們之前都用到過,

這些都是非註解的處理器對映器和介面卡,那些DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter都是註解的處理器對映器和介面卡

前端控制器從上邊的檔案中載入處理對映器、介面卡、檢視解析器等元件,如果不在springmvc.xml中配置,使用預設載入的。