博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
adf常用方法总结
阅读量:5979 次
发布时间:2019-06-20

本文共 41239 字,大约阅读时间需要 137 分钟。

1.使用clientAttribute传值、获取值 或组件上面放客户端属性 

public void onSelect(ValueChangeEvent valueChangeEvent) { Number id = (Number)valueChangeEvent.getComponent().getAttributes().get("employeeId"); ... }

  

注意:客户端属性名不能与其父组件的属性名重复,否则会得到第一个属性名的值,这里的employeeId必须是和selectBooleanCheckbox的属性名不同。

又例: 

//bean中获取属性值 String num =String.valueOf(eprebateBackBtn.getAttributes().get("status"));

 

2.为id设置seqence值

(new oracle.jbo.server.SequenceImpl("employees_seq",object.getDBTransaction())).getSequenceNumber()

  

在eo中设置目标属性 勾选表达式 然后编辑值。

3.根据table创建行 并赋值
1

CollectionModel _tableModel = (CollectionModel)table.getValue(); JUCtrlHierBinding _adfTableBinding =(JUCtrlHierBinding)_tableModel.getWrappedData(); DCIteratorBinding it = _adfTableBinding.getDCIteratorBinding();oracle.jbo.Row row_adf = null; row_adf = it.getNavigatableRowIterator().createRow(); row_adf.setNewRowState(oracle.jbo.Row.STATUS_INITIALIZED); it.getNavigatableRowIterator().insertRow(row_adf); row_adf.setAttribute("DepartmentId",row_poi.getCell(0).getNumericCellValue());

  

2

CollectionModel _tableModel = (CollectionModel)eprebateTable.getValue(); JUCtrlHierBinding _adfTableBinding = (JUCtrlHierBinding)_tableModel.getWrappedData(); DCIteratorBinding it = _adfTableBinding.getDCIteratorBinding(); NavigatableRowIterator iterator = it.getNavigatableRowIterator(); Row row=iterator.createRow(); row.setNewRowState(oracle.jbo.Row.STATUS_NEW); row.setAttribute("Num", 4); iterator.insertRow(row);

  

3

import oracle.binding.BindingContainer; import oracle.binding.OperationBinding;BindingContainer bindings = getBindings(); OperationBinding operationBinding = bindings.getOperationBinding("CreateInsert1"); operationBinding.execute(); CollectionModel _tableModel = (CollectionModel)eprebateTable.getValue(); JUCtrlHierBinding _adfTableBinding = (JUCtrlHierBinding)_tableModel.getWrappedData(); DCIteratorBinding it = _adfTableBinding.getDCIteratorBinding(); NavigatableRowIterator iterator = it.getNavigatableRowIterator(); Row currentRow = iterator.getCurrentRow(); currentRow.setAttribute("Num", iterator.getRowCount());

  

注意:以上三种方式需要在页面中对table进行绑定,第三种还要做操作绑定。

4.得到页面table的迭代器

private NavigatableRowIterator getTableIter(RichTable table) {        CollectionModel _tableModel = (CollectionModel) table.getValue();        JUCtrlHierBinding _adfTableBinding = (JUCtrlHierBinding) _tableModel.getWrappedData();        DCIteratorBinding it = _adfTableBinding.getDCIteratorBinding();        return it.getNavigatableRowIterator();    }

  

NavigatableRowIterator iterator = getTableIter(vflistTable);         Row currentRow = iterator.getCurrentRow();         currentRow.setAttribute("Status", 0);         currentRow.setAttribute("Isback", "1");         am.getTransaction().commit();

  

 

5.格式化时间

import java.util.Date;         import java.text.SimpleDateFormat;        SimpleDateFormat sdf = new SimpleDateFormat();         sdf.applyPattern("yyyyMMdd");         //以上两句可写成        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");         Date date = new Date();         String second = sdf.format(date);         //如果还要时分秒: HH:mm:ss         //注意:如果是时间类是oracle.jbo.domain.Date用         sdf.format(currDate.dateValue())

 

6.必填 必选

<af:outputLabel value="*" inlineStyle="color:Red;"/>

showRequired="true" 显示蓝色星号 不填没有错误信息 加上

autocommit=true 不填有错误信息
required="true" 显示蓝色星号 不填有错误信息
requiredMessageDetail="没钱不干活啊" 显示错误信息

 

7.下面的程序使用param隐含对象来取得使用者输入的参数以及一些

jsf基础知识: 

                                                
您好,

 

param是JSF-EL预设的隐含对象变量它代表request所有参数的集合,实际是一个java.util.Map型态对象,JSF所提供的隐含对象,大致上对应于JSP隐含物件不过JSF隐含

对象移除了pageScope与 pageContext,而增加了facesContext与view它们分别对应于javax.faces.context.FacesContext与 javax.faces.component.UIViewRoot。

对于Map型态对象,我们可以使用 '.' 运算子指定key值来取出对应的value也可以使用 [ ] 来指定,例如:

您好,

在 [ ] 之间也可以放置其它的变量值,例如:

1  
2
3

如果变量是List型态或数组的话,则可以在 [] 中指定索引,例如:

1         
2
3
4
5

您也可以指定字面常数,对于true、false、字符串、数字,JSF EL会尝试进行转换,例如:

如果要输出字符串 必须以单引号 ' 或双自变量 " 括住,如此才不会被认为是变量名称。

在宣告变量名称时 要留意不可与JSF的保留字或关键词同名,例如 :

不可取以下这些名称

true false null div mod and or not eq ne lt gt le ge instanceof empty

2

 

3

1  2      3         验证器示范 4      5      6         
7
8
9

请输入您的名称

10
11

12 名称: 13

14

15 密码: 16

17
18
19

20

21

22

23

24
25
26 27

 

在<h:inputText>、</h:inputSecret>中我们设定了required属性为 true这表示这个字段一定要输入值我们也在</h:inputSecret>设定了<f: validateLength>,并设定其minimum属性为6,

