概述

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。



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



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



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

Spring MVC的常用注解(一)的更多相关文章

  1. spring 以及 spring mvc 中常用注解整理

    spring 以及 spring mvc 中常用注解整理 @RequestMapping(映射路径) @Autowired(注入 bean 对象) 例如: @Autowired private Bas ...

  2. Spring MVC的常用注解

    一.@Controller @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写,你也可以自己指定. 二.@RequestMapping ...

  3. 0001 - Spring MVC中的注解

    1.概述 Spring MVC框架提供了功能强大的注解,大大简化了代码开发的同时也提升了程序的可扩展性 2.注解 2.1.@RequestMapping Spring MVC通过@RequestMap ...

  4. Spring中的常用注解

    Spring中的常用注解 1.@Controller 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.

  5. Spring 和 SpringMVC 常用注解和配置(@Autowired、@Resource、@Component、@Repository、@Service、@Controller的区别)

    Spring 常用注解 总结内容 一.Spring部分 1.声明bean的注解 2.注入bean的注解 3.java配置类相关注解 4.切面(AOP)相关注解 5.事务注解 6.@Bean的属性支持 ...

  6. Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法

    Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法 在Action中方法的返回值都是字符串行,一般情况是返回某个JSP,如: return "xx" ...

  7. Spring MVC 中 @ModelAttribute 注解的妙用

    Spring MVC 中 @ModelAttribute 注解的妙用 Spring MVC 提供的这种基于注释的编程模型,极大的简化了 web 应用的开发.其中 @Controller 和 @Rest ...

  8. Spring MVC中@RequestMapping注解使用技巧(转)

    @RequestMapping是Spring Web应用程序中最常被用到的注解之一.这个注解会将HTTP请求映射到MVC和REST控制器的处理方法上. 在这篇文章中,你将会看到@RequestMapp ...

  9. Spring MVC 4常用的那些注解

    Spring从2.5版本开始在编程中引入注解,用户可以使用@RequestMapping, @RequestParam, @ModelAttribute等等这样类似的注解.到目前为止,Spring的版 ...

随机推荐

  1. PalletOne调色板跨链的BTC实现

    之前已经讲到了PalletOne调色板跨链以太坊ETH和ERC20的技术原理,接下来我们来讲解PalletOne跨链比特币BTC的技术原理. 一.BTC充币 假如用户A持有一定数量的比特币BTC,他希 ...

  2. mysql的repeat()函数

    用来复制字符串,如下'ab'表示要复制的字符串,2表示复制的份数 mysql> select repeat('ab',2); +----------------+ | repeat('ab',2 ...

  3. WebShell代码分析溯源(二)

    WebShell代码分析溯源(二) 一.一句话变形马样本 <?php $POST['POST']='assert';$array[]=$POST;$array[0]['POST']($_POST ...

  4. MVC过滤器:过滤器执行顺序

    如果某个Action过滤器运用了多种过滤器,那么过滤器的执行顺序是如何呢? 规则一:不同类型的过滤器有一个先后顺序 即执行顺序是:授权过滤器->动作过滤器->结果过滤器->异常过滤器 ...

  5. python爬虫公众号所有信息,并批量下载公众号视频

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 数据分析实战 PS:如有需要Python学习资料的小伙伴可以加点击 ...

  6. linux指令大全(归类整理)

    一.文件目录指令 1 pwd指令 pwd 显示当前所在的目录 2 ls指令 ls [选项] [目录或文件] 查看文件信息 ls -a 查看所有文件和目录,包括隐藏的 ls -l 以列表的方式显示 ll ...

  7. javaWeb核心技术第十篇之Filter

    Web中有三大组件(需要配置web.xml) servlet:服务器端的小程序. Filter(过滤器):运行在服务器,对请求的资源进行过滤,对响应进行包装. 经典案例: 自动登录,网站全局编码,非法 ...

  8. JS基础研语法---函数基础总结---定义、作用、参数、返回值、arguments伪数组、作用域、预解析

    函数: 把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了 函数作用: 代码重用 函数的参数: 形参:函数定义的时候,函数名字后面的小括号里的变量 实参:函数调用的时候,函数名 ...

  9. 微信小程序之上传图片和图片预览

    这几天一直负责做微信小程序这一块,也可以说是边做边学习吧,把自己做的微信小程序的一些功能分享出来,与大家探讨一下,相互学习相互进步. 先看下效果图 只写了一下效果样式的话希望大家不要太在意,下面马路杀 ...

  10. Attaching an entity of type 'xxx' failed because another entity of the same type already has the same primary key value.

    问题的详细描述: Attaching an entity of type 'xxxxx' failed because another entity of the same type already ...