2013-05-20 91 views
0

我真的需要你的幫助來解決我的項目中遇到的這個問題。無論如何,JSF是新手。我正在開展一個項目,並且有這個模塊,在認證成功後,考試記錄會從數據庫中顯示給學生。如果所有學生都在同一個班級並提供相同數量的課程,這很容易,因爲您可以創建一個dataTable模型,然後在您的視圖中使用它。但就我而言,該數據庫包含不同部門和類別的學生考試記錄表,如計算機科學100,200和300級別,地質100,200和300級別等。這些學生還提供完全不同的課程。一些提供物理,消費稅,電腦和一些不。Display DataTable with unknown numbers of column

我的問題是如何動態地向不同的學生顯示其在數據表中的成績和課程名稱。讓我試試看。

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數據庫服務器。

+1

還沒有讀你的整個問題,但是... ...這是你在找什麼:http://www.primefaces.org/showcase/ui/datatableDynamicColumns.jsf(DataTable - 動態列) – Daniel

+0

@Daniel,謝謝,但這不正是我所期待的。我知道我的問題有點冗長,但我試圖解釋它,以便你們能理解。我想要一個可以用來顯示學生考試記錄的代碼。我不是要求整個代碼,而是要求發生這種情況的邏輯。我知道無法通過簡單地創建模型數據表並在視圖中使用它。請嘗試閱讀問題陳述,以便了解駕駛的內容。再次感謝... –

回答

0

我處於類似的情況,恐怕沒有辦法用未知列填充Datatable。你必須事先有麻煩。 在我的情況下,我發現爲了這個特殊需要轉移到JSP更容易,並讓JSF更加「靜態」使用。 在我的理解中,Datatable的唯一動態方面是行的麻煩。

解決此問題的一種方法是使用列的呈現屬性,在這種情況下,您將放入每個可能的列並決定(例如,通過bean)顯示或不顯示其中的一些,並隱藏一些其他。這是最好的半動態,但仍然是一個宜居的解決方案。

祝你好運。

P.S:如果錯了,請告訴我解決方案,因爲我會好奇地知道它雖然無法使用它。

+0

謝謝@Gloserio,我仍在研究和尋找出路。如果我終於找到解決辦法,我一定會保持你的貼文。 –

+0

@GinoWine:謝謝,一定要研究我提出的可能性,渲染屬性可以是一個相當強大的武器! – Akheloes

0

如何創建列的表格

第一列將被命名爲:課程代碼/名稱

第二列將名字:等級

那它是如何無論如何顯示在Uni/College ...

要實現它只是創建一個對象克拉2 Strings並填充這些對象的列表...,這將是你h:datatablevalue屬性...

+0

我打算只記錄一個課程名稱的成績,成績和GPA。但我會試一試... –

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

非常感謝您的評論。很抱歉,我已經在您的博客上評論過這個問題,我想我非常渴望得到您的關注。我要應用你的建議,如果我遇到任何問題,我也會評論回來。謝謝... –

+0

博客評論應該與博客文章相關,而不是完全不同的內容,否則他們可能會被刪除。如果您有任何問題,請將其發佈到Stack Overflow等問答網站上(正如您發現的那樣)。 – BalusC

+0

我明白你在說什麼。深表歉意。謝謝 –

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); 
}