3.SpringMVC的不同参数类型请求

1.请求参数类型介绍

客户端请求参数的格式是: name=value&name=value……

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

Spring MVC可以接收如下类型的参数

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

2.获取基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动进行类型的转换;自动的类型转换是指从String向其他类型的转换。

  • 参数传递过程中都是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";
}

3.获取对象类型参数

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";
}

4.设置中文乱码过滤器

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

<!--配置全局过滤的filter-->
<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>/*

5.获取数组类型参数

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";
}

6.获取集合类型参数

获取集合参数时,要将集合参数包装到一个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";
}

7 自定义类型转换器

SpringMVC 默认已经提供了一些常用的类型转换器;例如:客户端提交的字符串转换成int型进行参数设置,日期格式类型要求为:yyyy/MM/dd 不然的话会报错,对于特有的行为,SpringMVC提供了自定义类型转换器方便开发者自定义处理。

  • ${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> 。
    • 也就是取出部署的应用程序名或者是当前的项目名称
    • 比如我的项目名称是demo1在浏览器中输入为http://localhost:8080/demo1/a.jsp${pageContext.request.contextPath}或**<%=request.getContextPath()%>取出来的就是/demo1**,而"/"代表的含义就是http://localhost:8080
<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;
 }
}

spring-mvc.xml配置:

当进行日期转换时,自定义类型转换器配置。

注意:要使自定义类型转换器生效,需在处理器映射器和适配器配置后加:conversion-service=" "

<!--处理器映射器和适配器增强-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-
driven>
<!--自定义转换器配置-->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
  <property name="converters">
    <set>
      <bean class="com.lagou.converter.DateConverter"></bean>
    </set>
  </property>
</bean>
@RequestMapping("/converterParam")
public String converterParam(Date birthday) {
  System.out.println(birthday);
  return "success";
}

8 相关注解

@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";
}

9 获取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";
}

你可能感兴趣的:(SpringMVC,java,mvc,spring,springMVC)