SpringMVC 注解详解

Posted arax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC 注解详解相关的知识,希望对你有一定的参考价值。

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

@controller

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

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

  • 在spring mvc的配置文件的头文件中引入spring-context。
  • 在spring mvc 的配置文件中使用,该元素的功能是齐东东包扫描功能,以便注册有@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

该注解将指定的请求参数赋值给方法中的形参。
java @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的属性相同。下面给出用法实例
java @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。

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

以上是关于SpringMVC 注解详解的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC 注解详解

spring mvc 常用注解详解

spring mvc 必须使用注解配置吗?可不可使用xml配置?求高手详解

SpringMVC之ajax传递jason数据详解以及@RequestBody和@ResonseBody注解

springmvc注解详解

springmvc常用注解标签详解