Spring MVC的常用注解(一)

2022-10-16,,,

概述
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路径:
@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。

填写注册的信息之后,发送post请求,调用的是register方法,返回login.jsp。

填写登录名和密码,调用的是login方法,进行登录。

登陆成功后,返回information.jsp,展示信息。

《Spring MVC的常用注解(一).doc》

下载本文的Word格式文档,以方便收藏与打印。