четверг, 17 марта 2016 г.

Полезный код для managed bean в ADF(Useful code for managed beans in ADF)

Oracle ADF имеет  определенный набор классов, которые помогают в разработке  приложений. Сегодня я хочу рассказать, что это за классы и их возможности.

BindingContext, BindingContainer DCBindingContainer

BindingContext, BindingContainer and DCBindingContainer классы. Эти классы необходимы, что получать данные из ADF pagedef объектов.

//получение BindingContext,BindingContainer   и DCBindingContainer 
BindingContext bc = BindingContext.getCurrent();
BindingContainer bcon = bc.getCurrentBindingsEntry();
DCBindingContainer dcbcon = (DCBindingContainer) bc.getCurrentBindingsEntry(); 

List<AttributeBinding> attr = bcon.getAttributeBindings();
List<OperationBinding> oper = bcon.getOperationBindings();
List<ControlBinding> ctrl = bcon.getControlBindings();
List<AttributeBinding> attrDcbcon = dcbcon.getAttributeBindings();
List<OperationBinding> operDcbcon = dcbcon.getOperationBindings();
List iterDcbcon = dcbcon.getIterBindingList(); List exec = dcbcon.getExecutableBindings(); List<ControlBinding> ctrlDcbcon = dcbcon.getControlBindings();

//получение метода,установка значений его параметров и выполнение
OperationBinding method = dcbcon .getOperationBinding("methodAction");
Map paramsMap = method.getParamsMap();
paramsMap.put("param","value") ; method.execute();
List errors = method.getErrors();

//получение аттрибута и установка нового значения
AttributeBinding attr = (AttributeBinding)dcbcon.getControlBinding("test");
attr.setInputValue("test");

//получение данных из ADF tree и table

FacesCtrlHierBinding treeData = (FacesCtrlHierBinding)dcbcon.getControlBinding("tree");
Row[] rows = treeData.getAllRowsInRange();

//получение данных из итератора
DCIteratorBinding iterBind= (DCIteratorBinding)dcbcon.get("Iterator");
String attribute = (String)iterBind.getCurrentRow().getAttribute("field");

// обновление итератора
iterBind.executeQuery();
iterBind.refresh(DCIteratorBinding.RANGESIZE_UNLIMITED);


Faces Context
FacesContext класс используется для поиска JSF компонентов, изменения локалей, получения ELContext, ExternalContext а так же для получения bean-а

// FacesContext
FacesContext facesCtx = FacesContext.getCurrentInstance();

// поиск UIComponent по id
UIComponent input = facesCtx.getViewRoot().findComponent("f1");

// смена локали
facesCtx.getViewRoot().setLocale( Locale.ENGLISH);

// создание и выполнение el выражения
Application app = facesCtx.getApplication();
ExpressionFactory expFactory = app.getExpressionFactory();
ELContext elContext = facesCtx.getELContext();
ValueExpression valueExp = expFactory.createValueExpression(elContext, "#{xxxx}", Object.class);
Object result = valueExp.getValue(elContext);

// вывод сообщения в окне
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "header", "Текст сообщения");
facesCtx.addMessage(input.getClientId(facesCtx), msg);

// получение ExternalContext
ExternalContext ectx = facesCtx.getExternalContext();


// Получение session bean, где  SessionBean название бина, а Session - название класса
ValueExpression ve = expFactory.createValueExpression(ctx.getELContext(), "#{SessionBean}", Session.class);
Session test = (Session)ve.getValue(facesCtx .getELContext());




External Context

The ExternalContext класс, получает все java init и context параметры (web.xml) , Request и Session параметры и web application url.
 
// ExternalContext
ExternalContext ectx = facesCtx.getExternalContext();

// получение параметров
Map<String, Object> initParamsVar = ectx.getInitParameterMap();
Map<String, String> requestParamsVar = ectx.getRequestParameterMap();
Map<String, Object> sessionParamsVar = ectx.getSessionMap();

// context root приложения
String contextPath = ectx.getRequestContextPath();


// перенапраление на страницу
HttpServletResponse response = (HttpServletResponse)ectx.getResponse();
String url = ectx.getRequestContextPath()+"/adfAuthentication?logout=true&end_url=/faces/<название необходимой страницы>.jspx";

try {
response.sendRedirect(url);
} catch (Exception ex) {
ex.printStackTrace();
}

Adf Faces Context

При помощи AdfFacesContext класса, вы можете частично обновлять страницу.Это называется Partial Page Rendering ( PPR), а так же работать с PageFlowScope и ViewScope переменными

// AdfFacesContext
AdfFacesContext adfFacesCtx = AdfFacesContext.getCurrentInstance();

// PPR
adfFacesCtx.addPartialTarget(input);

// получение PageFlowScope параметро
Map<String, Object> scopePageFlowScopeVar= adfFacesCtx.getPageFlowScope();

// получение viewScope параметров
Map<String, Object> scopeViewScopeVar= adfFacesCtx.getViewScope();
При помощи AdfFacesContext все скоупы памяти, а так же ELContext и SecurityContext.


// ADFContext
ADFContext adfCtx = ADFContext.getCurrent();

// получение скоупов
Map<String, Object> applicationScope = adfCtx.getApplicationScope();
Map<String, Object> pageFlowScope = adfCtx.getPageFlowScope();
Map<String, String> requestScope = adfCtx.getRequestScope();
Map<String, Object> sessionScope = adfCtx.getSessionScope();

// создание и выполнение el выражения
ELContext elContext = adfCtx.getELContext();
ExpressionFactory expFactory = adfCtx.getExpressionFactory();
ValueExpression valueExp = expFactory.createValueExpression(elContext2, "#{xxxx}",
Object.class);
Object result = valueExp.getValue(elContext);

SecurityContext

SecurityContext классс, возвращает данные по текущему пользователю и его ролям


SecurityContext secCntx = adfCtx.getSecurityContext();
String user = secCntx.getUserName();
String[] roles = secCntx.getUserRoles();
boolean isAuthenticated = secCntx.isAuthenticated()

Controller Context

ControllerContext класс используется для получения данных о контроллере и данных по исключениям. Он обеспечивает получение информации о контроллере веб приложения для каждого запроса

ControllerContext cc = ControllerContext.getInstance();

//получить текущий  View Id
ControllerContext.getInstance().getCurrentViewPort().getViewId();


//получить текущий request URL во view activity
String url = cc.getGlobalViewActivityURL(viewId)

//или

String viewId = "/department";
String url = cc.getGlobalViewActivityURL(viewId);

// перейти програмно между view acitvities
ControllerContext.getInstance().getCurrentViewPort().setViewId("Department");


// получить исключения
Exception exp = cc.getCurrentViewPort().getExceptionData();

Так же можно найти достаточно большое количество кода, облегачающего разработку на github-е у ADF разработчика Marley(www.oracle-adf.ru): https://github.com/oracle-adf/Utils