Параметры сервлета и пути, такие как /xyz/{value}/test, как отобразить в web.xml?
Поддерживает ли сервлет URL-адреса следующим образом:
/xyz/{value}/test
где значение может быть заменено текстом или числом.
Как отобразить это в web.xml?
8 ответов
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.
Как указали другие, спецификация сервлета не допускает таких шаблонов; тем не менее, вы можете рассмотреть 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) { ... }
}
(Относится к: /questions/4481562/otobrazheniya-servletov-s-peremennyimi-tomcat-70/4481575#4481575.)
Он поддерживает отображение этого URL; но не предлагает никакой проверки.
В вашем веб-XML вы можете сделать это....
/xyz/*
Но это не гарантирует, что трейлинг test
присутствует и что это последний пункт. Если вы ищете что-то более сложное, попробуйте urlrewritefilter.
Никакой сервлет не поддерживает подобные шаблоны, возможный подход, как упоминалось другими людьми, также заключается в использовании /*
после xyz
но это не проверяет {value}
или /test
. Лучше выбрать Spring или JAX-RS. Однако, если вы планируете придерживаться сервлета, лучше его написать:
@WebServlet(urlPatterns = {"/xyz/*"})
Вы не должны делать это в 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
}
}
Как указано выше, базовые сервлеты не поддерживают шаблоны, которые вы указали в своем вопросе. Spring MVC поддерживает шаблоны. Вот ссылка на соответствующий раздел в справочном документе Spring.
Ответ от 2022 года.
Сервлеты по-прежнему не допускают подстановочные знаки, поэтому мы не можем делать такие вещи, как:
/xyz/{value}/test
Фильтр urlrewritefilter Пола Таки все еще находится в версии 4.0.3 и не совместим с новым пространством имен jakarta [1] (версия 5 находится в разработке).
Я нашел решение в самом Tomcat с его функцией RewriteValve .
См. https://rmannibucau.metawerx.net/post/tomcat-rewrite-url для пошагового руководства. Это удобное решение для разрешения использования подстановочных знаков в середине URL-адреса.
[1] https://github.com/paultuckey/urlrewritefilter/issues/239
Вы можете использовать эту библиотеку: http://zerh.github.io/ServletIO/, чтобы вы могли конвертировать ваши сервлеты в контроллеры MVC и использовать красивые URL