关于动态生成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
 
Global site tag (gtag.js) - Google Analytics