1. 程式人生 > 實用技巧 >Java執行Shell和傳輸檔案

Java執行Shell和傳輸檔案

第一節 涉及知識

1.經典三層和MVC模式回顧

軟體的整體架構有B/S(瀏覽器/伺服器模式)和C/S(客戶端/伺服器模式),ee開發主要就是B/S模式,從程式碼開發的角度,程式碼有層的概念.

經典三層: web表現層(view+controller) +service業務層+dao(資料接入訪問層)

2.經典三層

  • 表現層(Web層)
    整個表現層負責接收客戶端瀏覽器的請求並響應結果給客戶端瀏覽器顯示。(Http請求)

    具體說來,表現層=View檢視層+Controller控制層。Controller層負責接收請求、轉發請求給Service層、跳轉檢視頁面,servlet-->Struts(過濾器)-->SpringMVC

  • 業務層(Service層)
    負責業務邏輯處理,和專案需求息息相關(比如轉賬業務)。

  • Spring-->SpringBoot(全註解)

  • 主要涉及邏輯:異常處理引數處理宣告式事務AOP

  • 持久層(Dao層)
    和資料庫互動,對資料表進行增刪改查
    JDBC-->JdbcTemplate --> DButils -->MyBatis->Spring Data JPA -->MyBatis Plus

主流:SSM-->潮流: Spring全家桶

第二節 SpringMVC快速入門

3.SpringMVC框架概述

SpringMVC是一個輕量級的eb表現層框架,用來寫Controller接收請求跳轉頁面的,它是Spring框架的一部分。SpringMVC是對Servlet的封裝和增強,簡化了servlet的操作。它已經超越了Struts,成為目前最優秀的表現層框架。

  • 學習SpringMVC,要把握它的本質
    ○接收請求,轉發請求
    ○跳轉頁面
  • 什麼時候使用SpringMVC?
    • 當你覺得servlet繁瑣的時候
  • 在哪兒使用SpringMVC?
    ○在web表現層使用SpringMVC
  • SpringMVC的優勢
    • 操作特簡單,效能特別高,靈活性特別強
  • 與Struts框架相比
    • 解決了struts的安全性低,操作難,執行效能低的問題
  • 拓展認識
    • Spring + Spring jdbctemplate + SpringMVC --> Spring全家桶1.0主流
    • Spring cloud +Spring Boot +Spring DatajPA+SpringMVC -->Spring全家桶2.0潮流

4.SpringMVC的處理流程

之前: request請求到servlet,一個專案中有很多servlet,不同serlvet處理不同的事情,好比很多年前裝修,業主需要直接抱需求告知水工、電工、木工等。現在我們直接把需求告知包工頭,包工頭具體分發任務給下面的小弟(水工、電工、木工),我們不需要直接和其他人交涉。
前端控制器就類似於上面的包工頭,不幹具體的活,只負責接收請求,分發請求,反饋結果。
SpringMVC全域性只需要一個servlet。

5.SpringMVC快速入門

需求:

瀏覽器輸入url發起請求,該url請求被SpringMVC框架攔截處理,把後臺伺服器的當前時間輸出到jsp頁面顯示。

實現步驟:

  • 建立Maven工程,引入spring框架jar包,springMVC框架jar包,Servlet與jsp jar包
  • 定義類DefaultController
  • 方法gotoResult(),引數和返回值型別為ModelAndView
  • 類新增@Controller註解
  • 方法新增@RequestMapping註解,註解屬性為客戶端訪問虛擬路徑
  • spring配置檔案中,配置註解掃描
  • web.xml配置mvc框架前端控制器

目錄

maven jar包

<dependencies>
        <!--spring核心包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <!--springMVC的jar包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <!--Servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--jsp-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <!--
            provided的作用是:當專案打成war包時,當前的jar包不會壓縮在當前的war包裡
            只在當前程式碼的編寫和編譯過程中產生依賴的作用,
            當程式部署在Tomcat中的工程在war包壓縮包中,通過加上provided不然jar包壓縮在war包中
            執行的時候,用Tomcat自身帶的jar包

            -->
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <!-- 
		執行方式有兩種,一種是tomcat外掛,然後在maven中找到對應的檔案
		開啟tomcatjar包,右鍵run
		另一種tomcat執行
		配置Tomcat外掛  -->
    <!--
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>9090</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
-->

