0
votes

I am trying to create a Spring MVC app, I have multiple dispatcher servlets in my web.xml like this:

    <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>

And everything works fine, except one thing urls that i use in my jsp files like this:

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

doesnt return the mapping of dispatcher servlet, i mean that i need a url like this myapp/one/user to use a controller from one-servlet, but the url i get is myapp/user

Any possibility to append the dispatsher servlet mapping to my urls without hardcoding them in jsp files ?

1
Use the spring url tag instead. - M. Deinum
@M.Deinum the same result with <spring:url> - stakan
It will only work if the request is handled inside a DispatcherServlet, it will also not work for cross DispatcherServlet communication (so if you are in /one and expect /user/ to become /two/user that isn't going to work). - M. Deinum
@M.Deinum yes i understand that, i want to handle request inside a servlet - stakan

1 Answers

0
votes

You must rethink what you are doing. As you explicitely map multiple DispatcherServlet in your web.xml to specific URLs, that mapping is part of the local part or the URL. Either <c:url> or <spring:url> are able to add the servlet context part, but the servlet prefix is part of the webapplication, and none will guess it. After all, you should have a link from a page served by servlet one to a page served by servlet two, all that would still be in same servlet context.

IMHO, you should wnder why you need multiple DispatcherServlet in one Spring MVC application, is is rather uncommon. You will find many tutorials and examples aroud (just google ...) and all that I know use one single DispatcherServlet

Edit:

If you really want to go that way (but does actual problem really needs that ?), you could use an interceptor that would put in all requests an attribute containing the path for the servlet. You declare one interceptor bean in each servlet application context and set the servlet path to it. The interceptor could look like :

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;
    }
}

The in your JSP, you use : ${servletPath}/user