Tiles Framework:仅刷新正文内容

时间:2012-06-14 07:57:03

标签: struts tiles

我们有一个Tiles布局页面,包含页眉,菜单,正文和页脚。在此布局中,只要用户在菜单列表中执行某些操作,整个布局(包括页眉,菜单和页脚)就会刷新。我希望标题,菜单,页脚是静态的,只有正文部分才能更新。

有没有办法阻止刷新页眉,菜单和页脚,只更新菜单上的Body内容,可以使用Tiles实现?

2 个答案:

答案 0 :(得分:7)

要执行此操作,您需要使用ajax调用。一般程序是:

1.-创建并定义一个作为基础的图块,由标题,正文和页脚组成,如下所示:

<div id='headerTile'>whatever goes here...</div> <!--this is baseHeader.jsp-->
<div id='bodyTile'>whatever goes here....</div>  <!--this is baseBody.jsp-->
<div id='footerTile'>whatever goes here...</div>  <!--this is baseFooter.jsp-->

让我们将每个div视为您定义中的一个图块:

<definition name="layoutBase" path="/whateverPathItIs/layoutBase.jsp">
    <put name="header" value="/whateverPathItIs/baseHeader.jsp"/>
<put name="body" value="/whateverPathItIs/baseBody.jsp" />
<put name="footer" value="/whateverPathItIs/baseFooter.jsp" />         
</definition>

2.-创建并定义将替换你的身体内容的所有不同的jsp,请记住这个jsp必须只包含body元素。假设您有2个其他正文内容已准备好显示在您的页面中,每个内容都将是一个图块:

<div id='bodyContent1'>whatever goes here again...</div> <!--this is content1.jsp-->

<div id='bodyContent2'>whatever goes here again 2</div> <!--this is content2.jsp-->

3.-此时你有基本的jsp tile和另外两个包含body内容的jsp。现在我们需要一个struts动作,它将作为一个服务,根据ajax请求返回相应的主体。 将此作为正常操作,最后在mapping.findForward方法中,返回包含您身体的jsp 。您可以为每个正文内容创建一个操作,也可以为每个正文包含一个方法的单个DispatchAction。第二个选项更清晰,操作将如下定义:

<action path="/bodySwitcher" 
        type="BodySwitcherAction"
        parameter="method"
        scope="request"
        >
    <forward name="content1" path="/pathToJsp/content1.jsp"/>
    <forward name="content2" path="/pathToJsp/content2.jsp"/>
</action>

4.-要切换内容,请使用javascript或jquery进行ajax调用并将返回的jsp加载到您的身体中。这是使用.load()作为ajax调用在jQuery中切换内容的方法示例:

function switchContent(whichContent){
     $('#bodyTile').children().remove();
     $('#bodyTile').load("/pathToYourApp/bodySwitcher.do?method="+whichContent);
}

不要气馁答案的时间长短,我只是想干净利落地解释一下。这实际上很容易做到,问题是jquery / javascript与其他任何东西相关,唯一的细节是如何将struts动作用作服务。祝你好运。

答案 1 :(得分:1)

我确实喜欢Th0rndike并且像魅力一样工作。我使用弹簧并且有点不同,但是有着相同的想法。

在我的配置中,使用tile只使用视图来解决,我无法直接使用jsp文件执行新主体的前进,例如,使用path =“/ pathToJsp / content1.jsp”。

使用文件layouts.xml中tile的spring文档的默认配置,在现有模板之外添加新模板,该模板将在每次发出Ajax请求时负责包含新主体。

<definition name="bodySwitcher" template="/WEB-INF/layouts/bodySwitcher.jspx">
<put-attribute name="bodyContent" value="" />
</ Definition>

将模板文件设置为:

<div xmlns: jsp = "http://java.sun.com/JSP/Page"
xmlns: c = "http://java.sun.com/jsp/jstl/core"
xmlns: tiles = "http://tiles.apache.org/tags-tiles"
xmlns: spring = "http://www.springframework.org/tags"
xmlns: util = "urn: jsptagdir :/ WEB-INF/tags/util" id = "bodySwitcher"
version = "2.0">

<tiles:insertAttribute name="bodyContent" />

</div>

在文件views.xml中,设置加载页面新主体的每个链接的内容:

<definition name="link1" extends="bodySwitcher">
<put-attribute name="bodyContent" value="/WEB-INF/views/link1.jspx" />
</ Definition>

<definition name="aboutus" extends="bodySwitcher">
<put-attribute name="bodyContent" value="/WEB-INF/views/aboutus.jspx" />
</ Definition>

可以在主模板中进行Ajax请求:

$ (Document). ready (function () {

$ ('. PageAction'). click (function (e) {
LoadPage (e)
});

function LoadPage (e) {
e.preventDefault ();
console.log (e)
console.log (e.currentTarget.pathname);
$ ('# BodySwitcher'). children (). remove ();
$ ('# BodySwitcher'.) Load ("bodySwitcher? Method =" + e.currentTarget.pathname);
}

});

可以使用转发到bodySwitcher的参数方法中指定的视图的控制器来处理ajax请求。返回前向字符串,如“forward:”+ link1,转发到处理link1请求的控制器;