zoukankan      html  css  js  c++  java
  • SpringMVC 注解详解

    spring mvc 中有很多的注解,每个注解都有自己的功能,下面我们就对spring mvc中的注解一一作出介绍。关于spring的注解还没有总结,请等待后续blog更新。

    @controller

    org.springframework.stereotype.Controller注解类型用于指示当前类是一个控制器。 Spring使用扫描机制查找应用程序中所有基于注解的控制器类,分发器会扫描使用该注解类的方法,并检测方法是否使用了@RequestMapping注解,只用使用了@RequestMapping注解的方法才能用来处理请求。

    为了保证spring能找到控制器,需要完成两件事情:

    • 在spring mvc的配置文件的头文件中引入spring-context。
    • 在spring mvc 的配置文件中使用context:component-scan/,该元素的功能是启动包扫描功能,以便注册有@Controller、@Service、@Repository、@Component等注解的类成为spring的bean。
    <context:component-scan base-package = "com.chris.controller"/>
    

    @RequestMapping

    该注解类型指示spring用哪一个类或方法来处理请求动作,可以用于类或方法。

    @Controller
    // RequestMapping可以用来注释一个控制器类,此时,所有方法都将映射为相对于类级别的请求, 
    // 表示该控制器处理所有的请求都被映射到 user属性所指示的路径下
    @RequestMapping(value="/user")
    public class UserController{
        // 映射请求 user/register
        @RequestMapping(value="/register",method=RequestMethod.GET)
    	 public String registerForm() {
    		 // 跳转到注册页面
    	     return "registerForm";
    	 }
         // 映射请求 user/login
         @RequestMapping("/login")
    	 public String login( Model model) {
    	     return "loginForm";
    	 }
    }
    

    @RequestMapping可以指定一些属性

    • value:用来映射一个请求和一个方法,是其默认属性,如果在使用@RequestMapping时只有这个属性,则可以省略关键字value.
    • method:该属性用来指定该方法仅仅处理哪些HTTP请求的处理方式,例如GET、POST。
    • consumes:用来指定处理请求提交内容的类型。
    • produces:用来指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中包含的类型。
    • params:指明request中必须包含哪些参数时,才让该方法处理。例如下面的代码指明方法只处理其中名为"myParam",值为"myValue"的请求。
    @RequestMapping(value="/hello", method = RequestMethod.POST,
     params = "myParam = myValue")
    
    • headers 指明request中必须包含某些header值,才能让该方法处理请求,例如
    @RequestMapping(value="/hello", method = RequestMethod.POST,
     header = "bolgID = http://www.cnblogs.com/arax/")
    

    在使用@RequestMapping指定的方法中,如果要访问HttpServletRequest或HttpSession,可以将其直接作为参数,Spring会将对象传递给方法。

    @RequestMapping("/hello")
    public String login(HttpSession session) {
        return "hello";
    }
    

    @RequestParam

    该注解将指定的请求参数赋值给方法中的形参。

    @RequestMapping("/hello") {
        public String login(
            @RequestParam("loginName") String loginName,
            @RequestParam("password") String password
        ) {
            return "login";
        }
    }
    

    在执行上面函数时,springmvc 会将Request中的loginName,password从参数中取出来赋值给函数的形参。
    @RequestParam中的属性如下:

    • name:绑定参数在Request中的名称。
    • value:name属性的别名。
    • required:参数是否必须绑定。
    • defaultValue:如果没有传递参数而使用的默认值。
    @RequestParam(value="loginname",required=true,defaultValue="admin")
    

    @PathVariable

    @PathVariable只支持一个属性value,类型为String,表示绑定的名称,如果省略则表示绑定同名参数。

    @RequestMapping("path/{userId}")
    public String login(@PathVariable Integer userId) {
        return "login";
    }
    

    加入请求url为http://localhost:8080/path/3,则上述函数在执行时会自动将userId值映射为3。

    @RequestHeader

    将请求头信息区书记映射到处理方法上。其主要有如下属性

    • name:指定请求头绑定的名称。
    • value:name属性的别名。
    • required:参数是否必须绑定。
    • defaultValue:如果没有传递参数而使用的默认值。

    和@PathVariable的属性相同。下面给出用法实例

    @RequestMapping("/hello") {
        public String login(
            @RequestHeader("User-Agent") String userAgent,
            @RequestHeader(value="Accept") String[] accepts
        ) {
            return "login";
        }
    }
    

    @CookieValue

    将请求的Cookie书记映射到功能处理方法参数上。其支持的属性如下:

    • name:指定请求头绑定的名称。
    • value:name属性的别名。
    • required:参数是否必须绑定。
    • defaultValue:如果没有传递参数而使用的默认值。
      用法和@RequestParam相同,这里不再赘述。

    @SessionAttribute

    该注解允许我们有选择的将指定Model中的哪些属性转存到HttpSession对象中。其只能声明在类上。他包含3个属性。

    使用如下

    @Controller
    // 将Model中的属性名为user的放入HttpSession对象当中
    @SessionAttributes("user")
    public class SessionAttributesController{
    
    	@RequestMapping(value="/{formName}")
    	 public String loginForm(@PathVariable String formName){
    		// 动态跳转页面
    		return formName;
    	}
    
    	@RequestMapping(value="/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只有一个属性value,类型为String,表示绑定数据类型的名称。其使用方法以及表现形式比较多变,容我娓娓道来。@ModelAttribute主要用来修饰方法,被其修饰的方法会在Controller中每个方法执行前被执行,因此在一个Controller类要映射多个URL时,要谨慎使用。
    我个人理解被@ModelAttribute修饰的方法,是在执行映射方法前对Model的预处理。

    注解返回具体类的方法

    @Controller
    public class ModelAttribute1Controller{
    
        // 使用@ModelAttribute注释的value属性,
        // 来指定model属性的名称,model属性对象就是方法的返回值
    	@ModelAttribute("loginname")
    	public String userModel( 
    			@RequestParam("loginname") String loginname){
    		return loginname;
    	}
    
    	@RequestMapping(value="/login1")
    	 public String login() {
    		 return "result1";
    	 }
    }
    

    userModel会先于login执行,并在Model中以loginname为属性名称,userModel返回值为属性值,在Model中放入了一个属性。

    注解无返回值的方法

    @Controller
    public class ModelAttribute2Controller{
    
    	// model属性名称和model属性对象由model.addAttribute()实现,
        // 前提是要在方法中加入一个Model类型的参数。
    	// 注意:当URL或者post中不包含对应的参数时,程序会抛出异常。
    	@ModelAttribute
    	public void userModel( 
    			@RequestParam("loginname") String loginname,
    			@RequestParam("password") String password,
    			 Model model){
    		model.addAttribute("loginname", loginname);
    		model.addAttribute("password", password);
    	}
    
    	@RequestMapping(value="/login2")
    	 public String login() {
    		 return "result2";
    	 }
    }
    

    在这个例子中userModel先于login执行,相当于将一段对model的预处理逻辑单独放到一个函数中。

    注解返回具体类的方法

    @Controller
    public class ModelAttribute3Controller{
    
        // model属性的名称没有指定,它由返回类型隐含表示,
        // 如这个方法返回User类型,那么这个model属性的名称是user。
        // 这个例子中model属性名称由返回对象类型隐含表示,
        // model属性对象就是方法的返回值。它不需要指定特定的参数。
    	@ModelAttribute
    	public User userModel3( 
    			@RequestParam("loginname") String loginname,
    			@RequestParam("password") String password){
    		return new UserUpperCase(loginname, password);
    	}
    
    	@RequestMapping(value="/login3")
    	 public String login3() {
    		 return "result3";
    	 }
    }
    

    例子中@ModelAttribue没有参数,修饰的函数的返回值为User的对象,这时会以类名的首字母小写为属性名,返回值为属性值,在Model中放入一个属性。

    @ModelAttribute和@RequestMapping同时注解同一个方法

    @Controller
    public class ModelAttribute4Controller{
    	
        // 这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,
         //视图名称是@RequestMapping的value值。
        // Model属性名称由@ModelAttribute(value="")指定,相当于在request中封装了
        //username(key)=admin(value)。
    	@RequestMapping(value="/login")
    	@ModelAttribute(value="username")
    	 public String login() {
    		 return "admin";
    	 }
    }
    

    此时login方法的返回值不在是一个视图的名称,而是model属性的值,视图的名称仍然是@RequestMapping的value值"/login"。处理结束后页面继续跳转到login.jsp。

    注释一个方法的参数

    @Controller
    public class ModelAttribute5Controller{
        @RequestMapping(value="/login")
        public String login(@ModelAttribute("user") User user) {
        user.setUsername("管理员");
            return "result";
        }
    }
    

    此处@ModelAttribute相当于从model中取出属性名称为"user"的属性值赋值给login的形参user。如果@ModelAttribute不写参数默认取和形参同名的属性名的值。

    至此,SpringMVC中注解基本介绍完,后续请关注spring注解介绍。

    I am chris, and what about you?
  • 相关阅读:
    python 垃圾回收机制
    @property 取代getter setter方法
    ==值相等 is同一性
    循环获取文件名,拼接路径打印
    python 闭包
    python生成器
    hadoop集群环境搭建之zookeeper集群的安装部署
    hadoop集群环境搭建之安装配置hadoop集群
    hadoop集群环境搭建准备工作
    linux下安装jdk
  • 原文地址:https://www.cnblogs.com/arax/p/8505093.html
Copyright © 2011-2022 走看看