Добавить отображение сервлета диспетчера в 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