我是一位经验丰富的Grails开发人员,但我的大多数经验都是使用grails将JSON/XML提供给flex应用程序和一些相对简单的HTML网站.
我一直在深入研究使用grame中的sitemesh集成,我正在努力寻找一些更复杂的配置的最佳实践,我很好奇是否有任何好的教程或示例.在原来的SiteMesh的网站是不是因为它谈论Grails中不直接暴露标签有用.
谷歌搜索主要显示旧的邮件列表帖子和一些vanilla sitemesh的东西,这有助于我进一步向前移动,但这是一个很多的试验和错误.
我完全理解基本的g:layoutTitle,g:layoutHead和g:layoutBody标签是如何工作的.这些都很容易并且有很好的记录
我想看到的例子:
g:applyLayout - 关于这方面的文档很薄弱,我不完全理解主文档中建议的用法.这与设置meta name='layout' content='foo'属性有何不同?
g:pageProperty - 一些关于如何通过在正在修饰的页面中将值设置为元标记来将属性拉入主模板并使用属性的更好示例.pageProperty上的grails文档仅显示正在提出的正文的onload属性.我认为你也可以在这里使用元标记值,还有其他什么?
你可以使用多个级别的sitemesh布局?我的测试似乎让我觉得我做不到,但这似乎减少了可重用性.我认为这里的答案是g:applyLayout的一些用法,但那是我最挣扎的地方.
我被告知在我的JSP页面中使用scriptlet(<%= ...%>)并不是一个好主意.
有没有更多java/jsp经验的人可以给我一些关于如何更改此代码的指示,以便更多"最佳实践",无论可能是什么?
这个JSP实际上是我的sitemesh主装饰页面.基本上我的网页设计有一个标签条和一个子菜单,我希望以某种方式突出显示当前标签,并通过查看当前请求URI显示正确的子菜单.
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<html>
<head>
<title>My Events - <decorator:title /></title>
<link href="<%= request.getContextPath() %>/assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="tabs">
<a
<%= request.getRequestURI().contains("/events/") ? "class='selected'" : "" %>
href='<%= request.getContextPath() %>/events/Listing.action'>Events</a>
<a
<%= request.getRequestURI().contains("/people/") ? "class='selected'" : "" %>
href='<%= request.getContextPath() %>/people/Listing.action'>People</a>
</div>
<div class="submenu">
<% if(request.getRequestURI().contains("/events/")) { %>
<a href="Listing.action">List of Events</a>
|<a href="New.action">New Event</a>
<% } %>
<% if(request.getRequestURI().contains("/people/")) { %>
<a href="Listing.action">List of People</a>
|<a href="New.action">New Person</a>
<% } %> …Run Code Online (Sandbox Code Playgroud) 当我在gsp模板中使用标准的jsp注释块时
<%-- some server-side comment --%>
Run Code Online (Sandbox Code Playgroud)
,sitemesh引发'意外令牌'错误.我可以使用另一种评论语法吗?
我正在评估SiteMesh在我们的Web应用程序中的使用.我找到了SiteMesh的两个网站
看起来同一作者都参与其中(Joe Walnes).所以我的问题是 - SiteMesh还在积极开发吗?我发现的两个版本都稳定吗?一个被弃用了吗?SiteMesh还有其他替代方案吗?我们正在寻找一种工具,它可以充当许多不同Web应用程序的反向代理,以应用与应用程序分开控制的一致外观.SiteMesh似乎能够做到这一点......我想.
我正在努力重写一些老化的Web应用程序.有两个特别是非常非常相似,但今天没有共享代码,我的目标是解决这个问题.
这些项目正在用Maven,Spring MVC和Sitemesh重写.
模型层代码很容易使用JAR共享.但我不知道在类似的应用程序之间共享通用Web层代码(JSP和控制器)的任何好方法.
这是一些背景知识.这些应用程序是网络商店.一个是普通商店(想想amazon.com),用户可以登录,搜索产品,添加到购物车,结账.另一个基本上是相同的东西,只有它是一个打击站点.产品浏览和购物车部分是相同的.但是,登录和结帐完全不同.
我过于简单了,但这足以说明问题.产品浏览和购物车部分中有很大一部分Web层代码应该能够在两者之间共享.
我认为根据环境变量或来自不同数据库的设置,只能将相同的WAR文件作为"模式"运行.其中一个差异是完全不同的Spring Security配置.最好将其他站点的登录和结帐控制器从组件扫描中移除,这样任何人都无法通过URL操作以某种方式转换到错误的控制器.
我最初开始使用Maven Profiles并过滤以在同一个WAR项目中保留两个不同的配置集(web.xml,spring configs等).根据选择的Maven配置文件,生成的WAR使用不同的配置集(为清晰起见,使用不同的名称)构建.这违反了Maven原则,即一个pom产生一个工件.
有一个更好的方法吗?Maven WAR Overlays怎么样?我看到人们谈论使用叠加来共享CSS,JS,图像甚至一些常见的JSP等公共资源.但我没有看到有人提到像控制器这样的方式共享类.
我可以将Controller类推送到JAR,但从逻辑上看,它们应该保留在各自的JSP中.并且JSP也不能被推送到JAR(对吧?).
我还想过让它成为一个包含多个WAR文件的EAR - 一个用于常见购物体验的WAR,另一个用于相应登录和结帐的WAR.我相信会话可以在同一个EAR中的两个WAR之间共享,但我不确定它是否与Spring的会话范围bean相配.我听说他们并没有真正存储在会话中.我还必须弄清楚如何处理用于页眉/页脚的Sitemesh装饰器.需要将相同的Sitemesh配置及其资源复制到两个WAR中,对吗?所以最后,购物WAR工件在每种情况下仍然会有所不同.
我不得不相信其他人以前曾经处理过这个问题.我想错了吗?这种事情有一个共同的解决方案吗?
致力于Web应用程序的设计,因为它将是一个大型应用程序,因此无法回复jsp include功能,因此必须使用其他解决方案,为此我们提出了Tiles和Sitemesh.
我们对他们都是新手,所以我们非常感谢社区的任何见解.有关其他信息,我们将使用Struts2.x作为我们的邮件MVC框架,其中Spring用于其他层(业务)
哪个选项更好,因为应用程序必须处理大量内容和频繁的UI更改
我正在尝试做这样的事情:

