SpringMVC (二)非註解開發和註解開發
非註解的對映器
所有的對映器都實現了HandlerMapping介面。
原始的對映器:org.springframework.web.servlet.handler.BeanNameUrlHandlerMappingHandler:<bean name="/queryItems.action"
class="cn.itcast.ssm.controller.ItemsController1"></bean>
對映器和Handler合體配置:SimpleUrlHandlerMappering
需要在Controller的bean內增加id="",把Controller的bean增加到簡單url對映器內。
<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems.action"
class="cn.itcast.ssm.controller.ItemsController1" />
<!-- 處理器對映器
將Bean的Name作為url進行查詢,需要在配置Handler時指定beanname(就是url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- 簡單url對映 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
<property name="mappings">
<props>
<!-- 對itemsController進行url對映:url是/queryItems1.action -->
<prop key="/queryItems1.action">itemsController1</prop>
<prop key="/queryItems2.action">itemsController1</prop>
</props>
</property>
</bean>
多個對映器可以並存,前端控制器會判斷url能讓哪些對映器對映,就讓正確的對映器處理。
====================================================================================
非註解的介面卡
SimpleControllerHandlerAdapter要求編寫Handler實現Controller介面。
<!-- 處理器介面卡
所有處理器介面卡都實現HandlerAdapter介面 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
HttpRequestHandlerAdapter要求編寫的Handler實現HttpRequestHandler
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
配置Controller2
public class ItemsController2 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException {
//呼叫service查詢資料庫,查詢商品,這裡先使用靜態模擬
List<Items> itemsList = new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("聯想筆記本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad 筆記本");
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);
}
}
<!-- 配置另外一個Handler -->
<bean id="itemsController3" class="cn.itcast.ssm.controller.ItemsController2" />
所有的
後面可以隨便選擇一個對映器
<prop key="/queryItems3.action">itemsController3</prop>
通過這種方式沒有返回ModelAndView,可以通過response修改定義響應內容,比如返回json資料:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
多個介面卡也可以並存
======================================================================================
註解的處理器和對映器
DispatcherSerlvet.properties
刪除全部的介面卡、對映器、檢視解析器等元件,springmvc也能正常執行。
前端控制器會從檔案中載入處理器對映器等元件,如果不在springmvc.xml中配置,使用預設載入的。但是有分3.1之前和之後。
3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping註解映
射器。
3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注
解的對映器
3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter註解適
配器。
3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注
解介面卡。
配置註解的對映器和介面卡
<!-- 註解對映器 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 註解介面卡 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
轉換解析器就預設載入了,如果使用mvc:annotation-driven不用配置上邊的
RequestMappingHandlerMapping和Adapter
實際開發使用:mvc:annotation-driven
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems_test.action"
class="cn.itcast.ssm.controller.ItemsController1" />
<!-- 對於註解的Handler可以單個配置-->
<bean class="cn.itcast.ssm.controller.ItemsController3" />
<!-- 但是在實際開發中建議使用元件掃描 ,可以掃描controller、service
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>-->
<!-- 處理器對映器
將Bean的Name作為url進行查詢,需要在配置Handler時指定beanname(就是url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- 簡單url對映 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
<property name="mappings">
<props>
<!-- 對itemsController進行url對映:url是/queryItems1.action -->
<prop key="/queryItems1.action">itemsController1</prop>
<prop key="/queryItems2.action">itemsController1</prop>
</props>
</property>
</bean>
<!-- 註解對映器 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 註解介面卡 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
<!-- 使用mvc:annotation-driven 代替上邊的註解對映器和註解介面卡
mvc:annotation-driven預設載入很多的引數繫結方法,比如json轉換解析器就預設載入了,如果使用mvc:
annotation-driven不用配置上邊的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
實際開發使用的也是這個mvc:annotation-driven
<mvc:annotation-driven></mvc:annotation-driven>-->
<!-- 處理器介面卡
所有處理器介面卡都實現HandlerAdapter介面 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- 另一個非註解的介面卡 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
<!-- 檢視解析器
解析jsp解析,預設使用jstl標籤,classpath下面得有jstl的包-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
可以開發註解的Handler
ItemsController3.java
//使用Controller標識他是一個控制器
@Controller
public class ItemsController3 {
//商品查詢列表
//一般建議將url和方法名寫成一樣,方便queryItems和url進行對映,一個方法對應一個url
@RequestMapping("/queryItems")
public ModelAndView queryItems()throws Exception{
//呼叫service查詢資料庫,查詢商品,這裡先使用靜態模擬
List<Items> itemsList = new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("聯想筆記本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad 筆記本");
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;
}
註解的對映器和介面卡要配對使用
需要在spring容器中載入Handler
<!-- 對於註解的Handler可以單個配置-->
<bean class="cn.itcast.ssm.controller.ItemsController3" />
<!-- 但是在實際開發中建議使用元件掃描 ,可以掃描controller、service
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>-->
===============================================================================================
原始碼分析:
1.前端控制器接收請求,呼叫doDispatch
2.前端控制器呼叫處理器對映器查詢Handler
3.呼叫處理器介面卡執行Handler,得到執行的結果ModelAndVeiw
4.檢視渲染,將model資料填充到request域