在SpringMVC中常用的注解主要都是用于Controller上,所以下面的四大不同类型的注解都是根据它们处理的request的不同内容部分来区分的;
处理request body的注解:@RequestParam, @RequestBody;
处理request uri的注解:@PathVariable;
处理request header部分的注解:@RequestHeader, @CookieValue;
处理attribute类型的注解:@SessionAttribute,@ModelAttribute;
在@Controller注解之后就是@RequestMapping注解了;
这个RequestMapping就是用来注解一个控制类的方法,可以实现多级的管理控制器;例如,你可以先在一个类上去注解一个@RequestMapping("/user");然后在这个类的里面再去注解一个方法@RequestMapping("/register");这样的话,你可以通过请求user/register来进入register这个控制器中,实现多级的管理控制器;
然后这个RequestMapping个人觉得需要记住的属性有两个,一个默认属性value,标注是由那个请求映射过来的。而另一个属性是method属性, 用来指示该方法仅仅处理哪些HTTP请求方式;
@RequestMapping(value = "/hello",method = RequestMethod.POST)和@RequestMapping(value = "/hello",method = RequestMethod.GET);如果没有指定method属性值,则请求处理方法可以处理任意的HTTP请求方式;
下面是关于Model,ModelMap和ModelAndView这三种接口用来存储模型数据;个人理解,就是我们前面提到了当你的请求中携带了参数的时候,我们称他们为模型数据,这个时候,我们需要一个容器来存储这些模型数据,而在Controller中,我们只需要给控制器这个存储了模型数据的容器就可以了,也就是将模型数据进行封装。其中,Model和ModelMap基本没有太大的区别,而ModelAndView则是不仅包含了模型数据信息,还包含了视图信息,可以看成是一个Map<String,Object>对象;下面上代码;
@Controller public class User1Controller{ //@ModelAttribute修饰的方法会先与login调用,该方法用于接收前台jsp页面传入的参数 @ModelAttribute public void userModel(String loginname,String password,Model model){ logger.info("userModel"); User user = new User(); user.setLoginname(loginname); user.setPassword(password); model.addAttribute("user",user); } @RequestMapping("/login1") public String login(Model model){ logger.info("login"); //从Model当中取出之前存入的名为user的对象 User user = (User) model.asMap().get("user"); System.out.println(user); user.setUsername("测试"); return "result11"; } }
上面这个是model的使用;
@Controller public class User2Controller{ private static final Log logger = LogFactory.getLog(User2Controller.class); @ModelAttribute public void userModel2(String loginname,String password,ModelMap modelmap){ logger.info("userModel2"); User user = new User(); user.setLoginname(loginname); user.setPassword(password); modelMap.addAttribute("user",user); } @RequestMapping("/login2") public String login2(ModelMap modelMap){ logger.info("login2"); User user = (User) modelMap.get("user"); System.out.println(user); user.setUsername("测试"); return "result2"; } }
上面这个是ModelMap的使用;
@Controller public class User3Controller{ private static final Log logger = LogFactory.getLog(User3Controller.class); @ModelAttribute public void userModel3(String loginname,String password,ModelAndView mv){ logger.info("userModel3"); User user = new User(); user.setLoginname(loginname); user.setPassword(password); mv.addObject("user",user); } @RequestMapping("/login3") public ModelAndView login3(ModelAndView mv){ logger.info("login3"); User user = (User) mv.getModel().get("user"); System.out.println(user); user.setUsername("测试"); mv.setViewName("result3"); return mv; } }
上面这个是ModelAndView 的使用;
接下来是@RequestParam注解,用于将指定的请求参数赋值给方法中的形参;
@RequestMapping("/login") public ModelAndView login( @RequestParam("loginname") String loginname; @RequestParam("password") String password;){ return... }
这个RequestParam其实就是一个声明你在jsp页面中命名并打算传送过来的参数,value里面是你要传递过来的参数的名字;
@PathVariable注解;
这个注解可以非常方便地获得请求URL中的动态参数;这个注解经常用于当你要进入一些登录界面的时候,这个时候,你可以灵活地设置要去哪个登录界面;
@SessionAttributes注解;
这个注解可以允许我们有选择地指定Model中的哪些属性需要转存到HttpSession对象中;上代码;
@Controller @SessionAttribute("user") public class SessionAttributesController{ private static final Log logger = LogFactory.getLog(SesssionAttributesController.class); @RequestMapping("/{formname}") public String loginForm(@PathVariable String formName){ return formName; } @RequestMapping("/login") public String login( @RequestParam("loginname") String loginname, @RequestParam("password") String password, Model model){ User user = new User(); user.setLoginname(loginname); user.setPassword(password); user.setUsername(admin); model.addAttribute("user",user); return "welcome"; } }
下面要讲的是@ModelAttribute注解的五种使用方法,@ModelAttribute使用方法较为灵活,请见机行事;
1,@ModelAttribute(value = "")返回具体类的方法;
2,@ModelAttributevoid返回值的方法;
3,@ModelAttribute返回具体类的方法 ;
4,@ModelAttribute和@RequestMapping同时注释一个方法;
5,@ModelAttribute 注释一个方法的参数;
1,@ModelAttribute(value = "")返回具体类的方法,我们前面说过,ModelAttribute相当于一个存储模型数据的容器,而这第一种方法就相对有点简单了,就是标明了这是存储了那个具体的模型数据,记住是一个模型数据而已;而且没有提供容器,是属于简单的数据传输时用到的,上代码;
@Controller public class ModelAttribute1Controller{ @ModelAttribute("loginname") public String userModel1( @RequestParam("loginname") String loginname){ return loginname; } @RequestMapping("/login1") public String login1(){ return "result1"; } }
2,@ModelAttribute注解void返回值的方法,相对于上一个而言,这个的注解的特点在于他提供了一个容器来存储模型数据,而且还允许存储多个模型数据;上代码;
@Controller public class ModelAttribute2Controller{ @ModelAttribute publicv void userModel2( @RequestParam("loginname") Stirng loginname, @RequestParam("password") String password, Model model){ model.addAttribute("loginname",loginname); model.addAttribute("password",password); } @RequestMapping("/login2") public String login2(){ return "result2"; } }
从此,你就可以用model.addAttribute这个方法来将模型数据存入到容器中了;
3,@ModelAttribute返回具体类的方法;前面我们说的第一个方法里面ModelAttribute注解标注的是一个返回值为String的方法,而接下来的这个的返回值却是一个类。也就是说,他一样没有用容器,但是他用类将这些模型数据给封装了起来,上代码;
@Controller public User userModel3( @RequestParam("loginname") String loginname, @RequestParam("password") String password){ return find(loginname,password); } @RequestMapping("/login3") public String login3{ return "result3"; }
4,@ModelAttribute和@RequestMapping同时注释一个方法;这个时候就会有一个骚操作,这个时候方法里面返回的值就不再是视图名称了,而是model属性的值了,虽然我不知道这个有什么用。。。反正就是骚操作。。。
@Controller public class ModelAttribute4Controller{ @RequestMapping("/login4") @ModelAttribute("username") public String login4(){ return "admin"; } }
5,@ModelAttribute 注释一个方法的参数,这个跟第三个有点像,我觉得不同之处可能在于封装在类里面的模型在下面的Controller中可以被再次设置和使用吧。。。
@Controller public class ModelAttribute5Controller{ @ModelAttribute("user") public User userModel5( @RequestParam("loginname") String loginname, @RequestParam("password") String password){ User user = new User(); user.setLoginname(loginname); user.setPassword(password); return user; } @RequestMapping(("/login5") public String login5(@ModelAttribute("user") User user){ user.setUsername("管理员"); return "result5"; } }