zoukankan      html  css  js  c++  java
  • Spring MVC的常用注解(一)

    概述
    Spring从2.5版本开始引入注解,虽然版本不断变化,但是注解的特性一直被延续下来并不断进行扩展,这里就来记录一下Spring MVC中常用的注解,本文记录@Controller、@RequestMapping、@RequestParam和@PathVariable四个注解。
    @Controller注解
    该注解用来标记类,由其标记的类就是一个Spring MVC Controller的一个对象,即一个控制器类。
    Spring使用扫描机制扫描应用程序中所有使用该注解进行注释的类,分发处理器扫描使用了该注解的类的方法,检测方法是否使用了@RequestMapping注解,使用了@RequestMapping注解的方法才是真正处理请求的处理器。
    Spring能够扫描到控制器,需要在Spring MVC的配置文件(前文例子中的springmvc-servlet.xml文件)中完成两个配置项:
    1.在头文件中引入spring-context。
    2.使用<context:component-scan/>元素,该元素的功能:启动包扫描功能,注册使用了@Controller、@Service、@Repository、@Component等注解的类成为Spring的bean。

      1 <context:component-scan base-package="com.snow.dcl.controller"/>

    base-package属性指定了需要扫描的包,该包以及其子包中的类都会被进行处理,所有的控制器类都应该放在该包路径下,以免扫描其他无关的包。
    @RequestMapping
    该注解用来标记类或者方法,指示Spring用该类或者方法处理请求动作。
    如果使用该注解注释类,该类所有的方法,都被映射为相对于类级别的请求,表示该控制器处理的所有请求,都被映射都value属性指定的路径下。

      1 @Controller
      2 @RequestMapping(value = "/user")
      3 public class UserController {
      4 
      5     @RequestMapping(value = "register")
      6     public String register(){
      7         return "register";
      8     }
      9 
     10     @RequestMapping(value = "login")
     11     public String login(){
     12         return "login";
     13     }
     14 }
     15 


    因为在该类上使用了@RequestMapping(value = "/user")注解,请求都要加上/user路径:http://localhost:8080/user/login
    @RequestMapping注解支持的常用属性:

    属性类型说明
    value String[] 用于将指定请求映射到方法上
    method RequestMethod[] 映射指定请求的方法类型,包括GET、POST、PUT......
    consumes String[] 指定处理请求的提交内容类型(Content-Type:application/json、text/html等)
    produces String[] 指定返回的内容类型,必须是request请求头(Accept)中包含的类型
    params String[] 指定request中必须包含某些参数,才让该方法处理请求
    header String[] 指定request中必须包指定的header值,才让该方法处理请求


    注意:由于value是@RequestMapping注解的默认属性,如果该注解使用时只有此一个属性,则可以省略改属性名,若有多个属性,则必须写上value属性名。

      1 @RequestMapping(value = "/hello")
      2 @RequestMapping("/hello")


    value属性是String[]类型,所以可以设置多个值:

      1 @RequestMapping(value = {"/hello","/hello1"})


    此时请求访问两个路径都可以映射到同一个方法进行处理。
    @RequestParam
    该注解用来将指定的请求参数赋值给方法中的形参。
    @RequestParam注解支持的常用属性:

    属性类型说明
    name String 指定请求头绑定的名称
    value String name属性的别名
    required boolean 参数是否必须绑定
    defaultValue String 没有传递参数时,参数的默认值

    注解示例程序
    修改springmvc-servlet.xml文件
    示例程序在前文项目SpringMVCProject的基础上进行完善编写。
    修改springmvc-servlet.xml文件配置:

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <beans xmlns="http://www.springframework.org/schema/beans"
      3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4        xmlns:context="http://www.springframework.org/schema/context"
      5        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
      6 
      7     <!--spring可以自动扫描base-package设置的包或子包下的java类,如果扫描到有spring相关注解的类,则注册为spring的bean-->
      8     <context:component-scan base-package="com.snow.dcl.controller"/>
      9 
     10     <!--视图解析器-->
     11     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     12         <property name="prefix">
     13             <value>/WEB-INF/content/</value>
     14         </property>
     15         <property name="suffix">
     16             <value>.jsp</value>
     17         </property>
     18     </bean>
     19 
     20 </beans>
     21 


    1.现在使用了注解类型,所以不需要在XML文件中描述Bean。
    2.<context:component-scan base-package="com.snow.dcl.controller"/>指定Spring扫描com.snow.dcl.controller包及子包下所有的java文件。
    3.然后配置视图解析器展示,视图解析器中配置的prefix表示视图的前缀,suffix表示视图的后缀。

      1 @RequestMapping(value = "register")
      2 public String register(){
      3     return "register";
      4 }

    如上面程序中,返回的是"register",经过视图解析器后的完整路径为:/WEB-INF/content/register.jsp。
    注意:此处没有再配置处理映射器和处理适配器,当不进行配置时,Spring会使用默认的进行处理。
    创建User类
    首先在项目中创建com.snow.dcl.domain包,在该包下创建User类文件,编写如下程序:

      1 @Data
      2 public class User implements Serializable {
      3     private String loginname;
      4     private String password;
      5     private String username;
      6 }

    这里使用lombok的@Date注解,自动生成Getter、Setter和toString方法,lombok的安装前文有讲述。
    创建UserController类
    在com.snow.dcl.controller包下创建UserController类文件,编写如下程序:

      1 @Controller
      2 @RequestMapping(value = "/user")
      3 public class UserController {
      4 
      5     private static final Log LOGGER = LogFactory.getLog(UserController.class);
      6     private static List<User> userList;
      7 
      8     public UserController() {
      9         super();
     10         userList = new ArrayList<User>();
     11     }
     12 
     13     @RequestMapping(value = "/register", method = RequestMethod.GET)
     14     public String registerForm() {
     15         LOGGER.info("调用registerForm方法");
     16         return "register";
     17     }
     18 
     19     @RequestMapping(value = "/register", method = RequestMethod.POST)
     20     public String register(@RequestParam("loginname") String loginname, @RequestParam("password") String password, @RequestParam("username") String username) {
     21         LOGGER.info("调用register方法");
     22         User user = new User();
     23         user.setLoginname(loginname);
     24         user.setPassword(password);
     25         user.setUsername(username);
     26         userList.add(user);
     27         return "login";
     28     }
     29 
     30     @RequestMapping(value = "/login")
     31     public String login(@RequestParam("loginname") String loginname, @RequestParam("password") String password, Model model) {
     32         LOGGER.info("登录名:" + loginname + "密码:" + password);
     33         for (User user:userList){
     34             if (user.getLoginname().equals(loginname)&&user.getPassword().equals(password)){
     35                 model.addAttribute("user",user);
     36                 return "information";
     37             }
     38         }
     39         return "login";
     40     }
     41 }
     42 


    这里使用了本文记录的注解。
    创建register.jsp文件
    在项目的/WEB-INF/content目录下创建register.jsp文件,编写如下程序:

      1 <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
      2 <html>
      3 <head>
      4     <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
      5     <title>register</title>
      6 </head>
      7 <body>
      8 <h3>注册页面</h3>
      9 <br>
     10 <form action="register" method="post">
     11     <table>
     12         <tr>
     13             <td><label>登录名:</label></td>
     14             <td><input type="text" id="loginname" name="loginname"></td>
     15         </tr>
     16         <tr>
     17             <td><label>密码:</label></td>
     18             <td><input type="password" id="password" name="password"></td>
     19         </tr>
     20         <tr>
     21             <td><label>用户名:</label></td>
     22             <td><input type="text" id="username" name="username"></td>
     23         </tr>
     24         <tr>
     25             <td><input type="submit" id="submit" value="注册"></td>
     26         </tr>
     27     </table>
     28 </form>
     29 </body>

    用来进行注册信息的输入。
    创建login.jsp文件
    在项目的/WEB-INF/content目录下创建login.jsp文件,编写如下程序:

      1 <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
      2 <html>
      3 <head>
      4     <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
      5     <title>login</title>
      6 </head>
      7 <body>
      8 <h3>登录页面</h3>
      9 <br>
     10 <form action="login" method="post">
     11     <table>
     12         <tr>
     13             <td><label>登录名:</label></td>
     14             <td><input type="text" id="loginname" name="loginname"></td>
     15         </tr>
     16         <tr>
     17             <td><label>密码:</label></td>
     18             <td><input type="password" id="password" name="password"></td>
     19         </tr>
     20         <tr>
     21             <td><input type="submit" id="submit" value="登录"></td>
     22         </tr>
     23     </table>
     24 </form>
     25 </body>
     26 </html>

    用来进行登录信息的输入。
    创建information.jsp文件
    在项目的/WEB-INF/content目录下创建information.jsp文件,编写如下程序:

      1 <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
      2 <html>
      3 <head>
      4     <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
      5     <title>information</title>
      6 </head>
      7 <body>
      8 <h3>欢迎"${requestScope.user.loginname}"登录</h3>
      9 <h3>用户名为:"${requestScope.user.username}"</h3>
     10 </body>
     11 </html>

    用来进行展示用户名称。
    配置字符编码过滤器
    打开项目的web.xml文件,添加字符编码过滤器配置:

      1 <filter>
      2     <filter-name>SetCharacterEncoding</filter-name>
      3     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      4     <init-param>
      5         <param-name>encoding</param-name>
      6         <param-value>UTF-8</param-value>
      7     </init-param>
      8     <init-param>
      9         <param-name>forceEncoding</param-name>
     10         <param-value>true</param-value>
     11     </init-param>
     12 </filter>
     13 <filter-mapping>
     14     <filter-name>SetCharacterEncoding</filter-name>
     15     <url-pattern>/*</url-pattern>
     16 </filter-mapping>


    否则会出现information.jsp展示的中文信息乱码。
    测试
    启动TomcatServer,启动完成后,打开浏览器输入:http://localhost:8080/user/register访问成功。
    因为此时是GET请求,调用registerForm方法,返回register.jsp。

    Spring MVC注解01
    填写注册的信息之后,发送POST请求,调用的是register方法,返回login.jsp。
    Spring MVC注解02
    填写登录名和密码,调用的是login方法,进行登录。
    Spring MVC注解03
    登陆成功后,返回information.jsp,展示信息。

    Spring MVC注解04

  • 相关阅读:
    java编写socket使用bufferedReader.readLine()问题研究
    stage3D基础五-----Working with 3D cameras(转)
    stage3D基础四----Stage3D和透视投影的使用(转)
    stage3D基础三------什么是AGAL(转)
    stage3D基础二-----顶点和片段着色器(转)
    stage3D基础一-----Stage3D如何工作(转)
    OpenGL/GLSL数据传递小记(3.x)(转)
    OpenGL/GLSL数据传递小记(2.x)(转)
    Away3D引擎学习笔记(二)CameraController相机控制的应用
    I-team 博客全文检索 Elasticsearch 实战
  • 原文地址:https://www.cnblogs.com/Dcl-Snow/p/11496932.html
Copyright © 2011-2022 走看看