SpringMVC RequestMapping 详解

RequestMapping这个注解在SpringMVC扮演着非常重要的角色,可以说是随处可见。它的知识点很简单。今天我们就一起学习SpringMVC的RequestMapping这个注解。文章主要分为两个部分:RequestMapping 基础用法和RequestMapping 提升用法。

准备工作

pom.xml 这里是需要的jar包和相关的配置。这里设置了maven-compiler-plugin的java版本为1.7,避免打包出错和中文乱码的问题。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.springmvc</groupId>
  7. <artifactId>springmvc</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>war</packaging>
  10. <!-- 若不配置,打包时会提示错误信息
  11. Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project springmvc: Compilation failure:
  12. 提示 未结束的字符串文字 ,若字符串后面加上空格后可以打包成功,但会乱码。
  13. 原因是:maven使用的是默认的compile插件来进行编译的。complier是maven的核心插件之一,然而complier插件默认只支持编译Java 1.4
  14. -->
  15. <build>
  16. <plugins>
  17. <plugin>
  18. <artifactId>maven-compiler-plugin</artifactId>
  19. <configuration>
  20. <source>1.7</source>
  21. <target>1.7</target>
  22. <encoding>UTF-8</encoding>
  23. </configuration>
  24. </plugin>
  25. </plugins>
  26. </build>
  27. <properties>
  28. <spring.version>4.1.3.RELEASE</spring.version>
  29. </properties>
  30. <dependencies>
  31. <!-- spring begin -->
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-webmvc</artifactId>
  35. <version>${spring.version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-context</artifactId>
  40. <version>${spring.version}</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework</groupId>
  44. <artifactId>spring-aop</artifactId>
  45. <version>${spring.version}</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework</groupId>
  49. <artifactId>spring-core</artifactId>
  50. <version>${spring.version}</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework</groupId>
  54. <artifactId>spring-web</artifactId>
  55. <version>${spring.version}</version>
  56. </dependency>
  57. <!-- spring end -->
  58. <dependency>
  59. <groupId>javax.servlet</groupId>
  60. <artifactId>javax.servlet-api</artifactId>
  61. <version>4.0.0</version>
  62. <scope>provided</scope>
  63. </dependency>
  64. </dependencies>
  65. </project>

web.xml 设置字符拦截器,避免中文乱码

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id="WebApp_ID" version="3.0">
  6. <display-name>springmvc</display-name>
  7. <!-- 配置 DispatcherServlet -->
  8. <servlet>
  9. <servlet-name>dispatcher</servlet-name>
  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  11. <!-- 指定 SpringMVC 配置文件的位置和名称
  12. 若SpringMVC的配置文件名的格式和位置满足: /WEB-INF/servlet-name + "-servlet.xml"
  13. 则可以省略下面的init-param代码。这里的servlet-name是dispatcher。 即/WEB-INF/dispatcher-servlet.xml
  14. -->
  15. <load-on-startup>1</load-on-startup>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>dispatcher</servlet-name>
  19. <!-- servlet知识点:处理所有请求 -->
  20. <url-pattern>/</url-pattern>
  21. </servlet-mapping>
  22. <!-- 字符集过滤器 -->
  23. <filter>
  24. <filter-name>encodingFilter</filter-name>
  25. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  26. <init-param>
  27. <param-name>encoding</param-name>
  28. <param-value>UTF-8</param-value>
  29. </init-param>
  30. <init-param>
  31. <param-name>forceEncoding</param-name>
  32. <param-value>true</param-value>
  33. </init-param>
  34. </filter>
  35. <filter-mapping>
  36. <filter-name>encodingFilter</filter-name>
  37. <url-pattern>/*</url-pattern>
  38. </filter-mapping>
  39. </web-app>

SpringMVC的配置文件(dispatcher-servlet.xml)没有变,这里就不再贴出来了。可以去上一章找

RequestMapping 基础用法

核心类 ApiStudyController,这是重点需要看的java文件。里面主要介绍了@RequestMapping 的基础用法。

你需要重点学习的有: 获取请求参数值的@RequestParam注解;通过占位符获取参数值的@PathVariable注解;指定请求方式的method属性;用于将数据存储到作用域中返回给前端的Map,Model和ModelMap参数;以及如何使用POJO对象作为方法的参数。

  1. import java.util.Map;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.Model;
  4. import org.springframework.ui.ModelMap;
  5. import org.springframework.web.bind.annotation.CookieValue;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RequestHeader;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestMethod;
  10. import org.springframework.web.bind.annotation.RequestParam;
  11. @Controller
  12. @RequestMapping("apiStudy")
  13. public class ApiStudyController {
  14. private static final String SUCCESS = "apistudy";
  15. private static final String RESULT_KEY = "result";
  16. /**
  17. * 常用知识点:在类或者方法上使用 @RequestMapping 注解
  18. * 若没有修饰类,则访问路径是: http://ip:port/项目名/方法的@RequestMapping值
  19. * 若类有修饰类,则访问路径是: http://ip:port/项目名/类的@RequestMapping值/方法的@RequestMapping值
  20. */
  21. /**
  22. * 方法中用map作为参数,可以将数据存储到request作用域中,放回到页面上。
  23. * 同样用法的有 Model 类型 和 ModelMap 类型
  24. */
  25. @RequestMapping("/testMapResult")
  26. public String testMapResult(Map<String, Object> map, Model model, ModelMap modelMap){
  27. String apiDocs = "Map,Model,ModelMap (常用方法) : 在方法中添加Map的参数,可以将数据放到request 作用域中!";
  28. map.put(RESULT_KEY, apiDocs);
  29. model.addAttribute("model", "Model");
  30. modelMap.addAttribute("modelMap", "ModelMap");
  31. return SUCCESS;
  32. }
  33. /**
  34. * 常用知识点:使用 method 属性来指定请求方式
  35. * 若用GET方式请求,会提示:HTTP Status 405 - Request method 'GET' not supported 错误信息
  36. */
  37. @RequestMapping(value = "/testRequestMethod", method=RequestMethod.POST)
  38. public String testRequestMethod(Map<String, Object> map) {
  39. String apiDocs = "RequestMethod (常用方法) : 若设置只有POST请求才能进入,则用GET方式请求,会报405的错误。反之亦然!";
  40. map.put(RESULT_KEY, apiDocs);
  41. return SUCCESS;
  42. }
  43. /**
  44. * 常用知识点:使用注解 @PathVariable 映射 URL绑定占位,属于REST风格。
  45. * 注意两点:
  46. * 1. 严格用法: @PathVariable("arg") String arg; 前一个arg参数,必须要和占位参数{arg}保持一致。后面一个arg参数可以自定义。
  47. * 2. 偷懒用法: @PathVariable String arg; 这里的参数名 arg 必须要和占位参数{arg}保持一致,不然会提示400的错误
  48. */
  49. @RequestMapping("/testPathVariable/{arg}")
  50. public String testPathVariable(@PathVariable("arg") String arg, Map<String, Object> map) {
  51. String apiDocs = "PathVariable (常用方法) : 通过映射 URL绑定占位获取的值是 " + arg;
  52. map.put(RESULT_KEY, apiDocs);
  53. return SUCCESS;
  54. }
  55. /**
  56. * 常用知识点:使用注解 @RequestParam 来映射请求参数
  57. * 该注解有三个参数,
  58. * value 请求的参数名,
  59. * required 请求的参数是否必填 ,默认是true,
  60. * defaultValue 请求的参数默认值.
  61. * 参数的类型建议是封装数据类型,因为float默认值是0.0 ,若该参数是非必填,则会报错 HTTP Status 500
  62. */
  63. @RequestMapping("/testRequestParam")
  64. public String testRequestParam(@RequestParam("account") String account,
  65. @RequestParam(value="password", required=true) String password,
  66. @RequestParam(value="price", required=false, defaultValue="0.0") float price,
  67. Map<String, Object> map) {
  68. String apiDocs = "RequestParam (常用方法) : 获取映射请求参数的值有 account : " + account + " password : " + password + " price : " + price;
  69. map.put(RESULT_KEY, apiDocs);
  70. return SUCCESS;
  71. }
  72. /**
  73. * 常用知识点:方法参数是POJO对象
  74. * 前端的请求参数名一定要和POJO对象属性一致。支持级联
  75. */
  76. @RequestMapping(value = "/testPojo", method = RequestMethod.POST)
  77. public String testPojo(User user, Map<String, Object> map) {
  78. map.put(RESULT_KEY, user);
  79. return SUCCESS;
  80. }
  81. /**
  82. * 不常用方法:params 和 headers
  83. * @RequestMapping 注解中,除了常用的value和method外,还有两个较为常用的params和headers
  84. * 他们可以是请求跟精确,制定那些参数的请求不接受,同时也可以指定那些参数的请求接收。
  85. * params={param1,param2}
  86. * param1 表示 请求必须包含名为param1的请求参数
  87. * !param1 表示 请求不能包含名为param1的请求参数
  88. * param1!=value1 表示请求包含param1的请求参数,但是其值不能是value1
  89. */
  90. @RequestMapping(value="/testParamsAndHeaders", params={"itdragon"},
  91. headers = { "Accept-Language=zh-CN,zh;q=0.8" })
  92. public String testParamsAndHeaders(Map<String, Object> map) {
  93. String apiDocs = "params,headers (了解用法) : 这里表示当请求参数中包含了itdragon的时候才能进来";
  94. map.put(RESULT_KEY, apiDocs);
  95. return SUCCESS;
  96. }
  97. /**
  98. * 不常用方法:ant风格
  99. * ?匹文件名中一个字
  100. * *匹文件名中任意字
  101. * ** 匹多 层径
  102. */
  103. @RequestMapping("/*/testAntUrl")
  104. public String testAntUrl(Map<String, Object> map) {
  105. String apiDocs = "Ant风格 (了解用法) : ?匹文件名中一个字 ; *匹文件名中任意字 ; ** 匹多 层径 ";
  106. map.put(RESULT_KEY, apiDocs);
  107. return SUCCESS;
  108. }
  109. /**
  110. * 不常用方法:@RequestHeader 注解获取请求头数据。
  111. */
  112. @RequestMapping("/testRequestHeader")
  113. public String testRequestHeader(@RequestHeader(value = "Accept-Language") String al,
  114. Map<String, Object> map) {
  115. String apiDocs = "@RequestHeader (了解用法) : 获取请求头数据的注解, 如Accept-Language 的值是 : " + al;
  116. map.put(RESULT_KEY, apiDocs);
  117. return SUCCESS;
  118. }
  119. /**
  120. * 不常用方法:@CookieValue: 映射一个 Cookie值
  121. */
  122. @RequestMapping("/testCookieValue")
  123. public String testCookieValue(@CookieValue("JSESSIONID") String sessionId,
  124. Map<String, Object> map) {
  125. String apiDocs = "@CookieValue(了解用法) : 映射一个 Cookie值的注解, 如JSESSIONID 的Cookie值是 : " + sessionId;
  126. map.put(RESULT_KEY, apiDocs);
  127. return SUCCESS;
  128. }
  129. }

