代码之家  ›  专栏  ›  技术社区  ›  King Skippus

如何使用/*servlet映射将调度到WEB-INF?

  •  5
  • King Skippus  · 技术社区  · 14 年前

    我对Java servlet的编程还很陌生,所以如果我错了,请提前道歉。(但如果是这样的话,我将非常感谢您的帮助!)

    我的网站将有两个主要部分:web服务部分和“其他一切”部分,后者将为大多数交互式浏览器请求提供服务。我 思想 我可以在我的web.xml文件中这样做:

    <servlet>
        <servlet-name>Webservice</servlet-name>
        <servlet-class>com.mydomain.webservice</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Webservice</servlet-name>
        <url-pattern>/webservice/*</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>Interactive</servlet-name>
        <servlet-class>com.mydomain.interactive</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Interactive</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

    其目的是让通过AJAX、胖客户端应用程序或其他RPC方法进行通信的web服务使用以mydomain.com/webservice开头的URL,例如:

    • mydomain.com/webservice/login
    • mydomain.com/webservice/viewuser/12345
    • mydomian.com/webservice/deletetem/abc
    • 。。。

    然而,通常使用浏览器浏览网站的人会以以下方式访问网站:

    • mydomain.com(主页)
    • mydomain.com/login登录
    • mydomain.com/viewuser/12335
    • mydomain.com/deleteitem/abc
    • 。。。

    在我的交互式类中,我正在解析getPathInfo()结果以将请求转发到另一个类,而这些类中的绝大多数都使用请求分配器来转发信息以查看JSP文件,从而实际呈现HTML。因此,我的一个类中的一段代码可能看起来像:

    RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/views/master.jsp");
    view.forward(req, resp);
    

    我在交互式servlet中也有错误检查,这样,如果用户试图访问不可路由的URL(例如,mydomain.com/foobar,当我还没有定义任何处理foobar的内容时),它就会抛出一个HTTP 404。不过,当我启动它时, 一切 生成HTTP 404。

    经过一些故障排除,我发现该请求是在没有任何问题的情况下发送到servlet的,并且servlet对其进行了正确的解析。但是,当它试图将其转发到/WEB-INF/views/master.jsp时,它会再次调用servlet。我认为WEB-INF是一个“神奇”的目录,代表了公共不可访问的资源,但看起来我的Java容器(Jetty,通过Eclipse的Google App Engine插件)将其视为访问URL的尝试。我猜这是因为当我在web.xml文件中将/*定义为url模式时,它实际上将其解释为发送 一切 到该servlet,包括将请求转发到WEB-INF目录中的JSP视图文件的调用。

    我做错什么了吗?我甚至还没有尝试处理对web服务的请求,我一直只尝试处理对交互式网站的请求。如有任何帮助,我们将不胜感激!

    1 回复  |  直到 12 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    原始问题的解决方案非常简单——您应该将servlet配置为默认servlet:

    <servlet-mapping>
        <servlet-name>Interactive</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    请注意 / 模式。通过这种方式,它将处理其他servlet未处理的请求(与 /* 处理所有请求的映射)。

    但是,这种方法会导致提供静态内容的问题。如果要提供静态内容,则可能需要更复杂的解决方案,例如,请参阅, Using Spring, mapping to root in web.xml, static resources aren't found 。