显示具有未知列数的DataTable

时间:2013-05-20 05:00:35

标签: jsf datatable

我真的需要你帮助我解决这个问题。无论如何,我是JSF的新手。我正在处理一个项目,并且有一个模块,在成功进行身份验证后,将从数据库向学生显示检查记录。如果所有学生都在同一个班级并提供相同数量的课程,这将很容易,因为您可以创建一个dataTable模型,然后在您的视图中使用它。但就我而言,数据库包含不同部门和班级的学生考试记录表,如计算机科学100,200和300级,地质100,200和300级等等。这些学生还提供完全不同的课程。有些提供物理,GST,计算机,有些则没有。

我的问题是如何动态地向不同的学生展示他们在dataTable中的成绩和课程名称。让我试着想象一下。

100级计算机科学表有 CS101 CS102 GST101 MATH101 MATH102 PHY101 CHM101

200级计算机科学表有 CS201 CS202 CS203 MATH201 CHM202 请注意列数和列标题名称的差异。

然后,计算机科学100级学生想要查看他或她的考试记录,如何动态地在dataTable中显示这些记录与列名,而不是首先创建具有预定义列名的dataTable模型。事先不知道列数或名称。你如何为不同班级的不同学生做这个?我想要一个好的代码,可以让任何部门或级别的学生登录,然后检索他的考试记录。我没有要求验证代码已经实现,代码将显示数据库表列标题的名称以及它们为特定的100或200级别保留的记录。我需要这个,因为我没有必要创建一个包含特定列标题的dataTable模型,因为我在数据库中有许多表,不同的学生部门和类具有不同数量的列和名称。我需要你的帮助,我希望我能够清楚地传达我的问题。我在NetBeans 7.2.1上使用了JSF 2.1(Facelets和Manage Bean),MySQL数据库服务器。

4 个答案:

答案 0 :(得分:0)

我处于类似的情况,我担心没有办法用未知的列填充数据表。你必须事先得到numbre。 在我的例子中,我发现更容易转向JSP以满足这种特殊需求,并保持JSF更加“静态”使用。 根据我的理解,Datatable的唯一动态方面是行的麻烦。

解决此问题的一种方法是使用列的呈现属性,在这种情况下,您将放入每个可能的列并决定(例如通过bean)显示或不显示其中一些并隐藏其他一些。这是半动态的,但仍然是一个宜居的解决方案。

祝你好运。

P.S:如果错了,请告诉我解决方案,因为我很想知道它虽然无法使用它。

答案 1 :(得分:0)

如何创建两个圆柱表

第一栏将被命名为:课程代码/名称

第二栏将是名称:成绩

无论如何,它是如何在Uni / College中展示的......

要实现它,只需创建一个包含2 Strings的对象,并填充此类对象的列表......这将是您的h:datatable value属性......

答案 2 :(得分:0)

您可以使用List<Map<String, Object>>以通用方式获取数据。然后,您可以使用<c:forEach>动态构建列(请注意,<ui:repeat>是可以保留的,因为它在视图构建期间不运行,但在视图渲染时间期间)。

这是一个具体的启动示例,假设您的环境支持EL 2.2:

<h:dataTable value="#{bean.listOfMaps}" var="map">
    <c:forEach items="#{bean.listOfMaps[0].keySet().toArray()}" var="key">
        <h:column>
            #{map[key]}
        </h:column> 
    </c:forEach>
</h:dataTable>

如果您在单独的集合中也需要列标签(因为它维护排序,建议使用LinkedHashMap<String, String>),而是这样做:

<h:dataTable value="#{bean.listOfMaps}" var="map">
    <c:forEach items="#{bean.mapOfColumns}" var="column">
        <h:column>
            <f:facet name="header">#{column.value}</f:facet>
            #{map[column.key]}
        </h:column> 
    </c:forEach>
</h:dataTable>

答案 3 :(得分:0)

您可以使用支持bean方法

