• springmvc学习笔记(常用注解)


    springmvc学习笔记(常用注解)

    1. @Controller

    @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如下特点:

    1. 不需要继承任何类, 也不需要实现任何接口
    2. 可以处理多个请求
    3. 可以使用Servlet的相关特性

    spring自动扫描所有基于注解的类, 并将其注册为spring的bean, DispatcherServlet自动扫描注解为@Controller的类, 查找其中使用了@RequestMapping的方法, 这些方法是真正处理请求方法.

    <!-- 扫描包路径com.lizj.controller下的所有类, 将带有注解的类注册到spring容器中 -->
    <context:component-scan base-package="com.lizj.controller" />
    
    <!-- 视图解释器 -->
    <!-- 配置的视图解析器为InternalResourceViewResolver, 并为其添加了前缀prefix和后缀suffix属性 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<!-- 前缀 -->
    	<property name="prefix" value="/WEB-INF/jsp/" />
    	<!-- 后缀 -->
    	<property name="suffix" value=".jsp" />
    </bean>
    

    此示例中没有配置处理映射器和处理器适配器, spring将使用默认的处理映射器和处理器适配器来处理请求.

    下面是使用@Controller注解定义的控制器

    /**
     * 基于注解的控制器
     */
    @Controller
    public class HelloController {
    	
    }
    

    2. @RequestMapping

    2.1 @RequestMapping注解

    @RequestMapping注解用来表示请求具体由哪个类的哪个方法来处理. 即
    @RequestMapping既可以用来注解一个类, 也可以用来注解一个方法. 当用来注解一个类的时候, 所有方法都将映射为相对于类级的请求.

    /**
     * 基于注解的控制器
     */
    @Controller
    public class HelloController {
    
        @RequestMapping("/hello")
        public String sayHello(HttpServletRequest request) {
            model.addAttribute("message", "Hello World");
            return "helloworld";
        }
    }
    

    @RequestMapping注解支持的属性

    属性 类型 是否必要 说明
    name String 映射地址别名, 一般不设置
    value String[] 指定请求的地址映射到方法上
    method RequestMethod[] 请求的方法类型, 包括GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE,TRACE
    consumes String[] 指定处理请求的提交内容类型(Content-Type),例如application/json
    produces String[] 指定返回的内容类型, 返回的内容类型必须是request请求头(Accept)中包含的类型
    params String[] 指定request中必须包含某些参数值时, 此方法才处理此请求
    header String[] 指定request中必须包含某些指定的header值, 此方法才处理此请求
    path String[] In a Servlet environment... 就是value属性的别名, value属性没有含义不确切, path含义更明确

    常用的@RequestMapping属性:

    1. value
      value属性用于将请求映射到方法上. value属性是@RequestMapping的默认属性, 当只有唯一的属性时, 则可以省略属性名, 如下两个注解含义是一样的:
    @RequestMapping("/user")
    @RequestMapping(value="/user")
    
    多个请求地址映射到同一个方法
    @RequestMapping(value={"/user", "/customer"})
    
    1. method
      method属性指定此方法只处理哪些HTTP请求. 例如:
    // 此方法只处理POST请求.
    @RequestMapping(value="/user", method=RequestMethod.POST)
    
    // 此方法既支持POST请求, 又支持GET请求
    @RequestMapping(value="/user", method={RequestMethod.POST,RequestMethod.GET})
    

    如果没有配置method属性, 则此方法可以处理任意的HTTP请求.

    两个示例:

    1. 示例类: com.lizj.controller_01.HelloController01
      访问地址: http://127.0.0.1:8080/springmvc03/hello

    2. 示例类: com.lizj.controller_01.HelloController02
      访问地址: http://127.0.0.1:8080/springmvc03/hello/hello


    2.2 支持的方法参数类型

    每个请求处理方法都可以有多个参数, 参数类型可以为以下类型, 可根据需要添加方法声明参数.

    • javax.servlet.ServletRequestjavax.servlet.http.HttpServletRequest
    • javax.servlet.ServletResponsejavax.servlet.http.HttpServletResponse
    • javax.servlet.http.HttpSession
    • org.springframework.web.context.request.WebRequestorg.springframework.web.context.request.NativeWebRequeset
    • java.util.Locale
    • java.io.InputStreamjava.io.Reader 用于访问请求正文, 这两个对象与通过Servlet API拿到的InputSteam和Reader对象是一样的
    • java.io.OutputSteamjava.io.Writer 用于生成响应正文, 这两个对象与通过Servlet API拿到的OutputSteam和Writer对象是一样的
    • java.security.Principal 包装了当前被谁的用户信息
    • org.springframework.http.HttpEntity<T> 其提供了对HTTP请求头和请求内容的存取
    • org.springframework.web.servlet.mvc.support.RedirectAttributes 用以指定重定向下要使用到的属性集以及添加flash属性(暂存在服务端的属性,它们会在下次重定向请求的范围中有效)
    • org.springframework.validation.Errorsorg.springframework.validation.BindingResult 验证结果对象,用于存储前面的命令或表单对象的验证结果(紧接其前的第一个方法参数)
    • org.springframework.web.bind.support.SessionStatus 用以标记当前的表单处理已结束
    • org.springframework.web.util.UriComponentsBuilder 构造器对象, 用于构造当前请求URL相关的信息, 比如主机名、端口号、资源类型(scheme)、上下文路径、servlet映射中的相对部分(literal part)等
    • @PathVariable @MatrixVariable
    • java.util.Maporg.springframework.io.Modelorg.springframework.ui.ModelMap 用以增强默认暴露给视图层的模型(model)的功能
    • 带有@RequestParam注解的参数, 其存放了Servlet请求中所指定的参数. 参数的值会被转换成方法参数所声明的类型
    • 带有@RequestHeader注解的参数, 其存放了Servlet请求中所指定的HTTP请求头的值. 参数的值会被转换成方法参数所声明的类型
    • 带有@RequestBody注解的参数, 提供了对HTTP请求体的存取. 参数的值通过HttpMessageConverter被转换成方法参数所声明的类型
    • 带有@RequestPart注解的参数, 提供了对一个"multipart/form-data请求块(request part)内容的存取
    • 命令或表单对象, 它们用于将请求参数直接绑定到bean字段(可能是通过setter方法)

    在参数列表中, ErrorsBindingResult参数必须紧跟在其所绑定的验证对象后面. 这是因为, 在参数列表中允许有多于一个的模型对象, spring会为它们创建不同的BindingResult实例

    所有方法参数中, 最重要的是org.springframework.ui.Model, 它是一个接口, 功能类似于java.util.Map, 用于存储模型数据. springmvc调用处理方法前, 会创建一个隐含的模型对象, 作为模型数据的存储容器. 如果处理方法的方法参数为Model, 那么springmvc会将模型的引用传递给此参数. 那么在方法内部就可以访问模型中的数据, 也可以向模型中添加新的属性数据.

    /*
     * springmvc中controller中的方法参数, 支持大多数常用的数据类型, 
     * 如: String, int.... 
     */
    // 需要注意的是, 此处请求参数名必须与方法参数名一致, 否则获取不到参数值, 后面@RequestParam再做详细解释
    @RequestMapping("/get")
    public String getUser(String id, Model model) {
        User user = null;
        for(int i=0; i<userList.size(); i++) {
            User u = userList.get(i);
            if(u.getId().equals(id)) {
                user = u;
                break ;
            }
        }
        if(user == null) {
            user = new User();
            user.setId("001");
            user.setName("张三");
            user.setAge(18);
            user.setSex("男");
        }
        // 向model中添加数据
        model.addAttribute("user", user);
        // 返回视图名称
        return "user/oneuser";
    }
    

    两个示例:

    1. 示例类: com.lizj.controller_02.UserController01
      访问地址: http://127.0.0.1:8080/springmvc003/user01/get

    2. 示例类: com.lizj.controller_02.UserController02
      访问地址: http://127.0.0.1:8080/springmvc003/user02/get?userId=2


    2.3 支持的方法返回类型

    请求处理方法的返回类型如下:

    • org.springframework.web.servlet.ModelAndView
    • org.springframework.ui.Model
    • java.util.Map<K, V>
    • org.springframework.web.servlet.View
    • java.lang.String
    • HttpEntity<?>ResponseEntity<?>
    • java.util.concurrent.Callable
    • org.springframework.web.context.request.async.DeferredResult<?>
    • void

    如果控制器处理方法的返回值是ModelAndView类型, 其既包括模型数据, 又包括视图信息, 那么springmvc就可以使用包含的视图对模型数据进行渲染, 而且可以非常方便的访问模型数据. ModelAndview对象常用的添加模型数据和设置视图的方法如下:

    // 添加模型数据
    addObject(String attributeName, Object attributeValue);
    // 设置视图
    setViewName(String viewName);
    

    示例类: com.lizj.controller_02.UserController03
    访问地址: http://127.0.0.1:8080/springmvc003/user03/get?userId=3


    3. @RequestParam

    @RequestParam注解用于将指定的请求参数赋值给方法的参数.

    @RequestParam注解支持的属性

    属性 类型 是否必要 说明
    name String 指定请求参数绑定的名称
    value String name属性的别名
    required boolean 指示参数是否必须绑定
    default String 没有参数时使用的默认值

    请求处理的方法的参数的类型为Java基本类型和String.

    @RequestMapping(value="/add", method=RequestMethod.POST)
    public String add(@RequestParam("name") String name, 
    		     	  @RequestParam("author") String author) {
    	
    }
    

    当方法参数没有用@RequestParam修饰时, 那么会默认绑定同名的参数.

    示例类: com.lizj.controller_03.BookController
    访问地址: http://127.0.0.1:8080/springmvc003/book/books


    4. @PathVariable

    @PathVariable注解可以方便的从URL中获取请求的参数.
    它只支持一个类型为String的属性, 表示绑定的请求参数的名称, 省略则默认绑定同名的参数.

    @RequestMapping(value="/book/{bookId}")
    public ModelAndView get(@PathVariable int bookId)
    

    示例类: com.lizj.controller_04.BookController04
    访问地址: http://127.0.0.1:8080/springmvc003/book04/books


    5. @RequestHeader

    @RequestHeader注解用于将请求的头信息区数据映射到请求处理方法的参数上.

    @RequestHeader注解支持的属性

    属性 类型 是否必要 说明
    name String 指定请求头绑定的名称
    value String name属性的别名
    required boolean 指示参数是否必须绑定
    default String 没有参数时使用的默认值
    public void testRequestHeader(
    						@RequestHeader("User-Agent") String userAgent,
                            @RequestHeader("Accept") String[] accepts) {
    	// ...
    }
    

    示例类: com.lizj.controller_05.HeaderAndCookieController
    访问地址: http://localhost:8080/springmvc003/hac/show

    关于http请求的header头信息
    参考: http://www.cnblogs.com/printN/p/6534529.html


    6. @CookieValue

    @CookieValue注解将Cookie数据映射到请求处理方法的参数上.

    @CookieValue注解支持的属性

    属性 类型 是否必要 说明
    name String 指定请求头绑定的名称
    value String name属性的别名
    required boolean 指示参数是否必须绑定
    default String 没有参数时使用的默认值

    示例类: com.lizj.controller_05.HeaderAndCookieController
    访问地址: http://localhost:8080/springmvc003/hac/show


    7. @SessionAttributes

    @SessionAttributes注解指定Model中哪些数据需要转存到session中.

    @SessionAttributes注解支持的属性

    属性 类型 是否必要 说明
    names String[] Model中属性的名称, 储存在session中也会用此名称
    values String[] names属性的别名
    types Class<?>[] 根据指定参数的类型, 将模型中对应类型的参数存储到session中

    @SessionAttributes注解只能声明在类上, 不能声明在方法上.

    示例类: com.lizj.controller_06.LoginController
    访问地址: http://localhost:8080/springmvc003/login


    8. @ModelAttribute

    @ModelAttribute注解用于将请求参数绑定到Model对象上.
    @ModelAttribute只支持一个类型为String的属性value, 表示绑定的属性名称.

    需要注意的是, @ModelAttribute注解修饰的方法会在Controller的每个请求处理方法执行前被执行, 如果一个Controller映射了多个URL要注意这一问题.

    示例类: com.lizj.controller_06.PageController
    访问地址: http://127.0.0.1:8080/springmvc003/mac/testPage
    可结合示例, 阅读下面几种情况的介绍.

    1. @ModelAttribute注解修饰的方法有返回值

    示例:

    @ModelAttribute("paramName")
    public String getParam(@RequestParam("param") String param) {
    	return param;
    }
    

    此方法将先于其他请求处理方法执行, 并且将请求参数param的值, 以paramName为名称, 指定为model的一个属性, 此时model并没有显示的定义出来.

    示例:

    @ModelAttribute
    // 这次没有使用@ModelAttribute注解的value属性
    public User getUserById(String userId) {
    	return userService.getUserById(userId);
    }
    

    示例中没有显示的使用@RuquestParam注解, 而是使用了默认绑定同名参数.

    本示例中, 方法的返回值类型为User, 且没有使用@ModelAttribute注解的value属性. 此时, value的默认名称为方法返回值类型(首字母小写), 即模型中的属性名为方法返回值类型(首字母小写). 也可以显示的定义value属性.

    1. @ModelAttribute注解修饰的方法有返回值, 返回值类型为void

    示例:

    @ModelAttribute
    public void getUserById(String userId, Model model) {
    	model.addAttribute("user", userService.getUserById(userId));
    }
    

    这种写法的前提是在请求处理方法中加入了一个Model参数.

    1. @ModelAttribute@RequestMapping修饰同一个方法

    示例:

    @RequestMapping("/show")
    @ModelAttribute("username")
    public String show(String userId) {
    	User user = userService.getUserById(userId);
    	return user.getName();
    }
    

    示例中, @ModelAttribute@RequestMapping共同修饰了show方法. 此时方法的返回值不再是视图名称, 而是Model的属性值, Model属性的名称由@ModelAttributevalue设置, 即username;
    @RequestMappingvalue/show除了是请求映射之外, 还将作为视图名称, 即此请求处理方法将跳转至名称为show的页面.

    1. @ModelAttribute修饰一个请求处理方法的参数

    示例:

    @ModelAttribute
    public User getUserById(String userId) {
    	return userService.getUserById(userId);
    }
    
    @RequestMapping("/show")
    public String show(@ModelAttribute User user) {
    	return "mac/test05";
    }
    

    示例中, @ModelAttribute修饰的getUserById()方法仍旧在Model中添加user属性, 其值为一个User对象.
    而在show方法中, 参数也被@ModelAttribute修饰, 表示参数user的值就是Model中的属性值.


    9. @RequestBody 和 @ResponseBody

    9.1 @RequestBody

    springmvc提供了处理JSON格式请求和响应的功能, 可以方便的使服务端的请求处理方法和客户端JSON格式消息进行交互, 这时就用到了@RequestBody注解.

    @RequestBody注解用于读取request请求的body部分的数据, 解析后, 把相应的数据绑定到请求处理方法的参数上.

    前台页面使用GET或POST请求提交数据时, 数据编码格式会由请求头的ContentType来指定, 可分为以下几种情况:

    • application/x-www-form-urlencoded, 此时可以使用@RequestParam, @ModelAttribute来处理参数, 也可以使用@RequestBody.
    • multipart/form-data, 此时不能使用@RequestBody处理.
    • application/jsonapplication/xml, 只能使用@RequestBody处理.

    9.2 @ResponseBody

    @ResponseBody注解用于将Controller的请求处理方法返回的数据对象, 转换为指定格式后, 写入到response对象的的body数据区. 一般地, 返回的数据不是某个具体的视图页面, 而是某种格式的数据(json, xml等).

    9.3 示例

    示例类: springmvc004项目中, com.lizj.controller_08.BookController08
    访问地址: http://127.0.0.1:8080/springmvc004/book08/books

    简单说明:

    9.3.1 springmvc-servlet.xml

    springmvc-servlet.xml配置文件中, 添加加了两项配置:

    <!-- 自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter -->
    <mvc:annotation-driven />
    
    <!-- DispatcherServlet会拦截所有请求, 会将静态文件(如js文件)的请求看成路径, 就会找不到对应的静态文件 -->
    <!-- 此配置将使用默认的servlet响应静态文件, 避免出现上述情况 -->
    <mvc:default-servlet-handler/>
    

    springmvc4.x默认使用的HandlerMapping和HandlerAdapter为:

    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    

    详情见:
    spring-webmvc-4.2.3.RELEASE.jar
    org.springframework.web.servlet包下的DispatcherServlet.properties文件.

    9.3.2 pom.xml

    引用Jackson

    <!-- jackson -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.6.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.2</version>
    </dependency>
    

    Jackson用来实现json对象与Java对象之间的转换.

    示例下载:
    https://files.cnblogs.com/files/lzj0616/springmvc常用注解示例.rar

  • 相关阅读:
    (转)Docker network命令
    (转)Navicat连接MySQL8.0亲测有效
    (转)Docker 网络
    Docker问题方案收集
    (转)docker run的--rm选项详解
    (转)docker-compose安装
    (转)教你分分钟搞定Docker私有仓库Registry
    (转)Docker入门——Dockerfile详解
    (转)Windows下安装Docker, GitBash环境配置
    (转)教你分分钟搞定Docker私有仓库Registry
  • 原文地址:https://www.cnblogs.com/lzj0616/p/7542632.html
Copyright © 2020-2023  润新知