1. 请求参数类型介绍
客户端请求参数的格式是: name=value&name=value……
服务器要获取请求的参数的时候要进行类型转换,有时还需要进行数据的封装
SpringMVC可以接收如下类型的参数:
- 基本类型参数
- 对象类型参数
- 数组类型参数
- 集合类型参数
2. 获取基本类型参数
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自 动做类型转换;自动的类型转换是指从String向其他类型的转换。
jsp:
<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一致,参数值会自动映射匹配
JSP:
<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>
实体类:
package com.lagou.domain;
public class User {
private Integer id;
private String username;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
控制器:
package com.lagou.controller;
import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/user") //一级访问目录
public class UserController {
// http://localhost:8080/springmvc_quickstart/user/quick /一级访问目录/二级访问目录
/*
path :作用等同于value,同样是设置方法的映射地址
method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
*/
@RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
public String quick(Integer id){
// 业务逻辑
System.out.println("springmvc入门成功.....");
// 视图跳转 逻辑视图名
return "success";
}
/*
获取对象类型请求参数
*/
@RequestMapping("/pojoParam")
public String pojoParam(User user){
System.out.println(user);
return "success";
}
}
4. 中文乱码过滤器
当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤
<!--在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>
5. 获取数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配
JSP:
<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>
package com.lagou.controller;
import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {
// http://localhost:8080/springmvc_quickstart/user/quick /一级访问目录/二级访问目录
/*
path :作用等同于value,同样是设置方法的映射地址
method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
*/
@RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
public String quick(Integer id){
// 业务逻辑
System.out.println("springmvc入门成功.....");
// 视图跳转 逻辑视图名
return "success";
}
/*
获取数组类型请求参数
*/
@RequestMapping("/arrayParam")
public String arrayParam(Integer[] ids){
System.out.println(Arrays.toString(ids));
return "success";
}
}
6. 获取集合(复杂)类型参数
获得集合参数时,要将集合参数包装到一个POJO中才可以
JSP:
<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>
实体类:
package com.lagou.domain;
import java.util.List;
import java.util.Map;
public class QueryVo {
private String keyword;
private User user;
private List<User> userList;
private Map<String,User> userMap;
@Override
public String toString() {
return "QueryVo{" +
"keyword='" + keyword + '\'' +
", user=" + user +
", userList=" + userList +
", userMap=" + userMap +
'}';
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public Map<String, User> getUserMap() {
return userMap;
}
public void setUserMap(Map<String, User> userMap) {
this.userMap = userMap;
}
}
控制器:
package com.lagou.controller;
import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {
// http://localhost:8080/springmvc_quickstart/user/quick /一级访问目录/二级访问目录
/*
path :作用等同于value,同样是设置方法的映射地址
method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
*/
@RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
public String quick(Integer id){
// 业务逻辑
System.out.println("springmvc入门成功.....");
// 视图跳转 逻辑视图名
return "success";
}
/*
获取集合(复杂)类型请求参数
*/
@RequestMapping("/queryParam")
public String queryParam(QueryVo queryVo){
System.out.println(queryVo);
return "success";
}
}
7.自定义类型转换器
SpringMVC 默认已经提供了一些常用的类型转换器;例如:客户端提交的字符串转换成int型进行参数设置,日期格式类型要求为:yyyy/MM/dd 不然的话会报错,对于特有的行为,SpringMVC提供了自定义类型转换器方便开发者自定义处理。
JSP:
<form action="${pageContext.request.contextPath}/user/converterParam">
生日:<input type="text" name="birthday">
<input type="submit" value="自定义类型转换器">
</form>
日期转换类:
package com.lagou.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
// s就是表单传递过来的请求参数 2012-12-12
@Override
public Date convert(String s) {
// 将日期字符串转换成日期对象,进行返回
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
SpringMVC核心配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--处理器映射器-处理器适配器 进行了功能的增强:支持json的读写-->
<mvc:annotation-driven conversion-service="conversionService" />
<!--自定义类型转换器配置-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.lagou.converter.DateConverter"/>
</set>
</property>
</bean>
</beans>
控制器:
package com.lagou.controller;
import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {
// http://localhost:8080/springmvc_quickstart/user/quick /一级访问目录/二级访问目录
/*
path :作用等同于value,同样是设置方法的映射地址
method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
*/
@RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
public String quick(Integer id){
// 业务逻辑
System.out.println("springmvc入门成功.....");
// 视图跳转 逻辑视图名
return "success";
}
/*
获取日期类型参数:(自定义类型转换器)
*/
@RequestMapping("/converterParam")
public String converterParam(Date birthday){
System.out.println(birthday);
return "success";
}
}
8. 相关注解
@RequestParam
当请求的参数name名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注 解显示的绑定。
JSP:
<a href="${pageContext.request.contextPath}/user/findByPage?pageNo=2">
分页查询
</a>
控制器:
package com.lagou.controller;
import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {
// http://localhost:8080/springmvc_quickstart/user/quick /一级访问目录/二级访问目录
/*
path :作用等同于value,同样是设置方法的映射地址
method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
*/
@RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
public String quick(Integer id){
// 业务逻辑
System.out.println("springmvc入门成功.....");
// 视图跳转 逻辑视图名
return "success";
}
/*
演示@RequestParam注解
*/
/*
@RequestParam
name: 匹配页面传递参数的名称
defaultValue: 设置参数的默认值
required:设置是否必须传递该参数,默认值为true,如果设置了默认值,值自动改为false
*/
@RequestMapping("findByPage")
public String findByPage(@RequestParam(name = "pageNo",defaultValue = "1",required = false)Integer pageNum, @RequestParam(defaultValue = "5")Integer pageSize){
System.out.println(pageNum); //2
System.out.println(pageSize); //5
return "success";
}
}
@RequestHeader
获取请求头的数据。
package com.lagou.controller;
import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {
// http://localhost:8080/springmvc_quickstart/user/quick /一级访问目录/二级访问目录
/*
path :作用等同于value,同样是设置方法的映射地址
method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
*/
@RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
public String quick(Integer id){
// 业务逻辑
System.out.println("springmvc入门成功.....");
// 视图跳转 逻辑视图名
return "success";
}
/*
@ReuqestHeader注解的使用
*/
@RequestMapping("/RequestHeader")
public String requestHead(@RequestHeader("cookie") String cookie){
System.out.println(cookie);
return "success";
}
}
@CookieValue
获取cookie中的数据。
package com.lagou.controller;
import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/user") //一级访问目录
@SessionAttributes("username") //向request域中(model)中存入key为username时,会同步到session域中
public class UserController {
// http://localhost:8080/springmvc_quickstart/user/quick /一级访问目录/二级访问目录
/*
path :作用等同于value,同样是设置方法的映射地址
method:用来限定请求的方式 RequestMethod.POST:只能以post的请求方式访问该访问,其他请求方式会报错
params:用来限定请求参数的条件 params={"accountName"} 表示请求参数中必须有accountName
*/
@RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"}) // 二级访问目录
public String quick(Integer id){
// 业务逻辑
System.out.println("springmvc入门成功.....");
// 视图跳转 逻辑视图名
return "success";
}
/*
@CookieValue注解的使用
*/
@RequestMapping("/cookieValue")
public String cookieValue(@CookieValue("JSESSIONID") String jsessionId){
System.out.println(jsessionId);
return "success";
}
}
9. 获取Servlet相关API
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下。
/*
原始serlvetAPI的获取
*/
@RequestMapping("/servletAPI")
public String servletAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
// posthandler
return "success";
}
节选自拉钩教育JAVA系列课程
本文详细介绍了SpringMVC如何处理各种类型的请求参数,包括基本类型、对象类型、数组、集合以及复杂类型参数。同时,讲解了中文乱码的过滤器配置、自定义类型转换器的实现,并展示了@RequestParam、@RequestHeader和@CookieValue注解的使用,以及如何获取Servlet相关API。此外,还涵盖了处理日期类型的自定义转换器。
1083

被折叠的 条评论
为什么被折叠?



