SpringMVC--注解驱动的控制器

来源:互联网 发布:上海炫踪网络 怎么样 编辑:程序博客网 时间:2024/05/21 19:45

使用基于注解的控制器类,在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));    }
原创粉丝点击