首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

JSF 開發常見問題與解決方案匯總

     編輯:J2EE

問題 1:<f:subview> 中 <h:commandLink> 的 action 不執行

現象:包含頁面 (如導航欄) 使用 <f:subview>,被包含頁面含非 JSF 標籤 (如 <a>) 時需用 <f:verbatim> 包裹,但 <f:verbatim> 內容不在組件樹中,導致內部 <h:commandLink> action 失效。
解決:避免在 <f:verbatim> 中使用 JSF 組件,盡量全用 JSF 標籤。

問題 2:<f:subview> 中 action 執行但無法導航至 faces-config.xml 定義頁面

現象:action 方法執行了,但頁面不跳轉。
解決:檢查 faces-config.xml 中 <from-view-id>,若頁面被包含,應設為 "/*" 而非具體路徑 (如 "/navigatorbar.jspx")。

問題 3:結合 EMF 使用時拋出「找不到屬性」異常

現象:Error getting property 'xxx' from bean of type XXXX。
原因 1:EMF 生成的 XXXImpl 建構子為 protected,改為 public (注意保留 @generated 標記防重新生成覆蓋)。
原因 2:Bean 中存在同名不同參數方法 (如 getRecords() 和 getRecords(int year)),EL 解析衝突。
解決:重命名帶參數方法。
堆疊追蹤片段:
javax.faces.el.PropertyNotFoundException → PropertyResolverImpl → ArraySuffix → ComplexValue → ExpressionEvaluatorImpl → ValueBindingImpl → FacesBeanImpl → UIXComponentBase → UIXIterator → UIXCollection

問題 4:從 Session 移除一個 Bean

代碼方案:

ValueBinding binding = FacesContext.getCurrentInstance()
    .getApplication().createValueBinding("#{MyBean}");
binding.setValue(context, null);

將 Bean 綁定值設為 null 即可從作用域移除。

最佳實踐總結

  • 優先使用純 JSF 標籤,減少 <f:verbatim> 用法。
  • 導航規則 from-view-id 慎用通配符。
  • 托管 Bean 建構子必須為 public,避免重載屬性讀取器。
  • 操作作用域 Bean 時使用 ValueBinding API 而非直接操作 Map。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved