我们有一个Tiles布局页面,包含页眉,菜单,正文和页脚。在此布局中,只要用户在菜单列表中执行某些操作,整个布局(包括页眉,菜单和页脚)就会刷新。我希望标题,菜单,页脚是静态的,只有正文部分才能更新。
有没有办法阻止刷新页眉,菜单和页脚,只更新菜单上的Body内容,可以使用Tiles实现?
答案 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请求的控制器;