0

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

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

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

4 回答 4

0

我遇到了类似的情况,恐怕无法用未知列填充数据表。你必须提前知道号码。就我而言,我发现为了这种特殊需要而转向 JSP 并保持 JSF 用于更多“静态”使用会更容易。据我了解,数据表的唯一动态方面是行数。

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

祝你好运。

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

于 2013-05-20T08:29:54.640 回答
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>建议使用 a ,因为它保持顺序),那么请改为这样做:

<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>
于 2013-05-20T13:54:29.723 回答
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);
}
于 2013-09-13T06:44:35.737 回答
0

如何创建一个列的表

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

第二列将是名称:等级

无论如何,这就是它在大学/学院中的显示方式...

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

于 2013-05-20T11:11:43.877 回答