关于动态生成HtmlDataTable的问题
buptwhisper
2009-11-25
我由于应用的需求需要在后台动态生成一个HtmlDataTable,然后在页面上绑定来显示它。然而在生成HtmlDataTable时出现了一些问题。
首先我用setVar设置了一个var = "hot" 在设置每一行的每一列时我用了el表达式,即#{hot.xxx} 当然我若用setValueExpression("value", el表达式);是完全没有问题的。 但是我若在同时想要取这个表达式的值, 即el.getValue(elContext);但是发现这个值是null,也就是说elContext中并没有值。请问哪位大侠给指点迷津,成分感谢。 |
|
terryzhou
2009-11-26
paste code
|
|
buptwhisper
2009-11-26
部分代码是这样的:
HtmlOutputText tipText = new HtmlOutputText(); ValueExpression tipsbinding = elFactory.createValueExpression(elContext, "#{hot."+ headers.get(i).getTips() + "}", List.class); tipText.setValueExpression("value", tipsbinding);//这样可以绑定值 但是 tipsbinding.getValue(elContext)是null的 |
|
terryzhou
2009-11-26
outputText是没值返回的,又不是inputText
|
|
buptwhisper
2009-11-26
那请问如果我要在页面上显示,同时我要在程序中得到它的值以便作进一步的处理如何实现?
|
|
buptwhisper
2009-11-26
我刚试了一下,即使我使用HtmlInputText同样取不到值
|
|
terryzhou
2009-11-27
1.你写个简单的DEMO试下,类似于http://blog.sina.com.cn/s/blog_3c6ecea90100cw6e.html
二、从JSF页面传递组件属性到托管Bean f:attribute 组件也可以用来访问,任何绑定在托管Bean的UI组件的属性。这些属性值可以通过父组件的getAttributes()来获得。因为不能以方法参数的方式传值给托管Bean绑定的UI组件的getter和setter方法,这时f:attribute就会非常有用。这里有个UI组件绑定到托管Bean 的基础例子 <h:outputText binding="#{myBean.myText}" value="#{myBean.myTextValue}"> <f:attribute name="attributename" value="attributevalue" /> </h:outputText> 托管Bean代码: import javax.faces.component.html.HtmlOutputText; public class MyBean ...{ private HtmlOutputText myText; public HtmlOutputText getMyText() ...{ return myText; } public String getMyTextValue() ...{ return (String) myText.getAttributes().get("attributename"); } public void setMyText(HtmlOutputText myText) ...{ this.myText = myText; } } 页面有binding,后台一定能取得该对象值,如果不binding,只有input,select等输入值会重新提交到bean里(利用bean.setXXX方法). 2.如果你在dataTable里想迭代使用取得输入值,只能依赖binding,因为传值不再是简单得调用bean.setXXX(先要取得list中的Object,然后再调用Object.setXXX,最后再把list,set回bean里) 3.帖下你的前台代码,简单描述下你的需求(实现动态列).看有没其它解决方法 |
|
buptwhisper
2009-11-27
表达能力不是很好,代码贴出来又牵连太大,请见谅,我可以再试着描述一下我的需求:
1.这里是一个关于动态生成一个HtmlDataTable的问题,且它不与前台页面打交道,准确的讲,它不需要页面的数据来形成,页面只是通过一个h:dataTable的binding属性来显示它。 2.生成这个table的数据来源于后台的一个list<?> dataSource,这个dataSource中的?是某个类,这个类中有哪些属性需要显示我是通过annotation可以取出来的,更准确点,关于这个list<?>中的?我可以生成一个List<String> headers;这个headers也就是要显示的动态列,headers中的每一个元素是关于要显示的列的值的生成路径。举例说明是这样的意思 比如页面上我要显示一张关于users的dataTable,我试着在后台先生成一个HtmlDataTable.这个dataTable是通过一个List<User> users来生成的。 假如User的结构如下: public class User { private String userName; private String userId; private int grade; private List<Award> award; //然后是所有字段的get/set方法 } 同时,我可以生成一个要显示的列 headers中的值是{"userName" ,"userId","grade","awards"} 当然对于userName,userId,grade这些简单的属性(简单的列),我可以显示出来,以下是生成HtmlDataTable的部分代码: HtmlDataTable table = new HtmlDataTable(); table.setVar("hot"); for(String header : headers) { HtmlColumn column = new HtmlColumn(); //设置一列的值 HtmlOutputText valueText = new HtmlOutputText(); ValueExpression el = Expressions.instance().createValueExpression("#{hot."+ header+ "}").toUnifiedValueExpression(); valueText.setValueExpression("value",el); column.getChildren().add(valueText); //设置这一列的表头 HtmlOutputText columnTitle = new HtmlOutputText(); columnTitle.setHeader(header); column.setHeader(columnTitle ); table.getChildren().add(column); } //整个table的行的值 table.setValue(users); 但是由于其中的awards这个字段是一个特殊的字段,它不能直接用el表达式来进一步的取出它的值,我在想,这个awards本身是一个list,其结果是在table中的award这一列实质上是一个小的HtmlDataTable(),所以我希望能够在每一行中取出它对应的awards来进一步的生成小的table. 于是我考虑通过el表达式来取出它的值。为了简单起见,我把上面的代码中加了一行特殊处理,变为: HtmlDataTable table = new HtmlDataTable(); table.setVar("hot"); for(String header : headers) { HtmlColumn column = new HtmlColumn(); if(!header.equals("awards")) { //设置一列的值 HtmlOutputText valueText = new HtmlOutputText(); ValueExpression el = Expressions.instance().createValueExpression("#{hot."+ header+ "}").toUnifiedValueExpression(); valueText.setValueExpression("value",el); column.getChildren().add(valueText); } else { //这里应该是一个嵌套的小的table //但是我希望能够取到某一行对于该列的值 //el表达式应该是hot.awards,即 ValueExpression listValueEl = elFactory.createValueExpression(elContext, "#{hot.awards}", Object.class); //但是用下面的方法取出来的值却是null Object listValue = listValueEl.getValue(elContext); //关键就是用什么办法能够取到它的值。 } //设置这一列的表头 HtmlOutputText columnTitle = new HtmlOutputText(); columnTitle.setHeader(header); column.setHeader(columnTitle ); table.getChildren().add(column); } //整个table的行的值 table.setValue(users); 3.哆嗦了这么多,我也不知道描述清楚没有。请指点迷津。 |
|
terryzhou
2009-11-27
1.大概清楚你的需求
2.解决方法 a:<outputText/>的value不是一定要是"#{bean.XXX}",也可以直接文本;我觉得像全部写成(从效率上来说你都已经使用迭代) HtmlOutputText valueText = new HtmlOutputText(); valueText.setValue(hot.getXXX);//已知方法名,利用反射访问方法 后面也别在column里嵌dataTable了,直接换行output即可. b:使用<rich:columns/>,感觉和你的需求有点像 http://livedemo.exadel.com/richfaces-demo/richfaces/columns.jsf?c=columns&tab=usage 3.不知道我描述的,你清楚没 |
|
terryzhou
2009-11-27
|
相关讨论
相关资源推荐
- Delphi(C++Builder)6 到 5 工程转换器
- delphi c++builder JSON 生成与解析 例子
- Java;C#/C++与Delphi/C++Builder之区别与联系
- C++Builder与Delphi界面主题包使用教程
- 让Delphi组件和C++ Builder共用
- Delphi与C++Builder代码共享的实现
- 社区反应:IntelliJ开源,亡羊补牢?
- RAD Studio Delphi C++ Builder 2020年11月开发路线图PPT:研发Delphi WebAssembly编译器
- C++ builder6.0(BCB)中的类型转换总结
- c语言程序设计wav,[转载]wav音频:C语言 wav文件转换DAT/TXT/DOC