我正在对 WebCenter 提供的 portlet 进行一些研究,但是在它们之间传输参数时遇到了一些问题。我的想法是创建 2 个 portlet:一个部门 portlet,我可以在其中选择一个部门 ID,它作为参数发送给第二个 portlet,员工,所以我将有一个包含来自指定部门的相应员工的表。这 2 个 portlet 是基于一些页面流构建的。部门 portlet 工作正常,但对于员工 portlet,我遇到了一些问题。
对应于员工的 JSP 页面片段有一个基于 ViewObject 的表,该表后面有一个基于绑定变量的查询。我创建了一个EmployeesBean,其中我有一个方法,它接受接收到的参数并使用这个绑定变量执行查询。这是代码:
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import oracle.adf.view.rich.context.AdfFacesContext;
import oracle.jbo.ApplicationModule;
import oracle.jbo.Row;
import oracle.jbo.ViewObject;
public class EmployeesBean {
private static final String DEPARTMENT_NUMBER_KEY = "DEPTNO";
private static final int DEPARTMENT_NUMBER_NULL_VALUE = -1;
public EmployeesBean() {
super();
}
public void getEmployees(String deptno) {
System.out.println("enters in getEmployees()");
int filterDeptno = findDepartmentValue(deptno);
FacesContext facesContext = FacesContext.getCurrentInstance();
Application app = facesContext.getApplication();
ExpressionFactory elFactory = app.getExpressionFactory();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExp =
elFactory.createValueExpression(elContext, "#{data.AppModuleDataControl.dataProvider}",
Object.class);
ApplicationModule am = (ApplicationModule)valueExp.getValue(elContext);
ViewObject emplVO;
emplVO = am.findViewObject("EmployeesVO1");
emplVO.setNamedWhereClauseParam("deptno", filterDeptno);
emplVO.executeQuery();
Row r = emplVO.first();
System.out.println(r.getAttribute("FirstName"));
}
public void setDepartmentNumber(String deptno) {
selectDepartment(deptno);
}
public void selectDepartment(String deptno) {
System.out.println("aici e problema");
AdfFacesContext afContext = AdfFacesContext.getCurrentInstance();
System.out.println(deptno);
afContext.getPageFlowScope().put(DEPARTMENT_NUMBER_KEY, deptno);
}
public int findDepartmentValue(String defaultValue) {
AdfFacesContext afContext = AdfFacesContext.getCurrentInstance();
String deptno =
(defaultValue == null ? (String)afContext.getPageFlowScope().get(DEPARTMENT_NUMBER_KEY) :
defaultValue);
return (deptno == null ? DEPARTMENT_NUMBER_NULL_VALUE :
Integer.valueOf(deptno));
}
}
我还在employees.jsff 上拖了getEmployees() 方法,所以如果我转到页面定义,我有一个绑定,它将确定每次出现事件时要执行的getEmployees 方法。如果我创建事件映射,所有这些与部门.jsff 混合在 .jspx 页面中工作
现在我正在尝试将这个任务流转换为一个 portlet。在为页面流创建 portlet 条目后,我需要创建一个导航参数,我在 employees.xml 中执行此操作:
<input-parameter-definition>
<description>Main context parameter</description>
<display-name>Department Number</display-name>
<name>deptno</name>
<value>#{pageFlowScope.contextProvider.departmentNumber}</value>
<class>java.lang.String</class>
</input-parameter-definition>
<managed-bean>
<managed-bean-name>contextProvider</managed-bean-name>
<managed-bean-class>view.EmployeesBean</managed-bean-class>
<managed-bean-scope>pageFlow</managed-bean-scope>
</managed-bean>
一切正常,但是当我尝试将其用作 WebCenter 应用程序中的 portlet 时,当我选择一个部门时,departmentId 被传输到员工 portlet 时,会调用 selectDepartment,但永远不会调用 getEmployees()(事件没有传播),所以我的表中没有返回数据。我是 Portlet 的初学者,我看不出问题出在哪里。谁能给我一些想法?