Spring MVC中@Controller和@RequestMapping注解详解
admin
2024-03-08 01:45:05
0

在《第一个Spring MVC应用》教程中创建了两个传统风格的控制器,它们是实现 Controller 接口的类。传统风格的控制器不仅需要在配置文件中部署映射,而且只能编写一个处理方法,不够灵活。使用基于注解的控制器具有以下两个优点:

  • 在基于注解的控制器类中可以编写多个处理方法,进而可以处理多个请求(动作),这就允许将相关的操作编写在同一个控制器类中,从而减少控制器类的数量,方便以后的维护。
  • 基于注解的控制器不需要在配置文件中部署映射,仅需要使用 RequestMapping 注释类型注解一个方法进行请求处理。

在 Spring MVC 中最重要的两个注解类型是 Controller 和 RequestMapping,本节将重点介绍它们。在本节将创建一个 Spring MVC 应用 springMVCDemo02 来演示相关知识,springMVCDemo01 的 JAR 包、web.xml 与 springMVCDemo02 应用的 JAR 包、web.xml 完全一样。

Controller 注解类型

在 Spring MVC 中使用 org.springframework.stereotype.Controller 注解类型声明某类的实例是一个控制器。例如,在 springMVCDemo02 应用的 src 目录下创建 controller 包,并在该包中创建 Controller 注解的控制器类 IndexController,示例代码如下:

  1. package controller;
  2. import org.springframework.stereotype.Controller;
  3. /**
  4. * “@Controller”表示 IndexController 的实例是一个控制器
  5. *
  6. * @Controller相当于@Controller(@Controller) 或@Controller(value="@Controller")
  7. */
  8. @Controller
  9. public class IndexController {
  10. // 处理请求的方法
  11. }

在 Spring MVC 中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被 Spring MVC 框架扫描到,需要在配置文件中声明 spring-context,并使用 元素指定控制器类的基本包(请确保所有控制器类都在基本包及其子包下)。

例如,在 springMVCDemo02 应用的 /WEB-INF/ 目录下创建配置文件 springmvc-servlet.xml,示例代码如下:

  1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xmlns:mvc="http://www.springframework.org/schema/mvc"
  3. xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">

RequestMapping 注解类型

在基于注解的控制器类中可以为每个请求编写对应的处理方法。那么如何将请求与处理方法一一对应呢?

需要使用 org.springframework.web.bind.annotation.RequestMapping 注解类型将请求与处理方法一一对应。

1)方法级别注解

方法级别注解的示例代码如下:

  1. package controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. /**
  5. * “@Controller”表示 IndexController 的实例是一个控制器
  6. *
  7. * @Controller相当于@Controller(@Controller) 或@Controller(value="@Controller")
  8. */
  9. @Controller
  10. public class IndexController {
  11. @RequestMapping(value = "/index/login")
  12. public String login() {
  13. /**
  14. * login代表逻辑视图名称,需要根据Spring MVC配置
  15. * 文件中internalResourceViewResolver的前缀和后缀找到对应的物理视图
  16. */
  17. return "login";
  18. }
  19. @RequestMapping(value = "/index/register")
  20. public String register() {
  21. return "register";
  22. }
  23. }

上述示例中有两个 RequestMapping 注解语句,它们都作用在处理方法上。注解的 value 属性将请求 URI 映射到方法,value 属性是 RequestMapping 注解的默认属性,如果只有一个 value 属性,则可以省略该属性。

用户可以使用如下 URL 访问 login 方法(请求处理方法),在访问 login 方法之前需要事先在 /WEB-INF/jsp/ 目录下创建 login.jsp。

  1. http://localhost:8080/springMVCDemo02/index/login

2)类级别注解

类级别注解的示例代码如下:

  1. package controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller
  5. @RequestMapping("/index")
  6. public class IndexController {
  7. @RequestMapping("/login")
  8. public String login() {
  9. return "login";
  10. }
  11. @RequestMapping("/register")
  12. public String register() {
  13. return "register";
  14. }
  15. }

在类级别注解的情况下,控制器类中的所有方法都将映射为类级别的请求。用户可以使用如下 URL 访问 login 方法。

  1. http://localhost:8080/springMVCDemo02/index/login

为了方便维护程序,建议开发者采用类级别注解,将相关处理放在同一个控制器类中。例如,对商品的增、删、改、查处理方法都可以放在 GoodsOperate 控制类中。

编写请求处理方法

在控制类中每个请求处理方法可以有多个不同类型的参数,以及一个多种类型的返回结果。

1)请求处理方法中常出现的参数类型

如果需要在请求处理方法中使用 Servlet API 类型,那么可以将这些类型作为请求处理方法的参数类型。Servlet API 参数类型的示例代码如下:

  1. package controller;
  2. import javax.servlet.http.HttpSession;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. @Controller
  6. @RequestMapping("/index")
  7. public class IndexController {
  8. @RequestMapping("/login")
  9. public String login(HttpSession session,HttpServletRequest request) {
  10. session.setAttribute("skey", "session范围的值");
  11. session.setAttribute("rkey", "request范围的值");
  12. return "login";
  13. }
  14. }