在运行时创建列
public void loadDynamicList() throws Exception {

// Set headers (optional).
//dynamicHeaders = new String[] {"ID", "Name", "Value","delete"};

// Set rows. This is a stub example, just do your dynamic thing.
dynamicList = new ArrayList<String>();
/*dynamicList.add("One");
dynamicList.add("Two");
dynamicList.add("Three");
dynamicList.add("Four");
dynamicList.add("Five");
dynamicList.add("Six");*/

/*dynamicList.add(Arrays.asList(new String[] { "ID1","ID2" }));
dynamicList.add(Arrays.asList(new String[] { "ID1","ID2" }));
dynamicList.add(Arrays.asList(new String[] { "ID1","ID2" }));
dynamicList.add(Arrays.asList(new String[] { "ID1","ID2" }));
dynamicList.add(Arrays.asList(new String[] { "ID1","ID2" }));*/

existingCountryList = new ArrayList<Country>();
String countryCode="SL";
existingCountryList.add(getCountryService().getCountryByCode(countryCode));
Country country=getCountryService().getCountryByCode(countryCode);
countryLanguageSet=country.getCountryLanguage();
int languageSize=country.getCountryLanguage().size();
dynamicHeaders = new String[languageSize+1] ;
int counter=0;
   for (CountryLanguage count: countryLanguageSet) {
    System.out.println(count.getLanguage().getLanguageName());
    dynamicHeaders[counter]=count.getLanguage().getLanguageName();
    counter++;
}
   dynamicHeaders[counter]="Delete";
   System.out.println("header list "+dynamicHeaders.toString());
   System.out.println("size"+dynamicHeaders.length);

}

public void populateDynamicDataTable() {
debugLogger.debug("populateDynamicDataTable:Enter");
// Create <h:dataTable value="#{myBean.dynamicList}" var="dynamicItem">.
HtmlDataTable dynamicDataTable = new HtmlDataTable();
dynamicDataTable.setValueExpression("value", createValueExpression("#       {relationBean.dynamicList}", List.class));
dynamicDataTable.setVar("dynamicItem");
for (int count = 0; count < dynamicHeaders.length; count++) {
    HtmlColumn column = new HtmlColumn();
    HtmlOutputText header = new HtmlOutputText();
    header.setValue(dynamicHeaders[count]);
    column.setHeader(header);
if(dynamicHeaders[count].equals("Delete")){
    HtmlCommandButton commandButton=new HtmlCommandButton();
    commandButton.setValue("Delete"+count);

    commandButton.setActionExpression(createActionExpression("#{relationBean.deleteRow}", String.class));
    column.getChildren().add(commandButton);
}else{
    HtmlInputText input=new HtmlInputText();
    //List<String[]> ls = new  ArrayList<String[]>();
    input.setValueExpression("value",createValueExpression("#{dynamicItem}", String.class));
    column.getChildren().add(input);
   }
dynamicDataTable.getChildren().add(column);

}   
dynamicDataTableGroup = new HtmlPanelGroup();
dynamicDataTableGroup.getChildren().add(dynamicDataTable);
debugLogger.debug("populateDynamicDataTable:Exit");
}

public HtmlPanelGroup getDynamicDataTableGroup() throws Exception {
// This will be called once in the first RESTORE VIEW phase.
if (dynamicDataTableGroup == null) {
    loadDynamicList(); // Preload dynamic list.
    populateDynamicDataTable(); // Populate editable datatable.
}

return dynamicDataTableGroup;
}


public List<String> getDynamicList() {
return  dynamicList;
}
public void setDynamicList(List<String> dynamicList) {
this.dynamicList = dynamicList;
}


public void setDynamicDataTableGroup(HtmlPanelGroup dynamicDataTableGroup) {
this.dynamicDataTableGroup = dynamicDataTableGroup;
}

public ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().getExpressionFactory().createValueExpression(
    facesContext.getELContext(), valueExpression, valueType);
 }
public MethodExpression createActionExpression(String actionExpression, Class<?> returnType) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().getExpressionFactory().createMethodExpression(
    facesContext.getELContext(), actionExpression, returnType, new Class[0]);
}
private MethodExpression createMethodExpression(String valueExpression, Class<?> valueType,    Class<?>[] expectedParamTypes) {
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().getExpressionFactory().createMethodExpression(
        facesContext.getELContext(), valueExpression, valueType, expectedParamTypes);
}