我希望将所有URL映射到一个主servlet,除了我的静态文件(如样式表、图形等),并且仍然能够从我的servlet调用JSP。
我的目的是向用户提供“虚URL”,这样任何不指向静态文件或资源的URL都会映射到我的主servlet。
我该怎么做..?
如果有帮助,我可以将我所有的静态文件和JSP放在单独的文件夹中。在/*映射之前,有没有办法映射到这些文件夹?
发布于 2012-02-25 18:38:21
受How to access static resources when mapping a global front controller servlet on /*的启发,我想出了这个解决方案:
在/war/WEB-INF/web.xml中
<filter>
<filter-name>MainFilter</filter-name>
<filter-class>com.example.mywebsite.MainFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MainFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>com.example.mywebsite.MainServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/MainServlet/*</url-pattern>
</servlet-mapping>在MainFilter.java中
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI();
String topfolder = path.substring(1);
if (topfolder.contains("/")) {
topfolder = topfolder.substring(0, topfolder.indexOf("/"));
}
if (topfolder.startsWith("_")) {
chain.doFilter(request, response);
} else if (topfolder.endsWith(":")) {
request.getRequestDispatcher(path.replaceFirst(":", "")).forward(request, response);
} else {
request.getRequestDispatcher("/MainServlet" + path).forward(request, response);
}
}现在,您可以将所有静态内容放入WAR的子文件夹中。然后,如果你想从你的超文本标记语言链接到/war/css/style.css,你可以简单地把它称为"/css:/style.css"。或者,您可以在文件夹/文件的开头使用_命名,并以正常的方式引用它们。
( _规则还确保Google App Engine开发人员可以访问/_ah/admin)
发布于 2012-02-24 16:47:41
正如在注释中正确提到的那样,除非有合理的理由,否则应该为单独的JSP使用单独的Servlet。如果您想这样做,您可以简单地在servlet中使用if--else块,它由各种URL映射,并根据传入的请求和分派到相关的JSP。
喜欢
...
else if(request.getServletPath().equals("/user/account")){
//relevant processing and setting request attribute goes here
request.getRequestDispatcher("account_jsp_page.jsp").forward(request, response);
}
else if (....){
....我建议反对这个计划。最好让你的web.xml来做路由。或者最好使用一个为您处理此问题的框架。
发布于 2012-02-24 16:55:32
我建议使用框架来处理路由,例如Spring和Struts在处理路由方面做得更好。您可以让servlet或web.xml来做这件事,但是在这种情况下,不重用框架中的代码似乎毫无意义。因此,我建议使用Spring或Struts2
https://stackoverflow.com/questions/9427685
复制相似问题