这表示这个字 段最少需要6个字符。这一次在错误讯息的显示上 我们使用<h:messages>标签,当有验证错误发生时 相关的错误讯息会收集起来 使用<h:messages>卷标可以一次将所有的错误讯息显示出来。

4

5

outputFormat
产生指定的文字讯息 可以搭配<f:param>来设定讯息的参数以格式化文字讯, 例如

 

如果您的messages.properties包括以下的内容

welcomeText={0}, Your name is {1}. 则{0}与{1}会被取代为<f:param>设定的文字 最后显示的文字会是

Hello, Your name is Guest.

另一个使用的方法则是

 

6
inputSecret
显示密码输入字段 即输出<input> HTML卷标 其type属性设定为
password 例如

<h:inputSecret value="#{user.password}"/>

您可以设定redisplay属性以决定是否要显示密码字段的值 预设是
false。

inputHidden

隐藏字段 即输出<input> HTML卷标 其type属性设定为hidden
隐藏字段的值用于保留一些讯息于客户端 以在下一次发送窗体时一并
送出 例如
<h:inputHidden value="#{user.hiddenInfo}"/>

7
如果搭配<f:param>来使用则所设定的参数会被当作请求参数一并送出,例如

 

8.从数据库中拿数据
vo.setWhereCluse()
executeQuery
AdfFacesContext.getCurrentInstance.addPerttrigger(table)

9.ADF的scope获取方式 

ADFContext.getCurrent().getApplicationScope();         ADFContext.getCurrent().getSessionScope();         AdfFacesContext.getCurrentInstance().getPageFlowScope();        ADFContext.getCurrent().getRequestScope();         ADFContext.getCurrent().getViewScope();        Map
applicationScope = ADFContext.getCurrent().getApplicationScope(); Map sessionScope = ADFContext.getCurrent().getSessionScope(); Map
flowScope = AdfFacesContext.getCurrentInstance().getPageFlowScope(); Map
map = AdfFacesContext.getCurrentInstance().getViewScope(); Map requestScope = ADFContext.getCurrent().getRequestScope(); Map
scope = ADFContext.getCurrent().getViewScope(); }

 

10.JSF布局排版两个组件,<h:panelGrid>、<h:panelGroup>
<h:panelGrid> 这个卷标可以用来作简单的组件排版,它会使用HTML表格卷标来绘制表格,并将组件置于其中,主要指定columns属性,如设定为 2

 

则自动将组件分作 2 个 column来排列,注意 <h:panelGrid>的本体间只能包括JSF组件,如果想要放入非JSF组件,例如简单的样版,emplate,文字,则要使 <f:verbatim>包括住,例如 

Username
Password

 

 

这个组件用来将数个JSF组件包装起来使其看来像是一个组件例

如

 

11.为table中的字段添加排序、过滤
<af:column
headerText="#{bindings.CdsExportEprebateView2.hints.Vfno.label}"
id="c1" filterable="true" sortable="true" sortProperty="Vfno">
<af:outputText value="#{row.Vfno}"
id="ot2"/>
</af:column>
只读的字段生成之后不能排序不能过滤这时候需要加上几个属性
filterable="true" sortable="true" sortProperty="Vfno"
--------------------------------------------------------------------
12.在vo上增加条件查询并应用条件查询
条件查询名字filterByDept
条件查询条件( (Employees.DEPARTMENT_ID = :deptId ) )
应用条件查询
public void applyEmplyeeCriteria(Integer deptId){
ViewObjectImpl employees =
(ViewObjectImpl)findViewObject("Employees");
employees.setApplyViewCriteriaNames(null);
ViewCriteria criteria =
employees.getViewCriteria("filterByDept");
employees.applyViewCriteria(criteria);
employees.ensureVariableManager().setVariableValue("deptId",
deptId);
employees.executeQuery();
} -------------------------------------------------------------------
13.弹出消息框
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

public static void popupMessage(String level,String detail){

FacesMessage fm = new FacesMessage(null,detail);//默认级别
为info
if("info".equals(level))
fm.setSeverity(fm.SEVERITY_INFO);
else if("warn".equals(level))
fm.setSeverity(fm.SEVERITY_WARN);
else if("error".equals(level))
fm.setSeverity(fm.SEVERITY_ERROR);
else if("fatal".equals(fm.SEVERITY_FATAL))
fm.setSeverity(fm.SEVERITY_FATAL);
FacesContext.getCurrentInstance().addMessage(null, fm);
}
-------------------------------------------------------------
14.行拷贝 代码中进行row copy
//将one里的某些字段值copy给currentRow
private void setApplyAttribute(Row currentRow,Row one,String...columns){
//不要空指针
if(currentRow==null || one==null || columns.length==0)
return;
//循环赋值
for(String s:columns)
if(one.getAttribute(s)!=null)
currentRow.setAttribute(s, one.getAttribute(s));
}
----------------------------------------------------------
15.页面三目表达式判断形式
#{(row.Datastate eq '0') ? '正常':((row.Datastate eq '1') ? '暂存':'删除')}

inlineStyle="background-color:#{(row.Canmerge == '1')? ((row.Ismother == '0')? 'yellow' : ''):''};"readOnly="#{bindings.Marginal!=null}" 

---------------------------------------------------------

16.安全验证重定向到另一个URL

ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
HttpServletResponse response = (HttpServletResponse)ectx.getResponse();
String url = ectx.getRequestContextPath()+”/adfAuthentication?logout=true&am p;end_url=/faces/start.jspx”;
try {
response.sendRedirect(url);
} catch (Exception ex) {
ex.printStackTrace();
}
---------------------------------------------------------
17.刷新控件PPR
AdfFacesContext.getCurrentInstance().addPartialTarget(UIComponent);
---------------------------------------------------------
18.查找控件
private UIComponent getUIComponent(String name) {
FacesContext facesCtx = FacesContext.getCurrentInstance();
return facesCtx.getViewRoot().findComponent(name) ;
}
---------------------------------------------------------

19.获取table选中的行(不一定是当前行)

