【SpringMVC框架】非註解的處理器對映器和介面卡
阿新 • • 發佈:2019-01-31
非註解的處理器對映器和介面卡
1.非註解的處理器對映器
之前的處理器對映器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
介紹另一個對映器:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
現在同時存在兩個對映器,我們分別進行測試,發現訪問/queryItems_test.action與訪問/queryItems1.action與/queryItems2.action都可以得到正確檢視
說明:
多個對映器可以並存,前端控制器判斷url能讓哪些對映器對映,就讓正確的對映器處理。
2.非註解的處理器介面卡
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求編寫的Handler實現 Controller介面。
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求編寫的Handler實現 HttpRequestHandler介面。
測試:
先別忘記在springmvc.xml中配置Handler和處理器對映器
//使用此方法可以通過修改response,設定響應的資料格式,比如響應json資料
可以看到,其中BeanNameUrlHandlerMapping和HttpRequestHandlerAdapter咱們之前都用到過,
這些都是非註解的處理器對映器和介面卡,那些DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter都是註解的處理器對映器和介面卡
前端控制器從上邊的檔案中載入處理對映器、介面卡、檢視解析器等元件,如果不在springmvc.xml中配置,使用預設載入的。
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中配置,使用預設載入的。