我对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服务的请求,我一直只尝试处理对交互式网站的请求。如有任何帮助,我们将不胜感激!