RowKeySet selection = resultTable.getSelectedRowKeys();
Object[] keys = selection.toArray();
List receivers = new ArrayList(keys.length);
for ( Object key : keys ) {
User user = modelFriends.get((Integer)key);
}
// 获取table选中的行的另一种
for (Object facesRowKey : table.getSelectedRowKeys()) {
table.setRowKey(facesRowKey);
Object o = table.getRowData();
JUCtrlHierNodeBinding rowData = (JUCtrlHierNodeBinding)o;
Row row = rowData.getRow();
Test testRow = (Test)((DCDataRow)row).getDataProvider() ;
}
------------------------------------------------------------------
20.在eo实现类中 这个好搞个方法验证
public boolean validateLength(Number length) {
if(length!=null && String.valueOf(length).contains("."))
return false;
return true;
} ------------------------------------------------------------------
21.应用条件查询并设置参数值
public void applyJobCriteria(String title){
ViewObjectImpl employees =
(ViewObjectImpl)this.getJobsView1();
employees.setApplyViewCriteriaNames(null);
ViewCriteria criteria =
employees.getViewCriteria("JobsViewCriteria");
employees.applyViewCriteria(criteria);
employees.ensureVariableManager().setVariableValue("titleVar",
title);
employees.executeQuery();
employees.setApplyViewCriteriaNames(null);
}
---------------------------------------------------------------
22.开发人员可以通过继承javax.faces.event包中PhaseListener接口实
现阶段listener这个接口定义了3个方法

PhaseId getPhaseId()

void afterPhase(PhaseEvent)
void beforePhase(PhaseEvent)

getPhaseId方法返回何时提交阶段事件到listener在不指定阶段的情

况下阶段listener的beforePhase和afterPhase方法将在每个生命周
期中调用6次即每个生命周期阶段调用一次。
但是上面这样不指定生命周期阶段的用法通常情况下是不合理的如果
不指定阶段则意味着所有阶段都会执行代码在实际的应用中不太可能
需要这样

而如果你的逻辑处理需要花费很长时间的话由于错误的使用可能导致

页面显示的严重性能问题因此在往beforePhase和afterPhase方法中
添加业务逻辑时

需要明确根据阶段来执行明确指定在哪个阶段执行代码

public class CustomPhase implements PhaseListener {

public void beforePhase(PhaseEvent e) {

if(e.getPhaseId == PhaseId.INVOKE_APPLICATION) {
System.out.println("BEFORE " + e.getPhaseId());
}
}
public void afterPhase(PhaseEvent e) {
if(e.getPhaseId == PhaseId.INVOKE_APPLICATION) {
System.out.println("AFTER " + e.getPhaseId());
}
}
}
------------------------
23.页面定义js的两种方法
<af:document>
<af:resource type="javascript" source="/customJsCode.js"/>
</af:document>

<af:document>

<af:resource type="javascript">
function customJsFunction(){ … }
</af:resource>
</af:document>
--------------------------
24.页面传参 js调用 <af:clientAttribute name="rowKey"
value="#{row.rowKeyStr}"/>
<af:clientListener method="handleDepartmentClick"
type="click"/>

<af:document>

<af:messages/>
<f:facet name="metaContainer">
<af:group>
<script>
function handleDepartmentClick(evt){
rowKey = evt.getSource().getProperty("rowKey");
alert(rowKey);
}
</script>
</af:group>
</f:facet>
...
</af:document>
-----------------------------
25.正则表达式验证
<af:validateRegExp pattern="[^.]*" hint="提示" messageDetailNoMatch="必须输入整数"/>

----------------------------

26.
安全退出 注销
FacesContext fctx = FacesContext.getCurrentInstance();
ExternalContext ectx = fctx.getExternalContext();
String url = ectx.getRequestContextPath() +
"/adfAuthentication?logout=true&end_url=/faces/Home.jsp
x";
try {
ectx.redirect(url);
} catch (IOException e) {
e.printStackTrace();
}
fctx.responseComplete();
return null;
-----------------------------------------------
27.ADF中怎样获取访问web.xml中的参数值
web.xml中的参数值可以提供给应用一些特殊的配置信息
How-to read context parameters in web.xml from ADF?
Context parameters in web.xml can be used to provide application specific configurations to ADF. To
access context parameters in ADF, you use the FacesContext static
context class as shown below

FacesContext fctx = FacesContext.getCurrentInstance();

ExternalContext ectx = fctx.getExternalContext();
ServletContext servletContext = (ServletContext) ectx.getContext();
String myContextParam =
(String)servletContext.getInitParameter("mycontextparam");

-------------------------------------------------

28.this.getDBTransaction().postChanges()
//也让它从缓存中查询满足条件的记录 但是这个会有一些操作上的隐
-------------------------------------------------
29.Row 、Number 的api位置
import oracle.jbo.Row;
import oracle.jbo.domain.Number;
-------------------------------------
30.创建一条有外键link的记录 需要先拿到主表的row然后create

//创建一条对应的eta记录 ViewRowSetImpl vrsi=(ViewRowSetImpl)row.getAttribute("CdsExportEtaView"); Row etaRow = vrsi.createRow(); vrsi.insertRow(etaRow); am.getDBTransaction().commit();

  

---------------------------------
31.从请求中获取url信息
request.getHeader("Host")--->127.0.0.1:7101
request.getContextPath()--->/cds
request.getServletPath()--->/faces
------------------------------
32.写入文件

InputStream inputStream=new FileInputStream(file); InputStreamReader isr=new InputStreamReader(inputStream,"UTF-8"); BufferedReader br=new BufferedReader(isr); String str; while((str=br.readLine())!=null) out.write(str.getBytes("UTF-8"));

33.得到某个迭代器的当前行的某个属性值

private Object getCurrExportid(){    DCBindingContainer dcBindings = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();    DCIteratorBinding iterBind= (DCIteratorBinding)dcBindings.get("CDS_Export_APPLY_ETA1Iterator");    return iterBind.getCurrentRow().getAttribute("Exportid"); }

  

