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个属性。
1271265-20180304163749490-1379109665.png

使用如下

@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中放入一个属性。
1271265-20180304163820593-1332682220.png

@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注解介绍。

转载于:https://www.cnblogs.com/arax/p/8505093.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值