用于测试的前端页面 index.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>SpringMVC 快速入门</title>
  8. </head>
  9. <body>
  10. <h2>@RequestMapping 注解基本用法</h2>
  11. <a href="helloworld">史上最丑的HelloWorld</a>
  12. <br/><br/>
  13. <a href="apiStudy/testMapResult">Map,Model,ModelMap的使用方法</a>
  14. <br/><br/>
  15. <a href="apiStudy/testRequestMethod">用GET请求方式测试POST方法</a>
  16. <form action="apiStudy/testRequestMethod" method="POST">
  17. <input type="submit" value="用POST请求方式测试POST方法"/>
  18. </form>
  19. <br/>
  20. <a href="apiStudy/testPathVariable/itdragon">@PathVariable获取占位数据</a>
  21. <br/><br/>
  22. <a href="apiStudy/testRequestParam?account=itdragon&password=123456">@RequestParam获取请求参数值</a>
  23. <br/><br/>
  24. <form action="apiStudy/testPojo" method="post">
  25. account: <input type="text" name="account" value="itdragon"/> <br>
  26. level: <input type="text" name="position.level" value="架构师"/> <br>
  27. salary: <input type="text" name="position.salary" value="88888.88"/> <br>
  28. <input type="submit" value="测试方法参数是POJO"/>
  29. </form>
  30. <br/>
  31. <hr/>
  32. <a href="apiStudy/testParamsAndHeaders?itdragon=great">params 和 headers用法</a>
  33. <br/><br/>
  34. <a href="apiStudy/itdragon/testAntUrl">Ant风格URL请求</a>
  35. <br/><br/>
  36. <a href="apiStudy/testRequestHeader">@RequestHeader 注解获取请求头数据</a>
  37. <br/><br/>
  38. <a href="apiStudy/testCookieValue">@CookieValue 注解获取 Cookie值</a>
  39. </body>
  40. </html>