首頁

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>首頁</title>
    </head>
    <body>
        SpringMVC框架的helloWorld

    </body>
</html>

controller層也就是servelt

/**
 * 控制器(理解為  相當於WEB階段的Servlet)
 * @author Lucky
 */

@Controller
public class DefaultController {
    /**
     * 定義方法,相當於以前 Servlet 中 用於處理請求的方法
     */
    @RequestMapping("gotoResult")
    public ModelAndView gotoResult(ModelAndView modelAndView){
        // 封裝資料
        modelAndView.addObject("nowDate",new Date());
        // 指定頁面
        modelAndView.setViewName("WEB-INF/jsp/result.jsp");

        return modelAndView;
    }
}

配置spring.xml 開啟註解掃描controller層的註解

<!-- 開啟SpringIOC註解掃描 -->
    <context:component-scan base-package="com.zhuxu.controller"></context:component-scan>

配置SpringMvc框架的前端控制器

<!-- 配置SpringMvc框架的前端控制器 -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 載入SpringMVC的配置檔案 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 讓dispatcherServlet物件隨著Tomcat的啟動而建立 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

結果頁面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>結果頁面</title>
    </head>
    <body>
        ${nowDate}
    </body>
</html>

第三節 SpringMVC架構

為什麼我們寫了 @RequestMapping 就可以找到相應的類或者方法呢?

為什麼傳了引數就可以自動進行封裝呢?

其實都依賴於 SpringMVC 的處理器對映器、處理器介面卡、檢視解析器這三大元件來完成

整體流程描述:

  1. 使用者發起請求到前端控制器 DispatcherServlet,該控制器根據 url-pattern 會過濾出哪些請求可以訪問、哪些不能訪問。並且會載入 springmvc.xml 配置檔案。
  2. DispatcherServlet 會找到處理器對映器 HandlerMapping,通過 HandlerMapping 完成 url 到 controller 對映的元件,簡單來說,就是將在 springmvc.xml 或註解中配置的 url 與對應的處理類找到並進行儲存,用 map<url,handler> 這樣的方式來儲存。
  3. HandlerMapping 有了對映關係,並且找到 url 對應的處理器,HandlerMapping 就會將其處理器 Handler 返回,在返回前,會加上很多攔截器。
  4. DispatcherServlet 拿到 Handler 後,找到處理器介面卡 HandlerAdapter,通過它來訪問處理器,並執行處理器。
  5. 執行處理器
  6. 處理器會返回一個 ModelAndView 物件給 HandlerAdapter
  7. 通過 HandlerAdapter 將 ModelAndView 物件返回給 DispatcherServlet
  8. DispatcherServlet 請求檢視解析器 ViewResolver 去進行檢視解析,根據邏輯檢視名解析成真正的檢視 jsp,其實就是將 ModelAndView 物件中存放檢視的名稱進行查詢,找到對應的頁面形成檢視物件
  9. 返回檢視物件到前端控制器。
  10. 檢視渲染,就是將 ModelAndView 物件中的資料放到 request 域中,用來讓頁面載入資料的。
  11. 通過第 8 步,通過名稱找到了對應的頁面,通過第 10 步,request 域中有了所需要的資料,那麼就能夠進行檢視渲染了。最後將其返回即可。

1:六個元件

1.1:DispatcherServlet - 前端控制器

dispatcherServlet 是整個流程的控制中心,由它呼叫其它元件處理使用者的請求。

dispatcherServlet 的存在降低了元件之間的耦合性。

1.2:HandlerMapping - 處理器對映器

HandlerMapping 負責根據使用者請求找到 Handler 即處理器

dispatcherServlet 接收到請求路徑之後,找 HandlerMapping ,根據請求路徑對映找到相應的方法或者類

SpringMVC 提供了不同的對映器實現不同的對映方式,例如:配置檔案方式,實現介面方式,註解方式等。

1.3:Handler - 處理器

它就是我們開發中要編寫的具體業務控制器。

由 DispatcherServlet 把使用者請求轉發到 Handler。由 Handler 對具體的使用者請求進行處理。

1.4:HandlAdapter - 處理器介面卡

通過 HandlerAdapter 對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理器進行執行。

1.5:ViewResolver - 檢視解析器

