Добавить отображение сервлета диспетчера в URL

Я пытаюсь создать приложение Spring MVC, у меня есть несколько сервлетов-диспетчеров в моем web.xml, например:

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

И все работает отлично, за исключением одного URL, который я использую в моих файлах JSP, например:

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

не возвращает отображение сервлета диспетчера, я имею в виду, что мне нужен такой URL myapp/one/user использовать контроллер из одного сервлета, но URL-адрес, который я получаю, myapp/user

Любая возможность добавить отображение сервлетов диспетчера в мои URL-адреса без жесткого их кодирования в файлах JSP?

1 ответ

Решение

Вы должны переосмыслить то, что вы делаете. Как вы явно сопоставить несколько DispatcherServlet в вашем web.xml к определенным URL-адресам это отображение является частью локальной части или URL-адреса. Или <c:url> или же <spring:url> могут добавить часть контекста сервлета, но префикс сервлета является частью веб-приложения, и никто не догадается об этом. В конце концов, у вас должна быть ссылка со страницы, обслуживаемой сервлетом 1, на страницу, обслуживаемую сервлетом 2, и все это будет в том же контексте сервлета.

ИМХО, вы должны знать, почему вам нужно несколько DispatcherServlet в одном приложении Spring MVC это довольно редко. Вы найдете много уроков и примеров (просто Google ...) и все, что я знаю, использовать один DispatcherServlet

Редактировать:

Если вы действительно хотите пойти по этому пути (но действительно ли это нужно для реальной проблемы?), Вы можете использовать перехватчик, который будет вставлять во все запросы атрибут, содержащий путь к сервлету. Вы объявляете один bean-объект-перехватчик в каждом контексте приложения сервлета и устанавливаете путь к сервлету. Перехватчик может выглядеть так:

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

Другие вопросы по тегам