我正在将现有的Tiles 1 webapp转换为Tiles 2架构。我在将值从JSP页面传递到tiles属性时遇到问题。
这是我的图块定义文件(tiles-definition.xml)
<tiles-definitions>
<definition name="cda.layout" template="/jsp/layouts/layout.jsp">
<put-attribute name="pageTitle" value="StoryTitle" type="string"/>
<put-attribute name="pageHeader" value="StoryHeader" type="string"/>
<put-attribute name="resources" value="" type="string"/>
</definition>
</tiles-definitions>
layout.jsp看起来像:
<html>
<head>
<title><tiles:insertAttribute name="pageTitle" flush="true"/></title>
</head>
<body>
...
...
<div class="content">
<h1><tiles:insertAttribute name="pageHeader" flush="true"/></h1>
</div>
...
...
</body>
</html>
我有一个使用布局的故事页面,需要将值传递给模板属性。
<%
// create a business object and populate
String mytitle= story.getTitle();
String myheader = story.getHeader();
%>
<tiles:insertTemplate template="../layouts/layout.jsp" flush="false" >
<tiles:putAttribute name="pageTitle" value="${mytitle}"/>
<tiles:putAttribute name="pageHeader"value="${myheader}"/>
</tiles:insertTemplate>
在story.jsp中,我可以将System.out.print()mytitle,myheader的值显示正确。但是,这些值不会传递给tile属性。
知道如何解决这个问题吗?
答案 0 :(得分:18)
${mytitle}
是一个JSP EL表达式,表示:在页面范围或请求范围,会话范围或应用程序范围中查找名为“mytitle”的属性。
通过定义scriptlet变量,您尚未在任何这些范围中定义属性。如果你有
它会工作pageContext.setAttribute("mytitle", mytitle);
但是在JSP中使用scriptlet是不好的做法。我不知道你的故事bean来自哪里,但它可能是一个请求属性。如果是这样,您可以使用JSTL:
以这种方式定义新的页面范围属性<c:set var="mytitle" value="${story.title}"/>
这是不必要的,因为你可以直接在tiles标签中使用这个表达式:
<tiles:putAttribute name="pageTitle" value="${story.title}"/>
在this tutorial中阅读有关JSP EL的更多信息。