(几乎)一个servlet的所有URL

时间:2012-02-24 08:36:34

标签: java jsp servlets web.xml

我想将所有URL映射到一个主servlet,除了我的静态文件(如样式表,图形和东西),并且仍然能够从我的servlet调用JSP。

我的目的是向用户提供“虚荣URL”,这样任何不指向静态文件或资源的URL都会映射到我的主servlet。

我该怎么做..?

如果有帮助,我可以将所有静态文件和JSP放在单独的文件夹中。有没有办法在/ *映射之前映射到这些文件夹..?

5 个答案:

答案 0 :(得分:0)

正如评论中正确提到的,除非有合理的理由,否则为单独的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进行路由。或者更好地使用一个为您处理此问题的框架。

答案 1 :(得分:0)

我建议使用框架来处理Spring的路由,而Struts在处理路由方面做得更好。您可以创建一个servlet或web.xml,但是在这种情况下,不重用框架中的代码似乎毫无意义。所以我建议使用Spring或Struts 2

答案 2 :(得分:0)

两种方法,既不完美:

  • 为您的'actions'定义一个扩展,并将其映射到您的servlet(如Struts 1中的.do)。
  • 让所有servlet请求转到特定的子路径(例如/ actions / *)

web.xml中的映射规则非常有限,因为容器在路径规则之后匹配扩展,因此无法将servlet映射到/*, except *.jsp

像往常一样,我认为“使用框架”不一定是答案 - 如果项目相对较小,增加的复杂性可能不值得。

答案 3 :(得分:0)

除了可以为你做的所有框架之外,正如其他人已经指出的那样,尝试以相反的方式映射它。

因此,不是尝试映射除例外之外的所有内容,而是映射异常并让所有内容都通过您的servlet。您可以通过放置一个映射到所有静态文件的过滤器来轻松实现此目的。

答案 4 :(得分:0)

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中的子文件夹中。然后,如果您要从HTML链接到/war/css/style.css,只需将其称为"/css:/style.css" ..或者您可以在开头用_命名您的文件夹/文件并参考他们喜欢正常..

(此外,_规则确保Google App Engine开发人员可以访问/_ah/admin