為了賬號安全,請及時綁定郵箱和手機立即綁定

SpringMVC從入門到精通之第三章

2016.01.24 16:46 12957瀏覽

好吧對于好多朋友說上一張不好懂,我感到抱歉,上次寫的時候那個點還沒下班,已經深夜了腦子有點短路。但是只要能跟著復制進自己的程序里面是可以運行的,每次都是能保證復制即可運行的。不然我沒有必要貼代碼了,直接截圖多方便。
上一章節中首先講解前端控制器DispatcherServlet的配置包括加載springmvc文件、攔截什么樣的請求等
還有兩個組件:分別是適配器和映射器(另外再補充一組)

非注解的處理器映射器
處理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
另一個映射器:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
補充:多個映射器可以并存,前端控制器判斷url能讓哪些映射器映射,就讓正確的映射器處理。
非注解的處理器適配器:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求編寫的Handler實現 Controller接口。
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求編寫的Handler實現 HttpRequestHandler接口。

可能有人沒有配置上面的那些發現程序能夠運行。那么知識點來了:
本章的第一個知識點在一個配置文件中是springmvc框架里面的一個配置文件,它的作用就是當沒有配置上面的適配器和處理器框架會根據這個文件默認使用一組適配器和映射器。
圖片描述
我們來簡單的看下這個文件里面的內容:

要先看下面這個翻譯:
# 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
這個就是默認加載的處理器映射器有兩個:第一個是根據Bean的名字URL的映射器,第二個是默認的注解處理器映射器(等下會講注解的)
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
這個是默認加載的處理器適配器有三個:http請求相關的、簡單的處理器適配器、默認的注解處理器適配器(等下會說到注解的)
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

上面的文件里面涉及到兩個注解的組件分別是:

注解的處理器映射器
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
注解的處理器適配器
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
這個兩個是在spring3.1版本之前用的,在3.1之后使用的都是和http請求相關的兩個組件
分別是:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解適配器。

程序配置:注解的這個兩個必須成對出現,要么全部出現、要么都不出現

    <!-- 知識點二:=========注解映射器====================== -->
    <!-- 說明 :對類中標記@ResquestMapping的方法進行映射,根據ResquestMapping定義的url匹配-->
    <!-- ResquestMapping標記的方法,匹配成功返回HandlerMethod對象給前端控制器,HandlerMethod對象中封裝url對應的方法Method。  -->
    <!-- 注意:從spring3.1版本開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用RequestMappingHandlerMapping完成注解式處理器映射。 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <!-- 知識點三:=========注解適配器====================== -->
    <!-- 說明:注解式處理器適配器,對標記@ResquestMapping的方法進行適配。-->
    <!-- 從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成注解式處理器適配。 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

實例程序:

/**  
 * @Title: ItemList3.java
 * @Package com.springapp.web.controller
 * @Description: TODO
 * @author Hanson
 * @date 2015-10-25
 */
package com.springapp.web.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 com.springapp.pojo.Items;

/**
 * 
 * @ClassName: ItemList3   
 * @Description: TODO(注解的處理器映射器和注解的適配器)   
 * @author: Hanson.Q
 * @date: 2016年1月24日 下午4:22:44   
 *
 */
@Controller
public class ItemList3 {
    /**
     * 
     * @Title: queryItem
     * @Description: TODO (定義請求url到處理器功能方法的映射)
     * @Author: Hanson.Q                
     * @Create Date: 2016年1月24日 下午4:23:11
     * @History: 2016年1月24日 下午4:23:11 Hanson.Q Created.
     *
     * @return
     *
     */
    @RequestMapping("/queryItem.action")
    public ModelAndView queryItem() {
        // 商品列表
        List<Items> itemsList = new ArrayList<Items>();
        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6s蘋果手機!");
        itemsList.add(items_2);
        // 創建modelAndView準備填充數據、設置視圖
        ModelAndView modelAndView = new ModelAndView();
        // 填充數據
        modelAndView.addObject("itemsList", itemsList);
        // 視圖
        modelAndView.setViewName("order/itemsList");
        return modelAndView;
    }
}

