首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在/*上映射全局前端控制器servlet时访问静态资源

如何在/*上映射全局前端控制器servlet时访问静态资源
EN

Stack Overflow用户
提问于 2009-05-15 18:23:40
回答 15查看 116.2K关注 0票数 60

我已经将Spring MVC dispatcher映射为/*上的全局前端控制器servlet。

<servlet>       
  <servlet-name>home</servlet-name>         
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     
</servlet>  
<servlet-mapping>       
  <servlet-name>home</servlet-name>         
  <url-pattern>/*</url-pattern>     
</servlet-mapping>

然而,这个映射阻止了对/res/文件夹中的静态文件的访问,比如CSS、JS、图片等等。

我怎么才能访问它们呢?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2009-05-15 19:33:29

我也遇到过这种情况,但从来没有找到一个很好的解决方案。我最终将我的servlet映射到URL层次结构中更高的一层:

<servlet-mapping>       
  <servlet-name>home</servlet-name>             
  <url-pattern>/app/*</url-pattern>     
</servlet-mapping>

现在,基本上下文(以及您的/res目录中)中的所有内容都可以由容器提供。

票数 12
EN

Stack Overflow用户

发布于 2010-08-29 12:27:00

将控制器servlet映射到更具体的url-pattern (如/pages/* )上,将静态内容放在特定的文件夹(如/static )中,并创建监听/*Filter,它透明地继续任何静态内容的链,并将请求分派给控制器servlet以获取其他内容。

简而言之:

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/pages/*</url-pattern>
</servlet-mapping>

在过滤器的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

票数 75
EN

Stack Overflow用户

发布于 2010-08-18 01:33:14

您要做的就是在web.xml中添加一个欢迎文件

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

然后将其添加到servlet映射中,这样当有人转到应用程序的根目录时,就会在内部将其发送到index.html,然后映射会在内部将它们发送到映射到的servlet

<servlet-mapping>
    <servlet-name>MainActions</servlet-name>
    <url-pattern>/main</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>MainActions</servlet-name>
    <url-pattern>/index.html</url-pattern>
</servlet-mapping>

最终结果:您访问了/Application,但是出现了/Application/MainActions servlet,而没有中断任何其他根请求。

明白了吗?因此,您的应用程序仍然位于子url,但当用户转到您网站的根目录时,它会自动显示。这允许您让/images/bob.img仍然转到常规位置,但'/‘是您的应用程序。

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

https://stackoverflow.com/questions/870150

复制
相关文章

相似问题

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