JSF中模板化页面的方法
JSF 1.1规范中未明确定义如何模板化页面。因JSF的标准VIEW技术是JSP,所以过去使用的一些技术,比如tiles仍然通用,不过要多做一些工作。另外,开源项目facelet (https://facelets.dev.java.net/)则是专门针对JSF环境下的JSP页面的模板化而开发的,理解和使用也都比较方便。这里将要展示的则是另外一个方法,只适合于ADF Faces组件:将page或panelPage页面对象与后台进行绑定,在后台设置page的内容。
将page/panelPage与后台对象绑定
如下代码来自于SRMain.jspx
…
<af:document title="#{res['srdemo.browserTitle']}">
<af:form>
<af:page title="#{res['srmain.pageTitle']} {userState.currentSvrId}"
binding="#{pageTemplateBean.pageTemplate}">
…
这里把page与后台pageTemplateBean的pageTemplate进行绑定。pageTemplateBean的代码如下:
import javax.faces.application.Application;
import javax.faces.component.UIParameter;
import javax.faces.component.html.HtmlOutputFormat;
import javax.faces.context.FacesContext;
<o:p> </o:p>
import javax.faces.el.MethodBinding;
<o:p> </o:p>
import javax.faces.event.ActionEvent;
<o:p> </o:p>
import oracle.adf.view.faces.component.core.nav.CoreCommandLink;
import oracle.adf.view.faces.component.core.nav.CoreCommandMenuItem;
import oracle.adf.view.faces.component.core.nav.CorePage;
import oracle.adf.view.faces.component.core.output.CoreMessages;
import oracle.adf.view.faces.component.core.output.CoreObjectImage;
import oracle.adf.view.faces.component.core.output.CoreOutputFormatted;
import oracle.adf.view.faces.component.core.output.CoreOutputText;
<o:p> </o:p>
import oracle.srdemo.view.util.JSFUtils;
<o:p> </o:p>
<o:p> </o:p>
public class PageTemplateBean {
<o:p> </o:p>
private CorePage pageTemplate;
<o:p> </o:p>
public PageTemplateBean() {
createPageTemplate();<o:p></o:p>
}
<o:p> </o:p>
public void setPageTemplate(CorePage pageTemplate) {
this.pageTemplate = pageTemplate;
}
<o:p> </o:p>
public CorePage getPageTemplate() {
return pageTemplate;
}
<o:p> </o:p>
private void createPageTemplate() {
<o:p> </o:p>
FacesContext facesContext = FacesContext.getCurrentInstance();
Application application = facesContext.getApplication();
<o:p> </o:p>
this.pageTemplate = new CorePage();
<o:p> </o:p>
pageTemplate.setValueBinding("value",
application.createValueBinding("#{appMenu.model}"));
pageTemplate.setVar("menuItem");
<o:p> </o:p>
CoreObjectImage branding = new CoreObjectImage();
branding.setSource("/images/SRBranding.gif");
pageTemplate.setBranding(branding);
<o:p> </o:p>
CoreObjectImage brandingApp = new CoreObjectImage();
brandingApp.setSource("/images/SRBranding.gif");
pageTemplate.setBrandingApp(brandingApp);
<o:p> </o:p>
pageTemplate.setMessages(new CoreMessages());
<o:p> </o:p>
CoreOutputText appCopyright = new CoreOutputText();
appCopyright.setValueBinding("value",
application.createValueBinding("#{res['srdemo.copyright']}"));
pageTemplate.setAppCopyright(appCopyright);
<o:p> </o:p>
<o:p> </o:p>
CoreOutputText appAbout = new CoreOutputText();
appAbout.setValue("About");
pageTemplate.setAppAbout(appAbout);
…<o:p></o:p>
CoreCommandMenuItem nodeStamp = new CoreCommandMenuItem();
<o:p> </o:p>
nodeStamp.setValueBinding("text",
application.createValueBinding("#{menuItem.label}"));
nodeStamp.setValueBinding("type",
application.createValueBinding("#{menuItem.type}"));
MethodBinding mb = application.createMethodBinding("#{menuItem.getOutcome}", null);
nodeStamp.setAction(mb);
nodeStamp.setValueBinding("icon",
application.createValueBinding("#{menuItem.icon}"));
<o:p> </o:p>
pageTemplate.setNodeStamp(nodeStamp);
}
}
<o:p> </o:p>
在pageTemplateBean类的createPageTemplate方法中,用代码控制的方法逐一建立诸如appCopyright、infoUser等标准page所具有的facet。