如何从JSP传递值到tiles属性?

10

我正在将一个已有的Tiles 1网站转换为Tiles 2架构。 我在将JSP页面中的值传递给tiles属性时遇到了问题。

这是我的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个回答

18

${mytitle}是JSP EL表达式,意思是:在页面范围、请求范围、会话范围或应用程序范围中查找名为"mytitle"的属性。

通过定义脚本变量,您没有在任何一个这些作用域中定义属性。如果您有这样的定义:

pageContext.setAttribute("mytitle", mytitle);

然而在JSP中使用脚本片段是不良实践。我不知道你的故事Bean来自哪里,但它可能是一个请求属性。如果是这样,您可以使用JSTL定义一个新的页面范围属性,如下所示:

<c:set var="mytitle" value="${story.title}"/>

这是不必要的,因为你可以直接在tiles标签中使用这个表达式:

<tiles:putAttribute name="pageTitle" value="${story.title}"/>

阅读此教程,了解更多关于JSP EL的信息。


谢谢您的回答,我正在使用这个解决方案,但问题在于输出将会是${story.title}故事标题。正如您所看到的${story.title}将被视为变量和值。虽然我只是从Java而不是JSP中传递它。 - Daniel Newtown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接