如何正确映射Servlet?

时间:2015-01-23 11:56:40

标签: jsp servlets web.xml

我想正确地映射我的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>

1 个答案:

答案 0 :(得分:1)

这可能不是预期的答案,但您必须使用Java EE提供的内容。 Servlet 3.0规范说:

在Web应用程序部署描述符中,以下语法用于定义映射:

  • /字符开头并以/*后缀结尾的字符串用于路径映射。
  • *.前缀开头的字符串用作扩展名映射。
  • 空字符串(“”)是一个特殊的URL模式,它完全映射到 应用程序的上下文根,即http://host:port/ /形式的请求。在这种情况下,路径信息为/,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*");
    }
}