Есть ли способ автоматически переписать URL при развертывании проекта Spring mvc в tomcat? - PullRequest
1 голос
/ 05 марта 2012

Итак, я работаю с Spring MVC впервые. Я создал приложение, используя IntelliJ, и все работает нормально, но сейчас я пытаюсь развернуть это приложение на Tomcat. У меня есть файл war "myapplication.war", и когда я его развернул на tomcat, я смог успешно перейти на localhost: 8080 / myapplication. На этой странице у меня есть ссылка на один из моих контроллеров.

<a href="/register">Register</a>

Который перенаправляет меня на localhost: 8080 / register вместо localhost: 8080 / myapplication / register. Если я сам изменю URL, он будет работать нормально.

Есть ли способ переписать этот URL автоматически? Я не хочу менять все URL в моем проекте, потому что тогда будет невозможно запустить его из IntelliJ.

Ответы [ 5 ]

5 голосов
/ 05 марта 2012

использовать <c:url> от

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Например:

<c:url var="registerVar" value="/register" />
...
<a href="${registerVar}">Registration</a>
3 голосов
/ 06 марта 2012

Мне не нравится <c:url...>, поскольку он требует двух строк JSP, где другим шаблонным движкам обычно требуется только один.Альтернатива:

<a href="${pageContext.request.contextPath}/register">Register</a>

Это фактически сделает то же самое, что и <c:url...>

Редактировать: должно быть более простой задачей изменить все URL в вашей IDE:

поиск: href="/ заменить: href="${pageContext.request.contextPath}/

1 голос
/ 05 марта 2012

Когда вы переименуете приложение war в ROOT.war (заглавные буквы для «ROOT»!), Тогда приложение будет работать без «префикса».

1 голос
/ 05 марта 2012

Если вы находитесь в http://localhost:8080/myapplication/welcome и ваша ссылка href = "register" (без косой черты), вы будете перенаправлены на http://localhost:8080/myapplication/register.

Проблема в том, что когда вы находитесь в http://localhost:8080/myapplication/foo/bar. Тогда эта же ссылка перенаправит вас на http://localhost:8080/myapplication/foo/register. Что я делаю для решения этой проблемы, это используйте базовый тег. Если вы поместите в тег head, он будет работать в обоих случаях.

0 голосов
/ 27 октября 2015

Создать фильтр, который включает в себя атрибут base как, например, для /src/java/company/project/web/filter/BaseFilter.java:

<code>import java.io.IOException;
import javax.servlet.*;

/**
 * Make sane JSP, instead of:
 *   <pre>&lt;a href="&lt;c:url value='/my/path/${id}.html'/&gt;"&gt;Title&lt;/a&gt;
*, позволяющий использовать: *
&lt;a href="${ctx}/my/path/${id}.html"&gt;Title&lt;/a&gt;
* / открытый класс BaseFilter реализует Filter {private String min;@Override public void init (FilterConfig fc) {min = fc.getServletContext (). GetInitParameter ("min");if (min == null) min = fc.getInitParameter ("min");if (min == null) min = "min";} @Override public void doFilter (запрос ServletRequest, ответ ServletResponse, цепочка FilterChain) выдает IOException, ServletException {request.setAttribute ("base", request.getServletContext (). GetContextPath ());request.setAttribute ("min", min);chain.doFilter (запрос, ответ);} @Override public void destroy () {}}

и зарегистрируйте этот фильтр в web.xml:

<filter>
    <filter-name>BaseFilter</filter-name>
    <filter-class>company.project.web.filter.BaseFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>BaseFilter</filter-name>
    <url-pattern>*.htm</url-pattern>
    <url-pattern>*.json</url-pattern>
</filter-mapping>

и используйте чистый синтаксис:

<script src="${base}/js/jquery.${min}.js"></script>
<link href="${base}/css/bootstrap.${min}.css" rel="stylesheet" type="text/css">
<a href="${base}/index.html">Home</a>

ПРИМЕЧАНИЕ Я устанавливаю дополнительные атрибуты в этом фильтре, например, для переключения между разработкой и минимизированной версией CSS / JS. Я использую атрибут min, который может быть установлен внешне для файла WAR в дескрипторе развертывания контекста (см.к документации по Java EE-контейнеру).

См. также мой ответ: https://stackoverflow.com/a/13993570/173149

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...