2013-04-26 53 views
0

我的問題很簡單,但我找不到解決它的方法。我有很多JSF XHTML頁面(使用IceFaces庫,但我想這不會改變任何東西),其中一些包括其他頁面,其中包含ui:include指令。這當然是遞歸的,當應用程序可以重現錯誤時,找到哪個XHTML顯示它並不總是很容易。如何打印呈現的XHTML文件的名稱

我想要做的是:打印所有在網頁渲染過程中使用的XHTML頁面的名稱。我能找到的唯一方法是在每個XHTML文件中添加一個顯示。例如,displayCustomer.xhtml會有這個作爲第一行:

<outputText rendered="#{myBean.debugXHTML}" value="displayCustomer.xhtml" /> 

這工作,但想我應該添加到我的所有文件類似的指令。如果可能的話,我希望沒有改變我的XHTML文件。如果這是不可能的,我希望它的輸出文本與我的所有文件完全相同(所以一個小的shell腳本可以在ui:composition指令之後添加此行)。

我在JBoss 7.1.X上使用mojarra 2.1.X版本(不知道這是否有幫助)。

在此先感謝您的幫助,我找不出任何解決方案。

+0

編輯你的問題保持「禮貌」記住,這樣我們就不會從閱讀分心。我們知道你可能會筋疲力盡,但不應該把重點放在我們身上。 – skuntsel 2013-04-26 13:42:53

+0

這不應該是粗魯的,編輯! – Wis 2013-04-26 19:18:48

+0

謝謝。但我明白你一定感受到了什麼!現在你有兩個答案,這取決於你想輸出的內容:查看我是否或請求URL。 – skuntsel 2013-04-26 19:29:32

回答

1

我想我有一個解決方案...

在您的XHTML頁面添加這樣:​​

<ice:outputText id="myHiddenCompo" rendered="#{DebugXHTML}" value="#{bean.getFileNameAndPath()}" /> 

在BackingBean創建這樣一個方法:

public final String getFileNameAndPath(){ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    UIViewRoot root = context.getViewRoot(); 
    UIComponent c = JSFHelper.findComponent(root, "myHiddenCompo"); 
    return c.getValueExpression("value").toString(); 
    } 

JSFHelper.java提取物:

public static UIComponent findComponent(final UIComponent c, final String id) { 
    if (id.equals(c.getId())) { 
     return c; 
    } 

    Iterator<UIComponent> kids = c.getFacetsAndChildren(); 
    while (kids.hasNext()) { 
     UIComponent found = findComponent(kids.next(), id); 
     if (found != null) { 
      return found; 
     } 
    } 
return null; 
} 

結果:

/WEB- INF /包括/文件夾/ verticalTabs/folderDisplay.xhtml @ 8,114 值= 「#{#{bean.getFileNameAndPath()}}」

後,您可以使用字符串來獲得您需要的部分。

我找到了一個 '好' 的實現,是因爲上面,我們有多個ID的一個問題(JSF 2查找重複的ID)

就在XHTML中加入這一行:

<ice:outputText rendered="#{DebugXHTML}" value="#{bean.getFileNameAndPath(component)} "/> 

組件是表示當前組件的jsf 2的關鍵字。

並修改支持bean代碼:

public final String getFileNameAndPath(UIComponent hiddenCompo) { 
    String manipString = hiddenCompo.getValueExpression("value").toString(); 
    return manipString.substring(0, manipString.indexOf(".xhtml") + 6); 
    } 
+0

完美!這正是我所期待的! – Wis 2013-07-24 13:55:59

1

#{view.viewId}會得到您正在呈現的當前視圖的名稱。所以你必須

<h:outputText rendered="#{myBean.debugXHTML}" value="#{view.viewId}" /> 

view對象是一個隱含的EL對象,它是類似於UIViewRoot對象你會從FacesContext拉在支持bean。

+0

該解決方案確實輸出瀏覽器URL:'/ pages/index.xhtml'。這不是我正在尋找的輸出。我想要打印'displayCustomer.xhtml'('index.xhtml'包含其他文件)。 – Wis 2013-04-29 11:00:36

0

可選擇使用#{view.viewId},你還可以利用花葯隱含EL對象,#{request},這使您可以訪問HttpServletRequest實例中,這樣你可以得到不在形式/index.html視圖id,而是通過在瀏覽器的URL ,例如,

#{request.requestURL}?#{request.queryString} 
+0

這不是我要找的。它顯示'http:// localhost:8080/## CONTEXT_ROOT ##/pages/index.jsf',接近本主題中提出的第一個解決方案。我想要'displayCustomer.xhtml'作爲輸出,這是主頁面中包含的文件的名稱,而不是主頁面本身。 – Wis 2013-04-29 11:07:18

+0

清楚地說明你想輸出的內容。你爲什麼期望它輸出與你在瀏覽器欄中看到的不同的內容? – skuntsel 2013-04-29 11:10:55

+0

我的英文不完美,我確實認爲我的主要文章很清楚,但顯然不完全。瀏覽器中的地址始終是'/ pages/index.jsf',而不是別的。一切都包含在'ui:include'中。我想知道的是包含XHTML page_的渲染。例如,我想在應用程序的主菜單旁邊有一個'mainMenu.xhtml'文本,子菜單旁邊的'subMenu.xhtml'文本,頁面中央的'displayCustomer.xhtml'文本if我正在瀏覽顯示客戶詳細信息的頁面,... – Wis 2013-04-29 14:11:42