1. 程式人生 > >SpringMVC入門丶請求引數繫結丶常用註解

SpringMVC入門丶請求引數繫結丶常用註解

SpringMVC入門

  1. 建立WEB工程,引入依賴

    <!-- 版本鎖定 -->
    <properties>
    <spring.version>5.0.2.RELEASE</spring.version>
    </properties>
    <dependencies>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
    </dependency>
    <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
    </dependency>
    </dependencies>
    
  2. 在web.xml中配置一個核心前端控制器(DispatcherServlet)

    <!--配置一個核心前端控制器-->
    <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:Springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    
  3. 編寫springmvc.xml的配置檔案

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- 配置spring建立容器時要掃描的包 -->
    <context:component-scan base-package="com.qin"></context:component-scan>
    
    <!-- 配置檢視解析器 -->
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--字首-->
    <property name="prefix" value="/WEB-INF/pages/"></property>
    <!--字尾-->
    <property name="suffix" value=".jsp"></property>
    </bean>
    
    <!-- 配置spring開啟註解mvc的支援-->
    <mvc:annotation-driven></mvc:annotation-driven>
    </beans>
    
  4. 編寫Controller

    //表示此類是一個controller
    @Controller
    public class HelloController {
    
        /**
         * 測試path
         * @return
         */
        @RequestMapping(path = "/hello")
        public String hello(){
            System.out.println("hello SpringMVC!");
            return "success";
        }
    
    }
    
  5. 在WEB-INF目錄下建立pages資料夾,編寫success.jsp的成功頁面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>hello</title>
    </head>
    <body>
       <h3>Success!!!</h3>
    </body>
    </html>
    
  • 入門案例的分析
    • 當啟動Tomcat伺服器的時候,因為配置了load-on-startup標籤,所以會建立DispatcherServlet物件,
      就會載入springmvc.xml配置檔案
    • 開啟了註解掃描,那麼HelloController物件就會被建立
    • 從index.jsp傳送請求,請求會先到達DispatcherServlet核心控制器,根據配置@RequestMapping註解
      找到執行的具體方法
    • 根據執行方法的返回值,再根據配置的檢視解析器,去指定的目錄下查詢指定名稱的JSP檔案
    • Tomcat伺服器渲染頁面,做出響應

SpringMVC的一次完整的執行

 

​ RequestMapping註解

1. RequestMapping註解的作用是建立請求URL和處理方法之間的對應關係
2. RequestMapping註解可以作用在方法和類上
    1. 作用在類上:第一級的訪問目錄
    2. 作用在方法上:第二級的訪問目錄
    3. 細節:路徑可以不編寫 / 表示應用的根目錄開始
3. RequestMapping的屬性
    1. path 指定請求路徑的url    
    2. value value屬性和path屬性是一樣的
    3. mthod 指定該方法的請求方式,不寫代表匹配所有 method = {RequestMethod.POST}
    4. params 指定限制請求引數的條件              params = {"username"}
    5. headers 傳送的請求中必須包含的請求頭

請求引數的繫結

  1. 請求引數的繫結說明
    1. 繫結機制
      1. 表單提交的資料都是k=v格式的 username=haha&password=123
      2. SpringMVC的引數繫結過程是把表單提交的請求引數,作為控制器中方法的引數進行繫結的
      3. 要求:提交表單的name和引數的名稱是相同的
    2. 支援的資料型別
      1. 基本資料型別和字串型別
      2. 實體型別(JavaBean)
      3. 集合資料型別(List、map集合等)
  2. 基本資料型別和字串型別
    1. 提交表單的name和引數的名稱是相同的
    2. 區分大小寫
  3. 實體型別(JavaBean)
    1. 提交表單的name和JavaBean中的屬性名稱需要一致
    2. 如果一個JavaBean類中包含其他的引用型別,那麼表單的name屬性需要編寫成:物件.屬性 例如:
      address.name
  4. 給集合屬性資料封裝
    1. 在jsp中姓名:<input type="text" name="list[0].name" >
  5. 請求引數中文亂碼的問題
<!--在web.xml中配置過濾器-->
<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>

6.自定義型別轉換器

​ java為我們提供了一個介面,我們可以通過實現Converter介面來自定義轉換器

​ 1.自定義型別轉換器

//自定義型別轉換器(String->Date)
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        if (source == null){
            throw new RuntimeException("字串不能為空");
        }

        try {
            DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date = sdf.parse(source);
            return date;
        } catch (ParseException e) {
            throw new RuntimeException("字串異常");
        }
    }
}
 2. 註冊自定義型別轉換器,在SpringMvc.xml中編寫配置
<!-- 註冊自定義型別轉換器 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="cn.itcast.utils.StringToDateConverter"/>
        </set>
    </property>
</bean>

<!-- 在Spring對MVC註解的支援中配置conversion-service -->
<mvc:annotation-driven conversion-service="conversionService"/>

常用的註解

  1. RequestParam註解

    1. 作用: 把請求中指定的引數傳遞給控制器中的形參
    2. 屬性 :
      1. value: 請求引數中的名稱
      2. required: 請求引數中是否必須有此引數,預設值是true,即必須提供
    3. 例:
    @RequestMapping(path="/hello")
    public String sayHello(@RequestParam(value="username",required=false)String name) {
        System.out.println(name);
        return "success";
    }
    
  2. RequestBody註解

    1. 作用: 用於獲取請求體的內容(ps:get方法不行)
    2. 屬性
      • required: 是否必須有請求體,預設是true
    3. 例:
    @RequestMapping(path="/hello")
    public String sayHello(@RequestBody String body) {
        System.out.println(body);
        return "success";
    }
    
  3. PathVariable註解

    1. 作用: 用於繫結url中的佔位符.(如/delete/{id},{id}就是佔位符)
    2. 屬性
      • value: 指定url中佔位符的名稱
    3. Restful風格的url
      1. 請求路徑一樣,可以根據不同的請求方式來執行後臺的不同方法
      2. restful風格的url的優點
        1. 結構清晰
        2. 易於理解
        3. 符合標準
        4. 擴充套件方便
    4. 例:
    @RequestMapping(path="/hello/{id}")
    public String sayHello(@PathVariable(value="id") String id) {
        System.out.println(id);
        return "success";
    }
    
  4. RequestHeader註解

    1. 作用:獲取指定請求頭的值
    2. 屬性
      • value:請求頭的名稱
    3. 例:
    @RequestMapping(path="/hello")
    public String sayHello(@RequestHeader(value="Accept") String header) {
        System.out.println(header);
        return "success";
    }
    
  5. CookieValue註解

    1. 作用: 用於獲取指定cookie的名稱的值
    2. 屬性
      • value: cookie的名稱
    3. 例:
    @RequestMapping(path="/hello")
    public String sayHello(@CookieValue(value="JSESSIONID") String cookieValue) {
        System.out.println(cookieValue);
        return "success";
    }
    
  6. ModelAttribute註解

    1. 作用
      1. 出現在方法上:表示當前方法會在控制器方法執行前線執行。
      2. 出現在引數上:獲取指定的資料給引數賦值。
    2. 應用場景
      • 當提交表單資料不是完整的實體資料時,保證沒有提交的欄位使用資料庫原來的資料。