【问题标题】:How to use @WebServlet to accept arguments (in a RESTFul way)?如何使用@WebServlet 接受参数(以 RESTFul 方式)?
【发布时间】:2015-09-28 03:06:36
【问题描述】:

假设我想接受以下网址:

http://myserver/myapplication/posts
http://myserver/myapplication/posts/<id>
http://myserver/myapplication/posts/<id>/delete

如何使用 servlet 装饰器 @WebServlet 来做到这一点?我正在调查valueurlPatterns,但我不知道该怎么做。例如,

@WebServlet(urlPatterns={"/posts", "/posts/*"})
[..]
String param = request.getPathInfo();

给了我一些结果,但是如何使用它呢?另外,request.getPathInfo() 似乎返回了通配符的值,但如果我想要更多参数,比如http://http://myserver/myapplication/posts/&lt;id&gt;/delete/&lt;force&gt;,该怎么办?

【问题讨论】:

  • 您可以使用实际的请求参数而不是尝试在 url 中传递数据...
  • “请求参数”是什么意思?请求参数?这不是 RESTful url 的工作方式。
  • @pistacchio 使用真正的 REST 框架,如 JAX-RS(Jersey、RestEasy 等)或 Spring MVC。这是他们在裸 servlet 上开箱即用支持的众多功能之一。
  • 我假设您想开发 RESTful 服务,因此建议您更好地使用适合此的框架,而不是从头开始重新发明轮子。 JAX-RS 是为此而生的,它的主要实现是 Jersey、Apache Wink 或 JBoss RESTeasy
  • 我只是对您为什么希望在不使用专为 REST 设计的 API 的情况下提供 REST 服务感到着迷。你真的应该考虑 JAX-RS,imo。

标签: java rest servlets servlet-3.0


【解决方案1】:

在 servlet 规范中,您没有路径变量的概念。一些 MVC 框架确实支持它们,例如 Struts 或 Spring MVC。

从 servlet 的角度来看,一个 URL 是:

scheme://host.domain/context_path/servlet_path/path_info?parameters

其中任何部分(从上下文路径开始可能为空)

servlet 3.0 状态规范:

  • 上下文路径:与此 ServletContext 关联的路径前缀 servlet 是其中的一部分。如果这个上下文是根植于 Web 服务器的 URL 名称空间,此路径将为空字符串。否则,如果 上下文不根植于服务器名称空间的根目录,路径以 / 字符,但不以 / 字符结尾。
  • Servlet Path:直接对应映射的路径部分 激活了这个请求。此路径以 '/' 字符开头,除非在这种情况下 其中请求与“/*”或“”模式匹配,在这种情况下它是 空字符串。
  • PathInfo:请求路径中不属于上下文路径或 小服务程序路径。如果没有额外的路径,则为 null,或者为带有前导的字符串 ‘/’。

HttpServletRequest 接口中存在以下方法来访问此 资料:

  • getContextPath
  • getServletPath
  • 获取路径信息

需要注意的是,除了请求之间的 URL 编码差异 URI 和路径部分,以下等式始终为真:

requestURI = contextPath + servletPath + pathInfo

这意味着你只需要使用@WebServlet(urlPatterns={"/posts"}),然后手动解码 pathInfo 部分以提取命令和参数

【讨论】:

    【解决方案2】:

    我认为你不能只使用 @WebServlet 注释来做到这一点。 urlPatterns 仅充当 Servlet 的指令,以指示应参加哪些 url 模式。 正如您在本文档https://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html 中看到的那样,当 urlPatterns 是一个字符串而不是它们的数组时,值就是这种情况。 正如 brso05 所述,您需要从请求中解析您的参数。

    【讨论】:

      猜你喜欢
      • 2012-08-26
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      相关资源
      最近更新 更多