2熊尉、處理器映射器和適配器罐柳、視圖解析器(springMVC筆記)

一、非注解映射器和適配器(工程springMVC02

1.1 非注解映射器

  • 非注解映射器BeanNameUrlHandlerMapping
    在之前我們使用的是這個處理器映射器狰住,配置為:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

使用此映射器的時候是將bean的名字作為url進行查找张吉,需要在配置Handler時指定bean的名字(就是url

<bean id="itemsController1" name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"/>
  • 非注解映射器SimpleUrlHandlerMapping
    從上面的配置可以看到,如果控制器較多的時候便不是很方便了催植,于是看使用此種非注解映射器如何配置:
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <!-- 對itemsController1進行url映射肮蛹,一個處理器可以對應多個映射地址 -->
                <prop key="/queryItems1.action">itemsController1</prop>
                <prop key="/queryItems2.action">itemsController1</prop>
                <!-- 配置ItemsController2 -->
                <prop key="/queryItems3.action">itemsController2</prop>
            </props>
        </property>
    </bean>

使用此種映射器的時候一個控制器可以對應多個url,可以看到我們可以同時為多個控制器配置url创南,較為方便伦忠。這里注意:我們使用<prop>中的key指定url,其值即是相關控制器的id稿辙,但是使用此映射器的時候昆码,配置控制器時則不需要指定name屬性了。

1.2 非注解適配器

  • 非注解適配器SimpleControllerHandlerAdapter
    我們看相關的配置:
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

而使用此配置器時邻储,相關的控制器需要實現(xiàn)Controller接口赋咽,我們看相關的類實現(xiàn)ItemsController1.java

package cn.itcast.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 org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import cn.itcast.ssm.pojo.Items;

//實現(xiàn)Controller接口的映射器
public class ItemsController1 implements Controller{

    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        //調用service查詢數(shù)據(jù)庫,查詢商品列表吨娜,這里使用靜態(tài)數(shù)據(jù)庫模擬
        List<Items> itemsList = new ArrayList<Items>();
        Items items_1 = new Items();
        items_1.setName("聯(lián)想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T 430");
        
        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6s");
        
        itemsList.add(items_1);
        itemsList.add(items_2);
        
        //返回ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        //相當于request的setAttribute方法脓匿,在jsp頁面中就可以通過items取數(shù)據(jù)了
        modelAndView.addObject("itemsList",itemsList);
        
        //指定視圖
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
        
        return modelAndView;
    }
}

這個類其實我們在之前的工程中已經給出了。

  • 非注解適配器HttpRequestHandlerAdapter
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

使用此適配器的控制器需要實現(xiàn)HttpRequestHandler接口宦赠,當然映射器可以任選陪毡。這里我們給出相關的類ItemsController2.java

package cn.itcast.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 org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import cn.itcast.ssm.pojo.Items;

//實現(xiàn)Controller接口的映射器
public class ItemsController2 implements HttpRequestHandler{

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        List<Items> itemsList = new ArrayList<Items>();
        Items items_1 = new Items();
        items_1.setName("聯(lián)想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T 430");
        
        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6s");
        
        itemsList.add(items_1);
        itemsList.add(items_2);
        
        request.setAttribute("itemsList",itemsList);
        //視圖
        request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);
        /*
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("json串");
        */
        
    }
}

注意:這種方式看起來很原始,但可通過response修改定義響應的內容勾扭,比如返回json數(shù)據(jù)毡琉。在上面我們已經給出相關的代碼。
注意:這里我們配置多個適配器和映射器是不會沖突的妙色。因為這里的映射器和適配器都是非注解的绊起。

