@RequestMapping("handle_login.do") public ModelAndView handleLogin( String username, String password) { String viewName = null; String message = null; Map<String, Object> model = new HashMap<String, Object>(); if ("root".equals(username)) { if ("1234".equals(password)) { // ... } else { viewName = "error"; message = "[2] 密码错误!"; model.put("msg", message); } } else { viewName = "error"; message = "[2] 用户名不存在!"; model.put("msg", message); } ModelAndView mav = new ModelAndView(viewName, model); return mav; }
#### 2.3. 使用ModelMap
`ModelMap`的使用方式与`HttpServletRequest`几乎相同:
@RequestMapping("handle_login.do") public String handleLogin( String username, String password, ModelMap modelMap) { String message = null; if ("root".equals(username)) { if ("1234".equals(password)) { // ... } else { message = "[3] 密码错误!"; modelMap.addAttribute("msg", message); return "error"; } } else { message = "[3] 用户名不存在!"; modelMap.addAttribute("msg", message); return "error"; } return null; }
### 3. 重定向
在控制器中处理请求时,如果需要重定向,方法的返回值应该是`String`,则值应该是`redirect:目标资源`,关于**目标资源**的表示,可以使用相对路径,也可以使用绝对路径,例如使用相对路径时可以返回`"redirect:index.do"`。
### 4. 关于@RequestMapping
`@RequestMapping`注解的作用主要是配置映射的路径。
该注解既可以添加在类之前,也可以添加在方法之前!例如:
@Controller @RequestMapping("user") public class UserController { @RequestMapping("reg.do") public String showReg() { return "reg"; } }
以上配置后,访问时,所使用的URL应该是`:8080/PROJECT/user/reg.do`。
在类之前使用该注解,可以简化每个方法之前的注解,例如,在类之前没有注解时,可能配置为:
@RequestMapping("user_list.do")
@RequestMapping("user_info.do")
@RequestMapping("news_list.do")
@RequestMapping("news_info.do")
如果在类和方法之前都加注解,就可以:
@RequestMapping("user")
@RequestMapping("list.do")
@RequestMapping("info.do")
@RequestMapping("news")
@RequestMapping("list.do")
@RequestMapping("info.do")
所以,一般,推荐每个控制器只处理相关数据,例如`UserController`控制器只处理与`User`相关的请求,而`NewsController`控制器只处理与`News`相关的请求,并且,每个类之前都添加`@RequestMapping`注解。
在配置路径时,并没有明确要求类的注解和方法的注解中是否使用`/`路径分隔符,例如以下4种配置是完全等效的:
@RequestMapping("user") @RequestMapping("list.do")
@RequestMapping("/user") @RequestMapping("/list.do")
@RequestMapping("/user") @RequestMapping("list.do")
@RequestMapping("user") @RequestMapping("/list.do")
使用`@RequestMapping`注解还可以限制请求方式,例如:
@RequestMapping(value="路径", method=RequestMethod.POST)
对于以上映射路径,如果尝试进行GET请求,则会出现405错误:
HTTP Status 405 - Request method 'GET' not supported
**小结**
`@RequestMapping`主要用于配置请求路径,在实际应用时,首先,每个控制器类之前都应该添加该注解,用于配置路径中间层,然后,每个控制器类只处理1种数据相关的请求,每个处理请求的方法之前必须再使用该注解配置具体路径,可根据实际情况选择配置该注解的`method`属性,以限定请求方式。
关于`@RequestMapping`的`value`属性和`method`属性的值,都可以是数组。
从Spring 4.3起,另有`@GetMapping`和`@PostMapping`,等效于限制了请求方式的`@RequestMapping`,即`@GetMapping("路径") = @RequestMapping(value="路径", method=RequestMethod.GET)`。使用这些注解时,需要在Spring的配置文件中添加注解驱动`<mvc:annotation-driven />`。
### 5. 关于@RequestParam注解
`@RequestParam`注解是添加在处理请求的方法的参数之前的注解!
使用`@RequestParam`可以解决客户端提交的参数名与服务器端处理请求时方法的参数名不一致的问题: