2011-06-06 108 views
2

我仍然學習使用JSF 2中的組合組件的一些功能。我對JSF 1.2開發有經驗,最近我讀了Geary和Horstmann編寫的「Core Java Server Faces 3rd Edition」一書。JSF 2 - 如何在複合組件子項完成操作後執行操作?

我想要做的是創建一個包裝文件上傳組件(目前使用PrimeFaces <p:fileUpload>)的複合組件。我需要將上傳的文件與會話作用域託管bean上的基於字符串的鍵關聯(稍後使用)。我試圖通過名爲'uploadedFileKey'的複合組件接口上的一個屬性來提供密鑰。下面是接口:

<html xmlns:composite="http://java.sun.com/jsf/composite"> 
    <composite:interface> 
     <composite:attribute name="uploadedFileKey" 
      type="java.lang.String" 
      required="true" /> 
    </composite:interface> 
    ... 
</html> 

的實現很簡單,使用PrimeFaces文件上傳標籤正如我前面提到。它需要一個帶有事件處理程序的託管bean,我也是基於來自PrimeFaces展示web應用程序的示例代碼創建的。下面是我的實現:

<composite:implementation> 
    <p:fileUpload 
     fileUploadListener="#{primeFacesFileUploadController.handler}" 
     label="Browse" 
     mode="advanced" 
     allowTypes="png,gif,jpg" /> 
</composite:implementation> 

我不打算在這裏包括整個控制器豆,但這裏是類的聲明:

@ManagedBean(name="primeFacesFileUploadController") 
@RequestScoped 
public class PrimeFacesFileUploadController { 
    // ... 
} 

的PrimeFaces文件上傳是不是不像別人,我有看到。它使用Faces Servlet上的自定義Filter來訪問上傳數據。實際的文件上傳部分工作正常,當上傳成功時,我將上傳的文件存儲在我的Tomcat服務器上的臨時文件中。

我的問題是不知道如何讓我的複合組件在成功上傳後採取行動。我希望我的複合組件將uploadedFileKey存儲在Map中的特定會話範圍的受管bean上,並將上傳的File作爲映射值。我怎樣才能做到這一點?

回答

1

我只是通過<f:attribute>作爲自定義組件屬性傳遞密鑰,並讓處理程序處理它。您可以通過event.getComponent().getAttributes()在處理程序方法中獲得它。

E.g.

<composite:implementation> 
    <p:fileUpload 
     fileUploadListener="#{primeFacesFileUploadController.handler}" 
     label="Browse" 
     mode="advanced" 
     allowTypes="png,gif,jpg"> 
     <f:attribute name="key" value="#{cc.attrs.uploadedFileKey}" /> 
    </p:fileUpload> 
</composite:implementation> 

public void handler(FileUploadEvent event) { 
    String key = (String) event.getComponent().getAttributes().get("key"); 
    yourSessionBean.getMap().put(key, event.getFile()); 
} 
+0

這看起來像它會工作。謝謝Balus。 – 2011-06-07 00:47:18

相關問題