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


问题内容

在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>或其他任何方法来做类似的事情吗?


问题答案:

简短的回答:当然可以 。但是我认为真正的问题是“如何?” :)

Spring MVC是Grails赖以建立的基础,因此它可以完成Grails可以做到的事情。Grails-
resources只是Grails用来简化开发工作的实用程序。如果要在Spring中执行相同的操作,则必须做一些工作。

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

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

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

其次,要将资源像Grails一样容易地嵌入HTML中,您必须将Spring
与其他视图技术相结合,例如sitemesh,freemarker
/ velocity / JSP …(Grails会为您提供幕后服务)。现在,您有了 freemarker或Velocity的宏 ,而不是
grails标记 。但是我建议您编写一些自己的自定义宏,因为内置宏并不总是很好。 __

我已经使用了Grails和Spring
MVC。我感谢Grails为使开发人员的生活更轻松而付出的努力,但是对于Spring来说,情况有所不同。使用Spring,您将需要编写更多代码,做出更多选择(在Grails中,它们是为您选择的“默认”,如果您不想自定义,则为“不可见”)。作为回报,您
被迫 更加了解底层机制,这是一件好事。

我已经使用sitemesh进行布局,并使用了freemarker作为多个Web项目的HTML渲染引擎,它们工作得很好。


更新:

我想明确指出,这mvc:resources并不是您问题的完整答案。这只是向浏览器 公开
Web资源的一部分。对于Grails,默认情况下已经进行了此操作,但对于Spring而言并非如此。您必须指定文件夹“图像”中的内容为资源,并且可以通过url访问http://your- domain-name/context-name/images/image-name。可以说,Spring比Grails更明确。

另一件事是模板引擎。在使用Spring时,Library
Sitemesh是一个流行的选择(这也是Grails的默认设置),因此并没有太大的区别(主要是关于语法)。
模板引擎的主要目的是用动态数据“填充”您的html ,我将向您展示……。

请注意,制作一个满足您示例要求的教程超出了答案的范围。而且,Spring启用了许多相关的解决方案,这意味着不同的开发人员可能具有不同的组织/配置方式。但是,给您一种感觉,我将举一个简单的示例(我正在使用freemarker来创建此示例):

在文件: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”,您可能会找到它。