ADF中的动态弹出内容

发布于:2021-01-21 10:15:11

0

128

0

ADF java JSF java ee

在这里,我们看一下如何使用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名称下的视图范围,该名称稍后可以在表达式语言中引用。我们使用idempListBeanbean中的地图中获取正确的员工,然后显示此人的附加信息。

为了创建这个示例项目,我使用了oraclejdeveloperstudio12c,这是开发ADF应用程序时推荐的IDE。