方便查看结果的apistudy.jsp页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>SpringMVC 快速入门</title>
  8. </head>
  9. <body>
  10. <h2>@RequestMapping 注解基本用法</h2>
  11. request 作用域 : <br/>
  12. ${requestScope.result} <br/>
  13. ${requestScope.model} <br/>
  14. ${requestScope.modelMap} <br/>
  15. <hr/>
  16. session 作用域 : <br/>
  17. ${sessionScope.result}
  18. </body>
  19. </html>

最后是两个用于测试的POJO对象,分别是User和Position

  1. public class User {
  2. private Integer id;
  3. private String account;
  4. private String password;
  5. private Position position;
  6. public User() {
  7. }
  8. public User(Integer id, String account, String password) {
  9. this.id = id;
  10. this.account = account;
  11. this.password = password;
  12. }
  13. public Integer getId() {
  14. return id;
  15. }
  16. public void setId(Integer id) {
  17. this.id = id;
  18. }
  19. public String getAccount() {
  20. return account;
  21. }
  22. public void setAccount(String account) {
  23. this.account = account;
  24. }
  25. public String getPassword() {
  26. return password;
  27. }
  28. public void setPassword(String password) {
  29. this.password = password;
  30. }
  31. public Position getPosition() {
  32. return position;
  33. }
  34. public void setPosition(Position position) {
  35. this.position = position;
  36. }
  37. @Override
  38. public String toString() {
  39. return "User [id=" + id + ", account=" + account + ", password=" + password + ", position="
  40. + position + "]";
  41. }
  42. }
  1. public class Position {
  2. private Integer id;
  3. private String level;
  4. private Double salary;
  5. public Integer getId() {
  6. return id;
  7. }
  8. public void setId(Integer id) {
  9. this.id = id;
  10. }
  11. public String getLevel() {
  12. return level;
  13. }
  14. public void setLevel(String level) {
  15. this.level = level;
  16. }
  17. public Double getSalary() {
  18. return salary;
  19. }
  20. public void setSalary(Double salary) {
  21. this.salary = salary;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Position [level=" + level + ", salary=" + salary
  26. + "]";
  27. }
  28. }

测试的效果图

RequestMapping 提升用法

这里的知识点有:输出模型数据 ModelAndView类型,Map(Model,ModelMap),@ModelAttribute注解,@SessionAttributes注解的使用,和 原生的Servlet Api的使用。

ModelAndView数据类型:见名知意,即包含了模型数据,又包含了视图数据。设置模型数据有两种方式:modelAndView.addObject(String attributeName, Object attributeValue) 方分别表示Key和Value。modelAndView.addAllObjects(modelMap) 存的参数是一个Map(Model,ModelMap其实都是Map数据类型)。

设置视图数据常用方法也有两种方式:

ModelAndView modelAndView = new ModelAndView(viewName) 初始化ModelAndView的时候设置。

modelAndView.setViewName(viewName) 初始化后再she'zh

@ModelAttribute 注解:被该注解修饰的方法, 会在每个目标方法执行之前被 SpringMVC 调用。实际开发中其实用的并不是很多。在我们更新数据的时候,一般都会先查询,后更新。该注解就扮演督促查询的角色,在执行更新的方法前先执行该注解修饰的查询数据方法。

@SessionAttributes 注解:只能修饰在类上,将模型数据暂存到HttpSession中,从而使多个请求的数据共享。常用方法有@SessionAttributes(value={"obj1", "obj2"}, types={String.class, Obj1.class})。表示可以将数据类型是String或者是对象Obj1的模型数据放到HttpSession中。也可以将变量名是obj1,obj2的模型数据放到HttpSession中。用这个注解容易出一个问题。HttpSessionRequiredException 异常,原因在代码注释中。

原生的Servlet Api:如果发现不能引入javax.servlet.* 的文件,可能是因为项目里面中没有servlet-api.jar。

普通项目解决方法:右击项目工程名称 ---> Build Path ---> Configure Build Path... ---> 选择 Libraries 点击 Add External JARS ---> 在按照tomcat的里面下,找到lib目录,里面就有。

Maven项目解决方法:如果按照上面的方法处理,虽然引入文件,当打包的时候会提示"找不到符号",是因为servlet-api.jar 没有真正的加入到classpath下。最简单的方法就是在pom.xml加入servlet-api.jar。

看代码:

  1. import java.io.IOException;
  2. import java.io.Writer;
  3. import java.util.Map;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.ModelAttribute;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.bind.annotation.SessionAttributes;
  11. import org.springframework.web.servlet.ModelAndView;
  12. @Controller
  13. @RequestMapping("apiStudy")
  14. @SessionAttributes(value={"user"}, types={String.class})
  15. public class ApiStudyController {
  16. private static final String SUCCESS = "apistudy";
  17. private static final String RESULT_KEY = "result";
  18. /**
  19. * @SessionAttributes 将数据存储到session中,达到多个请求数据共享的目的。
  20. * 只能修饰在类上的注解
  21. * 通过属性名value,指定需要放到会话中的属性
  22. * 通过模型属性的对象类型types,指定哪些模型属性需要放到会话中
  23. */
  24. /**
  25. * 常用方法:ModelAndView 方法的返回值设置为 ModelAndView 类型。
  26. * ModelAndView 顾名思义,是包含视图和模型信息的类型。
  27. * 其数据存放在 request 域对象中.
  28. */
  29. @RequestMapping("/testModelAndView")
  30. public ModelAndView testModelAndView() {
  31. String viewName = SUCCESS; // 需要返回的视图名
  32. String apiDocs = "ModelAndView(常用方法) : 之前学习的方法返回值是字符串,数据是通过Map返回到前端。现在可以通过ModelAndView类型直接完成。";
  33. ModelAndView modelAndView = new ModelAndView(viewName);
  34. modelAndView.addObject(RESULT_KEY, apiDocs); // 添加数据到model中
  35. return modelAndView;
  36. }
  37. /**
  38. * SpringMVC 确定目标方法 POJO 类型入参的过程
  39. * 第一步: 确定一个 key
  40. * 若方法形如 "testModelAttribute(User user)" , 则key为 user(POJO 类名第一个字母小写)
  41. * 若方法形如"testModelAttribute(@ModelAttribute("userObj") User user)" ,则key为 userObj
  42. * 第二步: 在 implicitModel 中查找 key 对应的对象
  43. * 若 implicitModel 存在, 则作为入参传入
  44. * 若 implicitModel 中不存在, 则检查当前Handler 是否使用 @SessionAttributes 注解
  45. * 若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了 key, 则会从 HttpSession 中来获取 key 所对应的 value 值, 若存在则直接传入到目标方法的入参中. 若不存在则将抛出异常.
  46. * 若 Handler 没有标识 @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key, 则通过反射来创建 POJO 类型的参数, 传入为目标方法的参数
  47. * implicitModel? SpringMVC 会把 key 和 POJO 类型的对象保存到 implicitModel 中, 进而会保存到 request 中.
  48. */
  49. @RequestMapping("/testModelAttribute")
  50. public ModelAndView testModelAttribute(User user){
  51. ModelAndView modelAndView = new ModelAndView(SUCCESS);
  52. modelAndView.addObject(RESULT_KEY, "update : " + user); // 添加数据到model中
  53. return modelAndView;
  54. }
  55. /**
  56. * 常用方法:@ModelAttribute 修饰方法。 被该注解修饰的方法, 会在每个目标方法执行之前被 SpringMVC 调用
  57. * 运行流程:
  58. * 第一步: 在执行 testModelAttribute(User user) 方法前,会先执行被@ModelAttribute 注解修饰的方法 getUser()
  59. * 第二步: 执行getUser() 后,将执行放入到Map中,其中的key 必须和目标方法User对象的首字母小写user
  60. * 第三步: SpringMVC 从 Map 中取出 User 对象,然后把对象传入目标方法的参数.
  61. *
  62. * 未使用 @ModelAttribute testModelAttribute方法 打印的信息 :
  63. * update : User [id=1, account=itdragon, password=null, position=null]
  64. * 使用@ModelAttribute testModelAttribute方法 打印的信息 :
  65. * update : User [id=1, account=itdragon, password=zhangdeshuai, position=null]
  66. */
  67. @ModelAttribute
  68. public void getUser(@RequestParam(value="id",required=false) Integer id,
  69. Map<String, Object> map){
  70. if(id != null){
  71. //模拟从数据库中获取对象
  72. User user = new User(1, "itdragon", "zhangdeshuai");
  73. map.put("user", user); // 这里的key 一定是该对象User的首字母小写user
  74. }
  75. }
  76. /**
  77. * 常用方法:可以使用 Serlvet 原生的 API 作为目标方法的参数 具体支持以下类型
  78. *
  79. * HttpServletRequest
  80. * HttpServletResponse
  81. * HttpSession
  82. * InputStream
  83. * OutputStream
  84. * Reader
  85. * Writer
  86. */
  87. @RequestMapping("/testServletAPI")
  88. public void testServletAPI(HttpServletRequest request,
  89. HttpServletResponse response, Writer out) throws IOException {
  90. response.setCharacterEncoding("utf-8");
  91. response.setContentType("text/html;charset=utf-8");
  92. out.write("Hello Servlet API,和用Servlet一样(0——0) ; <br/>request : " + request + " ;<br/>response : " + response);
  93. }
  94. }

一样的前端index.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>SpringMVC 快速入门</title>
  8. </head>
  9. <body>
  10. <h2>@RequestMapping 注解提升用法</h2>
  11. <a href="apiStudy/testModelAndView">ModelAndView的使用方法</a>
  12. <br/><br/>
  13. <form action="apiStudy/testModelAttribute" method="post">
  14. <input type="hidden" name="id" value="1"/><!-- 隐藏域 id -->
  15. account: <input type="text" name="account" value="itdragon"/> <br>
  16. <input type="submit" value="testModelAttribute"/>
  17. </form>
  18. <br/>
  19. <a href="apiStudy/testServletAPI">使用原生的Servlet API</a>
  20. <br/><br/>
  21. </body>
  22. </html>

两个实体类和查看结果的jsp页面没有变

效果图:



Spring MVC 其实提供了很多的组合注解:

@RestController = @Controller + @ResponseBody

@GetMapping = @RequestMapping(method = { RequestMethod.GET })

@PostMapping = @RequestMapping(method = { RequestMethod.POST })

后续有时间会补充,留着备忘!

补充,由于springMVC默认认为/users 和 /users.* 匹配规则等价,若不希望这样可以设置为false。

  1. /**
  2. * Whether to use suffix pattern match (".*") when matching patterns to
  3. * requests. If enabled a method mapped to "/users" also matches to "/users.*".
  4. * <p>By default this is set to {@code true}.
  5. * @see #registeredSuffixPatternMatch
  6. */
  7. public PathMatchConfigurer setUseSuffixPatternMatch(Boolean suffixPatternMatch) {
  8. this.suffixPatternMatch = suffixPatternMatch;
  9. return this;
  10. }

需要配置

  1. override fun configurePathMatch(configurer: PathMatchConfigurer) {
  2. configurer.setUseSuffixPatternMatch(false)
  3. }

SpringMVC RequestMapping 详解的更多相关文章

  1. springMVC(1)---@RequestMapping详解

    @RequestMapping详解 RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.这句话,太熟悉了.   ...

  2. 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解

    http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...

  3. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

    一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作. ...

  4. Spring MVC 学习)——控制器与@RequestMapping详解

    Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解 一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求 ...

  5. 简单搭建SpringMVC框架详解

    在公司待了两年,用的一直是Spring+SpringMVC+Hibernate框架,都是公司自己搭建好的,自己从来没有主动搭建过,闲来无聊,自己搭建试试.一下即我搭建的过程以及搭建所遇到的问题,有部分 ...

  6. SpringMVC @ModelAttribute 详解

    [@Controller]4 详解@ModelAttribute http://blog.sina.com.cn/s/blog_6d3c1ec601017q4p.html A.@ModelAttrib ...

  7. SpringMVC配置文件详解:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven />

    原文地址:https://www.cnblogs.com/lcngu/p/5080702.html Spring配置文件详解:<context:annotation-config/>和&l ...

  8. springMVC返回json数据乱码问题及@RequestMapping 详解

    原文地址:https://blog.csdn.net/u010127245/article/details/51774074 一.@RequestMapping RequestMapping是一个用来 ...

  9. 一起学SpringMVC之RequestMapping详解

    本文以一个简单的小例子,简述SpringMVC开发中RequestMapping的相关应用,仅供学习分享使用,如有不足之处,还请指正. 什么是RequestMapping? RequestMappin ...

