【问题标题】:append dispatsher servlet mapping to url将调度程序 servlet 映射附加到 url
【发布时间】:2014-12-10 04:00:07
【问题描述】:

我正在尝试创建一个 Spring MVC 应用程序,我的 web.xml 中有多个调度程序 servlet,如下所示:

    <servlet>
    <servlet-name>one-servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:appServlet/one-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>one-servlet</servlet-name>
    <url-pattern>/one/*</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>two-servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:appServlet/two-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>webapp-servlet</servlet-name>
    <url-pattern>/two/*</url-pattern>
</servlet-mapping>

一切都很好,除了一件事 我在我的 jsp 文件中使用的 url,如下所示:

<c:url value="/user" />

不返回dispatcher servlet的映射,我的意思是我需要一个像myapp/one/user这样的url来使用来自one-servlet的控制器,但我得到的url是myapp/user

是否有可能将调度程序 servlet 映射附加到我的 url 而无需将它们硬编码到 jsp 文件中?

【问题讨论】:

  • 改用spring url标签。
  • @M.Deinum 与 的结果相同
  • 只有当请求在DispatcherServlet 中处理时才有效,它也不适用于交叉DispatcherServlet 通信(所以如果你在/one 并期望/user/ 成为/two/user 这行不通)。
  • @M.Deinum 是的,我明白,我想在 servlet 中处理请求

标签: java spring spring-mvc servlets model-view-controller


【解决方案1】:

你必须重新考虑你在做什么。当您明确将 web.xml 中的 multiple DispatcherServlet 映射到特定 URL 时,该映射是本地部分或 URL 的一部分。 &lt;c:url&gt;&lt;spring:url&gt; 都可以添加 servlet 上下文部分,但 servlet 前缀是 web 应用程序的一部分,没有人会猜到。毕竟,您应该有一个从 servlet 1 服务的页面到 servlet 2 服务的页面的链接,所有这些仍然在同一个 servlet 上下文中。

恕我直言,您应该知道为什么在一个 Spring MVC 应用程序中需要多个 DispatcherServlet,这并不常见。您会发现很多教程和示例(只是 google ...),而我所知道的都使用一个 DispatcherServlet

编辑:

如果你真的想这样做(但实际问题真的需要这样做吗?),你可以使用一个拦截器,它会在所有请求中放入一个包含 servlet 路径的属性。您在每个 servlet 应用程序上下文中声明一个拦截器 bean,并为其设置 servlet 路径。拦截器可能看起来像:

public class PathInterceptor implements WebRequestInterceptor {
    private String servletPath = "";
    private String fullPath;

    @Override
    public void preHandle(WebRequest request) throws Exception {
    }

    @Override
    public void postHandle(WebRequest request, ModelMap model) throws Exception {
        if (fullPath == null) {
            fullPath = request.getContextPath() + servletPath;
        }
        model.addAttribute("servletPath", fullPath);
    }

    @Override
    public void afterCompletion(WebRequest request, Exception ex) throws Exception {
    }

    public void setServletPath(String servletPath) {
        if (servletPath.startsWith("/")) {
            this.servletPath = servletPath;
        }
        else {
            this.servletPath = "/" + servletPath;
        }
        fullPath = null;
    }
}

在您的 JSP 中,您使用:${servletPath}/user

【讨论】:

  • 我不想从一个 servlet 提供的页面链接到另一个 servlet 的页面,我需要在 servlet 中获取此链接
  • 这不是 servlet 和 servlet 上下文的工作方式。您将不得不手动完成。查看我的编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 2016-08-02
  • 2020-09-27
  • 2015-06-12
  • 1970-01-01
  • 2012-01-20
  • 2017-09-21
相关资源
最近更新 更多