當然光配置上面兩個注解相關的組件還是不夠的為什么呢?因為spring容器并不知道哪些類是處理器,這時候需要一個配置來把處理器交給容器管理。
知識點四:

    <!-- 組件掃描器:可以掃描@Controller、@Service、@Repository等等 -->
    <context:component-scan base-package="com.springapp.web.controller"/>

那么可能還有點懶說配置那兩個注解相關的組件還是不方便,還是得寫那么長。框架又幫我們想好了。
知識點五:真實開發的時候使用下面的配置可以代替上面配置的兩個注解的組件

    <!-- springmvc使用<mvc:annotation-driven> -->
    <!-- 自動加載RequestMappingHandlerMapping和RequestMappingHandlerAdapter, -->
    <!-- 可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解處理器和適配器的配置。 -->
    <mvc:annotation-driven/>

這樣以后這個配置文件中只要配置如下內容就可以了:
沒有使用注解時候的配置文件:

<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 ">
    <!-- 配置簡單的控制器處理適配器 -->
    <!-- SimpleControllerHandlerAdapter:即簡單控制器處理適配器, -->
    <!-- 所有實現了org.springframework.web.servlet.mvc.Controller 接口的Bean作為Springmvc的后端控制器。 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />

    <!-- 配置BeanNameUrl處理器映射器 -->
    <!-- BeanNameUrlHandlerMapping:表示將定義的Bean名字作為請求的url,需要將編寫的controller在spring容器中進行配置, -->
    <!-- 且指定bean的name為請求的url,且必須以.action結尾。 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"/>

    <!-- controller配置 -->
    <!-- name="/items1.action":前邊配置的處理器映射器為BeanNameUrlHandlerMapping, -->
    <!-- 如果請求的URL 為“上下文/items1.action”將會成功映射到ItemList1控制器。 -->
    <bean name="/items1.action" id="itemList1" class="com.springapp.web.controller.ItemList1"/> 
    <bean name="/items2.action" id="itemList2" class="com.springapp.web.controller.ItemList2"/>

    <!-- 配置視圖解析器 -->
    <!-- InternalResourceViewResolver:支持JSP視圖解析 -->
    <!-- viewClass:JstlView表示JSP模板頁面需要使用JSTL標簽庫,所以classpath中必須包含jstl的相關jar包; -->
    <!-- prefix 和suffix:查找視圖頁面的前綴和后綴,最終視圖的址為: -->
    <!-- 前綴+邏輯視圖名+后綴,邏輯視圖名需要在controller中返回ModelAndView指定,比如邏輯視圖名為hello,-->
    <!-- 則最終返回的jsp視圖地址 "WEB-INF/jsp/hello.jsp" -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

使用注解之后的配置文件:

<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 ">

    <!-- ======================組件掃描器====================== -->
    <context:component-scan base-package="com.springapp.web.controller" />

    <!-- springmvc使用<mvc:annotation-driven> -->
    <!-- 自動加載RequestMappingHandlerMapping和RequestMappingHandlerAdapter, -->
    <!-- 使用<mvc:annotation-driven>替代注解處理器和適配器的配置。 -->
    <mvc:annotation-driven />

    <!-- 配置視圖解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

把這個配置和之前的對比一下看看是不是簡單的多了。
之前寫那么多我原本的意思是想讓大家明白的深入一點,不能只知道怎么使用但是本身原理還是不知道,那長期以往后果就是你是一個沒有想法的程序員。而不是開發工程師。
在這邊還要感謝慕課,讓我有機會能夠與大家分享自己學習技術上的心得。

點擊查看更多內容
52人點贊

若覺得本文不錯,就分享一下吧!

評論

相關文章推薦

正在加載中
意見反饋 幫助中心 APP下載
官方微信

舉報

0/150
提交
取消
lpl竞猜