struts2 tiles插件中的问题。

时间:2011-07-31 07:27:00

标签: java struts2

我希望使用struts2 tiles插件对我的项目进行组件化。 我写的tiles.xml文件是这样的:

<tiles-definitions>
<definition name="indexBaseLayout" template="/indexBaseLayout.jsp">
    <put-attribute name="title" value="" />
    <put-attribute name="topBar" value="/topbar.action" />
    <put-attribute name="catalog" value="" />
    <put-attribute name="searchForm" value="" />
    <put-attribute name="main" value="" />
    <put-attribute name="footer" value="" />
</definition>
<definition name="regInput.tiles" extends="indexBaseLayout">
    <put-attribute name="title" value="注册" />
    <put-attribute name="main" value="/reg/input.action" />
</definition>
<definition name="regSuccess.tiles" extends="indexBaseLayout">
    <put-attribute name="title" value="注册" />
    <put-attribute name="main" value="/reg_success.jsp" />
</definition>
<definition name="index.tiles" extends="indexBaseLayout">
    <put-attribute name="title" value="主页" />
    <put-attribute name="main" value="/index.jsp" />
</definition>

这是struts.xml的一部分:

<package name="main" extends="struts-default" namespace="/">
    <action name="topbar" class="topBarAction">
        <result name="success">/topbar.jsp</result>
    </action>
</package>

如您所见,我在put-attribute值中添加了一些操作URL。我以为它们将作为struts动作执行并显示返回的结果视图。但事实是,tiles插件将“xxxx.action”识别为文件:java.io.FileNotFoundException:请求的资源(/bookstore/topbar.action)不可用。 那么有什么解决方案可以将动作的结果视图插入到tile布局中吗?

1 个答案:

答案 0 :(得分:0)

据我所知,您无法从图块定义执行操作。

如果您在渲染所有其他tile结果之前尝试在此jsp上执行某些逻辑,则另一种解决方案可能是使用json插件或类似的东西对struts操作使用一些异步jquery调用。

我不确定你的最终目标是什么,如果你可以描述你的目标,或许我可以帮助更多。

编辑:在JSP中使用条件的进一步定义

在tile定义中,您将正常引用JSP:

<definition name="indexBaseLayout" template="/indexBaseLayout.jsp">
    <put-attribute name="title" value="" />
    <put-attribute name="topBar" value="/topbar.jsp" />
    <put-attribute name="catalog" value="" />
    <put-attribute name="searchForm" value="" />
    <put-attribute name="main" value="" />
    <put-attribute name="footer" value="" />
</definition>

在JSP中,您将基于条件的struts标记呈现什么:

<s:if test="%{#session.user != null && #session.user.Authenticated"}>
    Welcome <s:property value="%{#session.user.name}" />
</s:if><s:else>
    <%-- Login form goes here --%>
</s:else>

此解决方案为您提供了一种在会话中检查用户对象的方法,这是我可能会亲自维护用户信息对象的地方。如果用户对象为null或boolean authenticated为false,则它将显示登录表单,否则它将显示欢迎消息,也可能显示注销按钮。