Java for Web学习笔记(五九):Controller替代Servlet(1)请求匹配

2023-11-13

URL匹配

书写方式

是对DispatcherServlet所匹配的URL进行二次匹配。本例DispatcherServelt的servlet-mapping中<url-pattern>/</url-pattern>。

//将匹配 /viewProduct
@RequestMapping("viewProduct")
public String viewProduct(...) { ... }

//将匹配 /viewProduct 
@RequestMapping(value="viewProduct")
public String viewProduct(...) { ... }

//将匹配 /viewProduct和/showProduct
@RequestMapping(value={"viewProduct","showProduct"})
public String viewProduct(...) { ... }

如果DispatcherServelt的servlet-mapping中<url-pattern>/store/*</url-pattern>。

//将匹配 /store/viewProduct
@RequestMapping("viewProduct")
public String viewProduct(...) { ... }

@RequestMapping可以加在Controller class,下例url-pattern为/

@RequestMapping("product")
public class ProductController{
    //将匹配 /product/viewProduct
    @RequestMapping("viewProduct")
    public String viewProduct(...) { ... } 
    ......
}

最优匹配

如果一个url匹配多个多个,采用最佳匹配的方式。

@RequestMapping("view/*")
public String viewAll(...) { ... }
@RequestMapping("view/*.json")
public String viewJson(...) { ... }
@RequestMapping("view/id/*")
public String view(...) { ... }
@RequestMapping("view/other*")
public String viewOther(...) { ... }

对于/view/other.json,将匹配viewOther()。前缀优先。有例如/view/id/anything.json,将匹配view()。

方法匹配

@RequestMapping("account")
public class AccountManagementController{
    //匹配 GET /account/add 
    @RequestMapping(value="add", method=RequestMethod.GET)
    public String addForm(...) { ... }

    //匹配 POST /account/add  
    @RequestMapping(value="add", method=RequestMethod.POST)
    public View addSubmit(...) { ... }
}

如果在类中指定方法,例如:

@RequestMapping(value="account", method={RequestMethod.GET, RequestMethod.POST})
public class AccountManagementController

先检查是否符合类的@RequestMapping限制,然后再检查是否符合方法@RequestMapping的限制。

请求参数限制

//要求具备参数employee,具备参数confirm且值为true
@RequestMapping(value="can", params={"employee", "confirm=true"})
public String can(...) { ... }

//要求不能具备employee,具备参数confirm且值不能为true
@RequestMapping(value="other", params={"!employee", "confirm!=true"})
public String other(...) { ... }

同样的,对于参数限制先检查是否符合类的@RequestMapping限制,然后再检查是否符合方法@RequestMapping的限制。

HTTP Header限制

和请求参数一样,具备否定的条件。此外:

  • header的值支持通配符。
  • header的名字大小写不敏感
@RequestMapping(value="user", headers={"X-Client", "content-type=text/*"})
public User user(...) { ... }

Content Type限制

可以使用headers对Content Type进行限制,但是更方便的通过consumes和produces:

  • consumes:对应请求中的Content-Type
  • produces:对应请求中的Accept
@RequestMapping(value="song", consumes={"text/json", "application/json"},
                              produces={"text/json", "application/json"})
public Song song(...) { ... }

本限制可以加载method也可以加在class,如果均有,则method的限定会override在类的限定,这和之前的有点不同,需要注意。因为这已经很明确具体到某个header的值的设定。



相关链接: 我的Professional Java for Web Applications相关文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java for Web学习笔记(五九):Controller替代Servlet(1)请求匹配 的相关文章

  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