-------------------------------------
34.得到用户名 安全 

String user = ADFContext.getCurrent().getSecurityContext().getUserName();

  

 

How-to access the username from ADF BC?

To access the username of an authenticated web session in ADF
Business Components, use the security
context as shown below 

ADFContext adfctx = ADFContext.getCurrent(); String user = adfctx.getSecurityContext().getUserPrincipal().getName();

  

The security context is also accessible from Groovy in ADF Business Components, for example to define

a bind variable used in a View Criteria that queries View Object data in
the context of the authenticated user 

adf.context.securityContext.userName

The SecurityContext is not available in Oracle JDeveloper releases

before 11g. In older releases, the
authenticated username is accessible from a call to
getUserPrincipalName() on the Application Module
Impl class. This "old" API is still supported but discouraged in favor of
the SecurityContext accessed
from the ADF context.
------------------------------
35.outputLabel和outputText两者有何不同
outputLabel 文字有颜色,重在label作用
outputText 文字一般,不重在label作用
<af:outputLabel value="税名称" id="ol4"/>
<af:outputText value="#{bindings.Tariffcds.inputValue}" id="ot84"/>

36.vo 增加临时属性

因战斗需要 在vo中新增临时属性ligangcolor 设置:
type:String
value type:expression
value
关键是value的取值 有两种来源 一种是其他字段的处理值 还有一 种就是自定义值。
自定义值支持Java语言 貌似是groovy语言吧 不确定 以下两种设
值方式是都是正确的
1 "blue"
2 new String("blue")
这种设置初始值的方式 发现有一个缺点就是页面第一次加载会卡。
---------------------------------------------------
37.对于一些基本的CUD操作 可以弄个公共方法:
import oracle.adf.model.BindingContext;
import oracle.binding.BindingContainer;
import oracle.binding.OperationBinding;
/*
*opr操作如delete、commit等
*return操作成功返回true否则返回false
*/
private boolean opr_action(String opr){ BindingContainer bindings =
BindingContext.getCurrent().getCurrentBindingsEntry();;
OperationBinding opr = bindings.getOperationBinding(opr);
opr.execute();
if(!delete.getErrors().isEmpty()){
System.out.println("删除失败");
return false;
}else
return true;
}
--------------------------------------
38.在Managed Bean中给ADF RichTable排序 .
1Backing Bean中设置排序方法
public void sortMethod(SortEvent event){
DCIteratorBinding iter = ADFUtils.findIterator("xxxxVOIterator");
String propery = event.getSortCriteria().get(0).getProperty();
String isAsending = event.getSortCriteria().get(0).isAscending()
== true ? "asc" : "desc";
//在内存中排序
ViewObject vo = iter.getViewObject();
vo.setSortBy(propery + " " + isAsending);
vo.setQueryMode(ViewObject.QUERY_MODE_SCAN_VIEW_ROWS); vo.executeQuery();
vo.setSortBy(null); //去除排序基准
SortCriteria[] sc = new SortCriteria[0];
iter.applySortCriteria(sc);
}

2在RichTable中添加sort listener事件

<af:table .....
sortListener="#{backing_xxx.sortMethod}"

提示 如果是table中字段的默认升降序排序 可以在dataBingding中

