1. 程式人生 > >SpringMVC (二)非註解開發和註解開發

SpringMVC (二)非註解開發和註解開發

非註解的對映器

所有的對映器都實現了HandlerMapping介面。

原始的對映器:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
Handler:<bean name="/queryItems.action" 


class="cn.itcast.ssm.controller.ItemsController1"></bean>

對映器和Handler合體配置:SimpleUrlHandlerMappering

需要在Controller的bean內增加id="",把Controller的bean增加到簡單url對映器內。

簡單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
<!-- 配置另外一個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域