二、注解映射器和適配器(工程springMVC03

2.1 相關說明

  • 1.非注解的多個映射器或適配器不會沖突燎斩,但是卻不能和注解的適配器同時使用,必須要成對蜂绎,即注解的適配器必須使用注解的映射器栅表。
  • 2.我們發(fā)現(xiàn)在上一個工程中我們將相關映射器和適配器刪掉之后工程還是可以運行的,這是因為springMVC中有默認的配置师枣,我們在包中找到一個資源文件:
    1

    前端控制器會從配置文件中加載處理器映射器怪瓶、適配器、視圖解析器等組件践美,如果不再配置文件中配置這些組件洗贰,那么就使用DispatcherServlet.properties中默認的配置找岖。

2.2 注解的映射器和適配器

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

說明:這里我們分別配置了注解形式的映射器和適配器,當然springMVC給我們提供了更好用的工具敛滋,使用下面的配置我們就可以將上面的配置取消掉了:

<mvc:annotation-driven/>

說明:我們在使用此配置的時候報錯很可能是schema文件沒有配置上许布,在后面我們會給出完整的配置文件,可以自行查看绎晃。其實在開發(fā)中也是使用此種方式蜜唾。

2.3 控制器編寫

使用注解的方式,當然控制器的編寫也是不一樣了庶艾,我們發(fā)現(xiàn)在使用非注解的方式時編寫控制器總是要繼承相關的接口袁余,那必然就要實現(xiàn)相關的方法,那如果我們想編寫多個方法就不是很方便了咱揍,這里我們看注解方式可以很好的改善這一問題:
ItemsController3.java

package cn.itcast.ssm.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import cn.itcast.ssm.pojo.Items;

//注解的handler
/*使用@Controller標識控制器*/

@Controller
public class ItemsController3{
    
    //商品查詢列表颖榜,一般建議將url和方法名一樣,@RequestMapping實現(xiàn)對下面方法和url進行映射煤裙,
    //即一個方法對應一個url掩完,url后面可以加.action也可以不加
    @RequestMapping("/queryItems")
    public ModelAndView queryItems() throws Exception{
        List<Items> itemsList = new ArrayList<Items>();
        Items items_1 = new Items();
        items_1.setName("聯(lián)想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T 430");
        
        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6s");
        
        itemsList.add(items_1);
        itemsList.add(items_2);
        
        //返回ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        //相當于request的setAttribute方法,在jsp頁面中就可以通過items取數(shù)據(jù)了
        modelAndView.addObject("itemsList",itemsList);
        
        //指定視圖
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
        
        return modelAndView;
    }
    //其他方法也可以同時在此類中進行添加
}

說明:這里我們使用注解@Controller表示此類是一個控制器积暖,使用注解@RequestMapping表示其對應的url藤为。同時我們可以看到不需要繼承任何接口,于是我們可以在此類中定義多個方法夺刑,而相關的url映射使用注解即可缅疟。

2.4 配置控制器

<!-- 配置Handler -->
<!--對于注解的Handler可以單個配置,id不需要了遍愿,因為在類中使用注解已經配置好了存淫,在實際開發(fā)中使用主鍵掃描 -->
<!-- <bean class="cn.itcast.ssm.controller.ItemsController3"/> -->
<!-- 主鍵掃描,可以掃描Controller沼填、service等等桅咆,這里是掃描Controller -->
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>

說明:這里我們給出了兩種配置方法,當然如何取舍我們在配置中已經注明坞笙。最后我們可以使用地址http://localhost:8080/springMVC03/queryItems.action進行訪問岩饼。不管url中有沒有.action,都使用上面的地址薛夜。

三籍茧、視圖解析器

視圖解析器默認是支持jstl的,但是在配置的時候我們還可以為跳轉的jsp地址配置前綴和后綴:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 默認支持下面的jstl -->
        <!-- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> -->
        <!-- jsp路徑前綴 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- jsp路徑后綴 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

這里我們配置了前綴和后綴梯澜,那么在控制器ItemsController3.java中進行跳轉的時候就可以這樣:

modelAndView.setViewName("items/itemsList");

最后:給出完整的配置文件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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    
    <!-- 配置Handler -->
    <!--對于注解的Handler可以單個配置寞冯,id不需要了,因為在類中使用注解已經配置好了,在實際開發(fā)中使用主鍵掃描 -->
    <!-- <bean class="cn.itcast.ssm.controller.ItemsController3"/> -->
    <!-- 主鍵掃描吮龄,可以掃描Controller俭茧、service等等,這里是掃描Controller -->
    <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
    
    <!-- **************************注解的處理器映射器************************** -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <!-- **************注解的處理器適配器漓帚,所有的處理器適配器都實現(xiàn)HandlerAdapter************** -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
    
    <!-- 使用下面的注解驅動可以代替上面的注解映射器和注解適配器的配置母债,同時默認加載了很多的參數(shù)綁定方法,比如json轉換的解析器
    如果使用此種方式就不用配置上面的映射器和適配器了胰默,在實際開發(fā)中使用此種方式 -->
    <!-- <mvc:annotation-driven/> -->
    
    <!-- ****************視圖解析器场斑,解析jsp視圖,默認使用jstl牵署,classpath下需要有jstl的包*************** -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 默認支持下面的jstl -->
        <!-- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> -->
        <!-- jsp路徑前綴 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- jsp路徑后綴 -->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

四漏隐、跟蹤源碼

這里我們只是簡要的跟蹤一下源碼,加深對springMVC執(zhí)行流程的認識奴迅。

  • 1.前端控制器
    這里當然我們首先供前端控制器開始青责,此類中有一個入口方法doDispatch(),我們從此方法開始取具。

  • 2.前端控制器調用映射器查找控制器
    我們在doDispatch()中找到這樣一段

    2

    這里我們進入getHandler方法:
    3

    可以看到此方法返回一個執(zhí)行鏈HandlerExecutionChain脖隶。

  • 3.調用處理器處理器調用handler
    映射器返回執(zhí)行鏈之后前端加載器就會調用處理器去處理相關方法,在doDispatch()方法中找到:

    4

    我們進入此方法的時候發(fā)現(xiàn)出現(xiàn)了很多適配器暇检,我們在之前都見過产阱,它們在執(zhí)行完之后都會返回一個ModelAndView

  • 4.視圖渲染块仆,將model數(shù)據(jù)填充到request
    doDispatch()方法中找到

    5

    進入此方法构蹬,在此方法中找到:
    6

    7

    可以看到調用的是render方法,得到一個view悔据,再調用view的渲染方法庄敛,將model數(shù)據(jù)填充到request域中。在前端控制器類render()方法中找到:
    8

    此類是一個接口科汗,我們進入其抽象方法
    9

    再次進入藻烤,可以看到:
    10

    進入方法renderMergedOutputModel

11

這里我們可以看到很多渲染類,之前我們配置了一個InternalResourceViewResolver头滔,選擇InternalResourceView怖亭,看到下面這段代碼:
12

點擊進入:
13

這里就將模型數(shù)據(jù)填充到了視圖類中。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末坤检,一起剝皮案震驚了整個濱河市兴猩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缀蹄,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缺前,居然都是意外死亡蛀醉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門衅码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拯刁,“玉大人,你說我怎么就攤上這事逝段《獠#” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵奶躯,是天一觀的道長帚桩。 經常有香客問我,道長嘹黔,這世上最難降的妖魔是什么账嚎? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮儡蔓,結果婚禮上郭蕉,老公的妹妹穿的比我還像新娘。我一直安慰自己喂江,他們只是感情好召锈,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著获询,像睡著了一般涨岁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筐付,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天卵惦,我揣著相機與錄音,去河邊找鬼瓦戚。 笑死沮尿,一個胖子當著我的面吹牛,可吹牛的內容都是我干的较解。 我是一名探鬼主播畜疾,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼印衔!你這毒婦竟也來了啡捶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奸焙,失蹤者是張志新(化名)和其女友劉穎瞎暑,沒想到半個月后彤敛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡了赌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年墨榄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勿她。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡袄秩,死狀恐怖,靈堂內的尸體忽然破棺而出逢并,到底是詐尸還是另有隱情之剧,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布砍聊,位于F島的核電站背稼,受9級特大地震影響,放射性物質發(fā)生泄漏辩恼。R本人自食惡果不足惜雇庙,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灶伊。 院中可真熱鬧疆前,春花似錦、人聲如沸聘萨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽米辐。三九已至胸完,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翘贮,已是汗流浹背赊窥。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狸页,地道東北人锨能。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像芍耘,于是被迫代替她去往敵國和親址遇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理斋竞,服務發(fā)現(xiàn)倔约,斷路器,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,857評論 6 342
  • 1. 簡介 1.1 什么是 MyBatis 坝初? MyBatis 是支持定制化 SQL浸剩、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,527評論 0 4
  • 作畫順序:房子钾军,樹,女朋友绢要,我巧颈,太陽,花草袖扛。女朋友手里拿著書,想畫兩個人是側身45度相對的十籍,但不會畫蛆封,我自己因為上...
    藍田_b685閱讀 576評論 0 0
  • 哎呀呀,終于可以住進新房里啦勾栗!我是相當?shù)呐d奮惨篱,一想到以后附近有那么多好吃好玩的地兒,真是相當滿足围俘。好啦砸讳,轉回正題,...
    MissBella閱讀 1,062評論 2 18