设置各个字段的排序方式。
----------------------------------
39.js运行.exe
function RunExe()
{
var commandtoRun = "C:\\file.exe";
var objShell = new
<strong>ActiveXObject</strong>("Shell.Application");
objShell.<strong>ShellExecute</strong>(commandtoRun, "", "",
"open", 1);
}
--------------------------------
40.弹出消息框
private void popupMessage(String summary,String detail){
FacesMessage fm = new FacesMessage();
fm.setSeverity(fm.SEVERITY_WARN);
fm.setSummary(summary);
fm.setDetail(detail);
FacesContext.getCurrentInstance().addMessage(null, fm);
}
注意以上是弹出消息框的完整代码已经被收入JSFUtils工具类中
所以你可以简单使用以下
JSFUtils.addFacesInformationMessage("这是一个一般信息提示框。");
JSFUtils.addFacesErrorMessage("这是一个错误信息提示框。");
--------------------------------
41.交通灯示例代码
<af:column sortProperty="Exc"
filterable="true"
sortable="true"
headerText="#{bindings.CdsImportView
View1.hints.Exc.label}"
id="c1"> <dvt:gauge gaugeType="LED"
ledStyle="LS_DOT"
imageHeight="24"
imageWidth="24"
rendered="true"
textAntialiasing="false"
visualEffects="NONE"
gaugeSetDirection="GSD_DOWN"
thresholdDialStyle="TDS_RING_FILL
"
animationOnDataChange="none"
animationIndicators="NONE"
renderImagemap="false"
flashDefaultFontLoading="FLASH_DE
FAULT_FONT_LOADING_NONE"
partialSubmit="false"
imageFormat="PNG_STAMPED"
inlineStyle="height:30px;"
value="#{row.Exc}"
svgFontEmbedding="SVG_FONT_EM
BEDDING_NONE"
graphicAntialiasing="false" specularHighlight="SH_OFF"
id="g2">
<dvt:topLabel position="LP_NONE"/>
<dvt:thresholdSet>
<dvt:threshold text="Low"
thresholdMaxValue="1"
fillColor="#ff0000"/>
<dvt:threshold text="Medium"
thresholdMaxValue="2"
fillColor="#00ff00"/>
<dvt:threshold text="High"
fillColor="#00ff00"/>
</dvt:thresholdSet>
</dvt:gauge>
</af:column>
---------------------------------------------------
42.可以把批处理、复选框批量选中代码抽象出来 示例代码如下
1页面代码
<af:column id="c470" headerText="选择校验"
align="center" width="50">
<af:selectBooleanCheckbox text="" label=""
id="sbc1" autoSubmit="true" valueChangeListener="#{impCos
tBean.selectHandler}">
<af:clientAttribute name="costId" value="#{row.Id}"/>
</af:selectBooleanCheckbox>
</af:column>
2impCostBean中
//得到保存选中的list
public List<Number> getSelectList(){
Map viewScope = ADFContext.getCurrent().getViewScope();
Object obj = viewScope.get("isSureSelectList");
if(obj==null){
obj=new ArrayList<Number>();
viewScope.put("isSureSelectList", obj);
}
return (List<Number>)obj;
}
//选中、退选处理
public void selectHandler(ValueChangeEvent valueChangeEvent) {
// Add event code here...
System.out.println("old
value:"+valueChangeEvent.getOldValue());
System.out.println("new value:"+valueChangeEvent.getNewValue());
Boolean old = (Boolean)valueChangeEvent.getOldValue();
Boolean newValue =
(Boolean)valueChangeEvent.getNewValue();
//排除这一情况null-->false
if (old == null && newValue.booleanValue() == false)
return;
Number id
=(Number)valueChangeEvent.getComponent().getAttributes().get("c
ostId");
if (!newValue.booleanValue()) {
if (getSelectList().contains(id)) {
System.out.println("放弃选择:"+id);
getSelectList().remove(id);
}
} else {
System.out.println("选择:"+id);
getSelectList().add(id);
}
System.out.println("当前选择个数"+getSelectList().size());
}
}
以上不同页面之间可以共用啊
以下是业务处理示例
处理1
//更新选择的费用记录的确定标志
public String sureHandler_action() {
List<Number> costIdList = getSelectList();
//1 检查如果用户什么都没选
if(costIdList==null || costIdList.size()==0)
return null;
//2 检查通过迭代处理
for(Number costId:getSelectList()){
...
}
//3 提交保存
BindingContainer bindings = getBindings();
OperationBinding operationBinding =
bindings.getOperationBinding("Commit");
operationBinding.execute();
return null;
}
处理2 //cost 迭代更新cost的确定标志位
public void updateSureFlag(String voName,List<Number>
costIdList){
//先检查参数
if(voName==null || "".equals(voName) || costIdList==null ||
costIdList.size()==0)
return;
//迭代更新
ViewObjectImpl vo =
(ViewObjectImpl)findViewObject(voName);
for(Number costId:costIdList){
Row[] byKey = vo.findByKey(new Key(new Object[]
{ costId }), 1);
if (byKey != null && byKey.length>0){
Row row=byKey[0];
row.setAttribute("Issure", '1');
}
}
this.getDBTransaction().commit();
}
------------------------------------------------------------
43.根据条件变颜色、底色三目表达式的运用 inlineStyle="background-color:#{(row.Canmerge == '1')?
((row.Ismother == '0')? 'yellow' : ''):''};"
-----------------------------------------------------------
44.自定义窗体弹出的两种方式
popup
1页面使用showPopupBehavior
<af:outputText value="outputText2" id="ot1">
<af:showPopupBehavior triggerType="mouseOver"
popupId="p2s"
align="afterStart"/>
</af:outputText>
<af:popup id="p2s">
<af:noteWindow id="wnw21" >
<f:verbatim>maoinmimewoovowvwvvowvm
sftrgregf</f:verbatim>
</af:noteWindow>
</af:popup>
2代码 需要绑定popup到bean中
RichPopup onPopup = this.getOnPopup();
RichPopup.PopupHints hints = new RichPopup.PopupHints();
onPopup.show(hints);
------------------------------------------------------- 45.根据主键找记录
ViewObject vo= this.getCdsUserView1();
Row[] byKey = vo.findByKey(new Key(new Object[]
{ costId }), 1);
if (byKey != null && byKey.length>0){
Row row=byKey[0];
for(String key:attrNames.keySet())
System.out.println(key+":"+row.getAttribute(key));
}
--------------------------------------------------------
46.组件相关
(1)通过组件上的事件获取组件
FacesContext context = FacesContext.getCurrentInstance();
FacesMessage messagge = new FacesMessage("Successfully
uploaded file"+file.getFilename()+"("+file.getLength()+"bytes)");
context.addMessage(event.getComponent().getClientId(context),mes
sage);
(2)获取根组件
public static void addFacesErrorMessage(String attrName, String
msg){
FacesContext ctx = FacesContext.getCurrentInstance();
FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, attrName, msg);
ctx.addMessage(JSFUtils.getRootViewComponentId(), fm);
}
(3)通过根组件+组件ID查找组件
pubic static void addFacesErrorMessage(String attrName, String
msg){
FacesContext ctx = FacesContext.getCurrentInstance();
FacesMessage fm = new
FacesMessage(FacesMessage.SEVERITY_ERROR, attrName, msg);
ctx.addMessage(JSFUtils.getRootViewComponentId().findCompone
nt("productpriceIT").getClientId(ctx), fm);
}
------------------------------------------------------
47.LOV页面使用
1拖放view至页面 选择生成ADF Form 发现JobId的显示组件
自动设置为ADF List of Values Input。如果选中Query List Automatically
弹出查询页面时 会直接显示所有结果。
JobId为一个文本输入框 旁边有一个查询按钮 点击后可以查询 选
择一条记录 会返回到文本输入框。注意 无论查询显示的是哪些字段
返回的都是 JobId。
2设置inputListOfValues组件的autoSubmit="true"。除了(3)的运
行效果之外 . 当输入AD_ 按下Tab键 会弹出所有以AD_开头的JobId选项。
. 当输入AD_V 按下Tab键 会直接补全为AD_VP 因为只有一个值
满足条件。
3为inputListOfValues组件增加autoSuggestBehavior 如
<af:autoSuggestBehavior
suggestedItems="#{bindings.JobId.suggestedItems}"/>此时 除了(4)
的运 行效果之外 会新增一种效果 随着用户的输入 会自动下拉
显示匹配的结果。经过测试 中文也可以支持自动匹配。
-----------------------------------------------------
48.添加表格的excel导出和打印功能
<f:facet name="menus">
<af:menu text="报表制作">
<af:commandMenuItem text="导出EXCEL">
<af:exportCollectionActionListener type="excelHTML"
exportedId="t1"/>
</af:commandMenuItem>
<af:commandMenuItem text="打印">
<af:showPrintablePageBehavior/>
</af:commandMenuItem>
</af:menu>
</f:facet>
----------------------------------------------------- 49.下拉列表的情况
Consignee==》null value
Consignee1==》0 索引
Transportation==》出口海运 value
Transportation1==》13 索引
Portofloading==》SHANGHAI value
Portofloading1==》114 索引
Pickupaddress==》5662 value
Pickupaddress1==》2 索引
货代公司Forward==> Schenker value
货代公司Forward1==> 4 索引

