Jsf 显示列数未知的数据表

Jsf 显示列数未知的数据表,jsf,datatable,Jsf,Datatable,我真的需要你的帮助来解决我在项目中遇到的这个问题。不管怎样,我对JSF还是新手。我正在做一个项目,有一个模块,在这个模块中,考试记录在成功认证后从数据库显示给学生。如果所有学生都在同一个班级,提供相同数量的课程,这将很容易,因为您可以创建一个数据表模型,然后在视图中使用它。但在我的例子中,数据库包含了学生在不同部门和班级的考试记录表,比如计算机科学100200和300级,地质学100200和300级等等。这些学生也提供完全不同的课程。有些提供物理、GST、计算机,有些则不提供 我的问题是如何在数

我真的需要你的帮助来解决我在项目中遇到的这个问题。不管怎样,我对JSF还是新手。我正在做一个项目,有一个模块,在这个模块中,考试记录在成功认证后从数据库显示给学生。如果所有学生都在同一个班级,提供相同数量的课程,这将很容易,因为您可以创建一个数据表模型,然后在视图中使用它。但在我的例子中,数据库包含了学生在不同部门和班级的考试记录表,比如计算机科学100200和300级,地质学100200和300级等等。这些学生也提供完全不同的课程。有些提供物理、GST、计算机,有些则不提供

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

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

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


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

我也遇到过类似的情况,我担心无法用未知列填充数据表。你必须事先得到通知。 在我的例子中,我发现为了满足这个特殊的需求而使用JSP更容易,并保留JSF以获得更多的“静态”使用。 据我所知,数据表唯一的动态方面是行数

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

祝你好运


注:如果错误,请告诉我解决方案,因为尽管我无法使用它,但我很想知道它。

创建一个两列表如何

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

第二列将是name:Grade

这就是它在大学里的展示方式

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

您可以使用
列表
以通用方式获取数据。然后您可以使用
动态生成列(请注意
不适合,因为它不是在视图生成时运行的,而是在视图渲染时运行的)

下面是一个具体的启动示例,假设您的环境支持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>

#{map[key]}
如果您还需要在单独的集合中使用列标签(建议使用
LinkedHashMap
,因为它可以维持顺序),则可以这样做:

<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>

#{column.value}
#{map[column.key]}

您可以在运行时使用backingbean方法创建列

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);
}
public void loadDynamicList()引发异常{
//设置标题(可选)。
//dynamicHeaders=新字符串[]{“ID”、“Name”、“Value”、“delete”};
//设置行。这是一个存根示例,只需执行动态操作。
dynamicList=新的ArrayList();
/*动态列表。添加(“一”);
动态列表。添加(“两个”);
动态列表。添加(“三”);
动态列表。添加(“四”);
动态列表。添加(“五”);
动态列表。添加(“六”)*/
/*add(Arrays.asList(新字符串[]{“ID1”,“ID2”}));
add(Arrays.asList(新字符串[]{“ID1”,“ID2”}));
add(Arrays.asList(新字符串[]{“ID1”,“ID2”}));
add(Arrays.asList(新字符串[]{“ID1”,“ID2”}));
add(Arrays.asList(新字符串[]{“ID1”,“ID2”}))*/
existingCountryList=新建ArrayList();
字符串countryCode=“SL”;
existingCountryList.add(getCountryService().getCountryByCode(countryCode));
Country Country=getCountryService().getCountryByCode(countryCode);
countryLanguageSet=country.getCountryLanguage();
int languageSize=country.getCountryLanguage().size();
dynamicHeaders=新字符串[languageSize+1];
int计数器=0;
for(CountryLanguage计数:countryLanguageSet){
System.out.println(count.getLanguage().getLanguageName());
dynamicHeaders[计数器]=count.getLanguage().getLanguageName();
计数器++;
}
dynamicHeaders[计数器]=“删除”;
System.out.println(“标题列表”+dynamicHeaders.toString());
System.out.println(“尺寸”+动态引线.长度);
}
public void populatedDynamicDataTable(){
debug(“populateDynamicDataTable:Enter”);
//创造。
HtmlDataTable dynamicDataTable=新的HtmlDataTable();
dynamicDataTable.setValueExpression(“value”,createValueExpression(“#{relationBean.dynamicList}”,List.class));
动力