我想正确地映射我的servlet 1)我希望它应该来到那个servlet时 url就像“show.jsp / anything”,即当用户输入“show.jsp /”+由“字母和数字”而不是“符号”组成的字符串时,即当用户输入时 “show.jsp / 1232342 $ 3 = 4”它应该抛出一个错误 我的映射
<servlet>
<servlet-name>show</servlet-name>
<jsp-file>/show.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>show</servlet-name>
<url-pattern>/show.jsp/*</url-pattern>
</servlet-mapping>
用户输入时“show.jsp / asd%&amp; hdfsjf”它应该转到另一个网址 那我该怎么写呢
<url-pattern>/show.jsp/*</url-pattern>
答案 0 :(得分:1)
这可能不是预期的答案,但您必须使用Java EE提供的内容。 Servlet 3.0规范说:
在Web应用程序部署描述符中,以下语法用于定义映射:
/
字符开头并以/*
后缀结尾的字符串用于路径映射。*.
前缀开头的字符串用作扩展名映射。/
,servlet路径和上下文路径为空字符串(""
)。/
字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为空。这意味着你无法做你想做的事,除了你可以使用容器将使用的事实:
例如,如果要将/show.jsp/asd
映射到servlet而将/show.jsp/*
映射到另一个,则可以。但是没有办法区分角色的类型。
它与你想要的不符,但它的工作方式......
如果你真的想这样做,你必须开发一个映射到`/show.jsp/*'的中继servlet。它将分析PathInfo字符串并转发到其他(未映射)servlet之一,具体取决于它是否包含非字母字符。
在web.xml中:
<servlet>
<servlet-name>relay</servlet-name>
<servlet-class>distinguished.classof.Relay</servlet-class>
</servlet>
<servlet>
<servlet-name>show</servlet-name>
<jsp-file>/show.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>other</servlet-name>
<jsp-file>/other.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>relay</servlet-name>
<url-pattern>/show.jsp/*</url-pattern>
</servlet-mapping>
接力:
public class Relay extends HttpServlet {
static final String SHOW = "show";
static final String OTHER= "other";
private Pattern pattern;
@Override
protected void service(HttpServletRequest hsr, HttpServletResponse hsr1) throws ServletException, IOException {
String info= hsr.getPathInfo();
RequestDispatcher dispatcher = getServletContext.getNamedDispatcher(
pattern.matcher(info).matches() ? SHOW : OTHER);
dispatcher.forward(hsr, hsr1);
}
@Override
public void init() throws ServletException {
pattern = Pattern.compile("\\w*");
}
}