对于/ admin/*的所有请求,我需要使用B装饰器来装饰页面,但是B装饰器必须包含在作为主应用程序布局的装饰器的内容中.
我怎么能用Sitemesh做到这一点?
它甚至可能吗?或者我必须在B装饰器中重复相同的布局?
提前致谢
我正在使用Spring 3和sitemesh.我想在sitemesh中定义的decorator页面中引用spring context bean.
问题是SiteMesh过滤器在Spring上下文之外工作,因此sitemesh decorator jsp页面上的请求对象是本机HttpServletRequest,而不是包含有用函数的包装器来访问上下文等.
有没有办法以某种方式配置spring和sitemesh以访问装饰页面中的Spring上下文?
我正在努力在遗留应用程序中实现 Spring Session。我按照 Spring 文档来实现会话库,一切似乎都运行良好,除了......
有一个 UI 元素通过 sitemesh 装饰在每个页面上。此 UI 元素检查会话中的对象以查看它是否应该显示。当通过 sitemesh 装饰器从会话中检索对象时,该对象为空。当我通过控制器或主要内容 JSP 访问同一个对象时,对象被填充并且一切正常。
换句话说:
Web request -> tomcat -> controller -> jsp -> jstl -> session object = ok
然后继续渲染 sitemesh decorator adds main.jsp -> jstl -> same session object is null
我想这一定是配置问题。我可以确认,当我注释掉springSessionRepositoryFilter页面时,页面呈现正确,但是我没有使用 spring 会话并点击我的 redis 服务器。如果有人有任何想法,我将不胜感激。谢谢!我的 web.xml 看起来像这样。
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0" id="WebApp_1398187215147">
<display-name>MyApplication Web Application</display-name>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name> …Run Code Online (Sandbox Code Playgroud) 我是Grails/GSP/Sitemesh的新手,我想弄清楚我是否可以使用嵌套布局.我希望有一个主要布局,将用于我的所有页面,以包含标准页眉,页脚和我所有的CSS/JavaScript资源.在另一个页面子集上,我想定义一个将从主要页面继承的布局,并添加一个侧面菜单和一些其他内容.这样,该部分的每个页面都引用了第二个布局,并自动从中获取内容以及主要布局.
这可能吗?如何定义第二个布局以引用主要布局以使其工作?
更新1
所以,我通读下面评论中链接的博客文章,但仍然遇到麻烦.我尝试使用以下层次结构设置一个非常简单的测试用例.
/layouts/main.gsp
-- /layouts/sub.gsp
-- /test/index.gsp
Run Code Online (Sandbox Code Playgroud)
对于我的页面,我在main.gsp中有以下内容:
<!DOCTYPE html>
<html>
<head>
<title><g:layoutTitle default="Grails"/></title>
<g:layoutHead/>
</head>
<body>
MAIN <br />
<g:layoutBody/>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在sub.gsp中:
<g:applyLayout name="main">
<html>
<head>
<title><g:layoutTitle/></title>
<g:layoutHead/>
</head>
<body>
Sub<br />
<g:pageProperty name="page.content"/>
</body>
</html>
</g:applyLayout>
Run Code Online (Sandbox Code Playgroud)
最后在index.gsp中:
<html>
<head>
<meta name="layout" content="sub"/>
<title>Title Here</title>
</head>
<body>
<content tag="page.content">
Content
</content>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当我加载页面时,页面标题设置正确,我在页面上看到"Main"和"Sub",但"Content"没有显示.我敢肯定我必须做一些简单的错误...任何想法?
更新2
我发现我已经拥有<content tag="page.content">它应该只是<content tag="content">.似乎现在正在工作.