5

我对 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/deleteitem/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(例如,当我没有定义任何东西来处理 foobar 时,mydomain.com/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 中的 JSP 视图文件的调用- INF 目录。

难道我做错了什么?我什至还没有开始尝试处理对 Web 服务的请求,而且我一直在尝试处理对交互式站点的请求。任何帮助将不胜感激!

4

1 回答 1

1

原始问题的解决方案非常简单 - 您应该将 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 are not found

于 2012-07-30T07:41:47.893 回答