首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(几乎)所有URL都指向一个servlet

(几乎)所有URL都指向一个servlet
EN

Stack Overflow用户
提问于 2012-02-24 16:36:34
回答 5查看 4.5K关注 0票数 1

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

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

我该怎么做..?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-25 18:38:21

How to access static resources when mapping a global front controller servlet on /*的启发,我想出了这个解决方案:

/war/WEB-INF/web.xml

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
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)

票数 0
EN

Stack Overflow用户

发布于 2012-02-24 16:47:41

正如在注释中正确提到的那样,除非有合理的理由,否则应该为单独的JSP使用单独的Servlet。如果您想这样做,您可以简单地在servlet中使用if--else块,它由各种URL映射,并根据传入的请求和分派到相关的JSP。

喜欢

代码语言:javascript
运行
复制
...
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来做路由。或者最好使用一个为您处理此问题的框架。

票数 0
EN

Stack Overflow用户

发布于 2012-02-24 16:55:32

我建议使用框架来处理路由,例如Spring和Struts在处理路由方面做得更好。您可以让servlet或web.xml来做这件事,但是在这种情况下,不重用框架中的代码似乎毫无意义。因此,我建议使用Spring或Struts2

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9427685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档