使用基于注解的控制器类,在POJO类定义处标注@Controller,再通过<\context:component-scan/>扫描相应的类包,即可使POJO成为一个能处理HTTP请求的控制器。
DispatcherServlet所提供的默认DefaultAnnotationHandlerMapping就可以满足需求。它将请求映射到使用@RequestMapping注解的方法。
1、@RequestMapping
在控制器的类定义和方法定义处都可以标注@RequestMapping,类定义处的@RequestMapping提供初步的请求映射信息,方法定义处的@RequestMapping提供进一步的细分映射信息。
DispatcherServlet截获请求后,就通过控制器上@RequestMapping提供的映射信息确定请求所对应的处理方法。
1.1、通过请求URL进行映射
@RequestMapping在类定义处指定的URL相对于Web应用的部署路径,而在方法定义处指定的URL则相对于在类定义处指定的URL。
如果在类处未标注@RequestMapping,那么方法处标注的@RequestMapping的URL是相对于Web**应用的部署路径**。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/register")
public String register(){
return "user/login";
}
}
@RequestMapping不但支持标准的URL,还支持Ant风格(?:匹配文件名中的一个字符、*:匹配文件名中的任意字符、**:匹配多层路径),也支持带{xxx}占位符的URL:
//访问路径:http://localhost:8080/spitter/user/aaa/login
@RequestMapping("/*/login")
public String login(){
return "user/login";
}
//访问路径:http://localhost:8080/spitter/user/aaa/bbb/login
@RequestMapping("/**/login")
public String login(){
return "user/login";
}
//访问路径:http://localhost:8080/spitter/user/12343/test/login
@RequestMapping("/{pass}/{userName}/login")
public ModelAndView login(@PathVariable("pass") String password,@PathVariable String userName){
User user=new User();
user.setPassword(password);
user.setUserName(userName);
ModelAndView mv=new ModelAndView();
mv.addObject("user",user);
mv.setViewName("user/createSuccess");
return mv;
}
2、通过请求参数、请求方法类型、请求头进行映射
@RequestMapping的value、method、params、headers,它们可以组合使用,它们之间是 与 的关系,联合使用可以让请求更加精确。
//1、请求方法类型进行映射
@RequestMapping(method = RequestMethod.POST)
public ModelAndView createUser(User user){
ModelAndView mv=new ModelAndView();
mv.addObject("user",user);
mv.setViewName("user/createSuccess");
return mv;
}
//2、请求参数进行映射
//请求参数可以是报文体和URL包含的请求参数
//请求路径:http://localhost:8080/spitter/user?username=zhangsan
@RequestMapping(params = "username")
public ModelAndView login(@RequestParam("username") String userName){
User user=new User();
user.setUserName(userName);
ModelAndView mv=new ModelAndView();
mv.addObject("user",user);
mv.setViewName("user/createSuccess");
return mv;
}
//请求头进行映射
@RequestMapping(headers = "content-type=text/*")
public String register(){
return "user/login";
}
//组合使用,同时满足
@RequestMapping(value = "/register",method = RequestMethod.POST,params = {"param1=value1","param2=value2"},headers = "content-type=text/*")
public String register(){
return "user/login";
}
二、请求处理方法签名
1、使用@RequestParam绑定请求参数值
//它有三个参数:value:参数名;
//required:是否必须,默认是true;
//defaultValue:默认参数名,在设置该参数时,required设置为false;
@RequestMapping(value="index",params = "username")
public ModelAndView login(@RequestParam(value = "username",required = false,defaultValue = "user") String userName){
User user=new User();
user.setUserName(userName);
ModelAndView mv=new ModelAndView();
mv.addObject("user",user);
mv.setViewName("user/createSuccess");
return mv;
}
2、使用@CookieValue绑定请求中的Cookie值
//它也有相同的三个参数:value、required、defaultValue
@RequestMapping("/index")
public String getSession(@CookieValue(value = "sessionId",required = false) String sessionId){
return "user/success";
}
3、使用@RequestHeader绑定请求报文头的属性值
@RequestMapping(value = "/index",method = RequestMethod.POST)
public String handle02(@RequestHeader("Accept-Encoding")String encoding){
return "user/success";
}
利用PostMan工具测试:
4、使用命令/表单对象绑定请求参数值
Spring MVC会按照请求参数名和对象属性名匹配的方式,自动为该对象填充属性值,支持级联的属性名
@RequestMapping(method = RequestMethod.POST)
public ModelAndView createUser(User user){
ModelAndView mv=new ModelAndView();
mv.addObject("user",user);
mv.setViewName("user/createSuccess");
return mv;
}
5、使用Servlet API对象作为入参
public void handle03(HttpServletRequest request, HttpServletResponse response){
String username= WebUtils.findParameterValue(request,"username");
response.addCookie(new Cookie("username",username));
}