SpringMVC的常用注解

         在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";
        }
}

  

原文地址:https://www.cnblogs.com/zxx123/p/8468860.html