使用传统的Request对象接收参数
- 以下的内容都是紧接着前面的文章的如果你想来玩这个 Demo 请自行参考前面文章开始玩下来即可
- 页面代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>receive parameter</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/myController.action" method="get">
商品名称:<input type="text" placeholder="请输入商品名称" name="goods_name"/>
<br/>
商品价格:<input type="text" placeholder="请输入商品价格" name="goods_price"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
MyFirstController
代码如下:
- SpringMVC 框架会自动把
Request
对象传递给方法
/**
* @author: BNTang
**/
@Controller
public class MyFirstController {
@RequestMapping("/myController.action")
public ModelAndView show(HttpServletRequest request) {
String goods_name = request.getParameter("goods_name");
String goods_price = request.getParameter("goods_price");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("goods_name", goods_name);
modelAndView.addObject("goods_price", goods_price);
modelAndView.setViewName("/first");
return modelAndView;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC-入门程序</title>
</head>
<body>
商品名称 → ${goods_name}
<br/>
商品价格 → ${goods_price}
</body>
</html>
不使用Request对象来接收简单数据类型的参数
- 当请求的参数名称和处理器
形参
名称一致时会将请求参数与形参进行绑定
@RequestParam
- 形参的类型与绑定的类型不一致时,可以使用
@RequestParam
进行绑定
value
:请求参数名字
required
:是否必须,默认是 true
,表示请求中一定要有相应的参数,否则将报错
defaultValue
:默认值,表示如果请求中没有同名参数时的默认值,也就是没有相关的参数会自动的设置一个默认值
接收JavaBean对象的参数
- 要求对象当中的属性要和表单当中的名称一致
- 创建
Goods
/**
* @author: BNTang
**/
public class Goods {
private String goods_name;
private String goods_price;
public String getGoods_name() {
return goods_name;
}
public void setGoods_name(String goods_name) {
this.goods_name = goods_name;
}
public String getGoods_price() {
return goods_price;
}
public void setGoods_price(String goods_price) {
this.goods_price = goods_price;
}
}
/**
* @author: BNTang
**/
@Controller
public class MyFirstController {
@RequestMapping("/myController.action")
public ModelAndView show(Goods goods) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("goods", goods);
modelAndView.setViewName("/first");
return modelAndView;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC-入门程序</title>
</head>
<body>
商品名称 → ${goods.goods_name}
<br/>
商品价格 → ${goods.goods_price}
</body>
</html>
接收数组类型的参数
name
相同时,可以使用数组的形式来接收对应的参数
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>receive parameter</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/myController.action" method="get">
商品名称:<input type="text" placeholder="请输入商品名称" name="goods_name"/>
<br/>
商品价格:<input type="text" placeholder="请输入商品价格" name="goods_price"/>
<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>
/**
* @author: BNTang
**/
public class Goods {
private String goods_name;
private String goods_price;
private String hobby[];
@Override
public String toString() {
return "Goods{" +
"goods_name='" + goods_name + '\'' +
", goods_price='" + goods_price + '\'' +
", hobby=" + Arrays.toString(hobby) +
'}';
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getGoods_name() {
return goods_name;
}
public void setGoods_name(String goods_name) {
this.goods_name = goods_name;
}
public String getGoods_price() {
return goods_price;
}
public void setGoods_price(String goods_price) {
this.goods_price = goods_price;
}
}
/**
* @author: BNTang
**/
@Controller
public class MyFirstController {
@RequestMapping("/myController.action")
public String show(Goods goods) {
System.out.println(goods);
return "/first";
}
}
接收包装类类型的参数
/**
* @author: BNTang
**/
public class QueryVO {
private Goods goods;
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>receive parameter</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/myController.action" method="get">
商品名称:<input type="text" placeholder="请输入商品名称" name="goods.goods_name"/>
<br/>
商品价格:<input type="text" placeholder="请输入商品价格" name="goods.goods_price"/>
...
</form>
</body>
</html>
/**
* @author: BNTang
**/
@Controller
public class MyFirstController {
@RequestMapping("/myController.action")
public ModelAndView show(QueryVO queryVO) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("queryVO", queryVO);
modelAndView.setViewName("/first");
return modelAndView;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC-入门程序</title>
</head>
<body>
商品名称 → ${queryVO.goods.goods_name}
<br/>
商品价格 → ${queryVO.goods.goods_price}
</body>
</html>
接收List集合类型的参数
/**
* @author BNTang
**/
public class Dog {
private String name;
private String color;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>receive parameter</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/myController.action" method="get">
商品名称:<input type="text" placeholder="请输入商品名称" name="goods_name"/>
<br/>
商品价格:<input type="text" placeholder="请输入商品价格" name="goods_price"/>
<br/>
<h1>宠物</h1>
宠物名称:<input type="text" name="dogs[0].name"/>
宠物颜色:<input type="text" name="dogs[0].color"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
/**
* @author: BNTang
**/
public class Goods {
private String goods_name;
private String goods_price;
private List<Dog> dogs;
@Override
public String toString() {
return "Goods{" +
"goods_name='" + goods_name + '\'' +
", goods_price='" + goods_price + '\'' +
", dogs=" + dogs +
'}';
}
public String getGoods_name() {
return goods_name;
}
public void setGoods_name(String goods_name) {
this.goods_name = goods_name;
}
public String getGoods_price() {
return goods_price;
}
public void setGoods_price(String goods_price) {
this.goods_price = goods_price;
}
public List<Dog> getDogs() {
return dogs;
}
public void setDogs(List<Dog> dogs) {
this.dogs = dogs;
}
}
/**
* @author: BNTang
**/
@Controller
public class MyFirstController {
@RequestMapping("/myController.action")
public String show(Goods goods) {
System.out.println(goods);
return "/first";
}
}
自定义参数绑定
需求
- 修改商品日期
- 由于日期数据有很多种格式,SpringMVC 没办法把字符串转换成日期类型
- 所以需要自定义参数绑定
分析
- 前端控制器接收到请求后,找到注解形式的处理器适配器
- 对
RequestMapping
标记的方法进行适配,并对方法中的形参进行参数绑定
- 内部已经定义了很多的转换器,比如可以直接使用
int
类型来接收字符串
- 日期类型与字符串比较特殊,字符串的日期格式,有很多种,可以自己来定义是哪种格式的转换
- 可以在 SpringMVC 处理器适配器上自定义转换器
Converter
进行参数绑定
开始实现
- 把发布时间对象的字符串转换成日期接收
- 修改
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>receive parameter</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/myController.action" method="get">
商品名称:<input type="text" placeholder="请输入商品名称" name="goods_name"/>
<br/>
商品价格:<input type="text" placeholder="请输入商品价格" name="goods_price"/>
<br/>
发布时间:<input type="text" placeholder="请输入发布时间" name="goods_date"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
/**
* @author: BNTang
**/
public class Goods {
private String goods_name;
private String goods_price;
private Date goods_date;
@Override
public String toString() {
return "Goods{" +
"goods_name='" + goods_name + '\'' +
", goods_price='" + goods_price + '\'' +
", goods_date=" + goods_date +
'}';
}
public String getGoods_name() {
return goods_name;
}
public void setGoods_name(String goods_name) {
this.goods_name = goods_name;
}
public String getGoods_price() {
return goods_price;
}
public void setGoods_price(String goods_price) {
this.goods_price = goods_price;
}
public Date getGoods_date() {
return goods_date;
}
public void setGoods_date(Date goods_date) {
this.goods_date = goods_date;
}
}
/**
* @author BNTang
**/
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
if (null != source) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.parse(source);
}
} catch (Exception e) {
System.out.println("转换异常");
}
return null;
}
}
- 在 SpringMVC 核心配置文件当中配置自定义转换器
...
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="top.it6666.converter.DateConverter"/>
</list>
</property>
</bean>
...
- 控制台代码如下
MyFirstController
/**
* @author: BNTang
**/
@Controller
public class MyFirstController {
@RequestMapping("/myController.action")
public String show(Goods goods) {
System.out.println(goods);
return "/first";
}
}