Параметры сервлета и пути, такие как / xyz / {value} / test, как отобразить в web.xml? - PullRequest
30 голосов
/ 03 января 2012

Поддерживает ли сервлет URL-адреса следующим образом:

/xyz/{value}/test

, где значение может быть заменено текстом или числом.

Как отобразить это в web.xml?

Ответы [ 5 ]

47 голосов
/ 03 января 2012

Servlet API не поддерживает использование в шаблоне подстановочного знака шаблона URL *. Он допускает использование подстановочного знака * в конце сопоставления, например, /prefix/*, или в начале сопоставления, например, *.suffix.

.

При стандартном допустимом синтаксисе шаблона URL лучше всего сопоставить его с /xyz/* и извлечь информацию о пути, используя HttpServletRequest#getPathInfo().

Итак, учитывая <url-pattern>/xyz/*</url-pattern>, вот базовый начальный пример того, как извлечь информацию о пути, нулевые проверки и индекс массива из пропущенных проверок границ:

String pathInfo = request.getPathInfo(); // /{value}/test
String[] pathParts = pathInfo.split("/");
String part1 = pathParts[1]; // {value}
String part2 = pathParts[2]; // test
// ...

Если вы хотите более точный контроль, как это возможно с Apache HTTPD mod_rewrite, тогда вы можете посмотреть на фильтр перезаписи URL Tuckey .

7 голосов
/ 03 января 2012

Как указали другие, спецификация сервлета не допускает таких шаблонов; однако вы можете рассмотреть вариант JAX-RS , который разрешает такие шаблоны, если это подходит для вашего случая использования.

@Path("/xyz/{value}/test")
public class User { 

    public String doSomething(@PathParam("value") final String value) { ... }

}

Или:

@Path("/xyz/{value}")
public class User { 

    @Path("test")
    public String doTest(@PathParam("value") final String value) { ... }

}

(относится к: https://stackoverflow.com/a/8303767/843093.)

3 голосов
/ 03 января 2012

Он поддерживает отображение этого URL;но не предлагает никакой проверки.

В вашем веб-XML вы можете сделать это ....

/xyz/*

Но это не гарантирует, что трейлинг test присутствуети что это последний пункт.Если вы ищете что-то более сложное, попробуйте urlrewritefilter.

http://code.google.com/p/urlrewritefilter/

0 голосов
/ 03 января 2012

Вы не должны делать это в web.xml, вы можете указывать каждый запрос на свой фильтр (Patternfilter) и проверять URL

package com.inventwheel.filter;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * Servlet Filter implementation class PatternFilter
 */
@WebFilter("/*")
public class PatternFilter implements Filter {

    /**
     * Default constructor. 
     */
    public PatternFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            String servletPath = ((HttpServletRequest)request).getServletPath();
            String requestURI = ((HttpServletRequest)request).getRequestURI();
            Pattern pattern = Pattern.compile(".*"+servletPath+"/(.*)");
            Matcher matcher = pattern.matcher(requestURI);
            if (matcher.matches())
            {
            String param = matcher.group(1);
            // do stuff with param here..
            }

        chain.doFilter(request, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}
0 голосов
/ 03 января 2012

Как указано выше, базовые сервлеты не поддерживают шаблоны, которые вы указали в своем вопросе. Spring MVC поддерживает шаблоны. Здесь - ссылка на соответствующий раздел в Spring Reference Document .

...