Как сделать так, чтобы сервлет отображал специальный URL-адрес на статический ресурс?

Я знаю, что сервлет по умолчанию автоматически возвращает статические ресурсы. Однако мой URL-адрес довольно особенный, и я не хочу, чтобы он выглядел как http://mysite/app/test.html. Может быть, это так:

http://mysite/app/dosomething/7419698f

Я хочу сопоставить (или перенаправить?) этот запрос в статический HTML-файл, например, /WEB-INF/pages/dowork.html. Более того, 7419698f — это только параметр, http://mysite/app/dosomething/2926739e также будет сопоставлен с тем же статическим файлом. Я знаю такой обходной путь:

<servlet>
    <servlet-name>test</servlet-name>
    <jsp-file>/pages/dowork.html</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>test</servlet-name>
    <url-pattern>/dosomething/*</url-pattern>
</servlet-mapping>

Это работает только в том случае, если dowork.html является легальным файлом jsp. Если я хочу обслуживать такой ресурс изображения, это приведет к ошибке.


person guogangj    schedule 05.06.2014    source источник
comment
Вы можете сопоставить свой шаблон URL с конкретным сервлетом и использовать его для перенаправления, попробуйте просмотреть этот вопрос: stackoverflow.com /questions/6175722/перенаправление с сервлета   -  person Alexey Malev    schedule 05.06.2014


Ответы (2)


Сопоставьте свой URL-адрес с default сервлетом (вам не нужно его объявлять)

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/dosomething/*</url-pattern>
</servlet-mapping>
person Leos Literak    schedule 05.06.2014
comment
Я просто начинаю думать, что мой ответ неверен и что сервлет / фильтр перенаправления необходим. Вечером сделаю прототип. - person Leos Literak; 05.06.2014

Подсказка Леоса Литерака верна. Мое требование не может быть выполнено с помощью простой конфигурации xml, я должен сделать что-то еще.

Мне нужен фильтр. В веб.xml:

<filter>
    <filter-name>summary-fw-filter</filter-name>
    <filter-class>com.mycompany.mywebapp.filter.SummaryForwardFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>summary-fw-filter</filter-name>
    <url-pattern>/summary/*</url-pattern>
</filter-mapping>

Код фильтра:

public class SummaryForwardFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        String url = request.getRequestURL().toString();
        String[] urlSegments = url.split("/");
        String guid = urlSegments[urlSegments.length-1];
        if(guid.matches("^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$")){
            request.getRequestDispatcher("/WEB-INF/pages/summary.jsp").forward(servletRequest, servletResponse);
            return;
        }
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
    }

    @Override
    public void destroy() {
    }
}

Затем URL-адрес http://mysite/mywebapp/summary/ecef22d6-7aa6-49db-b0d3-6577a63d14c8 будет сопоставлен с файлом /WEB-INF/pages/summary.jsp. Это также нормально при попытке сопоставления с файлами, отличными от JSP.

Параметр guid можно получить с помощью кода javascript следующим образом:

function extractGuid(value) {
    var re = /[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i;
    var match = re.exec(value);
    return match ? match[0] : null;
}

var guid = extractGuid(window.location.href);
person guogangj    schedule 07.07.2014