随机推荐

  1. OpenGL ES2.0光照

    一.简单光照原理 平行光(正常光) 光照效果=   环境颜色 + 漫反射颜色 + 镜面反射颜色 点光源 光照效果=   环境颜色 + (漫反射颜色 + 镜面反射颜色)× 衰减因子 聚光灯 光照效果= ...

  2. linux安装禅道的步骤

    linux一键安装禅道:1.禅道帮助文档:http://www.zentao.net/book/zentaopmshelp/90.html 2.修改Apache的端口号:/opt/zbox/zbox ...

  3. 神经网络JOONE的实践

    什么是joone Joone是一个免费的神经网络框架来创建,训练和测试人造神经网络.目标是为最热门的Java技术创造一个强大的环境,为热情和专业的用户. Joone由一个中央引擎组成,这是Joone开 ...

  4. java笔记02

    一,编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数 /** * */ package 课堂2; import java.util.Random; /** * @author 信16 ...

  5. PHP四种基本排序算法

    PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数 ...

  6. [Bayesian] “我是bayesian我怕谁”系列 - Naive Bayes+prior

    先明确一些潜规则: 机器学习是个collection or set of models,一切实践性强的模型都会被归纳到这个领域,没有严格的定义,’有用‘可能就是唯一的共性. 机器学习大概分为三个领域: ...

  7. C#中的异常处理(try-catch的使用)——使程序更加稳定

    使用try-catch来对代码中容易出现异常的语句进行异常捕获. try { 可能出现异常的代码: } catch { 出现异常后需要执行的代码: } 注:1.在执行过程中,如果try中的代码没有出现 ...

  8. HDU 4267 A Simple Problem with Integers(树状数组区间更新)

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  9. SSH三大框架整合步骤

    Struts2:需要整合的第一个框架: 1.创建一个动态web项目 2.导入struts2必须的jar 放到 lib目录下 ,再 build path 添加web工程中 3.配置struts2的核心配 ...

  10. js中编码问题escape、encodeURI

    未分类 1.js对文字进行编码涉及3个函数:   escape,encodeURI,encodeURIComponent, 相应3个解码函数:unescape,decodeURI,decodeURIC ...