如何将值从JSP传递给tiles属性?

时间:2012-01-18 19:18:11

标签: spring jsp tiles

我正在将现有的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属性。

知道如何解决这个问题吗?

1 个答案:

答案 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的更多信息。