使用值变事件得到下拉列表的值时发现不能使用

ADFUtils.getBoundAttribute("");这个只能获取值变前的值。
---------------------------------------------------
50.bean中得到当前行的高级使用
效果 点击某个按钮后传入选中行的整个对象
方法 为该按钮添加setActionListener其from值绑定到Table对应
iterator的currentRowto值绑定到页面对应MB中ViewRowImpl类型
的变量rowObject(该变量就是用来接收传进来的行对象的)。实例
<af:setActionListener from="#{bindings.tableIterator.currentRow}"
to="#{MB.rowObject}">,然后在rowObject的set方法中就可以设置行中字段值了。
--------------------------------------------------------
51.类oracle.jbo.server.ApplicationModuleImpl的一些方法
1executeCommand
public int executeCommand(java.lang.String command)
用于在服务器端执行特别的sql语句。返回值说明执行这条sql影响的
行数。该方法适用于测试和调试应用。
Specifies a valid SQL statement to be executed by the server. The
return integer value describes how many rows were affected by the
SQL statement. This is a utility method for testing and debugging
queries and applications.
The following code example uses executeCommand. The SQL string is
designed to update the EMP table. This example passes the string to
executeCommand, then prints a message to report how many rows
were actually updated.

public static void demoUpdateColumn(ApplicationModule appMod) {

String sqlStr = "UPDATE EMP " +
"SET MGR=7007 " +
"WHERE MGR=7698 ";

int n = appMod.getTransaction().executeCommand(sqlStr); System.out.println("Updated " + n + " rows.");

}

注意 这方法会执行任何可用的sql 比如说删除数据库中的一张表。

比较危险 慎用。
Be careful when using executeCommand, because it will execute any
valid SQL statement. For example, you could perform an operation like
the following DDL command:

appMod.getTransaction().executeCommand("DROP TABLE

MYTEMPTABLE");

A pending database transaction could be committed inadvertently due

to the implicit commit performed by DDL operations, as well as having
any row locks released.

Parameters:
command - a valid SQL statement.

--------------------------------------------------------------------------------

2getDBTransaction public DBTransaction getDBTransaction()
得到当前这个am的事务不同am的事务不共享。
Gets this Application Module's database transaction. Note that if this
method is invoked on a nested Application Module, the root
Application Module's transaction is returned. This is because the
transaction is shared by all Application Modules contained by the root
Application Module.
If the user creates two root Application Modules, they normally do not
share the transaction. To share a transaction acroos root Application
Modules, the user would need to define a global transaction through
JTA and have both Application Modules participate in it.

Returns:

the transaction.
Throws:
java.lang.IllegalStateException - if no root Application Module is found.
This could happen if the user calls this method on an Application
Module that has

--------------------------------------------------------------------------------

52.实体中的属性之历史属性和可更新的和刷新
1.History Column
Select this checkbox to log changes to the database. You can only log
changes if: You have implemented authorization (login) using
JAAS/JAZN. The selected attribute is persistent. Changes will be
logged in the corresponding database column. You have not selected
Primary Key, Mandatory, or Discriminator. The attribute type is Char,
Character, String, Date, Timestamp, or Number.

Once you have selected this checkbox, choose the history column type:

1created on 创建时间
Select this option to use the column to log the date on which the row
was first created. The attribute type must be Date or Timestamp.
2modified on 修改时间
Select this option to use the column to log the date on which the row
was last modified. The attribute type must be Date or Timestamp.
3created by 谁创建的
Select this option to use the column to log the user who created the
row. The attribute type must be Char, Character, or String.
4modified by 谁修改的
Select this option to use the column to log the user who last modified
the row. The attribute type must be Char, Character, or String.
5version number Select this option to use this column to log the number of times the
row has been changed. The attribute type must be Number.

2.Updateable

The view attribute setting is based on the entity attribute setting and
can made more restrictive.

2Always

Select to make an attribute updatable.

3While New

Select to make an attribute updatable before an entity is first posted.

4Never

Select to make an attribute read-only.

3.Refresh After

Select one or both of these options to reflect the effects of triggers
after DML operations.

1update

After the entity object posts changes to an existing database row, the entity object retrieves the value of the attribute from the
corresponding database field.

2Insert After

the entity object inserts a new row in the database, the entity object
retrieves the value of this attribute fromhe corresponding database
field
----------------------------------------------------------------
53.ADF自带过滤功能不区分大小写敏感不敏感
caseInsensitive
caseSensitive

filterFeatures="caseInsensitive"

例子如下
<af:column sortProperty="Consignee" filterable="true"
sortable="true"
headerText="#{bindings.CdsExportApplyVie
w1.hints.Consignee.label}"
id="c35" filterFeatures="caseInsensitive">
---------------------------------------------------------------
54.将当前行的DepartmentId放入pageFlowScope中;
CollectionModel model = (CollectionModel) employeeTable.getValue();
JUCtrlHierBinding tableBinding = (JUCtrlHierBinding)
model.getWrappedData();
//table synchronizes row selection with current binding row
DCIteratorBinding tableIterator =
tableBinding.getDCIteratorBinding();
if (tableIterator.getCurrentRow() != null) {
Object departmentIdValue =
tableIterator.getCurrentRow().getAttribute("DepartmentI
d");
//copy value into the pageFlowScope, which is returned in an
task
//flow param output
ADFContext adfCtx = ADFContext.getCurrent();
Map pageFlowScope = adfCtx.getPageFlowScope();
pageFlowScope.put("departmentId", departmentIdValue);
}
----------------------------------------------------------------
55.玩输出模式
<af:column id="c201" headerText="操作"
width="105"
rendered="#{adfFacesContext.outputMode!='printable'}">
<af:commandButton text="财务退回"
id="cb11"
binding="#{tuiDanBean.vflistBa
ckBtn}"
action="#{tuiDanBean.vflistBac
k_action}"
disabled="#{row.Vfdate!=null}
"/>
</af:column>
<af:activeImage source="/images/stockChart.gif"
rendered="#{adfFacesContext.outputMode != "email"}"/>
--------------------------------------------------------------
56.转向问题看官方最佳解说
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session =
(HttpSession)context.getExternalContext().getSession(tru
e);//session不可能为空
String actionStr =
String.valueOf(session.getAttribute("firstLink"));
context.getApplication().getNavigationHandler().handleNavi
gation(context, null, actionStr);
How-to efficiently redirect an ADF Faces view using ADFc
ADF Faces developers use
facesContex.getExternalContext().redirect(String) to issue a GET
request to a
JSF view. Using ADFc, the redirect URL should neither be read from
the current UIView root directly or
provided in the form /faces/<viewId name>. Instead, have the
controller generating the redirect String
for a specific viewId as shown below:
FacesContext fctx = FacesContext.getCurrentInstance();
ExternalContext ectx = fctx.getExternalContext();

