【发布时间】:2011-12-07 17:24:23
【问题描述】:
非常感谢有关使用 JSF 2.0、PrimeFaces 和 Ajax 的 Web 应用程序模式的指导。我们当前的系统使用带有标准提交的 JSP,我们的应用程序中的每个功能页面都有 1 个 JSP。每个 JSP 为逻辑、导航和 EJB 调用调用一个动作类。使用相同的设置迁移到 JSF 会相对简单,即 1 个 xhtml 页面和关联的支持 bean 以及通过 do 方法完成的导航/逻辑。但是我们想通过 Ajax 提交,这在我的脑海中引起了困惑。如果我加载 abc1.xhtml 并使用 ajax 提交,那么我会继续使用 abc1.xhtml,尽管我可能需要转到 abc2.xhtml。我想过在 1 个 xhtml 页面上有关联的表单,并使用渲染属性来决定要显示的内容。这行得通,但我不喜欢在 1 页中有很多表格。理想情况下,我希望将每个页面分开,但不知道 Ajax 是如何实现的。任何想法将不胜感激。
编辑 - 这是最初的解决方案,但现在我在下面的回答中进行了改进。这可行,但参数似乎存在问题。当我单击 AAA 或 BBB 链接时,我需要传递一个参数,以便 ViewController bean 知道单击了什么以及在哪里设置目标页面。但是,如果我单击 AAA.xhtml 中的提交按钮,除非我还将 <f:param name="tranID" value="AAA"/> 添加到命令按钮,否则内容不会改变。我以为我在 ViewController 构造函数中处理了一个空参数,但显然我错过了一些重要的东西。我唯一的想法是与 URL 有关。当我单击菜单链接时,它会将参数添加到 url ?tranID=AAA。如果我不将参数添加到后续提交中,这是否有效地更改了 url 并导致某种不匹配?
viewController.xhtml
<h:body>
<h:panelGroup layout="block" id="transactionControl">
<h4>
<h:outputLink id="mfa" value="#{facesContext.externalContext.requestContextPath}/xhtml/viewController.xhtml" styleClass="menuLink">
<h:outputText value="AAA"></h:outputText>
<f:param name="tranID" value="AAA"/>
</h:outputLink>
</h4>
<h4>
<h:outputLink id="inq" value="#{facesContext.externalContext.requestContextPath}/xhtml/viewController.xhtml" styleClass="menuLink">
<h:outputText value="BBB"></h:outputText>
<f:param name="tranID" value="BBB"/>
</h:outputLink>
</h4>
</h:panelGroup>
<h:panelGroup layout="block" id="content" style="border-style: solid;">
<ui:include src="#{viewController.destinationPage}.xhtml"></ui:include>
</h:panelGroup>
</h:body>
AAA.xhtml
<h:body>
<h:form prependId="false">
<h:outputText value="Click the button to go to AAB"></h:outputText>
<p>
<p:commandButton id="submitButton" value="Go" ajax="true" actionListener="#{viewController.doAAAtoAAB}"
process="@form"
update="content">
<f:param name="tranID" value="AAA"/>
</p:commandButton>
</p>
</h:form>
</h:body>
AAB.xhtml
<h:body>
<h:panelGroup layout="block" id="subContent">
<h:outputText value="This is the AAB content"></h:outputText>
</h:panelGroup>
</h:body>
BBB.xhtml 和 BBC.xhtml 同上
ViewController bean
package com.mcpplc.supportclient.webapp.managedBeans;
import javax.faces.context.FacesContext;
import java.io.Serializable;
@ManagedBean
@ViewScoped
public class ViewController implements Serializable
{
String destinationPage = "splash";
FacesContext context;
String callingTranID;
public ViewController ()
{
context = FacesContext.getCurrentInstance();
callingTranID = context.getExternalContext().getRequestParameterMap().get("tranID");
if (callingTranID != null )
{
destinationPage = callingTranID;
}
}
public void doAAAtoAAB()
{
destinationPage = "AAB";
}
public void doBBBtoBBC()
{
destinationPage = "BBC";
}
public String getDestinationPage()
{
return destinationPage;
}
public void setDestinationPage( String destinationPage )
{
this.destinationPage = destinationPage;
}
}
【问题讨论】: