【问题标题】:should I make two different servlet entry for rest and normal html in web.xml我应该在 web.xml 中为 rest 和普通 html 创建两个不同的 servlet 条目吗
【发布时间】:2014-12-10 02:50:30
【问题描述】:

我正在编写 spring mvc 应用程序。

在我的应用程序中,我有网页以及其他 Web 服务来处理 ajax 调用。

我已经在 web.xml 中完成了下面的条目

<servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring_myapp-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

我是否应该使用相同的 servlet 映射我的 rest url

<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

或者我应该为休息创建新的 servlet 条目。

我已经在 pom.xml 中为“org.codehaus.jackson”完成了必需的条目,并且我已经在我的 spring_myapp-servlet.xml 中做了必需的条目。

对于 html 页面,我在控制器中使用以下代码

@RequestMapping(value = "/htmlUrl")
public ModelAndView ModifyValiodation(HttpServletRequest request) {
     // my code
}

我正在使用的休息服务

@RequestMapping(value = "/restUrl")
public @ResponseBody Map<String, String> restUrl(HttpServletRequest request) {
     // my code
}

如果我只使用一个 servlet 进行两个 url 映射,则总共会生成 4 个 url。

  1. myapp/htmlUrl.html
  2. myapp/restUrl.html
  3. myapp/rest/htmlUrl
  4. myapp/rest/restUrl

如果我将两个不同的 servlet 与单独的 dispacherServlet 一起使用,那么我是否必须在 servlet.xml 中输入 spring 的每个组件和服务?

请指出暴露REST Web服务的解决方案。

谢谢!

【问题讨论】:

  • 不,你不需要,不,你不需要复制任何东西。如果您想让 2 个 servlet 将公共内容迁移到由 ContextLoaderListener 加载的通用应用程序上下文,那么它就是在所有 DispatcherServlets 之间共享的父上下文。虽然您可以使用 2 个 servlet,但您也可以简单地将控制器映射到 /rest/restUrl
  • 调度程序期望映射到/。其他的都是针对特殊情况的。您应该将调度程序映射到/ 并让它处理所有 请求。另外,停止使用 XML;如果您只是在学习 Spring,那么没有理由学习过时的信息。使用现代 Java,您还可以取消 web.xml
  • 感谢您的回复。因为我想将 .html 附加到我的 url,所以我已将其映射到 *.html。春天有什么办法可以附加.html,这样我就可以从web.xml映射中删除它。
  • @BoristheSpider 你能给我一些关于如何使用 web.xml 而不是使用 xml 的更多信息
  • @M.Deinum 和 @BoristheSpider 感谢您的帮助。我从你的回答中得到了我的解决方案。现在我将/ 用于DispatcherServlet,在控制器中我使用/rest/restUrl。非常感谢,我已经花了很长时间来搜索它。 @BoristheSpider,如果你能提供一些关于如何使用 web.xml 而不是使用 xml 的链接或信息,那就太好了

标签: java spring rest servlets web.xml


【解决方案1】:

使用

<servlet-mapping>
 <servlet-name>myapp</servlet-name>
 <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

如果您使用两个 DispatcherServlet 条目,它将在您的应用程序中加载两个 ApplicationContext 对象。由于您使用 spring mvc 来处理对应用程序的所有请求,因此您应该可以使用此配置。任何以 .html 结尾的请求 url 或任何包含 /rest/ 的 url 都将由 spring 处理。

【讨论】:

  • 感谢您的回复。当我使用@RequestMapping 时,它会将所有url 映射到两个servlet 映射。如何区分并使其将特定 url 映射到 /rest
【解决方案2】:

由您来设计基础架构的服务器端。

RESTful 规范都没有执行此操作的任何说明,Servlet 规范对此也没有强制要求。

在应用程序设计中,我认为最好保留两个不同的 servlet 来处理不同的 URL,因为随着时间的推移,类会变得复杂而冗长。这些可以用作前端控制器,并且可能在后端有通用的逻辑类。

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 2019-01-11
    • 1970-01-01
    • 2011-01-19
    • 2019-02-16
    • 1970-01-01
    • 2011-04-29
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多