除了 Servlet API 参数类型以外,还有输入输出流、表单实体类、注解类型、与 Spring 框架相关的类型等,这些类型在后续章节中使用时再详细介绍。

其中特别重要的类型是 org.springframework.ui.Model 类型,该类型是一个包含 Map 的 Spring 框架类型。在每次调用请求处理方法时 Spring MVC 都将创建 org.springframework.ui.Model 对象。Model 参数类型的示例代码如下:

  1. package controller;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpSession;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.ui.Model;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. @Controller
  8. @RequestMapping("/index")
  9. public class IndexController {
  10. @RequestMapping("/register")
  11. public String register(Model model) {
  12. /*在视图中可以使用EL表达式${success}取出model中的值*/
  13. model.addAttribute("success", "注册成功");
  14. return "register";
  15. }
  16. }

2)请求处理方法常见的返回类型

最常见的返回类型就是代表逻辑视图名称的 String 类型,例如前面教程中的请求处理方法。除了 String 类型以外,还有 ModelAndView、Model、View 以及其他任意的 Java 类型。

相关内容

热门资讯

给我挚爱的或给我的挚爱用法语怎... 给我挚爱的或给我的挚爱用法语怎么说!“给我挚爱的XXX ”或 “给我的挚爱XXX ”用法语怎么说!~...
大仙让请了一个狐仙在家里我看着... 大仙让请了一个狐仙在家里我看着有点不舒服怎么办?大仙让请了个狐仙在家里,自己看着有点不舒服。好的办法...
英语的八大语法结构是什么? 英语的八大语法结构是什么?1.一般现在时:主语+do/doese.gWecleantheroomev...
风趣机智的白羊座们也会做事常常... 风趣机智的白羊座们也会做事常常马虎不正经?机灵,风趣机智的白羊座们也会做事常常虎头虎尾?白羊座的人虽...
蜡烛的诗句 蜡烛的诗句秋夕 杜牧 银烛秋光冷画屏,轻罗小扇扑流萤。天阶夜色凉如水,坐看牵牛织女星.落红不是无情物...
天龙八部里面的虚竹最早是什么派 天龙八部里面的虚竹最早是什么派大概是 蛋黄派最早是少林寺的少林少林少林少林少林少林少林少林少林少...
明代古墓女尸光鲜如活人,究竟是... 明代古墓女尸光鲜如活人,究竟是怎么回事?可能是棺木的密封性很好,致使尸体迅速脱水,隔绝氧气,减缓腐化...
什么是龙娘客 什么是龙娘客一个人骂另一个人说是龙娘客一样的这个事青田话。。。。就是说他像中年妇女,婆婆妈妈
完美国际高手请来看看 完美国际高手请来看看用G时,最好用360保险箱保护起来……
语言 用韩文怎么说 语言 用韩文怎么说语言 用韩文怎么说【中文】:语言【韩文】:말/언어【罗马音标】:Mal /Eon ...
完美世界里修真是什么意思? 完美世界里修真是什么意思?完美世界离得修真是一个修行术语,说白了包括打怪升级、系统任务、交友探险等等...
一个少年的求助! 一个少年的求助!乐观二字最重要,积极对待生命!!!我太同情你和你的妈妈了....我觉得你应该如实告诉...
《临界·爵迹》出完了吗 《临界·爵迹》出完了吗临界爵迹是出完了,接下来是《爵迹·风津道》,都是爵迹系列的,有好几本临界爵迹完...
我似乎能看懂别人的心思 我似乎能看懂别人的心思你好,那说明你能通过一些细节(说话,动作,表情)慎扰链揣摩人意,观察比较敏锐,...
我听见别人咀嚼的声音就特别烦躁 我听见别人咀嚼的声音就特别烦躁是心理有什么问题吗就是咀嚼和吞咽的声音,我一听就巨烦.有什么解决的办法...
如何解落降头 如何解落降头看一些佛教之类的书,能对你有帮助要自己认真做事,不要管别人的评论,没有人向你施了降头。戴...
赛尔号时空密码 从那里来?还有... 赛尔号时空密码 从那里来?还有那个精元是什么?精细!!要打精灵王6-9次系统就会给你的,精元.......
苏的拼音是什么 苏的拼音是什么我问的字是不苏,但我也不知道为什么一写出来就成了苏了,那个字是一个更右边半包了一个生字...
皇马哪一年的阵容中有齐达内,罗... 皇马哪一年的阵容中有齐达内,罗纳尔多,贝克汉姆,劳尔和欧文?差不多是2002年吧!2004-2005...
现在已经拍成了电影的《哈利波特... 现在已经拍成了电影的《哈利波特》一共拍了几集,分别叫什么?电影啊,不是小说!谢谢!是不是有一部《哈利...