ViewResolver 負責將處理結果生成 View 檢視。

ViewResolver 首先根據邏輯檢視名解析成物理檢視名即具體的頁面地址,再生成 View 檢視物件,最後對 View 進行渲染將處理結果通過頁面展示給使用者。

1.6:View - 檢視

SpringMVC 框架提供了很多的 View 檢視型別的支援,包括:jstlView、freemarkerView、pdfView 等。

我們最常用的檢視就是 jsp,一般情況下需要通過頁面標籤或頁面模版技術,將模型資料通過頁面展示給使用者,需要由程式設計師根據業務需求開發具體的頁面。

2:定製元件

其實 springmvc 中的各個元件都是內建的,不用配置就可以

2.1:定製檢視解析器

ModelAndView 中設定檢視時,每次都要寫字首和字尾,可以不寫嗎?可以,定製檢視解析器即可

在 springmvc.xml 中定製

<bean id="internalResourceViewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 字首 -->
    <property name="prefix" value="/WEB-INF/"/>
    <!-- 字尾 -->
    <property name="suffix" value=".jsp"/>
</bean>

2.2:定製處理器對映器

在 SpringMVC 的各個元件中,處理器對映器、處理器介面卡、檢視解析器稱為 SpringMVC 的三大元件。

使用 <mvc:annotation-driven> 會自動載入

  • RequestMappingHandlerMapping (處理對映器)
  • RequestMappingHandlerAdapter (處理介面卡)

可用在 SpringMVC.xml 配置檔案中使用 <mvc:annotation-driven> 替代註解處理器對映器和介面卡的配置。

它就相當於在 xml 中配置了:

<!-- HandlerMapping --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> 
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- HandlerAdapter --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> 
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean> 
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> <!-- HadnlerExceptionResolvers --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver"></bean> 
<bean class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"></bean>

注意: 一般開發中,我們都需要寫上此標籤(雖然從入門案例中看,我們不寫也行,隨著課程的深入,該標籤還有具體的使用場景)

明確: 我們只需要編寫處理具體業務的控制器以及檢視。

<mvc:annotation-driven />註解意義:提供 Controller請求轉發,json自動轉換等功能

<mvc:annotation-driven /> 是一種簡寫形式,完全可以手動配置替代這種簡寫形式,簡寫形式可以讓初學都快速應用預設配置方案。配置一些 messageconverter。即解決了 @Controller 註解的使用前提配置 <context:annotation-config /> 是對包進行掃描,實現註釋驅動 Bean 定義,同時將 bean 自動注入容器中使用。即解決了 @Controller 標識的類的 bean 的注入和使用。
<mvc:annotation-driven /> 會自動註冊 RequestMappingHandlerMapping 與 RequestMappingHandlerAdapter 兩個 Bean,這是 Spring MVC 為 @Controller 分發請求所必需的,並且提供了資料繫結支援,@NumberFormatannotation 支援,@DateTimeFormat 支援,@Valid 支援讀寫 XML 的支援(JAXB)和讀寫 JSON 的支援(預設Jackson)等功能。
我們處理響應 ajax 請求時,就使用到了對 json 的支援。
對 action 寫 JUnit 單元測試時,要從 spring IOC 容器中取 DefaultAnnotationHandlerMapping 與 AnnotationMethodHandlerAdapter 兩個 bean,來完成測試,取的時候要知道是 <mvc:annotation-driven /> 這一句註冊的這兩個 bean。

第四節 @RequestMapping 註解

用法一:

多個URL路徑對映到同一個Handler(同一個方法)

Handler處理器

@RequestMapping註解用於對映請求與處理器

註解屬性value,可以配置多個url

