刚接触Oracle ADF,确实是非常的不熟悉,编译器,各种组件,jsf。万事开头难,坚持。
这几天在做打印的功能,一般的方法都是写一个js方法,调用window.print()。
ADF中有自己的方法,就是在commandButton中加入af:showPrintablePageBehavior.例如:
<af:commandButton text="Print" id="cb2" >
<af:showPrintablePageBehavior/>
</af:commandButton>
这个标签的作用是弹出一新的个窗口,这个窗口的内容是<f:view></f:view>之间的所有内容,但是一些按钮 不会显示.
然后在<f:view>中的beforePhase属性上绑定一个方法。这个方法是通用的:
public void beforePhaseMethod(PhaseEvent phaseEvent) {
//only perform action if RENDER_RESPONSE phase is reached
if (phaseEvent.getPhaseId() == PhaseId.RENDER_RESPONSE){
FacesContext fctx = FacesContext.getCurrentInstance();
//check internal request parameter
Map requestMap = fctx.getExternalContext().getRequestMap();
Object showPrintableBehavior =
requestMap.get("oracle.adfinternal.view.faces.el.PrintablePage");
if(showPrintableBehavior != null){
if (Boolean.TRUE == showPrintableBehavior){
ExtendedRenderKitService erks = null;
erks = Service.getRenderKitService(
fctx,ExtendedRenderKitService.class);
//invoke JavaScript from the server
erks.addScript(fctx, "window.print();");
}
}
}
}
例如:<f:view beforePhase="#{pageFlowScope.Bean.beforePhaseMethod}",
这个方法的作用是在你弹出的窗口中自动的弹出打印的对话。
看erks.addScript(fctx, "window.print();");就明白其实是加了一个js方法,也是调用的window.print();
这样就完成了。
但是,有时候我们只要打印页面的一部分,并不需要打印<f:view></f:view>中的所有内容,我们可以利用
af:panelSplitter和af:panelAccordion。但是af:panelAccordion会改变页面布局,所以不考虑它。
我们把要打印的内容放在af:panelSplitter标签中间,当然也有包括打印的按钮。
af:panelSplitter 首先要加入的是<f:facet name="first"> name必须是first。然后再<f:facet>标签中加入
<h:panelGroup>标签,把要打印的内容放入<h:panelGroup>中就行,例如:
<af:panelSplitter styleClass="AFStretchWidth" inlineStyle="height:1400px">
<f:facet name="first">
<h:panelGroup>
这中间是打印的内容和打印的按钮,大致就是这样的了。
</h:panelGroup>
</f:facet>
</af:panelSplitter>
关于Oracle ADF中的打印问题
于 2014-07-25 17:53:21 首次发布