发布于:2021-01-21 10:15:11
0
128
0
在这里,我们看一下如何使用javaee升级ADF来构建一个弹出窗口系统,该系统根据用户的交互动态地做出反应。
对于那些没听说过的人来说,ADF是一种基于JSF(javaserverfaces)的javaee技术。它用新的组件、更独立的生命周期、业务模型层和许多其他改进来升级JSF的特性。我将描述如何使用动态数据创建弹出窗口,这些数据会根据用户交互进行更改。
在ADF中,建议用声明式的方式完成大部分工作,这是正确的ADF方式。在我们的示例中,我们将使用这个确切的方法,这意味着我们将以声明的方式来做所有事情。
为了说明这个方法,我们将使用一个名为Employee的定制POJO,它将保存公司中给定员工的所有信息,比如名字、姓氏、出生日期和薪水。我们的应用程序将列出所有可用的员工,我们可以在详细信息弹出窗口中看到每个员工的详细信息。
对于这个页面,我使用的是全新的taskflow,而不是基于页面片段,并且我在页面流作用域中注册了一个托管bean,名为empListBean
。这个bean将提供一个雇员集合,只用于提供数据。它可以在您的实际场景中使用来自DB或WS的对象进行更改—这取决于具体情况。例如,雇员被创建并保存在映射集合的bean中,其中键是雇员的id。
我们把员工们想象成一张桌子——这里没什么特别的:
<af:table var="emp" rowBandingInterval="0" id="t1" value="#{pageFlowScope.empListBean.employeesOnly}"> <af:column sortable="false" headerText="First Name" id="c1" align="center"> <af:outputText value="#{emp.firstName}" id="ot1"/> </af:column> <af:column sortable="false" headerText="Last Name" id="c2" align="center"> <af:outputText value="#{emp.lastName}" id="ot2"/> </af:column> <af:column sortable="false" id="c5" align="center"> <af:button text="Details" id="cb1"> <af:clientAttribute name="selectedId" value="#{emp.idCode}"/> <af:showPopupBehavior popupId=":empDetails" triggerType="click"/> </af:button> </af:column> </af:table>
这里的关键点是,在button组件中,我们添加了一个属性标记来保存当前员工的ID代码。我们使用声明性的方式通过showPopupBehavior
标记调用页面上的弹出窗口。
现在是弹出部分。这不是什么难事,这是它看起来的样子:
<af:popup id="empDetails" launcherVar="source" eventContext="launcher" contentDelivery="lazyUncached"> <af:setPropertyListener type="popupFetch" from="#{source.attributes.selectedId}" to="#{viewScope.id}"/> <af:dialog type="ok" title="Employee Details" id="d2"> <af:panelFormLayout maxColumns="1" id="pfl1"> <af:panelLabelAndMessage label="Birth date" id="plam1"> <af:outputText id="ot3" value="#{pageFlowScope.empListBean.employees[viewScope.id].birthDate}"> <f:convertDateTime pattern=""/> </af:outputText> </af:panelLabelAndMessage> <af:panelLabelAndMessage label="Salary" id="plam2"> <af:outputText id="ot4" value="#{pageFlowScope.empListBean.employees[viewScope.id].salary}"/> </af:panelLabelAndMessage> </af:panelFormLayout> </af:dialog> </af:popup>
在此,检查这两个标记及其属性非常重要:
<af:popup id="empDetails" launcherVar="source" eventContext="launcher" contentDelivery="lazyUncached"> <af:setPropertyListener type="popupFetch" from="#{source.attributes.selectedId}" to="#{viewScope.id}"/>
从弹出窗口中,我们声明调用弹出窗口以显示为source
的组件—在这里您可以指定任何适合您的名称。对于事件上下文,我们选择ADF中预定义的launcher。
然后是setPropertyListener
,它将一些值从一个地方设置到另一个地方。这里最重要的一点是,这个值是在用户实际看到数据之前设置的。我们的from place是source
组件的属性,在这里我们设置了雇员的ID,并将其设置为id
名称下的视图范围,该名称稍后可以在表达式语言中引用。我们使用id
从empListBean
bean中的地图中获取正确的员工,然后显示此人的附加信息。
为了创建这个示例项目,我使用了oraclejdeveloperstudio12c,这是开发ADF应用程序时推荐的IDE。
作者介绍