我真的需要你帮助我解决这个问题。无论如何,我是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数据库服务器。
答案 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);
}