[英]How do I dispatch to WEB-INF with /* servlet-mapping?
我仍然是编程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>
目的是Web服务,它通过AJAX,胖客户端应用程序或其他RPC方法进行通信,以使用所有以mydomain.com/webservice开头的URL,例如:
但是,通常使用浏览器浏览网站的人会访问该网站:
在我的交互式类中,我正在解析getPathInfo()结果以将请求转发到另一个类,并且绝大多数这些类中的绝大多数使用请求调度程序来转发信息以查看JSP文件以实际呈现HTML。 所以我的一个类中的代码片段可能如下所示:
RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/views/master.jsp");
view.forward(req, resp);
我也在交互式servlet中进行错误检查,这样如果用户试图访问不可路由的URL(例如,当我没有定义任何东西来处理foobar时,mydomain.com/foobar),它会抛出一个HTTP但是,当我启动它时, 一切都会产生HTTP 404。
经过一些故障排除后,我发现请求正在向servlet发出没有任何问题,并且servlet正在正确解析它。 但是,当它尝试将其转发到/WEB-INF/views/master.jsp时,它会再次调用servlet。 我认为WEB-INF是一个“魔术”目录,代表了公共无法访问的资源,但看起来我的Java容器(Jetty,通过Eclipse的Google App Engine插件)将其视为尝试访问URL。 我猜这是因为当我将/ *定义为我的web.xml文件中的url-pattern时,它实际上将其解释为,将所有内容发送到该servlet,包括将请求转发到WEB中的JSP视图文件的调用 - INF目录。
难道我做错了什么? 我还没有尝试处理对Web服务的请求,而我只是试图处理对交互式站点的请求。 任何帮助将不胜感激!
原始问题的解决方案非常简单 - 您应该将servlet配置为默认值:
<servlet-mapping>
<servlet-name>Interactive</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
注意/
pattern。 这样它就可以处理其他servlet未处理的请求(与处理所有请求的/*
mapping不同)。
但是,这种方法会导致提供静态内容的问题。 如果您要提供静态内容,则可能需要更复杂的解决方案,例如,请参阅使用Spring,在web.xml中映射到root,找不到静态资源 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.