我的目标是通过以下模式的所有URL实现相同的servlet servlet1:
myserver.com/path1/*
其中*可以是“x”、“x/xx”、“x/xx/x.cfg”等任何东西。
最后,我只想处理regex[0-9a-zA-Z]后面的URL。(cfg | xml | htm)但我可以在servlet中这样做。servlet解析原始URL并动态构建请求的配置文件。
当我有以下映射
<servlet-name>servlet1</servlet-name>
<url-pattern>/path1</url-pattern>
正如预期的那样,urlmyserver。com/path1指向servlet1
当我使用下面的映射时,它看起来对我来说很有意义:
<servlet-name>servlet1</servlet-name>
<url-pattern>/path1/*</url-pattern>
我仍然可以通过urlmyserver访问servlet 1。com/path1/
我无法通过urlmyserver访问servlet。com/path1/path2,这个url实际上把我带回了欢迎文件条目
实际上,任何有第二条路径的东西都会让我回到欢迎文件条目,而不管我输入了什么模式。对于第二条路径,我指的是我的服务器上的任何东西。com/path1/*其中*超过0个字符
我目前看到的唯一选择是让欢迎文件条目处理我的请求(丑陋)或使用
. cfg. xml*. htm
这使得URL与myserver类似。com/XXX。cfg工作(myserver.com/X/XXX.cfg不工作)。这也会很难看,而且会干扰该网络应用的未来发展
如何使映射按我希望的方式工作?
尝试使用Filter
,如果此路径/path 1
大部分时间被调用,并将逻辑放在那里。
您可以完全控制这个过滤器。您可以在web.xml中定义跳过网址,用逗号分隔。
我用这个过滤器压缩逻辑。
网状物xml:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.x.y.z.servlet.MyFilter</filter-class>
<init-param>
<param-name>skipEqualsURIs</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>skipStartsWithURIs</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>skipEndsWithURIs</param-name>
<param-value></param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我的过滤器。爪哇:
public class MyFilter implements Filter {
/** The skip equals ur is set. */
private Set<String> skipEqualsURIsSet = new HashSet<String>();
/** The skip starts with ur is set. */
private Set<String> skipStartsWithURIsSet = new HashSet<String>();
/** The skip ends with ur is set. */
private Set<String> skipEndsWithURIsSet = new HashSet<String>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String skipEqualsURIs = filterConfig.getInitParameter("skipEqualsURIs");
if (skipEqualsURIs != null && skipEqualsURIs.trim().length() > 0) {
for (String skipURI : skipEqualsURIs.split(",")) {
skipEqualsURIsSet.add(skipURI);
}
}
String skipStartsWithURIs = filterConfig.getInitParameter("skipStartsWithURIs");
if (skipStartsWithURIs != null && skipStartsWithURIs.trim().length() > 0) {
for (String skipURI : skipStartsWithURIs.split(",")) {
skipStartsWithURIsSet.add(skipURI);
}
}
String skipEndsWithURIs = filterConfig.getInitParameter("skipEndsWithURIs");
if (skipEndsWithURIs != null && skipEndsWithURIs.trim().length() > 0) {
for (String skipURI : skipEndsWithURIs.split(",")) {
skipEndsWithURIsSet.add(skipURI);
}
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String uri = httpServletRequest.getRequestURI();
if (isSkip(uri)) {
// do what you want to do based on skip logic
// filterChain.doFilter(servletRequest, servletResponse);
} else {
// do what you want to do based on skip logic
// filterChain.doFilter(servletRequest, servletResponse);
}
}
private boolean isSkip(String uri) {
boolean skip = skipEqualsURIsSet.contains(uri);
if (!skip) {
for (String skipURI : skipStartsWithURIsSet) {
if (uri.startsWith(skipURI)) {
skip = true;
break;
}
}
}
if (!skip) {
for (String skipURI : skipEndsWithURIsSet) {
if (uri.endsWith(skipURI)) {
skip = true;
break;
}
}
}
return skip;
}
@Override
public void destroy() {
}
}
主要内容:Servlet 单一映射,Servlet 多重映射客户端通过 URL 地址来访问 Web 服务器中的资源,Servlet 程序若想被外界访问,就必须被映射到一个 URL 地址上。很多时候,该 URL 地址和 Servlet 程序的物理路径(在硬盘上的存储位置)并不一致,因此它被称为虚拟路径。Servlet 与虚拟路径的对应关系就叫做 Servlet 虚拟路径映射。 Servlet 虚拟路径映射可以被分为 2 类: 单一映射 多重映射 下面介绍如何
问题内容: 如果我点击/ test / page,以上方法将起作用。但是,打/ test或/ test /将不起作用。我正在使用Spring MVC,我的请求映射如下: 编辑: 我正在通过一个独立的项目进行验证,但这似乎是Spring的UrlPathHelper的一个错误。当同时存在上下文和servlet路径时,以下方法将返回错误的路径,并且你在打servlet时不带斜杠。 举例来说,我有一个“
当前正在读取Head First Servlet JSP。我目前陷入了映射servlet。这可能是一个愚蠢的问题,但如何才能正确地映射servlet url模式呢?我正在使用eclipse mars,这是我第一次使用JSP/servlet。在创建动态web项目时,我总是检查generate web xml 这是默认web.xml中的内容 它使用这个来运行 但当我将其添加到显示名称下方时 它给我一个
我正在尝试在web.xml中映射多个servlet。在我的index.html中,我有一个操作“desktype.do”的表单,当我运行程序时,它成功了。我是这样开始的: …效果很好。它成功地编译,并且在按下我在index.html中设置的按钮后,它就会按照需要运行。在添加了额外的servlet映射之后: 我收到错误“模块尚未部署。详细信息请参阅服务器日志。构建失败(总时间;0秒)”我不确定该怎么