当将全局前端控制器servlet映射到/*时,如何访问静态资源。

17 浏览
0 Comments

当将全局前端控制器servlet映射到/*时,如何访问静态资源。

我已经将Spring MVC调度程序映射为全局前置控制器servlet在/*上。\n

       
  home         
  org.springframework.web.servlet.DispatcherServlet     
  
       
  home         
  /*     

\n然而,这个映射会阻止访问静态文件,如CSS、JS、图片等,它们都在/res/文件夹中。\n我该如何访问它们?

0
0 Comments

当将全局前端控制器servlet映射在“/*”上时,如何访问静态资源

问题原因:在将全局前端控制器servlet映射在“/*”上时,如果想要访问静态资源,需要对web.xml文件进行配置。

解决方法:在web.xml文件中添加欢迎文件和servlet映射。

首先,在web.xml文件中添加欢迎文件:


    index.html

然后,将servlet映射添加到web.xml文件中,以便当有人访问应用程序的根目录时,他们会被内部重定向到index.html文件,然后再将其内部重定向到所映射的servlet:


    MainActions
    /main


    MainActions
    /index.html

最终结果是:当访问/Application时,将会显示/Application/MainActions servlet,而不会影响其他根目录的请求。

明白了吗?所以你的应用程序仍然位于子URL,但是当用户访问站点的根目录时,会自动显示你的应用程序。这允许你将/images/bob.img仍然指向常规位置,而'/'则是你的应用程序。

我发现这种解决方法在我使用Tomcat时效果很好,我想要通过自己的Servlet来处理自己的index.template文件。我不知道它是否是Servlet规范的必需解释,尽管如果有的话,第10.10节中的欢迎文件部分似乎要求容器在检查映射之前提供静态资源...但我不确定我是否理解正确。

另外,这也是一个相关的地方,从前的JavaEE规范预见到了“部署者”、“开发者”和“主机管理员”之间的角色分离。而现在,Docker已经成为“可部署单元”,因此,运行应用程序的Tomcat实例(或Jetty等)本身就是一个在开发时选择的组件。所以,如果它在你的servlet容器中运行,对于你的应用程序来说是有效的,就好好享受吧。只有当你将Servlet作为可重用的组件部署到“任何地方”时,你才需要担心互操作性。但这几乎不会发生。

0
0 Comments

问题原因:在使用Spring 3.0.4.RELEASE及更高版本时,当将全局前端控制器servlet映射到"/*"时,访问静态资源的方式发生了改变。

解决方法:可以使用标签来配置静态资源的映射。

配置示例:


详细参考:Spring参考文档

0
0 Comments

问题原因:将全局前端控制器servlet映射到"/*"时,无法访问静态资源。

解决方法:将控制器servlet映射到更具体的"url-pattern",例如"/pages/*",将静态内容放置在特定文件夹"/static"中,并创建一个监听"/*"的过滤器,该过滤器会对任何静态内容透明地继续执行链,并将请求转发给控制器servlet处理其他内容。

解决方案代码如下:

过滤器配置:


    filter
    com.example.Filter


    filter
    /*

控制器servlet配置:


    controller
    com.example.Controller


    controller
    /pages/*

过滤器的doFilter()方法代码:

HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());
if (path.startsWith("/static")) {
    chain.doFilter(request, response); // Goes to default servlet.
} else {
    request.getRequestDispatcher("/pages" + path).forward(request, response);
}

这种解决方法可以使得在浏览器地址栏中不显示"/pages",是完全透明的。如果需要,可以将"/static"和/或"/pages"作为过滤器的init-param。

注意:在控制器中不要再次转发到控制器,因为它已经完成了它的工作。可以将视图隐藏在"/WEB-INF"文件夹中,例如"/WEB-INF/pages/default.jsp"。

这种解决方案非常棒,可以解决这个问题。

0