// 用法1:多個url路徑對映到同一個Handler(同一個方法)
    @RequestMapping(value = {"gotoResultURL","gotoResultURL2"})
    public ModelAndView gotoResultURL(ModelAndView modelAndView){
        // 封裝資料
        modelAndView.addObject("nowDate",new Date()+"========gotoResultURL");
        // 指定頁面
        modelAndView.setViewName("result");

        return modelAndView;

用法二:

@RequestMapping 註解作用在類上,實現對請求路徑的分類管理,限定類中方法訪問的字首

@RequestMapping("default")
public class DefaultController{}
<fieldset>
    <p>01_MVC入門測試用例</p>
    <a href = "${pageContext.request.contextPath}/default/gotoResultURL2.do">測試</a>
</fieldset>

用法三:

method屬性限定請求方法,請求的handler相同,請求方式不同進入不同方法處理

method屬性限定請求方法,請求的handler相同,請求方式不同進入不同方法處理,訪問的url是一樣的(handler名字是一樣的),但是根據不同的請求方式(get/post)進入不同的方法處理,請求的url一樣,但是請求方式不一樣(get/post)

/**
  * url相同,但是請求方式為GET
  * @RequestMapping註解屬性method
*/
@RequestMapping(value = "gotoResultMethod",method = RequestMethod.GET)
public ModelAndView gotoResultMethodGet(ModelAndView modelAndView){
	modelAndView.addObject( "nowDate",new Date()+"Method=GET");
	modelAndView.setViewName( "index" );
	return modelAndView;
/**
  * url相同,但是請求方式為POST
  * @RequestMapping註解屬性method
*/
@RequestMapping(value = "gotoResultMethod" ,method = RequestMethod.POST)
	public ModelAndView gotoResultMethodPost(ModelAndView modelAndView){
	modelAndView.addobject( "nowDate",new Date()+"Method=POST");
	modelAndView.setViewName( "index" );
	return modelAndView;
}

用法四:

params屬性限定請求引數:支援簡單的表示式語法,url一樣,根據攜帶引數的不同進入不同的方法處理
params屬性限定請求引數,支援簡單的表示式語法,url一樣,根據攜帶引數的不同進入不同的方法處理,url相同,請求方式相同,請求引數不同進入不同hanIder方法處理

<fieldset>
    <h4>用法4 params屬性限定請求引數︰支援簡單的表示式語法,url一樣,根據攜帶引數的不同進入不同的方法處理</h4>
	<a href="http://1ocalhost:8080/user/login. do?type=user">普通使用者</a>
	<a href="http://localhost:8080/user/login. do?type=admin">管理員</a>
	<a href="http://localhost:8080/user/login. do?type=vip">VIP</a>
 </fieldset>
    
 url相同,請求方式相同,請求引數不同
@RequestMapping註解屬性params
id:表示請求必須包含名為id的請求引數
演示:http://localhost:9090/user/gotoResultMethod.action?id=123
!id:表示請求不能包含名為id的請求引數
演示: http://localhost:9090/user/gotoResultMethod.action?id=123
idl=100:
表示請求包含名為param1的請求引數,但其值不能為100
演示: http://localhost:9090/user/gotoResultMethod.action?id=1123213
id!=100”,"name”}:請求必須包含名為id和name的兩個請求引數,
演示: http://localhost:9090/user/gotoResultMethod.action?id=112&name=zhang3

第五節 請求引數繫結

功能一:預設支援ServletAPI

SpringMVC在方法中直接宣告HttpServletRequest,HttpServletResponse,HttpSession即可使用

控制器

@Controller
@RequestMapping("params")
public class DefaultController {
    // 功能一:預設支援ServletAPI
    @RequestMapping("gotoParams")
    public ModelAndView gotoResultURL(HttpServletRequest request, HttpServletResponse response, HttpSession session,ModelAndView modelAndView){
        // 獲取請求引數
        String id = request.getParameter("id");
        String name = request.getParameter("name");

        // 封裝資料
        modelAndView.addObject("nowDate",new Date()+"==="+id+"===="+name);
        // 指定頁面
        modelAndView.setViewName("result");

        return modelAndView;
    }
}

請求引數

    <body>
        <h3>請求引數繫結</h3>
        <fieldset>
            <h4>功能一:預設支援ServletAPI</h4>
            <a href="${pageContext.request.contextPath}/params/gotoParams.do?id=123&name=list">測試路徑2</a>
        </fieldset>
    </body>

功能二:繫結簡單的資料型別

  • 基本資料型別推薦使用包裝類,包裝類可以為null
  • 說明:對於布林型別的引數,請求引數值為true或false。或者1或0
/**
  * 繫結基本資料型別引數
  * 引數的名字,和請求引數的鍵相同
*/
//功能2:繫結簡單資料型別
//http://localhost:9090/param/sendParamsBase.action?isVip=1
@RequestMapping(i"sendParamsBase"])
public ModelAndView sendParamsBase(Boolean isVip,ModelAndView modelAndView){
	modelAndView.addobject("nowDate",new Date()+"===="+ isVip);
	modelAndView.setViewName("Result");
	return mode1AndView;
}


 // 功能二:繫結簡單資料型別
    @RequestMapping("gotoParamsBase")
    public ModelAndView gotoParamsBase( Integer id,ModelAndView modelAndView){

        // 封裝資料
        modelAndView.addObject("nowDate",new Date()+"==="+id);
        // 指定頁面
        modelAndView.setViewName("result");

        return modelAndView;
    }

jsp頁面

        <fieldset>
            <h4>功能二:繫結簡單資料型別</h4>
            <a href="${pageContext.request.contextPath}/params/gotoParamsBase.do?id=123&name=list">測試路徑2</a>
        </fieldset>

功能三:@RequestParam註解使用

當形參和傳遞的引數名稱不一致時使用RequestParam進行手動對映,類似於MyBatis中requestMap的作用

    // 功能三:RequestParam
    @RequestMapping("gotoParamsParam")
    public ModelAndView gotoParamsParam(@RequestParam("id") Integer ids, ModelAndView modelAndView){

        // 封裝資料
        modelAndView.addObject("nowDate",new Date()+"==="+ids);
        // 指定頁面
        modelAndView.setViewName("result");

        return modelAndView;
    }
        <fieldset>
            <h4>功能三RequestParam</h4>
            <a href="${pageContext.request.contextPath}/params/gotoParamsBase.do?id=123">測試路徑2</a>
        </fieldset>

功能四:繫結pojo物件

  • 直接形參生命pojo即可接收
  • 要求:傳遞的引數名必須和pojo屬性名對應
public class User {
    private Integer id;
    private String name;
    private String sex;
}
// get set tonstring  省略
 // 功能四:繫結pojo
    @RequestMapping("gotoParamsPojo")
    public ModelAndView gotoParamsPojo(User user, ModelAndView modelAndView){

        // 封裝資料
        modelAndView.addObject("nowDate",new Date()+"==="+user);
        // 指定頁面
        modelAndView.setViewName("result");

        return modelAndView;
    }
        <fieldset>
            <h4>功能四:繫結pojo物件</h4>
            <a href="${pageContext.request.contextPath}/params/gotoParamsPojo.do?id=123&name=lisi">測試路徑2</a>
        </fieldset>

功能五:繫結pojo物件的包裝類物件

  • 重點在於船艙引數的命名
  • pojo包裝物件首先就是一個普通的pojo,就應該按照上面繫結的pojo的要求來,然後進一步處理,傳參時引數名,首先應該定位到包裝物件的屬性名,如果不能確定資料,通過屬性的方式進一步鎖定即可。
/**
 * 用於對  頁面提交的表單所對應的實體物件
 *
 * entity---> 網頁中表單提交的資料,所對應的JavaBean物件
 * pojo ---> 對應資料庫表的實體類  JavaBean物件
 * @author Lucky
 */
public class QueryVo {
    private User user;

    @Override
    public String toString() {
        return "QueryVo{}";
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

<fieldset>
            <h4>功能五:繫結pojo物件的包裝類物件</h4>
            <a href="${pageContext.request.contextPath}/params/gotoParamsQueryVo.do?user.id=123&user.name=wangyi">測試路徑2</a>
</fieldset>
// 功能五:繫結pojo物件的包裝類物件
    @RequestMapping("gotoParamsQueryVo")
    public ModelAndView gotoParamsQueryVo(QueryVo queryVo, ModelAndView modelAndView){

        // 封裝資料
        modelAndView.addObject("nowDate",new Date()+"==="+queryVo);
        // 指定頁面
        modelAndView.setViewName("result");

        return modelAndView;
    }

功能六:繫結List集合包裝pjo物件

傳遞繫結集合型別(List/Map),作為pojo的一個屬性來傳遞

<fieldset>
            <h4>功能六:繫結集合包裝pojo物件</h4>
            <form action="${pageContext.request.contextPath}/params/gotoParamsList.do" method="get">
                <table>
                    <tr>
                        <th>id</th>
                        <th>name</th>
                        <th>sex</th>
                    </tr>
                    <tr>
                        <td><input type="text" name="userList[0].id" placeholder="請輸入ID"></td>
                        <td><input type="text" name="userList[0].name" placeholder="請輸入姓名"></td>
                        <td><input type="text" name="userList[0].sex" placeholder="請輸入性別"></td>
                    </tr>
                </table>
                <input type="submit" value="提交">
            </form>
        </fieldset>
 private List<User> userList;
// 功能六:繫結集合包裝pojo物件
    @RequestMapping("gotoParamsList")
    public ModelAndView gotoParamsList(QueryVo queryVo, ModelAndView modelAndView){

        // 封裝資料
        modelAndView.addObject("nowDate",new Date()+"==="+queryVo);
        // 指定頁面
        modelAndView.setViewName("result");

        return modelAndView;
    }

功能七:繫結Map集合包裝pojo物件

index.jsp

<fieldset>
            <h4>功能七:繫結Map集合包裝pojo物件</h4>
            <form action="${pageContext.request.contextPath}/params/gotoParamsList.do" method="get">
                <table>
                    <tr>
                        <th>id</th>
                        <th>name</th>
                        <th>sex</th>
                    </tr>
                    <tr>
                        <td><input type="text" name="userMap[user001].id" placeholder="請輸入ID"></td>
                        <td><input type="text" name="userMap[user001].name" placeholder="請輸入姓名"></td>
                        <td><input type="text" name="userMap[user001].sex" placeholder="請輸入性別"></td>
                    </tr>
                </table>
                <input type="submit" value="提交">
            </form>
        </fieldset>

ParamsController控制器中的方法

// 功能七:繫結Map集合包裝pojo物件
    @RequestMapping("gotoParamsMap")
    public ModelAndView gotoParamsMap(QueryVo queryVo, ModelAndView modelAndView){

        // 封裝資料
        modelAndView.addObject("nowDate",new Date()+"==="+queryVo);
        // 指定頁面
        modelAndView.setViewName("result");

        return modelAndView;
    }

第六節 SpringMVC編碼過濾器

前邊的案例中你在輸入框,輸入一下中文試試,會發現控制檯是幾個 ????

隨便寫一個表單

<form action="encodingFilter" method="post">
    <input type="text" name="name" />
    <input type="submit" value="提交">
</form>

控制器

@RequestMapping(value = "encodingFilter",method = RequestMethod.POST)
public String testEncodingFilter(String name){
    System.out.println(name);
    return "success";
}

輸入中文,檢視控制檯

在前端控制器 web.xml中寫

<!-- 配置編碼過濾器:過濾post請求 -->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 初始化引數:編碼格式 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

但是此種方式只能攔截 POST 請求,攔截 GET 請求需要到 Tomcat 中配置

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> 

改為:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/> 

如果遇到 ajax 請求仍然亂碼,把: useBodyEncodingForURI="true" 改為 URIEncoding="UTF-8" 即可。

第七節 訊息頭相關的兩個註解 -- 瞭解

1:RequestHeader

作用: 用於獲取請求訊息頭。

屬性:

  • value:提供訊息頭名稱
  • required:是否必須有此訊息頭

注: 在實際開發中一般不怎麼用。

使用示例 jsp中程式碼:

<!-- RequestHeader註解 --> 
<a href="springmvc/useRequestHeader">獲取請求訊息頭</a> 

控制器中程式碼:

/** 
 * RequestHeader註解 
 * @param user 
 * @return 
 */ 
@RequestMapping("/useRequestHeader") 
public String useRequestHeader(
    @RequestHeader(value="Accept-Language", required=false) 
    String requestHeader){
    System.out.println(requestHeader); 
    return "success"; 
} 

2:CookieValue

作用: 用於把指定 cookie 名稱的值傳入控制器方法引數。

屬性:

  • value:指定 cookie 的名稱。
  • required:是否必須有此 cookie。
<!-- CookieValue註解 --> 
<a href="springmvc/useCookieValue">繫結cookie的值</a> 

控制器中的程式碼:

/**
 * Cookie註解註解 
 * @param user 
 * @return 
 */ 
@RequestMapping("/useCookieValue") 
public String useCookieValue(
    @CookieValue(value="JSESSIONID",required=false) 
    String cookieValue){ 
    System.out.println(cookieValue); 
    return "success"; 
}