在Spring MVC中管理HTML资源(CSS,JS文件)

时间:2012-05-22 00:21:18

标签: spring grails spring-mvc resources

是否可以在Spring MVC中管理类似于grails-resources的HTML资源?

与此类似:http://www.anyware.co.uk/2005/2011/09/12/optimising-your-application-with-grails-resources-plugin/

例如:在Grails中,模块被指定为

modules = {  
     common {  
        resource url:"css/main.css"  
        resource url:"js/jquery.js"  
     }  
}

并在HTML中,使用模块名称指定此标记以加载所有文件。

<r:require module="common"/>

所以我想知道有没有办法在Spring MVC中用<mvc:resources>或其他任何选项做类似的事情?

2 个答案:

答案 0 :(得分:3)

简短回答:肯定。但我认为真正的问题是“怎么样?” :)

Spring MVC是Grails构建的基础,因此它可以做Grails可以做的事情。 Grails-resources只是Grails为帮助开发工作更容易实现的实用工具。如果你想在Spring中做同样的事情,你必须做一些工作。

首先,Spring MVC有一种公开资源的方法(reference,第17.15.6章,“配置资源服务”);例如:

<mvc:resources mapping="/images/**" location="/images/"/>

以上行将[Web folder]/images/中的每个文件作为资源公开,并可由Web浏览器请求。

其次,要像Grails一样将资源嵌入到HTML中,你必须结合Spring with some other view technologies,比如sitemesh,freemarker / velocity / JSP ......(Grails为你做幕后的事情)。现在您拥有 freemarker或Velocity的宏 ,而不是 grails标记 。但我建议你写一些自己的自定义宏,因为内置的宏并不总是好的。

我使用过Grails和Spring MVC。我很欣赏Grails为使开发人员的生活更轻松而付出的努力,但是对于Spring来说,事情有点不同。使用Spring,您将可以编写更多代码,进行更多选择(在Grails中,它们被选为“默认”,如果您不想自定义,则为“隐形”)。作为回报,你是强迫更多地了解底层机制,这是一件好事。

我使用sitemesh进行布局,将freemarker用作多个Web项目的HTML渲染引擎,它们运行良好。


<强>更新

我想明确指出mvc:resources不是您问题的完整答案。这只是 公开 浏览器获取的网络资源的一部分。使用Grails,这已经默认生成了,但对Spring来说并非如此。您必须指定文件夹“images”中的内容是资源,并且可以通过URL http://your-domain-name/context-name/images/image-name访问它们。如上所述,Spring比Grails更明确。

另一件事是模板引擎。使用Spring时,Library Sitemesh是一个很受欢迎的选择(它也是Grails的默认选项),所以它没有太大区别(主要是关于语法)。 模板引擎的主要目的是用动态数据“填写”你的htmls ,我将向你展示......一点点。

请注意,制作符合您示例的教程超出了答案的范围。此外,Spring支持许多相关解决方案,这意味着不同的开发人员可能有不同的组织/配置方式。但是为了给你一种感觉,我会做一个快速的例子(我使用freemarker来做这个例子):

在file:common.ftl中,我有:

<#macro commonInclude>
<script type="text/javascript" src="${rc.getContextUrl('/js/jquery.js')}"></script>     
<link rel="stylesheet" type="text/css" href="${rc.getContextUrl('css/main.css')}" />
</#macro>

使用更多配置,然后在视图文件中我可以调用:

<@common.commonInclude />

它将呈现您想要的代码。

如您所见,主要区别在于它们的语法。 Grails允许更清晰的风格,而Spring为您提供更“明确”的风格,如果您想要自定义内容,这将会受益。

  • 奖励:如果您正在寻找Grails layout的替代品,请快速搜索“Spring and Sitemesh”,您可能会找到它。

答案 1 :(得分:0)

  

grails-app / conf / spring / resources.groovy

import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
import org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler

// Place your Spring DSL code here
beans = {

    resourceHttpRequestHandler(ResourceHttpRequestHandler) {
        locations = ['file:/D:/fupload/']
    }

    resourceHandlerAdapter(HttpRequestHandlerAdapter)

    resourceHandlerMapping(SimpleUrlHandlerMapping) {
        urlMap = ['/fupload/**':'resourceHttpRequestHandler']
    }
}