String viewId = "... add viewId...."

ControllerContext controllerCtx = null;
controllerCtx = ControllerContext.getInstance();
String activityURL = controllerCtx.getGlobalViewActivityURL(viewId);
try{
ectx.redirect(activityURL);
} catch (IOException e) {
//Can't redirect
e.printStackTrace(); }

Why? Because a redirect is a Get request and you don't want ADFc to

treat it as a new application request
but instead retrieve the internal controller state. For this you need the
state toke in the redirect URL,
which is what the code line above does
----------------------------------------------------------------
57.bean中增加组件
UIComponent parent =....;
RichInputText it = new RichInputText();

it.setValue("test...");parent.getChildren().add(it);

---------------------------------------------------------------
58.删除确认对话框
1popup所在页面位置
<f:view>
<af:document id="d1" title="成品计划员管理">
<af:messages id="m1"/>
<af:form id="f1">
<!-- 对话框 开始 -->
<af:popup id="p1"> ...
2popup示例只需要改这个dialogListener
<af:popup id="p1">
<af:dialog id="d5" title="删除确认"
dialogListener="#{consigneeBean.deleteApply}">
<af:panelGroupLayout id="pg210" halign="center"
layout="vertical">
<br/>
<af:outputText value="确定要删除吗 "
id="ot341"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br/>
</af:panelGroupLayout>
</af:dialog>
</af:popup>
3调用者
<af:commandToolbarButton text="删除" id="ctb4">
<af:showPopupBehavior triggerType="click"
popupId=":::p1"/>
</af:commandToolbarButton>
-------------------------------------------------------------
59.常用工具类小结
1org.apache.commons.lang.math.NumberUtils 处理数字与字符串
的无异常转化
例子
String str=null;
int i = NumberUtils.toInt(str);
System.out.println("i="+i);
字符串是null 或是其他任意不能转化成整数的字符串 都会转变成0。
2java.text.SimpleDateFormat 用于格式化日期
3java.text.DecimalFormat 用于格式化数字

---------------------------------------------------------------

60.将文件作为流读入内存

InputStream input = ClassLoaderUtil.getStream("sap.properties");        prop.load(input);        input.close();        InputStream is = InitialLoader.class.getResourceAsStream("/global.properties");

61.点一下按钮关闭当前页面

1         FacesContext fc = FacesContext.getCurrentInstance();2         ExtendedRenderKitService erks =3             (ExtendedRenderKitService) Service.getRenderKitService(fc, ExtendedRenderKitService.class);4 5         erks.addScript(fc, "window.close();");

 

 

62.设置日期为当前日期

如果eo中对应的属性类型为oracle.jbo.domain.Date有以下两种设置

为当前日期方式

 

row.setAttribute("Applydate", new oracle.jbo.domain.Date(oracle.jbo.domain.Date.getCurrentDate()));        oracle.jbo.domain.Date now = new oracle.jbo.domain.Date(new Timestamp(System.currentTimeMillis()));

63.对数据库的操作要谨慎一些有提交就会有回滚善用异常

Example 4–15 Updating an Existing Entity Row

