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

原文地址:https://www.cnblogs.com/arax/p/8505093.html

时间: 2024-08-26 17:52:44

SpringMVC 注解详解的相关文章

SpringMVC注解详解—0604

转自:孤傲苍狼 只为成功找方法,不为失败找借口! Spring常用注解 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package="pagkage1[,pagkage2,-,pagkageN]"/>. 如:在base-package指明一个包 1 <context:component-scan base-package="

【转】@RequestParam @RequestBody @PathVariable 等参数绑定注解详解

@RequestParam @RequestBody @PathVariable 等参数绑定注解详解 2014-06-02 11:24 23683人阅读 评论(2) 收藏 举报 目录(?)[+] 引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主

Spring中常用的配置和注解详解

一.  Spring中常用的配置文件详解 Spring中的配置文件详解 1.<!-- 配置注解bean的扫描路径 该配置表示从cn包下开始扫描--> <context:component-scan base-package="cn"></context:component-scan> 2.<!-- 加载资源文件 其中Location表示从哪个路径加载配置文件properties--> <context:property-placeh

Java——注解详解

Java注解同 classs 和 interface 一样,注解也属于一种类型.它是在 Java SE 5.0 版本中开始引入的概念. 注解的定义 通过 @interface 关键字进行定义. public @interface TestAnnotation { } 这段代码就创建了一个名字为 TestAnnotaion 的注解. 你可以简单理解为创建了一张名字为 TestAnnotation 的标签. 使用注解 @TestAnnotation public class Test { } 在类上

Java基础13:反射与注解详解

Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Oracle官方对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fi

springMVC的注解详解

springmvc常用注解标签详解 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示.在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@Request

【Spring】SpringMVC之详解AOP

1,AOP简介 Aspect Oriented Programming  面向切面编程.AOP还是以OOP为基础,只不过将共同逻辑封装为组件,然后通过配置的方式将组件动态切入到原有组件中.这样做的有点有:可以在不修改原有组件功能代码的基础上,对组件进行扩充,对公共需要和传统业务进行解耦. 2,语法 1.切面组件(加什么功能?) Aspect 在组件中寻找共通位置和时机,将追加功能切入到原有组件中.追加的功能组件一般被称为切面组件. 2.  切入点(给谁加?) Pointcut 切入点用于指定切入

spring mvc 注解详解(springMvc mybatis spring)

1. 声明Bean的注解: 1.1 @Component : 组件,没有明确的角色 1.2 @Service : 在业务逻辑层(service层)使用 1.3 @Repository : 在数据访问层(dao层)使用 1.4 @Controller : 在展现层(MVC--SpringMVC)使用 2. 注入Bean的注解: 2.1 @Aautowired : Spring提供的注解 对类成员变量.方法及构造函数进行标注,完成自动装配的工作.通过 @Autowired的使用来消除set ,get

SpringMvc之参数绑定注解详解

引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessage