Spring MVC学习(二)常用注解

来源:互联网 发布:知乎 清华经管 编辑:程序博客网 时间:2024/06/05 18:04
  1. Controller注解:用于标记一个类,使用该注解标记过的类就是一个控制器类,Spring使用扫描机制查找应用程序中所有基于注解的控制器类,分发器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。eg:@Controller
    public class newHelloController {}
  2. @RequestMapping注解:可以用来注释一个控制器类,这时候类中的所有方法都将映射为相对于类级别的请求。eg:@Controller
    @RequestMapping(value=”/user”)//注解类,该类下的所有方法都对应改路径
    public class userController {} 访问路径:http://localhost:8080/SpringMVCTest/user/register ;注释方法时,被注释的方法将成为一个请求处理方法。eg:@RequestMapping(value=”/hello”)
    public String hello(Model model){}
    • value属性:是@RequestMapping注释的默认属性,如果只有唯一的属性则可以省略属性名。
    • method属性:用来指示该方法仅仅处理哪些HTTP请求。
    • consumes属性:指定处理请求的提交内容类型。
    • produces属性:指定返回的内容类型。
    • params属性:指定request中必须包含某些参数值时才让该方法处理。
    • header属性:指定request中必须包含某些指定的header值,才让该方法处理请求。
  3. Model和ModelMap
    • Spring MVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器.如果处理方法的参数为Model或ModelMap类型,则Spring MVC会将隐含模型的引用传递给这些参数.在处理方法内部,开发者就可以通过调用这个参数对象访问模型数据中的所有数据,也可以向模型中添加新的属性数据.示例代码如下:

@ModelAttribute 注解注释的方法会优先调用,负责接收前台jsp页面传入的参数。