1     /* Update the status of an existing order */ 2     public void updateOrderStatus(long orderId, String newStatus) { 3         //1. Find the order OrderEOImpl order = retrieveOrderById(orderId); 4         if (order != null) { 5             //2. Set its Status attribute to a new value 6             order.setOrderStatusCode(newStatus); 7             //3. Commit the transaction 8             try { 9                 getDBTransaction().commit();10             } catch (JboException ex) {11                 getDBTransaction().rollback();12                 throw ex;13             }14         }15     }

The example for removing an entity row would be the same, except that after finding the existing entity, you would use the following line instead to remove 

the entity before committing the transaction:

// Remove the entity instead!
order.remove();

64.官方查询标准步骤:

1.Request begings and application module is acquired
2.setWhereClause(null) 清除查询提交
3.setWhereClauseParam(null) 清除查询绑定变量
4.setWhereWhereClause(...)
5.setWhereClauseParam(...)
6.executeQuery()
7.Application module is released

65.建立View Criteria 查询条件查询

1 import oracle.jbo.ApplicationModule; 2 import oracle.jbo.Row; 3 import oracle.jbo.ViewCriteria; 4 import oracle.jbo.ViewCriteriaRow; 5 import oracle.jbo.ViewObject; 6 import oracle.jbo.client.Configuration; 7  8 public class TestClientViewCriteria { 9     public static void main(String[] args) {10         String amDef = "devguide.examples.readonlyvo.PersonService";11         String config = "PersonServiceLocal";12         ApplicationModule am = Configuration.createRootApplicationModule(amDef, config);13         // 1. Find the view object to filter14         ViewObject vo = am.findViewObject("PersonList");15         // Work with your appmodule and view object here16         Configuration.releaseRootApplicationModule(am, true);17         // 2. Create a view criteria row set for this view object18         ViewCriteria vc = vo.createViewCriteria();19         // 3. Use the view criteria to create one or more view criteria rows20         ViewCriteriaRow vcr1 = vc.createViewCriteriaRow();21         ViewCriteriaRow vcr2 = vc.createViewCriteriaRow();22         // 4. Set attribute values to filter on in appropriate view criteria rows23         vcr1.setAttribute("PersonId", "> 200");24         vcr1.setAttribute("Email", "d%");25         vcr1.setAttribute("PersonTypeCode", "STAFF");26         // Note the IN operator must be followed by a space after the operator.27         vcr2.setAttribute("PersonId", "IN (204,206)");28         vcr2.setAttribute("LastName", "Hemant"); // 5. Add the view criteria rows to the view critera row set29         vc.add(vcr1);30         vc.add(vcr2);31         // 6. Apply the view criteria to the view object32         vo.applyViewCriteria(vc);33         // 7. Execute the query34         vo.executeQuery();35         while (vo.hasNext()) {36             Row curPerson = vo.next();37             System.out.println(curPerson.getAttribute("PersonId") + "" + curPerson.getAttribute("Email"));38         }39     }40 }

 

66.使用VO创建新行

1 import oracle.jbo.ApplicationModule; 2 import oracle.jbo.Row; 3 import oracle.jbo.ViewObject; 4 import oracle.jbo.client.Configuration; 5 import oracle.jbo.domain.DBSequence; 6 import oracle.jbo.domain.Date; 7 import oracle.jbo.domain.Timestamp; 8  9 public class TestCreateOrder {10     public static void main(String[] args) throws Throwable {11         String amDef = "oracle.fodemo.storefront.store.service.StoreServiceAM";12         String config = "StoreServiceAMLocal";13         ApplicationModule am = Configuration.createRootApplicationModule(amDef, config);14         // 1. Find the Orders view object instance.15         ViewObject orders = am.findViewObject("Orders");16         // 2. Create a new row and insert it into the row set17         Row newOrder = orders.createRow();18         orders.insertRow(newOrder);19         // Show the entity object-related defaulting for CreatedBy20         System.out.println("CreatedBy defaults to: " + newOrder.getAttribute("CreatedBy"));21         // 3. Set values for some of the required attributes22         Date now = new Date(new Timestamp(System.currentTimeMillis()));23         newOrder.setAttribute("OrderDate", now);24         newOrder.setAttribute("OrderStatusCode", "PENDING");25         newOrder.setAttribute("OrderTotal", 500);26         newOrder.setAttribute("CustomerId", 110);27         newOrder.setAttribute("ShipToAddressId", 2);28         newOrder.setAttribute("ShippingOptionId", 2);29         newOrder.setAttribute("FreeShippingFlag", "N");30         newOrder.setAttribute("GiftwrapFlag", "N");31         // 4. Commit the transaction32         am.getTransaction().commit();33         // 5. Retrieve and display the trigger-assigned order id34         DBSequence id = (DBSequence) newOrder.getAttribute("OrderId");35         System.out.println("Thanks, reference number is " + id.getSequenceNumber());36         Configuration.releaseRootApplicationModule(am, true);37     }38 }

 

67.得到sequence

1     public oracle.jbo.domain.Number getSequenceNumber() { 2         try { 3             String seq = "your_db_sequence_name"; 4             oracle.jbo.server.SequenceImpl theSeq = new oracle.jbo.server.SequenceImpl(seq, getDBTransaction()); 5             oracle.jbo.domain.Number seqNextNumber = theSeq.getSequenceNumber(); 6             return seqNextNumber; 7         } catch (Exception e) { 8             //handle exceptions 9         }10         return null;11     }

绑定方法到页面上之后在bean中调用

1     public oracle.jbo.domain.Number getNextEmployeeSequenceNumber() {2         BindingContext bindingContext = BindingContext.getCurrent();3         BindingContainer bindings = bindingContext.getCurrentBindingsEntry();4         OperationBinding getNextSequence = bindings.getOperationBinding("getSequenceNumber");5         oracle.jbo.domain.Number seqVal = (oracle.jbo.domain.Number) getNextSequence.execute();6         return seqVal;7     }

 程序员的基础教程:

转载地址:http://stoox.baihongyu.com/

你可能感兴趣的文章
ceph学习笔记之七 数据平衡
查看>>
windows下的php的memcache扩展的安装及memcache最新下载地址
查看>>
YOLOv3: 训练自己的数据(绝对经典版本1)
查看>>
POJ 1150 The Last Non-zero Digit 《挑战程序设计竞赛》
查看>>
Could not find artifact com.sun:tools:jar:1.5.0 解决办法
查看>>
phpstorm xdebug remote配置
查看>>
引用与指针的区别
查看>>
pygtk笔记--2.1:布局容器,VBox、Hbox、Alignment
查看>>
dtree.js树的使用
查看>>
Springboot2.1.3 + redis 实现 cache序列化乱码问题
查看>>
python 异常处理
查看>>
线程什么时候需要同步,什么时候不需要同步?
查看>>
Struts2 自定义拦截器(方法拦截器)
查看>>
Linux服务器的那些性能参数指标
查看>>
BZOJ 2302: [HAOI2011]Problem c [DP 组合计数]
查看>>
Atitti 过程导向 vs 结果导向 attlax的策
查看>>
c++ 11开始语言本身和标准库支持并发编程
查看>>
.NET Core 之 MSBuild 介绍
查看>>
iOS:即时通讯之<了解篇 SocKet>
查看>>
@EnableTransactionManagement注解理解
查看>>