SpringMVC的请求

请求参数类型介绍

客户端请求参数的格式: name=value&name2=value2...

服务器要获取请求的参数的时候要进行类型转换,有时还需要进行数据的封装。

SpringMVC可以接收如下类型的参数:

  • 基本类型参数
  • 对象类型参数
  • 数组类型参数
  • 集合类型参数

获取基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且自动做类型转换。

自动的类型转换是指从String向其他类型的转换。

<a href="${pageContext.request.contextPath}/user/simpleParam?id=1&username=杰克"> 
    基本类型
</a>
@RequestMapping("/simpleParam")
public String simpleParam(Integer id, String username) {
    System.out.println(id);
    System.out.println(username);
    return "success";
}

获取对象类型参数

Controller中的业务方法参数的POJO属性名与请求参数的name一致,参数值会自动映射匹配。

<form action="${pageContext.request.contextPath}/user/pojoParam" method="post">
    编号:<input type="text" name="id"><br>
    用户名:<input type="text" name="username"><br>
    <input type="submit" value="对象类型">
</form>
public class User {
	Integer id;
	String username;
	
	// setter getter略过... 
}
@RequestMapping("/pojoParam")
public String pojoParam(User user) {
    System.out.println(user);
    return "success";
}

中文乱码过滤器

当进行post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。

<!--配置全局过滤的filter-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <!-- 将编码方式设置为UTF-8 -->
        <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>

获取数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。

<form action="${pageContext.request.contextPath}/user/arrayParam">
    编号:<br>
    <input type="checkbox" name="ids" value="1">1<br>
    <input type="checkbox" name="ids" value="2">2<br>
    <input type="checkbox" name="ids" value="3">3<br>
    <input type="checkbox" name="ids" value="4">4<br>
    <input type="checkbox" name="ids" value="5">5<br>
    <input type="submit" value="数组类型">
</form>
@RequestMapping("/arrayParam")
public String arrayParam(Integer[] ids) {
    System.out.println(Arrays.toString(ids));
    return "success";
}

获取集合(复杂)类型参数

获取集合参数时,需要将集合参数封装到一个POJO中。

<form action="${pageContext.request.contextPath}/user/queryParam" method="post">
    搜索关键字:
    <input type="text" name="keyword"><br>
    user对象:
    <input type="text" name="user.id" placeholder="编号">
    <input type="text" name="user.username" placeholder="姓名"><br>
    list集合<br>
    第一个元素:
    <input type="text" name="userList[0].id" placeholder="编号">
    <input type="text" name="userList[0].username" placeholder="姓名"><br>
    第二个元素:
    <input type="text" name="userList[1].id" placeholder="编号">
    <input type="text" name="userList[1].username" placeholder="姓名"><br>
    map集合<br>
    第一个元素:
    <input type="text" name="userMap['u1'].id" placeholder="编号">
    <input type="text" name="userMap['u1'].username" placeholder="姓名"><br>
    第二个元素:
    <input type="text" name="userMap['u2'].id" placeholder="编号">
    <input type="text" name="userMap['u2'].username" placeholder="姓名"><br>
    <input type="submit" value="复杂类型">
</form>
public class QueryVo {
    private String keyword;
    private User user;
    private List<User> userList;
    private Map<String, User> userMap;
}
@RequestMapping("/queryParam")
public String queryParam(QueryVo queryVo) {
    System.out.println(queryVo);
    return "success";
}

自定义类型转换器

SpringMVC 默认已经提供了一些常用的类型转换器。

例如:客户端提交的字符串转换成int型进行参数设置,日期格式类型的要求:yyyy/MM/dd ,否则会报错。

而对于特有的行为,SpringMVC提供了自定义类型转换器便于开发者自定义处理。

<form action="${pageContext.request.contextPath}/user/converterParam">
    生日:
    <input type="text" name="birthday">
    <input type="submit" value="自定义类型转换器">
</form>
public class DateConverter implements Converter<String, Date> {
    public Date convert(String dateStr) {
        // 将日期字符串转换成日期对象返回 
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}
<!--处理器映射器和适配器增强-->
<mvc:annotation-driven conversion-service="conversionService"/>

<!--自定义转换器配置-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="converter.DateConverter"/>
        </set>
    </property>
</bean>
@RequestMapping("/converterParam")
public String converterParam(Date birthday) {
    System.out.println(birthday);
    return "success";
}

相关注解

@RequestParam

当请求的参数name名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定

<a href="${pageContext.request.contextPath}/user/findByPage?pageNo=2"> 
    分页查询 
</a>
// @RequestParam()注解的参数说明:
//       defaultValue 设置参数默认值
//       name 匹配页面传递参数的名称
//       required 设置是否必须传递参数,默认值为true;如果设置了默认值,值自动改为false

@RequestMapping("/findByPage")
public String findByPage(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize) {
    System.out.println(pageNum);
    System.out.println(pageSize);
    return "success";
}

@RequestHeader

用于获取请求头的数据。

@RequestMapping("/requestHead")
public String requestHead(@RequestHeader("cookie") String cookie) {
    System.out.println(cookie);
    return "success";
}

@CookieValue

用于获取Cookie中的数据。

@RequestMapping("/cookieValue")
public String cookieValue(@CookieValue("JSESSIONID") String jesessionId) {
    System.out.println(jesessionId);
    return "success";
}

获取Servlet相关API

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:

@RequestMapping("/servletAPI")
public String servletAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
    System.out.println(request);
    System.out.println(response);
    System.out.println(session);
    return "success";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值