将dispatsher servlet映射附加到url

时间:2014-10-15 07:04:04

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

我正在尝试创建一个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" />

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

是否有可能将调度程序servlet映射附加到我的URL而不在jsp文件中对其进行硬编码?

1 个答案:

答案 0 :(得分:0)

你必须重新思考你在做什么。当您明确地将web.xml中的多个 DispatcherServlet映射到特定URL时,该映射是本地部分或URL的一部分。 <c:url><spring:url>都可以添加servlet上下文部分,但servlet前缀是webapplication的一部分,没有人会猜到它。毕竟,你应该有一个从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