"分页栏出现3个问号BUG解决"

2013-06-06(Thursday) 00:00

平台:Jdeveloper 11.1.1.7.0


BUG描述 标准控件af:table,“页”字前后出现三个问号。

原因分析

查看LOG文件
{% codeblock lang:java %} 无法从外观 mySkin.desktop 获取资源关键字 页

可见是RenderingContext类中getTranslatedString方法发生异常。
查看源代码分析:

找到源代码所在位置

将JAR包解压得到RenderingContext类,反编译查看

结果如下RenderingContext.class
{% codeblock lang:java %} public String getTranslatedString(String key) { if (key == null) return null; try { return getSkin().getTranslatedString(getLocaleContext(), key); } catch (MissingResourceException mre) { _LOG.severe("CANNOT_GET_RESOURCE_KEY", new String[] { key, getSkin().getId() }); } return "???" + key + "???"; }

可知在调用getTranslatedString获取Resource时,发生MissingResourceException异常所以返回了带"???"+Key+"???"字样的字符串。

解决方案:

根据以上分析基本可知出现问号的原因是在获取resourcebundle时,找不到Key为页的resource,所以直接返回了"???" + key + "???",就出现分页显示出现问号的BUG。

方案一:重写ResourceBundle类,增加KEY值为“页”的资源。 步骤如下:

  • 创建SkinBundle类 extends ListResourceBundle
    {% codeblock lang:java %} package cn.dengdezhao.bundle public class SkinBundle extends ListResourceBundle { @Override public Object[][] getContents() { System.out.println("executing..."); return new Object[][]{ { "页", "页" } }; } }

  • 创建trinidad-skins.xml文件注册定制化Skin
    {% codeblock lang:xml %} <?xml version="1.0" encoding="UTF-8"?> mySkin.desktop mySkin skyros-v1.desktop org.apache.myfaces.trinidad.desktop css/mySkin.css cn.dengdezhao.bundle.SkinBundle

  • 修改trinidad-config.xml文件如下:
    {% codeblock lang:xml %} <?xml version="1.0" encoding="UTF-8"?> mySkin

  • 创建css/mySkin.css文件(内容默认CSS即可)

运行即发现问号消失。

方案二:其实原理跟方案一一样,也是通过改resourcebundle实现。resourcebundle支持三种类型,一种是以上的扩展ListResourceBundle类实现,一种是通过配置文件properties实现,另外一种是xliff实现。也可创建一个ApplicationBundle.properties文件,内容如下:
{% codeblock lang:java %} 页 = 页

trinidad-skins.xml里的bundle-name节点设置成ApplicationBundle也可实现同样效果。

定制CSS可参照["定制CSS"]

Category: ADF Tagged: ADF


adf:tree做的树菜单如何过滤子节点的数据?

2012-06-26(Tuesday) 00:00

需求:项目中的树菜单需要权限用户的权限过滤显示子菜单,通过用户所在的用户组可以查看的页面ID(List)过滤子节点
解决方案:
因为树是通过viewLink关联自身的VO生成的,想在AM里添加方法,对VO进行过滤处理把结果返回。
但实现起来比较麻烦,调用方法之后要刷新页面,初始化的树数据过滤处理困难。
于是想重写VO的方法看能不能在VO层就过滤掉子节点。重写createViewLinkAccessorRS,此方法返回ViewLink的结果,也就是菜单的子节点数据

