. 关于@RequestParam注解
1.1. 基础使用
使用@RequestParam
注解,可以解决提交的请求参数与处理请求的方法参数名称不一致的问题,例如:
@RequestMapping("/handle_login.do")
public String handleLogin(
@RequestParam("uname") String username,
String password) {
System.out.println("username=" + username);
System.out.println("password=" + password);
return null;
}
使用@RequestParam
注解后,默认情况下,对应的请求参数是必须的,如果提交的请求不包含这项参数,则会提示:
HTTP Status 400 - Required String parameter 'uname' is not present
1.2. 注解的配置
使用@RequestParam
注解请求参数名称时的完整语法是:
@RequestParam(value="uname")
在@RequestParam
注解中,还有另一个属性required
,取值为boolean
类型,例如:
@RequestParam(value="uname", required=false)
可以发现,使用@RequestParam
时,其required
属性的默认值是true
。
除此以外,该注解还有一个String
类型的属性defaultValue
:
@RequestParam(value="uname", required=false, defaultValue="hello")
这项defaultValue
表示的是默认值,即没有提交这项请求参数时,将按照默认值来处理,如果提交了这项请求参数,则这项配置没有意义。
从4.2版本后,该注解还可以使用name属性,意义与value属性相同。
/**
* The name of the request parameter to bind to.
* @since 4.2
*/
@AliasFor("value")
String name() default "";
2. 转发数据
2.1. 【不推荐】通过HttpServletRequest参数转发数据
当需要转发数据时,可以在处理请求的方法中添加HttpServletRequest
对象作为参数,然后调用该参数对象的setAttribute(String, Object)
方法封装即可:
@RequestMapping("/handle_reg.do")
public String handleReg(User user,
HttpServletRequest request) {
System.out.println(user);
// 暂视为所有用户名注册时都是失败的,原因:用户名已经被占用
// 封装错误信息,以准备转发
String message = "您输入的用户名(" + user.getUsername()
+ ")已经被占用!";
request.setAttribute("message", message);
// 执行转发
return "error";
}
2.2. 【不推荐】使用ModelAndView
在处理请求时,使用ModelAndView
作为方法的返回值。
在ModelAndView
中,Model
表示需要转发的数据,其类型是Map<String, ?>
类型,View
表示负责响应的视图组件,可以使用String viewName
表示。
@RequestMapping("/handle_reg.do")
public ModelAndView handleReg(String username) {
// 暂视为所有用户名注册时都是失败的,原因:用户名已经被占用
String message = "MODEL:您输入的用户名("
+ username + ")已经被占用!";
// 封装转发的数据
Map<String, Object> model
= new HashMap<String, Object>();
model.put("message", message);
// 准备返回值
ModelAndView mav
= new ModelAndView("error", model);
// 执行转发
return mav;
}
2.3. 【推荐】使用ModelMap
ModelMap
是SpringMVC中提供的用于封装转发数据的类型,其本质就是一个Map
,你可以像使用一般的Map
类似的方式去使用它,同时,当你需要封装转发数据时,使用与HttpServletRequest
相同的方式去使用即可!
@RequestMapping("/handle_reg.do")
public String handleReg(String username,
ModelMap modelMap) {
// 暂视为所有用户名注册时都是失败的,原因:用户名已经被占用
String message = "MODELMAP:您输入的用户名("
+ username + ")已经被占用!";
// 封装需要转发的数据
modelMap.addAttribute("message", message);
// 执行转发
return "error";
}
3 重定向
在处理请求的方法中,返回值类型依然使用String
,并且,返回的字符串使用redirect:
作为前缀,然后写出目标位置的相对路径或绝对路径。
// 重定向
@RequestMapping("/handle_reg.do")
public String handleReg() {
// 假设注册一定成功,并到登录页
// 当前位置: /user/handle_reg.do
// 重定向到登录,即:/user/login.do
return "redirect:login.do";
}
4. 处理Session
与ModelMap
的使用方式是一样的!即:把HttpSession
作为参数添加到处理请求的方法中,然后,这整个方法中就可以使用Session。
5. 关于@RequestMapping
使用@RequestMapping
主要用于配置所处理的请求的路径,完整配置应该是:
@RequestMapping(value="/handle_reg.do")
除此以外,还可以添加配置method
属性,以限制请求的类型,例如:
@RequestMapping(value="/handle_reg.do", method=RequestMethod.POST)
如果以上路径配置了限制为POST请求,然后,实际发出的是GET请求,则会提示405错误:
HTTP Status 405 - Request method 'GET' not supported
通常,对于GET类型的请求并不配置method
,而POST类型的请求应该配置method
。但是,出于规范的考虑,无论什么请求,都应该显式的限制请求类型,除非你确定这些请求类型都是允许的。
6. 阶段小结
SpringMVC主要解决了如何接收请求,并给予的响应的问题。
在处理请求时,请求的参数(含多个请求参数构成的对象类型)、HttpServletRequest
、HttpServletResponse
、ModelMap
、HttpSession
都可以根据需要,自行添加为处理请求的方法的参数,然后,在方法内部直接使用即可!
处理请求的方法返回值可以是String
,默认的响应方式是转发,如果需要重定向,则返回的字符串应该是redirect:相对路径或绝对路径
。
使用@RequestMapping
注解可以配置请求路径,甚至限制请求类型。
使用@RequestParam
注解可以确定请求参数的名称、是否必须、默认值。