SpringMVC学习笔记-请求
请求参数(重点)
SpringMVC将传递的参数封装到处理器方法的形参中,达到快速访问参数的目的。
普通类型参数传参
@RequestMapping("/requestParam1")
public String requestParam1(String name){
System.out.println(name);
return "page.jsp";
}
访问地址
http://localhost/requestPram1?name=Harmony
@RequestMapping("/requestParam1")
public String requestParam1(String name,int age){
System.out.println(name + " " + age);
return "page.jsp";
}
访问地址
http://localhost/requestParam1?name=Harmony&age=14
注意:参数名与处理器方法形参名要保持一致!即访问的地址参数名输入不是name,或者个数一致浏览器都是会报错的!
参数设定
@RequestParam 的使用
类型: 形参注解
位置:处理器类中的方法形参前方
作用:绑定请求参数与对应处理方法形参间的关系
@RequestMapping("/requestParam2")
public String requestParam2(@RequestParam(name = "userName",
required = true,
defaultValue = "Harmony") String name) {
System.out.println("name="+name);
return "page.jsp";
}
访问地址
http://localhost/requestParam2?userName=Jock
这里的参数是name,我们可以通过@RequestParam给参数取别名。required为true表示必须传参,defaultValue的值表示该参数的默认值,即若不写参数,就默认为Harmony!
POJO类型参数传参
大致包含一下几个内容

当POJO中使用简单类型属性时, 参数名称与POJO类属性名保持一致

问:在user类中有name和age两个属性,那么如果有一个简单属性age和实体类user中的age那么怎么给它们传参?
参数冲突
当POJO类型属性与其他形参出现同名问题时,将被同时赋值

解决办法
建议使用@RequestParam注解进行区分
上述讲到可以起别名,我们用@RequestParam("userAge"),将简单属性age取别名为userAge,除此之外没有更好的解决办法了!
// http://localhost/requestParam4?name=Jock&age=39
@RequestMapping("/requestParam4")
public String requestParam4(User user,@RequestParam("userAge") int age){
System.out.println(user+" "+age);
return "page.jsp";
}
复杂POJO类型参数
(1)当POJO中出现对象属性时,参数名称与对象层次结构名称保持一致

在User实体类中有引用类型address,传参时我们用层次关系即可。
address是一级属性,province是二级属性。
(2)当POJO中出现List,保存对象数据,参数名称与对象层次结构名称保持一致,使用数组格式描述集合中对象的位置
public class User {
private String name;
private Integer age;
private Map<String,Address> addressMap;
}
public class Address {
private String province;
private String city;
private String address;
}
@RequestMapping("/requestParam7")
public String requestParam7(User user){
System.out.println("user.addresses="+user.getAddress());
return "page.jsp";
}
访问地址
![]()
(3)当POJO中出现Map,保存对象数据,参数名称与对象层次结构名称保持一致,使用映射格式描述集合中对象的位置
public class User {
private String name;
private Integer age;
private Map<String,Address> addressMap;
}
public class Address {
private String province;
private String city;
private String address;
}
@RequestMapping("/requestParam8")
public String requestParam8(User user){
System.out.println("user.addressMap="+user.getAddressMap());
return "page.jsp";
}
访问地址
![]()
较使用List的而言,将[ ]中的内容换成 key就行!
数组与集合类型参数传参
数组类型参数
请求参数名与处理器方法形参名保持一致,且请求参数数量> 1个
@RequestMapping("/requestParam9")
public String requestParam9(String[] nick){
System.out.println(nick[0]+","+nick[1]);
return "page.jsp";
}
访问路径
![]()
传参的个数必须大于1个,不然会报错!
集合类型参数
保存简单类型数据,请求参数名与处理器方法形参名保持一致,且请求参数数量> 1个
@RequestMapping("/requestParam10")
public String requestParam10(@RequestParam("nick") List<String> nick){
System.out.println(nick);
return "page.jsp";
}
访问路径
![]()
如果不使用@RequestParam()会报错!!!
原因如下:
SpringMVC默认将List作为对象处理,赋值前先创建对象,然后将nick作为对象的属性进行处理。由于 List是接口,无法创建对象,报无法找到构造方法异常;修复类型为可创建对象的ArrayList类型后,对象可以创建,但没有nick属性,因此数据为空。
此时需要告知SpringMVC的处理器nick是一组数据,而不是一个单一数据。通过@RequestParam注解,将数量大于1个names参数打包成参数数组后, SpringMVC才能识别该数 据格式,并判定形参类型是否为数组或集合,并按数组或集合对象的形式操作数据。
请求映射 @RequestMapping(重点)
之前的案例我们有使用@RequestMapping 注解。
该注解既可以作为类注解,也可以作为方法注解。
方法注解
作用:绑定请求地址与对应处理方法间的关系
类注解
作用:为当前处理器中所有方法设定公共的访问路径前缀
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/requestURL2")
public String requestURL2() {
return "page.jsp";
}
}
上述代码,在类注解@RequestMapping("/user"),方法注解@RequestMapping("/requestURL2")
所以,访问page.jsp的路径名为: /user/requestURL2
page.jsp必须放在webapp目录下的user目录中!!!即@RequestMapping("/user")作为类注解,则就要求页面必须放在user的目录里面!
注意:下述代码在return里面"/page.jsp",有了“/”表示访问的是根路径下的jsp页面,没有写表示当前路径往下访问。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/requestURL2")
public String requestURL2() {
return "/page.jsp";
}
}
常用属性
@RequestMapping(
value="/requestURL3", //设定请求路径,与path属性、 value属性相同
method = RequestMethod.GET, //设定请求方式
params = "name", //设定请求参数条件,必须有name参数,没写就会报错
headers = "content-type=text/*", //设定请求消息头条件
consumes = "text/*", //用于指定可以接收的请求正文类型(MIME类型)
produces = "text/*" //用于指定可以生成的响应正文类型(MIME类型)
)
public String requestURL3() {
return "/page.jsp";
}

浙公网安备 33010602011771号