我试过从我的Sitemesh装饰器中排除某些页面,但它似乎没有遵循自己的逻辑:
<decorators>
<excludes>
<pattern>/register</pattern>
</excludes>
</decorators>
Run Code Online (Sandbox Code Playgroud)
Sitemesh有哪些替代方案可以作为主要使用普通JSP/JSTL的Spring MVC应用程序中的替代品?
我在我们的应用程序中使用sitemesh.在装饰者jsp我添加了头部和身体标签
<body onload="<decorator:getProperty property='body.onload'/>" >.所以我想在我的jsp页面上处理body onload.我添加了以下内容
<script type="text/javascript">
function init() {
alert("hi");
}
</script>
</head>
<body onload="javascript:init();">
Run Code Online (Sandbox Code Playgroud)
但是init()在我的jsp页面中不起作用.
如何使用Spring MVC,Sitemesh和Freemarker将spring.ftl宏导入Freemarker模板页面?
我根据Ted Young的配置示例使用Sitemesh和Freemarker配置了一个Spring MVC应用程序.根据Spring MVC/Freemarker集成参考,有必要导入spring.ftl宏,以便通过<@ spring.bind"command.name"/>将支持模型绑定到视图.但是,这样做:
<#import "/spring.ftl" as spring>
<@spring.bind "command.user"/>
Run Code Online (Sandbox Code Playgroud)
此例外的结果:
org.springframework.web.util.NestedServletException:
Request processing failed; nested exception is freemarker.
template.TemplateException: Error reading imported file spring.ftl
Run Code Online (Sandbox Code Playgroud)
其他人已经遇到过这个问题,但我还没有找到谷歌的解决方案.我也试图使用这种技术(压缩spring.ftl,将它放在META-INF/lib中,并将zip添加到构建路径中),但它似乎没有成功.
谢谢!
Tiles和Sitemesh看起来很受欢迎但是这些东西真的很旧,与目前来自Ruby(ERB)或PHP(开放式电源模板)的当前很棒的东西相比看起来很糟糕.这些天模板引擎允许舒适的模板化(插入变量,根据上下文自动化,迭代Iterables,访问bean属性)和布局(例如页眉,页脚和覆盖以及添加到父级中定义的某些部分),而不需要任何困难的配置,并且不需要需要更改当前堆栈(例如您的Web框架).
示例parent.html:
<html>
<head>
<title>
<layout:part name="title">
Default title
</layout:part>
</title>
<layout:part name="head" />
</head>
<body>
<div class="menu" layout:part="menu">
default menu
</div>
<div class="content" layout:part="content" />
<div class="footer">
(c) me
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
示例child.html
<layout:extend file="parent.html">
<layout:fill name="title">
Custom title
</layout:fill>
<layout:fill name="contnet">
the content
{$var} from model
</layout:fill>
</layout:extend>
Run Code Online (Sandbox Code Playgroud)
我正在寻找更好的Facelets,这不需要我改变整个堆栈 - 我不会让整个项目适应JSF或Wicket只是为了使用更好的视图.
模板引擎不应该需要任何其他servlet或过滤器(没有基于URL的逻辑).我想以编程方式使用引擎.一个可能的用例是在Spring 3中定义自定义ViewResolver.
如果布局没有在配置文件中预先定义,那将是完美的.如果只是在模板文件中定义父视图,则不需要这样做.
该框架可能位于JSP之上,但并非如此.优点是可以使用其他框架(例如Spring)提供的taglib.
或者也许Sitemesh/Tiles中已经存在所有内容但需要大量配置?如果您知道任何允许实现所有上述目标的示例配置,请告诉我.
相关问题:Sitemesh有哪些替代方法可以帮助在Spring MVC应用程序中布局JSP/JSTL页脚/标题? - 我的问题也涉及模板,并不仅限于Spring Web MVC.
我正在将一组grails 2.0.4应用程序迁移到3.x版.所有这些都与许多java应用程序一起部署在同一服务器中.两组java和grails应用程序都使用sitemesh和freemarker模板具有相同的外观.但是使用grails 3.x我无法使commond装饰工作,应用程序坚持使用layouts/main.gsp来渲染我的gsp.
到目前为止(grails 2.0.4)提供一个共同的装饰是相当直的; 每个grails应用程序的文件/WEB-INF/decorators.xml提供对适用的freemarker模板的引用.web.xml包括sitemesh过滤器和freemarker装饰器servlet声明和映射
decorators.xml:
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/">
<excludes>
<pattern>/ND/*</pattern>
<pattern>/*/ND/*</pattern>
</excludes>
<decorator name="freemarker" page="myftl.ftl">
<pattern>/*</pattern>
</decorator>
</decorators>
Run Code Online (Sandbox Code Playgroud)
来自web.xml的Sitemesh过滤器和freemarker servlet:
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>class://</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
resources.groovy:
beans = {
sitemeshFreemarkerServlet(ServletRegistrationBean) {
servlet = bean(FreemarkerDecoratorServlet)
urlMappings = ["*.ftl"]
loadOnStartup = 2
}
}
Run Code Online (Sandbox Code Playgroud)
但是,grails 3.x应用程序坚持使用layouts/main.gsp来渲染我的gsp页面.似乎没有处理decorators.xml.我错过了什么?
我使用servlet配置我的Spring Web应用程序以在URL处提供图像:
/imgsrv?imgid=12345
Run Code Online (Sandbox Code Playgroud)
我也安装了Sitemesh,现在当我调用这个图像servlet时,我得到一个与这个servlet相关的装饰器异常,它不需要应用装饰器.
根据Sitemesh文档,您可以排除某些URL应用装饰器,但语法不明确.
以下哪种模式最适合将上面的URL排除在"装饰"之外:
<decorators defaultdir="/WEB-INF/view/decorators">
<excludes>
<pattern>/imgsrv*</pattern>
<pattern>/imgsrv/*</pattern>
<pattern>/imgsrv**</pattern>
<pattern>/imgsrv/**</pattern>
<pattern>/imgsrv*.*</pattern>
<pattern>/imgsrv/*.*</pattern>
</excludes>
<decorator name="main" page="main.jsp">
<pattern>/*</pattern>
</decorator>
</decorators>
Run Code Online (Sandbox Code Playgroud) 我试图使用Sitemesh 3来控制Spring MVC应用程序的JSP输出的装饰.
当我点击应用程序时,似乎Sitemesh正在向Spring servlet发出请求以尝试并检索其装饰器文件.这可能是,也可能不是正确的行为,但它引起了我很多头痛.
我对Sitemesh 3的理解是它在Spring之后完成它的工作,即在Response对象上.
我在浏览器中遇到的错误是404和日志(配置/代码如下):
INFO: Server startup in 1367 ms
DEBUG: org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name
'springiness' processing GET request for [/clientmanager/]^M
DEBUG:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping -
Looking up handler method for path /^M
DEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping -
Returning handler method [public java.lang.String
uk.co.hermes.HomeController.home(java.util.Locale,org.springframework.ui.Model)]^M
DEBUG: org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning
cached instance of singleton bean 'homeController'^M
DEBUG: org.springframework.web.servlet.DispatcherServlet - Last-Modified value for
[/clientmanager/] is: -1^M
INFO : uk.co.hermes.HomeController - Welcome home! The client locale is en_GB.^M
DEBUG: org.springframework.beans.factory.support.DefaultListableBeanFactory - Invoking
afterPropertiesSet() …Run Code Online (Sandbox Code Playgroud) 我正在使用sitemesh作为基于弹簧的网站.问题是我有一些javascript,我希望它只使用jquery $(function() { ... })在一个特定页面的onload事件上运行,而不是在每个页面上运行.
我把jquery.js包含在我的装饰者的底部,在身体之后.因此,如果我尝试<script>在我的装饰页面的主体中包含一个标记,则不会执行该脚本,因为之后将加载jquery !我知道我可以在我的装饰器的标题中包含jquery.js,所以它将在装饰页面中的自定义脚本之前,但我不喜欢该解决方案,因为它将在我的页面的头部包含javascritp.
所以我希望在我的sitemesh装饰器中有一个占位符,我的装饰页面中的自定义将被放置(你可以理解我来自django世界:p).这可能吗 ?你有什么建议吗?或者我应该把我的jquery.js放在标题中并完成它?
我见过Sitemesh与Spring和Freemarker(FTL)一起使用.所以我想知道什么是Sitemesh及其与FTL的使用,例如.
请注意:这个问题几乎与这个题为"从grails 2.3.8 2.4升级时的资源插件错误"的问题重复,但是在我看来,有些事情是不同的,值得将它作为一个单独的问题提出:
所以,我要求你在关闭/关闭投票之前作为一个骗子,请指出我在其他问题中提供的确切解决方案也将适用于我的确切情况.如果你不能那样做,请不要关闭/关闭这个问题!
我正在将Grails 2.3.6应用程序升级到Grails 2.4.4.我做的时候run-app得到:
Error |
2015-03-05 14:42:44,257 [localhost-startStop-1] ERROR [localhost].[/myapp] - Exception starting filter sitemesh
java.lang.ClassNotFoundException: org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter
at org.grails.plugins.tomcat.ParentDelegatingClassLoader.findClass(ParentDelegatingClassLoader.java:59)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4809)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5485)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Error |
2015-03-05 14:42:44,268 [localhost-startStop-1] ERROR core.StandardContext - …Run Code Online (Sandbox Code Playgroud) sitemesh ×10
spring-mvc ×5
java ×3
jsp ×3
freemarker ×2
grails ×2
spring ×2
grails-3.1 ×1
java-ee ×1
javascript ×1
jquery ×1
jstl ×1
regex ×1
servlets ×1
tiles ×1