【问题标题】:Display DataTable with unknown numbers of column显示列数未知的 DataTable
【发布时间】:2013-05-20 05:00:34
【问题描述】:

我真的需要您的帮助来解决我的项目遇到的这个问题。无论如何,我是 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 模型,因为我在数据库中有许多表,不同的学生部门和班级的列数和名称不同。请我需要你的帮助,我希望我能够清楚地传达我的问题。我正在使用 JSF 2.1(Facelets 和 Manage Bean),NetBeans 7.2.1 上的 MySQL 数据库服务器。

【问题讨论】:

  • 尚未阅读您的整个问题,但是...这是您要查找的内容:primefaces.org/showcase/ui/datatableDynamicColumns.jsf(DataTable - 动态列)
  • @Daniel,谢谢,但这并不是我想要的。我知道我的问题有点冗长,但我试图解释它以便你们能够理解。我想要一个与大学显示学生考试记录的方式相同的代码。我不是要求整个代码,而只是要求发生这种情况的逻辑。我知道这不能通过简单地创建模型数据表并在您的视图中使用来完成。请尝试阅读问题说明,这样您就会知道自己在做什么。再次感谢...

标签: jsf datatable


【解决方案1】:

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

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

祝你好运。

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

【讨论】:

  • 感谢@Gloserio,我仍在研究并寻找出路。如果我终于找到解决办法,我一定会及时通知你。
  • @GinoWine :谢谢,一定要研究我建议的可能性,渲染属性可以是一个非常强大的武器!
【解决方案2】:

如何创建一个两个列的表

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

第二列将是名称:等级

这就是它在 Uni/College 中的显示方式......

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

【讨论】:

  • 我打算只记录一个课程名称的成绩、分数和 GPA。但我会试一试...
【解决方案3】:

您可以使用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&lt;String, String&gt;,因为它保持顺序),那么请改为这样做:

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

【讨论】:

  • 非常感谢您的评论。很抱歉,我已经在你的博客上评论了这个问题,我想我很想引起你的注意。我将应用您的建议,如果我遇到任何问题,我也会发表评论。谢谢...
  • 博客上的评论应该与博客文章相关,而不是完全不同的东西,否则它们可能会被删除。如果您有任何问题,只需将其发布在 Stack Overflow 等问答网站上(如您所见)。
  • 我明白你在说什么。非常抱歉。谢谢
【解决方案4】:

您可以在运行时使用支持 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2017-08-22
    相关资源
    最近更新 更多