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 個或以上時,他們的關系是與的關系。
應用:
View Code
View Code
View Code
@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; } }
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; } }
定義一個接受請求參數的控制器類
/** * 請求參數綁定 */ @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; } }
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"/>