当前位置:  开发笔记 > 编程语言 > 正文

如何在Spring MVC中处理静态内容?

如何解决《如何在SpringMVC中处理静态内容?》经验,为你挑选了9个好方法。

我正在使用Spring MVC 3开发一个webapp,并且DispatcherServlet像'so'一样捕获所有请求(web.xml):

  
    app
    org.springframework.web.servlet.DispatcherServlet
  

  
    app
    /
  

现在这可以像宣传的那样工作,但是我如何处理静态内容呢?以前,在使用RESTful URL之前,我会抓住所有*.html并将其发送给DispatcherServlet,但现在它是一个不同的球类游戏.

我有一个/ static /文件夹,其中包含/ styles /,/ js /,/ images/etc,我想从中排除/ static/*DispatcherServlet.

现在,当我这样做时,我可以获得静态资源:

  
    app
    /app/
  

但我希望它有很好的URL(我使用Spring MVC 3)而不是登陆页面www.domain.com/app/

我也不希望解决方案耦合到tomcat或任何其他servlet容器,并且因为这是(相对)低流量我不需要网络服务器(如apache httpd)infront.

有一个干净的解决方案吗?



1> Joris..:

由于我花了很多时间在这个问题上,我以为我会分享我的解决方案.从Spring 3.0.4开始,有一个配置参数被调用(参考文档网站上的更多信息)可用于提供静态资源,同时仍然使用站点根目录上的DispatchServlet.

要使用它,请使用如下所示的目录结构:

src/
 springmvc/
  web/
   MyController.java
WebContent/
  resources/
   img/
    image.jpg
  WEB-INF/
    jsp/
      index.jsp
    web.xml
    springmvc-servlet.xml

文件的内容应如下所示:

SRC /用SpringMVC /网络/ HelloWorldController.java:

package springmvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

 @RequestMapping(value="/")
 public String index() {
  return "index";
 }
}

的WebContent/WEB-INF/web.xml文件:




 
  springmvc
  org.springframework.web.servlet.DispatcherServlet
  1
 

 
  springmvc
  /
 

的WebContent/WEB-INF /用SpringMVC-servlet.xml中:




    
 

    
 

    
 
 
 

    
 
  
  
  
 


的WebContent/JSP/index.jsp的:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Page with image

" />

希望这可以帮助 :-)


这个例子应该在Spring用户指南中 - 这是我在这个主题上看到的最好的.谢谢Joris!
您还可以使用,它将映射到根目录.(即:根将包含资源和jsps).这可以节省你在任何地方使用c:url
正如@Bane所指出的,是此解决方案的关键部分.你(或任何人)会介意告诉我为什么吗?谢谢!

2> rozky..:

在Spring 3.0.4.RELEASE中可以解决此问题,您可以在spring repatcher 配置文件中使用 配置元素.

检查Spring文档


虽然实际上并没有"错误",但这个答案太简短了,因为Spring自己的文档(你引用作为你的答案)似乎缺少某些东西.检查Joris的答案是否有更完整的答案......不是因为它很冗长,而是事实上他提到使用,你的答案和Spring的dox都没有提到 - 并证明了是解决方案的关键部分.

3> Ayub Malik..:

在Spring 3.0.x中将以下内容添加到您的servlet-config.xml(在web.xml中配置为contextConfigLocation的文件.您还需要添加mvc命名空间,但如果您不知道如何,则只需谷歌!;)

这对我行得通


问候

Ayub Malik



4> 小智..:

如果我正确理解您的问题,我想我找到了解决您问题的方法:

我有同样的问题,原始输出显示没有找到CSS样式,javascripts或jquery文件.

我刚刚将映射添加到"默认"servlet中.以下内容已添加到web.xml文件中:

 
  default
  *.css
 

 
    default
    *.js
 

这应该过滤掉DispatcherRequest对象的javascript和css文件请求.

再次,不确定这是否是你所追求的,但它对我有用.我认为"default"是JBoss中默认servlet的名称.不太确定它对于其他服务器是什么.


你可以在同一个``中添加所有``标签

5> 小智..:

还有另一个堆栈溢出帖子,它有一个很好的解决方案.

它似乎不是特定于Tomcat,很简单,而且效果很好.我已经尝试了这篇文章中的几个解决方案与spring mvc 3.1但是在获取我的动态内容时遇到了问题.

简而言之,它说添加这样的servlet映射:


default
/images/*



6> hamo..:

我找到了一种方法,使用tuckey的urlrewritefilter.如果你有一个,请随时给出更好的答案!

在web.xml中:


    UrlRewriteFilter
    org.tuckey.web.filters.urlrewrite.UrlRewriteFilter



    UrlRewriteFilter
    /*


  
    app
    org.springframework.web.servlet.DispatcherServlet
  

  
    app
    /app/*
  

在urlrewrite.xml中:



    /
    /app/


    ^([^\.]+)$
    /app/$1


    /app/**
    /$1
    

这意味着任何带有'.'的uri.在其中(例如style.css)将不会被重写.


更好的答案是Spring 3的``,正如@Joris所证明的那样.

7> nickdos..:

我刚刚在Spring MVC 3.0中解决了这个问题,我最初选择了UrlRewriteFilter选项.但是我对这个解决方案并不满意,因为它"感觉不对"(我不是唯一的一个 - 请参阅上面的链接,弹出论坛中出现"hack"这个词几次).

所以我想出了一个类似上面的"未知(谷歌)"的解决方案,但借用了从/ static /(取自Pet Store应用程序的Spring Roo版本)提供的所有静态内容的想法."默认"servlet对我来说不起作用,但Spring Webflow ResourceServlet也是如此(也取自Spring Roo生成的应用程序).

web.xml中:


    mainDispatcher
    org.springframework.web.servlet.DispatcherServlet
    2



    Resource Servlet
    org.springframework.js.resource.ResourceServlet
    1



    mainDispatcher
    /



    Resource Servlet
    /static/*

我对JSP所做的唯一更改是为CSS,JS和图像添加/ static/path到URL.例如"$ {pageContext.request.contextPath} /static/css/screen.css".

对于Maven用户,"org.springframework.js.resource.ResourceServlet"的依赖关系是:


    org.springframework.webflow
    org.springframework.js
    2.0.8.RELEASE


回顾Spring Pet Clinic应用程序的标准(非Roo)版本,我注意到"default"的servlet定义已注释掉了附加注释:"在容器(GlassFish)中取消注释,但未声明此隐含的定义开箱即用".默认的显式包声明是org.apache.catalina.servlets.DefaultServlet.所以这可能是你的"开箱即用"资源servlet(?).我使用Jetty开发工作,似乎Jetty没有提供隐式默认servlet(如Glassfish).

8> Puneet Lamba..:

我对这个问题的经验如下.大多数与Spring相关的网页和书籍似乎都表明最合适的语法如下.

    

上面的语法建议您可以将静态资源(CSS,JavaScript,图像)放在应用程序根目录中名为"resources"的文件夹中,即/ webapp/resources /.

但是,根据我的经验(我使用Eclipse和Tomcat插件),唯一有效的方法是将资源文件夹放在 WEB_INF(或META-INF)中.所以,我推荐的语法如下.

    

在JSP(或类似)中,引用资源如下.


不用说,整个问题只是因为我希望我的Spring调度程序servlet(前端控制器)拦截一切,一切都是动态的,即.所以我的web.xml中有以下内容.


    front-controller
    
                org.springframework.web.servlet.DispatcherServlet
    
    1
    



    front-controller
    /

最后,因为我正在使用当前的最佳实践,所以我在前端控制器servlet xml中有以下内容(参见上文).


我在实际的控制器实现中有以下内容,以确保我有一个默认方法来处理所有传入的请求.

@RequestMapping("/")

我希望这有帮助.



9> Susitha Ravi..:

我遇到了同样的问题,发现Joris的回答很有帮助.但另外我需要补充一下

 

到servlet配置文件.如果没有该资源映射将无法工作,所有处理程序将停止工作.希望这会对某人有所帮助.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有