package com.xing.controller;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;/** *@author xpengfei *@creat  3:25:30 PM   Sep 15, 2017 */@Controllerpublic class userTestModelAndModelMap {    private static final Log logger=LogFactory.getLog(userTestModelAndModelMap.class);    @ModelAttribute    public void userModel(String username,String password,Model model){        logger.info("***********userModel方法***********");        //创建User对象存储jsp页面传入的参数        User user=new User();        user.setUsername(username);        user.setPassword(password);        //将user对象添加到Model中        model.addAttribute("user", user);    }    @RequestMapping(value="login1")    public String login(Model model){        logger.info("login1---------------------");        //从Model中获取User对象        User user=(User)model.asMap().get("user");        user.setTestName("hhhhhh1111111111");        System.out.println(user+"************************");        return "result1";    }}

这里写图片描述

package com.xing.controller;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;/** *@author xpengfei *@creat  3:38:43 PM   Sep 15, 2017 */@Controllerpublic class userTestModelAndModelMap2 {    private static final Log logger=LogFactory.getLog(userTestModelAndModelMap2.class);    @ModelAttribute  //@ModelAttribute注解修饰的方法会先于login调用,用于接收前台jsp页面传入的参数    public void userModel2(String username,String password,ModelMap modelMap){        logger.info("userModel2***********");        User user=new User();        user.setUsername(username);        user.setPassword(password);        user.setTestName("hhhhh2222222222");        modelMap.addAttribute("user", user);    }    @RequestMapping(value="/login2")    public String login2(ModelMap modelMap){        logger.info("login2***************");        User user=(User)modelMap.get("user");        System.out.println(user+"---------------------");        return "result2";    }}

这里写图片描述

4.ModelAndView的使用示例:

package com.xing.controller;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;/** *@author xpengfei *@creat  4:14:52 PM   Sep 15, 2017 */@Controllerpublic class userTestModelAndModelMap3 {    private static final Log logger=LogFactory.getLog(userTestModelAndModelMap3.class);    @ModelAttribute    public void userModel3(String username,String password,ModelAndView modelAndView){        logger.info("userModel3*************");        User user=new User();        user.setUsername(username);        user.setPassword(password);        //将user对象添加到ModelAndView的Model中        modelAndView.addObject("user", user);    }    @RequestMapping(value="login3")    public ModelAndView login3(ModelAndView modelAndView){        logger.info("login3-----------");        User user =(User)modelAndView.getModel().get("user");        System.out.println(user);        user.setTestName("333333hhhhhhhhhhhhhh");        //设置返回的视图名称        modelAndView.setViewName("result3");        return modelAndView;    }}

这里写图片描述
5.@RequestParam注解:
属性:
- name 类型String 用于指定请求头绑定的名称
- value 类型String name属性的别名
- required 类型 boolean 指示参数是否必须绑定
- defaultValue 类型String 如果没有传递参数而使用的默认值
使用示例代码:

package com.xing.controller;import java.util.ArrayList;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;/** *@author xpengfei *@creat  2:56:32 PM   Sep 15, 2017 */@Controller@RequestMapping(value="/user")//注解类,该类下的所有方法都对应改路径public class userController {    //定义静态User类型的list用于代替数据库保存用户注册的信息    private static List<User>userList;    //构造类,初始化List    public userController(){        userList=new ArrayList<User>();    }    private static final Log logger=LogFactory.getLog(userController.class);    @RequestMapping(value="/register",method=RequestMethod.GET)    //响应请求http://localhost:8080/SpringMVCTest/user/register    支持get方法    public String registerForm(){        logger.info("register  get 方法被调用-------------------");        //跳转到注册页面        return "register";    }    @RequestMapping(value="/register",method=RequestMethod.POST)    //响应请求http://localhost:8080/SpringMVCTest/user/register 支持post方法    public String register(            //将请求中的username参数的值赋给username变量,其他两个同样处理            @RequestParam("username") String username,            @RequestParam("password") String password,            @RequestParam("testName") String testName            ){        logger.info("register post 方法被调用------");        //创建User对象        User user=new User();        user.setUsername(username);        user.setPassword(password);        user.setTestName(testName);        //模拟数据库存储user        userList.add(user);        //跳转到登录界面        return "login";    }    //响应请求http://localhost:8080/SpringMVCTest/user/login    @RequestMapping(value="/login")    public String login(            //将请求中的username参数的值赋给username变量,其他两个做同样处理            @RequestParam("username") String username,            @RequestParam("password") String password,            Model model            ){        logger.info("登录名:"+username+"\t密码:"+password);        //在集合中查找用户是否存在,        for(User user:userList){            //若用户名和密码不匹配,则不会跳转到欢迎页面            if(user.getUsername().equals(username)                    && user.getPassword().equals(password)){                model.addAttribute("user", user);                return "welcome";            }        }        return "login";    }}

程序运行结果如下图:
这里写图片描述
这里写图片描述
这里写图片描述
6.@PathVariable、@RequestHeader、@CookieValue注解
- @PathVariable注解:可以非常方便的获得请求URL中的动态参数,该注解只支持一个属性value,类型为String表示绑定的名称,如果省略则默认绑定同名参数。
- @RequestHeader注解:将请求的头部信息区数据映射到功能处理方法的参数上。name属性 用于指定头部绑定的名称 类型为String;value属性 是name属性的别名 类型为String;required属性 表示参数是否必须绑定 类型为Boolean;defaultValue属性:如果没有传递参数而是用的默认值 类型String;
- @CookieValue注解:用于将请求的Cookie数据映射到功能处理方法的参数上。属性和@RequestHeader的属性相同;
示例:

package com.xing.controller;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.CookieValue;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestHeader;import org.springframework.web.bind.annotation.RequestMapping;/** *@author xpengfei *@creat  6:01:57 PM   Sep 15, 2017 *@PathVariable、@RequestHeader、@CookieValue注解的示例 */@Controller@RequestMapping(value="/user")public class PRCController {    private static final Log logger=LogFactory.getLog(PRCController.class);//  跳转到jsp页面    @RequestMapping(value="/PRCController")    public String PRCController(){        return "PRCController";    }    /*     * 测试@PathVariable注解     * 该方法映射的请求为:     */    @RequestMapping(value="/pathVariableTest/{userId}")    public void pathVariableTest(            @PathVariable Integer userId            ){        logger.info("通过@PathVariable获取的数据:"+userId);    }    /*     * 测试方法@RequestHeader注解     * 该方法映射的请求为:     */    @RequestMapping(value="/requestHeaderTest")    public void requestHeaderTest(                @RequestHeader("User-Agent") String userAgent,                @RequestHeader(value="Accept") String[]accepts            ){        logger.info("通过@RequestHeader注解获得的数据:"+userAgent);        for(String accept: accepts){            logger.info(accept+"-------------");        }    }    /*     * 测试@CookieValue注解     */    @RequestMapping(value="/CookieValueTest")    public void cookieValueTest(                @CookieValue(value="JSEEIONID",defaultValue="")String sessionId            ){        logger.info("通过@CookieValueTest获得的数据:"+sessionId);    }}

结果如下:
这里写图片描述
7.@SessionAttributes属性:允许我们选择性的指定Model中的哪些属性需要转存到HttPSession中.
- names属性: String[]类型,是Model中属性的名称,即存储在HttpSession当中的属性名称。
- value属性:String[]类型,name属性的别名。
- types属性:Class <”?”>类型,指示参数是否必须绑定。
PS:上边<>中的?单独打的是否排版有问题,就加了引号.
eg:
//将Model中属性名为user的属性放入HttpSession对象中
@SessionAttributes(“user”)
public class userController {}
这样user对象就被放到了session中了.

还可以写为:@SessionAttributes(types={User.class},value=”user”)

还可以放置多个对象到HttpSession中:
@SessionAttributes(types={User.class,Dept.class},value={“user”,”dept”})
types属性是用来指定放入HttpSession当中的对象类型.
8.@ModelAttribute注解:只支持一个属性value,类型为String,表示绑定的属性名称。
- 被@ModelAttribute注解注释的方法会在Controller每个方法执行前被执行,因此当一个Controller映射到多个URL时,需要谨慎使用。
- @ModelAttribute(value=“”)注释:返回具体类的方法。
- @ModelAttribute 注释void返回值的方法:model属性的名称和值由void方法内部model.addAttribute()方法实现,前提是要在方法的参数列表中出入一个Model类型的参数。
- @ModelAttribute注释返回具体类的方法
例如:
@ModelAttribute
public User userModel(
@RequestParam(“username”) String username,
@RequestParam(“password”)String password
){
return find(username,password);
}
在此例中userModel方法的返回值类型隐含表示,在这个例子中返回的是User类型,则model属性的名称就是user。
- @RequestMapping和@ModelAttribute同时注释一个方法时,方法返回的不再是视图名称:
例如:
@RequestMapping(value=“login”)
@ModelAttribute(value=“username”)
public String login(){
return “admin”;
}
这种使用方法不是返回名为admin的视图,而是相当于在request中封装了username(相当于key)=admin(相当于value);
- @ModelAttribute注释一个方法的参数
- 这时参数就是model的属性

未完待续……