在《第一个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,示例代码如下:

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

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

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 使用扫描机制扫描控制器类,控制器类都在controller包及其子包下 --><context:component-scan base-package="controller" /><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean>
</beans>

RequestMapping 注解类型

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

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

1)方法级别注解

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

package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* “@Controller”表示 IndexController 的实例是一个控制器
*
* @Controller相当于@Controller(@Controller) 或@Controller(value="@Controller")
*/
@Controller
public class IndexController {@RequestMapping(value = "/index/login")public String login() {/*** login代表逻辑视图名称,需要根据Spring MVC配置* 文件中internalResourceViewResolver的前缀和后缀找到对应的物理视图*/return "login";}@RequestMapping(value = "/index/register")public String register() {return "register";}
}

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

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

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

2)类级别注解

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

package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/index")
public class IndexController {@RequestMapping("/login")public String login() {return "login";}@RequestMapping("/register")public String register() {return "register";}
}

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

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

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

编写请求处理方法

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

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

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

package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/index")
public class IndexController {@RequestMapping("/login")public String login(HttpSession session,HttpServletRequest request) {session.setAttribute("skey", "session范围的值");session.setAttribute("rkey", "request范围的值");return "login";}
}

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

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

package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/index")
public class IndexController {@RequestMapping("/register")public String register(Model model) {/*在视图中可以使用EL表达式${success}取出model中的值*/model.addAttribute("success", "注册成功");return "register";}
}

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

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

Spring MVC中@Controller和@RequestMapping注解详解相关推荐

  1. Spring中Controller和RequestMapping的详解

    先看一个简单的实例: @Controller @RequestMapping("/hello") public class anyTypeController{@RequestMa ...

  2. SpringMVC学习:控制层(Controller)基于注解详解

    文章目录 一.URL映射Controller的方法返回值 二.SpringMVC各类注解详解 (一) @Controller (二) @RequestMapping 1.基本用法 2. path属性或 ...

  3. [Spring mvc 深度解析(一)] 详解Servlet

    详解Servlet ​ Servlet是Server+Applet的缩写,表示一个服务器应用.通过上面的分析我们知道Servlet其实就是一套规范,我们按照这套规范写的代码就可以直接在Java的服务器 ...

  4. spring mvc -@RequestMapping注解详解

    https://www.cnblogs.com/caoyc/p/5635173.html @RequestMapping参数说明: value:定义处理方法的请求的URL地址(重点): method: ...

  5. Spring MVC @RequestMapping注解详解

    @RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...

  6. Spring、Spring MVC、MyBatis整合文件配置详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. web.xml的配置 web.xml应该是整个项目最重要的配置文件了,不过servlet3.0中已经 ...

  7. Spring MVC Formatter(数据格式化)详解

    Spring MVC 框架的 Formatter<T> 与 Converter<S,T> 一样,也是一个可以将一种数据类型转换成另一种数据类型的接口.不同的是,Formatte ...

  8. Spring MVC Converter(类型转换器)详解

    Spring MVC 框架的 Converter<S,T> 是一个可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型.开发者在实际应用中使用框架内置的类型 ...

  9. SpringMVC RequestMapping注解详解

    2019独角兽企业重金招聘Python工程师标准>>> @RequestMapping注解的作用是对用户的请求映射到指定的控制器或方法,所以该注解可以用来修饰类和方法,在Reques ...

最新文章

  1. java分布式+高可用_[Java复习] 分布式高可用-Hystrix
  2. 从Storm和Spark 学习流式实时分布式计算的设计
  3. 使用PyTorch从零开始实现YOLO-V3目标检测算法 (一)
  4. 动态规划实现斐波那契数列求解
  5. bp神经网络_BP神经网络的原理介绍
  6. 开源cms - 资料收集
  7. 快手与2020央视春晚达成独家互动合作:大年三十发红包
  8. 实例化新的Android片段的最佳做法
  9. java数组子类型_在vhdl中获取数组子类型的范围属性
  10. mysql buffer size_mysql read_buffer_size 设置多少合适
  11. C语言arduino密码锁实验报告,Arduino密码锁设计
  12. matlab安装matconvnet
  13. source insight护眼模式颜色
  14. Error:Execution failed for task :app:mergeDebugResourcesSome file crunching failed的解决方法
  15. 计算机usb接口无法读取,USB设备识别不了,USB接口无法识别设备怎么办
  16. datatables 动态表格行合并
  17. 依图科技CTO颜水成被曝离职,或转战东南亚独角兽Shopee
  18. 云服务器最重要的特点,云服务的优势是什么(云服务的主要特点)
  19. Hyperledger caliper 安装记录
  20. 华擎主板简直在开玩笑

热门文章

  1. 华为18级工程师三年心血终成趣谈网络协议文档(附大牛讲解)
  2. Maven学习总结(56)—— Maven、Gradle 、 Ant 哪一个构建工具最适合你?
  3. Maven学习总结(33)——开发人员如何使用 Flyway 插件管理数据库版本
  4. Ehcache学习总结(2)--Ehcache整合spring配置
  5. 我喜欢用计算机400字,我的电脑400字作文
  6. python内置json模块_python的常用内置模块之序列化模块json
  7. oracle数据库stuff的用法,sql STUFF用法
  8. 开环控制的两轮差速驱动小车_汽车的差速器、差速锁有什么不同?很多车主容易把它俩搞混...
  9. Opencv笔记(十八)——轮廓的更多函数及其层次结构
  10. 一个对前端模板技术的全面总结