本文已参与「新人创作礼」活动,一起开启掘金创作之路
使用传统的request对象接收参数(参数名称要一致)
SpringMVC框架会自动把Request对象传递给方法,只需要根据名称即可获取对应的值
1. goods.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Goods.jsp</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/myform.action" method="post">
商品名称:<input type="text" placeholder="输入商品名称" name="goods_name"><br>
商品价格:<input type="text" placeholder="输入商品价格" name="goods_price"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
2. result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>result.jsp</title>
</head>
<body>
提交结果<br>
商品名称:${goods_name}<br>
商品价格:${goods_price}<br>
</body>
</html>
3. Controller.java
@Controller
public class MyFirstController {
@RequestMapping("/myform.action")
public ModelAndView myform(HttpServletRequest request){
//获取数据
String goods_name = request.getParameter("goods_name");
String goods_price = request.getParameter("goods_price");
//创建ModelAndView用来存放数据和视图
ModelAndView modelAndView = new ModelAndView();
//设置数据到视图中
modelAndView.addObject("goods_name",goods_name);
modelAndView.addObject("goods_price",goods_price);
//设置视图
modelAndView.setViewName("result");//会根据springMVC.xml中的配置自动拼接成/result.jsp
//将modelAndView返回
return modelAndView;
}
}
4. 运行结果
不使用request对象接收简单类型参数
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。
如果形参的类型与绑定的类型不一致时,可以使用@RequestParam进行匹配
@RequestParam使用说明:
value:请求参数名称
required:是否必须(默认为true),表示请求中一定要有相应的参数,否则会报错
defaultValue:设置默认值,表示请求中如果没有同名的参数,则使用defaultValue中的值
使用javaBean对象接收参数(要求对象当中的属性要和表单当中的名称一致)
1. Goods.java
@Setter @Getter @ToString
public class Goods {
private String goods_name;
private String goods_price;
}
2. result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>result.jsp</title>
</head>
<body>
提交结果<br>
商品名称:${goods.goods_name}<br>
商品价格:${goods.goods_price}<br>
</body>
</html>
3. Controller.java
@Controller
public class MyFirstController {
@RequestMapping("/myform.action")
public ModelAndView myform(Goods goods){
//创建ModelAndView用来存放数据和视图
ModelAndView modelAndView = new ModelAndView();
//设置数据到视图中
modelAndView.addObject("goods",goods);
//设置视图
modelAndView.setViewName("result");//会根据springMVC.xml中的配置自动拼接成/result.jsp
//将modelAndView返回
return modelAndView;
}
}
使用数组接收参数(name相同时可以使用数组来接收对应的参数)
1. 编写User类
public class User {
private String user_name;
private String user_age;
private String hobby[];
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public void setUser_age(String user_age) {
this.user_age = user_age;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getUser_name() {
return user_name;
}
public String getUser_age() {
return user_age;
}
public String[] getHobby() {
return hobby;
}
@Override
public String toString() {
return "User{" +
"user_name='" + user_name + ''' +
", user_age='" + user_age + ''' +
", hobby=" + Arrays.toString(hobby) +
'}';
}
}
2. First.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>First.jsp</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/mysubmit.action" method="post">
user:<input type="text" name="user_name"><br>
age:<input type="text" name="user_age" ><br>
爱好:<input type="checkbox" name="hobby" value="篮球"> 篮球
<input type="checkbox" name="hobby" value="乒乓球"> 乒乓球
<input type="checkbox" name="hobby" value="足球"> 足球
<input type="submit" value="提交">
</form>
</body>
</html>
3. Controller.java
@Controller
public class MyController {
@RequestMapping("/mysubmit.action")
public String myform(User user){
System.out.println(user);
return "second" ;
}
}
运行结果
使用包装类接收参数
1. 创建包装类Vo
public class Vo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Vo{" +
"user=" + user +
'}';
}
}
2. first.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>First.jsp</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/mysubmit.action" method="post">
user:<input type="text" name="user.user_name"><br>
age:<input type="text" name="user.user_age" ><br>
爱好:<input type="checkbox" name="user.hobby" value="篮球"> 篮球
<input type="checkbox" name="user.hobby" value="乒乓球"> 乒乓球
<input type="checkbox" name="user.hobby" value="足球"> 足球
<input type="submit" value="提交">
</form>
</body>
</html>
3. Controller.java
@Controller
public class MyController {
@RequestMapping("/mysubmit.action")
public String myform(Vo vo){
System.out.println(vo);
return "second" ;
}
}
4. 运行结果
List集合接收参数
1. 创建Dog类
public class Dog {
private String name;
private String color;
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
public String getName() {
return name;
}
public String getColor() {
return color;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + ''' +
", color='" + color + ''' +
'}';
}
}
2. 创建User类
public class User {
private String user_name;
private String user_age;
private String hobby[];
private Dog dog;
private List<Dog> dogs;
public void setDog(Dog dog) {
this.dog = dog;
}
public void setDogs(List<Dog> dogs) {
this.dogs = dogs;
}
public Dog getDog() {
return dog;
}
public List<Dog> getDogs() {
return dogs;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public void setUser_age(String user_age) {
this.user_age = user_age;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getUser_name() {
return user_name;
}
public String getUser_age() {
return user_age;
}
public String[] getHobby() {
return hobby;
}
@Override
public String toString() {
return "User{" +
"user_name='" + user_name + ''' +
", user_age='" + user_age + ''' +
", hobby=" + Arrays.toString(hobby) +
", dog=" + dog +
", dogs=" + dogs +
'}';
}
}
3. first.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>First.jsp</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/mysubmit.action" method="post">
user:<input type="text" name="user_name"><br>
age:<input type="text" name="user_age" ><br>
爱好:<input type="checkbox" name="hobby" value="篮球"> 篮球
<input type="checkbox" name="hobby" value="乒乓球"> 乒乓球
<input type="checkbox" name="hobby" value="足球"> 足球
<br>-------------------宠物-------------------------<br>
宠物名称:<input type="text" name="dog.name"><br>
宠物颜色:<input type="text" name="dog.color"><br>
<br>-------------------宠物-------------------------<br>
宠物名称:<input type="text" name="dogs[0].name"><br>
宠物颜色:<input type="text" name="dogs[0].color"><br>
<br>-------------------宠物-------------------------<br>
宠物名称:<input type="text" name="dogs[1].name"><br>
宠物颜色:<input type="text" name="dogs[1].color"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
4. Controller
@Controller
public class MyController {
@RequestMapping("/mysubmit.action")
public String myform(User user){
System.out.println(user);
return "second" ;
}
}
5. 运行结果
自定义参数绑定
根据业务需求自定义数据显示格式
例如:业务要求时间格式为yyyy:MM-dd
由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。
分析过程:
前端控制器接收到请求后,找到注解形式的处理器适配器;对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定;内部已经定义了很多的转换器,比如可以直接使用int类型来接收字符串;日期类型与字符串比较特殊,字符串的日期格式,有很多种.可以自己来定义是哪种格式的转换;可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。
实现步骤:
1. 创建转换器
/**
*转换日期类型的数据
* S:页面传过来的数据
* T:转换后的类型
*/
public class DateConverter implements Converter<String,Date> {
@Override
public Date convert(String source) {
try {
if (source != null) {
DateFormat df = new SimpleDateFormat("yyyy:MM-dd HH_MM:SS");
return df.parse(source);
}
}catch (Exception e) {
System.out.println("转换异常");
}
return null;
}
}
2. 在springMVC核心配置文件当中配置自定义转换器
<mvc :annotation-driven conversion-service **="conversionServiceFactoryBean" **/>
<bean id **="conversionServiceFactoryBean" **class **="org.springframework.format.support.FormattingConversionServiceFactoryBean" **>
**<property name **="converters" **>
<list>
<bean class **="demo1.util.DateConverter" **/>
</list>
</property>
</bean>
配置好的springMVC.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 扫描指定包下的注解 -->
<context:component-scan base-package="demo1.Controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置逻辑视图的前缀 -->
<property name="prefix" value="/"/>
<!-- 配置逻辑视图的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 注解驱动 -->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
<!-- 配置Convert转换器 转换工厂 -->
<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 可以配置多个转换器 -->
<property name="converters">
<list>
<bean class="demo1.util.DateConverter"/>
</list>
</property>
</bean>
</beans>
3. convert.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>日期转换器</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/convert.action" method="post">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
生日:<input type="text" name="date"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
4. ConvertController.java
@Controller
public class ConvertController {
@RequestMapping("/convert.action")
public void commit(String age, String name, Date date){
System.out.println(age);
System.out.println(name);
//日期转为字符串,并设置输出的格式为yyyy-mm-dd
String formatDate = new SimpleDateFormat("yyyy-mm-dd").format(date);
System.out.println(formatDate);
}
}
5. 运行结果
由于我们设置了字符串转日期的格式为yyyy:mm-dd,所以我们输入其他格式的字符串时都会报错,我们将日期输入值改为2020:01-19即可
此时可以看到控制台按照我们的要求打印出了对应的值
Post请求中文乱码
当发送post请求时,带有中文的参数会发生乱码
解决办法:在web.xml当中添加一个过滤器
完整web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMVC配置文件 -->
<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 启动服务器,加载SpringMVC控制器 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!-- 设置所有以action结尾的请求进入SpringMVC -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 解决post乱码问题 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 设置编码参是UTF8 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>