@Override
protected ViewRowSetImpl createViewLinkAccessorRS(AssociationDefImpl associationDefImpl,
ViewObjectImpl viewObjectImpl,
Row row,
Object[] object) {
ViewRowSetImpl viewRowSetImpl =
super.createViewLinkAccessorRS(associationDefImpl, viewObjectImpl,
row, object);
int count = 0;
// getList()拿到可以查看的pageId的列表,对比Row中的pageId属性,如果在List中存在,就取该Row,如果不存      //在,表示此子节点不予以显示,remove掉
if (this …

Category: ADF Tagged: ADF

Read More

表内的checkbox当数据量大时发现部分行勾选不中

2012-06-26(Tuesday) 00:00

测试发现,当数据只有25行的时候,都可以正常勾选,超过25行的数据,总是勾选不中。

问题产生原因:
由于自定制的checkbox是设置了immediate=true 即时给数据行的checkbox字段赋值。
VO的rangeSize 默认是25,
因此导致25条数据内是可选。25条之外的数据初始时没有取出来,因此对这些没取的数据行设置checkbox自然就不生效了(展现出来就是checkbox勾选不中)

解决方案:
修正VO的rangeSize为-1,查询全部,即可解决此问题。

Category: ADF Tagged: ADF

Read More

关于定制validator

2012-06-26(Tuesday) 00:00

一个时刻字段,要求输入00:00-12:60这样的时刻范围
使用如下的正则表达式,过滤掉了不合规则的数字之后,还差一个逻辑,结束时刻不能小于开始时刻,比如:10:00-9:00这样的输入也是不合法的。正则太折磨眼力了,应该也是可以做到这点的吧,为了偷懒,就定制个validator来处理这个点。

<af:validateRegExp pattern="([0-1][0-9]|2[0-4])\:([0-5][0-9]|60)\-([0-1][0-9]|2[0-4])\:([0-5][0-9]|60)" messageDetailNoMatch="请输入时刻,例如 00:00-24:60 " hint="请输入时刻,例如 00:00-24:60"/>
Step1。创建一个ValidatorTime类实现Validator接口
package …

Category: ADF Tagged: ADF

Read More

关于ManagedBean中多次执行构造方法时的问题

2012-06-26(Tuesday) 00:00

有时候需要在初始化时执行一些查询,但发现会多次执行。需要在构造方法里添加一行代码避免页面点击时多次执行初始化。
if (!(Boolean)ADFUtils.getBindObject("adfFacesContext.postback")) {
init();
}

通过页面是否postback来控制只初始化一次。

Category: ADF Tagged: ADF

Read More

关于selectBooleanCheckbox 的问题

2012-06-26(Tuesday) 00:00

页面的 selectBooleanCheckbox 选择后,总提示 不是数字(组件value是 true 或 false,数据库存的是Number),怎么解决

方案有三个
1。如果是基于表的Number字段(假设字段名是Flag,值是1或者0),想生成selectBooleanCheckbox ,可以重写这个VO的的 setFlag()跟getFlag()方法如下:
public void setFlag(Boolean value){
this.flag=value==true?1:0;
} public Boolean getFlag(){
return this.flag==0?false:true;
}

2。设置valueChangeListener.
在valueChange方法里捕获当前selectBooleanCheckbox 的值,然后转化成Number类型的传给VO

3。如果是只读的表,可以在UI上通过EL表达式处理。

Category: ADF Tagged: ADF

Read More

关于VO的只读可写等属性设置

2012-06-26(Tuesday) 00:00

如果生成ViewObject 的时候选择的是只读的VO的话,会发现VO的source里有ReadOnly="true"。
需求1:在MB中我通过代码拿到这个VO的实例,我想通过以下代码添加Row

Row newRow=Vo.createRow();
newRow.setAttribute("attribute1","value1");
newRow.setAttribute("attribute2","value2");
newRow.setAttribute("attribute3","value3");
Vo.insertRow(newRow);
最终发现,只读VO无法插入数据。怎么办?将ReadOnly改成"false"之后测试,发现满足需求~!
需求2:满足需求1之后发现,Vo里的确插入数据了。如果页面上有保存按钮,也会将这个数据更改到数据库,而这个数据只是需要在MB中起过渡作用,不必将newRow的数据postChange到DB,怎么办?
VO里 这个属性DeleteParticipant 立功了。 DeleteParticipant就是控制数据是否保存到DB的。设置 DeleteParticipant="false"发现满足了需求!

Category: ADF Tagged: ADF

Read More

immediate="true" 的异常

2012-06-26(Tuesday) 00:00

设置按钮的immediate="true" 可以避免因按钮提交FORM导致的页面刷新闪烁,但也会带来麻烦。
假如对表的取消按钮设置了此属性,可能会发生新增数据,然后点取消作rollback时数据显示异常。
开发时值得注意

Category: ADF Tagged: ADF

Read More

oracle数据库用户被锁问题解决

2012-06-26(Tuesday) 00:00

运行AM的时候报个JDBC连接错误,ORA-280000:用户被锁的异常。
于是在PL/SQL DEV里切换成SYSTEM用户 alter user XXX account unlock;之后,用PL/SQL DEV测试 可以连上了
再运行AM的时候,又报了个用户被锁。很是蛋疼
于是换到命令行,尝试以SYSDBA的身份再执行一次alter account unlock;
发现连不上:报了以下错误:
ORA-28056: Writing audit records to Windows Event Log failed
这你妹的,原来是系统日志满了,解决方案:
打开windows 事件查看器,将应用程序日志清理一下,重新连接数据库,连接成功。

Category: ADF Tagged: ADF

Read More

如何在MB中对selectionListener collectionModel.makeCurrent调用

2012-06-26(Tuesday) 00:00

如何在MB中对Table的默认"#{bindings.PromotionVO1.collectionModel.makeCurrent}"进行调用?

当需要重写adf:table的缺省的selectListener时,可以在自己绑定的MB的方法里,调用默认的makeCurrent方法。取得当前行的数据,进行自己的定制操作。方法如下:

//调用缺省makeCurrent
JSFUtils.resolveMethodExpression("#{bindings.yourVO.collectionModel.makeCurrent}",
new Class[] { SelectionEvent.class },
new Object[] { selectionEvent });
取得选中行的数据
Row selectedRow =
(Row)JSFUtils.resolveExpression("#{bindings.yourVOIterator.currentRow}");
然后就可以针对取得的数据进行定制开发了。

Category: ADF Tagged: ADF

Read More
Page 1 of 2

Next »