spring mvc RequestMapping注解,參數綁定,自定義類型轉換器


RequestMapping注解

作用:
  用於建立請求 URL 和處理請求方法之間的對應關系
 
出現位置:
類上:
  請求 URL 的第一級訪問目錄。此處不寫的話,就相當於應用的根目錄。寫的話需要以/開頭。
  它出現的目的是為了使我們的 URL 可以按照模塊化管理:
  例如:
    賬戶模塊:
       /account/add
       /account/update
       /account/delete
      ...
    訂單模塊:
       /order/add
       /order/update
       /order/delete
    紅色的部分就是把 RequsetMappding 寫在類上,使我們的 URL 更加精細。
方法上:
  請求 URL 的第二級訪問目錄。
  
屬性:
  value:用於指定請求的 URL。它和 path 屬性的作用是一樣的。
  method:用於指定請求的方式。
  params:用於指定限制請求參數的條件。它支持簡單的表達式。要求請求參數的 key 和 value 必須和配置的一模一樣。
  例如:
    params = {"accountName"},表示請求參數必須有 accountName
    params = {"moeny!100"},表示請求參數中 money 不能是 100。
  headers:用於指定限制請求消息頭的條件。
  注意:以上四個屬性只要出現 2 個或以上時,他們的關系是與的關系。
 
應用:
@Controller
@RequestMapping(path = "/user")
public class HelloController {
    /**
     * 請求映射注解:path=/hello
     *      /hello就變成這個方法執行的請求路徑
     * @return
     */
    @RequestMapping(value = "/hello",method = {RequestMethod.POST,RequestMethod.GET},params = {"username"},headers = {"Accept"})
    public String sayHello(){
        System.out.println("Hello SpringMVC");
        return "success";
    }
}

對應的請求url是/user/hello; 請求方法是POST/GET; 請求參數必須帶有username; 請求頭中必須有Accept參數

<a href="/myWeb/user/hello?username=hehe">12</a> 這樣的超鏈接就是允許的

1

 

參數綁定

SpringMVC 綁定請求參數的過程是通過把表單提交請求參數,作為控制器中方法參數進行綁定的

支持的數據類型
   基本類型參數:
    包括基本類型和 String 類型
   POJO 類型參數:
    包括實體類,以及關聯的實體類
   數組和集合類型參數:
    包括 List 結構和 Map 結構的集合(包括數組)
使用方式:
  如果是基本類型或者 String 類型:
    要求我們的參數名稱必須和控制器中方法的形參名稱保持一致。(嚴格區分大小寫)
  如果是 POJO 類型,或者它的關聯對象:
    要求表單中參數名稱和 POJO 類的屬性名稱保持一致。並且控制器方法的參數類型是 POJO 類型。
  如果是集合類型,有兩種方式:    
    第一種:
      要求集合類型的請求參數必須在 POJO 中。在表單中請求參數名稱要和 POJO 中集合屬性名稱相同。
      給 List 集合中的元素賦值,使用下標。
      給 Map 集合中的元素賦值,使用鍵值對。
    第二種:
      接收的請求參數是 json 格式數據。需要借助一個注解實現

 

應用:

首先准備好兩個javaBean當作請求時提交的參數

User

package cn.cast.domain;

import java.io.Serializable;

public class User implements Serializable {
    private String uname;
    private Integer age;

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                '}';
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
View Code

Account:內含List<User>,Map<String,User>

package cn.cast.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;
    //private User user;

    private List<User> list;
    private Map<String,User> map;

    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    /*public User getUser() {
        return user;
    }

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

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }
}
View Code

定義一個接受請求參數的控制器類

/**
 * 請求參數綁定
 */
@Controller
@RequestMapping("/param")
public class ParamController {
    /**
     * 請求參數綁定入門
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("執行了。。");
        System.out.println("用戶名"+username);
        System.out.println("密碼"+password);
        return "success";
    }
    /**
     * 請求參數綁定:把數據封裝到JavaBean中
     * @return
     */
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println("執行了。。");
        System.out.println(account);
        return "success";
    }
}

用於填寫參數信息,發送請求的頁面param.jsp

<%--
  Created by IntelliJ IDEA.
  User: ASUS
  Date: 2020/4/11
  Time: 15:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <!--請求參數綁定-->
    <!--<a href="/myWeb/param/testParam">請求參數綁定</a>
    <form action="/myWeb/param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br/>
        密碼:<input type="text" name="password"/><br/>
        金額:<input type="text" name="money"/><br/>
        用戶姓名:<input type="text" name="user.uname"/><br/>
        用戶年齡:<input type="text" name="user.age"/><br/>
        <input type="submit" value="提交"/>
    </form>
    -->
    <!--把數據封裝Account類中,類中存在List和Map集合-->
    <form action="/myWeb/param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br/>
        密碼:<input type="text" name="password"/><br/>
        金額:<input type="text" name="money"/><br/>

        <!--這個對象存list-->
        用戶姓名:<input type="text" name="list[0].uname"/><br/>
        用戶年齡:<input type="text" name="list[0].age"/><br/>

        <!--這個對象存map-->
        用戶姓名:<input type="text" name="map['one'].uname"/><br/>
        用戶年齡:<input type="text" name="map['one'].age"/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

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>

 

自定義類型轉換器

當提交的參數需要進行類型轉換時,就需要使用類型轉換器

自定義類型轉換器:將String轉換成Date類

修改User類,其中包含一個Date類

package cn.cast.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private String uname;
    private Integer age;

    private Date date;

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
View Code

param.jsp的提交表單

<!--使用自定義類型轉換器,將date從String轉換成Date-->
    <form action="/myWeb/param/saveUser" method="post">
        用戶姓名:<input type="text" name="uname"/><br/>
        用戶年齡:<input type="text" name="age"/><br/>
        用戶生日:<input type="text" name="date"/><br/>
        <input type="submit" value="提交"/>
    </form>

自定義類型轉換器,當遇到格式為yyyy-MM-dd的字符串,且其目標類型是日期類時,就將其進行轉換

/**
 * 字符串轉換成日期
 */
public class StringToDateConverter implements Converter<String,Date> {

    /**
     * 傳進來的字符串
     * @param sourse
     * @return
     */
    @Override
    public Date convert(String sourse) {
        if(sourse==null){
            throw new RuntimeException("請傳入數據");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return df.parse(sourse);
        } catch (ParseException e) {
            throw new RuntimeException("數據類型轉換錯誤");
        }
    }
}

在springmvc.xml里進行配置

!-- 配置自定義類型轉換器 -->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <!--注入自己寫的類-->
            <set>
                <bean class="cn.cast.utils.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--開啟SpringMVC框架注解的支持,配置類型轉換器使其生效-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM