Spring MVC的常用注解(一)

mac2022-06-30  84

概述 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注解支持的常用属性:

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

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

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

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

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

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

属性类型说明nameString指定请求头绑定的名称valueStringname属性的别名requiredboolean参数是否必须绑定defaultValueString没有传递参数时,参数的默认值 注解示例程序 修改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,展示信息。

转载于:https://www.cnblogs.com/Dcl-Snow/p/11496932.html

最新回复(0)