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