2013年4月21日日曜日

JSFポートレット・ファイルアップロード

JSFのファイルアップロード方法を解説したページがあったのでここに載せておく。
JSF Portlet File Upload
https://jsfportletbridge.java.net/public/JSFPortletFileUpload.html

まだ試してないが、
たぶんサブミットのアクションリスナで実装するのだと思う。

JSFにはファイルアップロード機能が無いので、SpringをWEBフレームワークとして優先させてたけど、ファイルアップロードがOKならばハナシはチョット変わってくる。
(ただJSF的には亜流感がかなりあるように思うが…)

そもそも何故JSFは2.0になってもファイルアップロード機能がサポートされないのだろう?
と疑問に思う。
誰も必要としていないのだろうか?
それなら、このような解説ページができるワケが無いよね。
何故なのだろう?

JSF Portlet File Upload
JSFポートレット・ファイルアップロード
This uses Portlet Filter approach to provide File Upload functionality in JSF Portlet.
これはJSFポートレットの中にファイルアップロード機能を提供する為にポートレットフィルタを使用したアプローチである。
This provides a generic solution that works in all JSF Portlet Bridges and will work on portals that support JSR 286.
ここで提供するのは通常のソリューションであり、全JSFポートレットブリッジで機能し、JSR286をサポートするポータルで機能する。
Following are the steps to add fileupload functionality in your jsf portlet ( See the example jsf fileupload portlet that uses this functionality.)
下記に追記するのは、あなたのJSFポートレットの中にファイルアップロード機能を追加するステップである(JSFファイルアップロード・ポートレットの例でこの機能の使用を見て欲しい)。

1. Add the following JARs to the WEB-INF/lib of the jsf portlet webapp.The version numbers doesn't matter as long as you get the newest.
1.下記JARファイルをJSFポートレットwebappのWEB-INF/libに追加する。最新版を入手する限り、バージョン番号は重要ではない。
commons-fileupload-1.2.1-jar  (supports file upload capability for a portlet)
commons-fileupload-1.2.1-jar  (ポートレットのファイルアップロード機能をサポート)
commons-io-1.4-jar (required by commons-fileupload)
commons-io-1.4-jar (commons-fileuploadに必要)
portlet-fileupload-filter.jar (handles the portlet filter and the fileupload functionality and makes the org.apache.commons.fileupload.FileItem available as a request attribute, Source Code)
portlet-fileupload-filter.jar (ポートレットフィルタとファイルアップロード機能をハンドルし、org.apache.commons.fileupload.FileItemをリクエスト属性として有効にさせる, ソースコード)


2. Add the following portlet filter entry in the portlet.xml
2.portlet.xmlに下記ポートレットフィルタ・エントリを追加する。
<portlet-app ..... version='2.0'>
    <portlet>
        <portlet-name>name_of_the_portlet</portlet-name>
                ........
    </portlet>
    <filter>
        <filter-name>PortletFileUploadFilter</filter-name>
        <filter-class>com.sun.portlet.PortletFileUploadFilter</filter-class>
        <lifecycle>ACTION_PHASE</lifecycle>
    </filter>
    <filter-mapping>
        <filter-name>PortletFileUploadFilter</filter-name>
        <portlet-name>name_of_the_portlet</portlet-name>
    </filter-mapping>
</portlet-app>


3. Define the fileupload component in the JSF page (you will use the name to get FileItem from the request)
3.JSFページにファイルアップロード・コンポーネントを定義する (リクエストからFileItemを入手するのにnameを使用する)
<input type="file" name="name_of_the_component" />


4. After you submit the JSF page, you can obtain the org.apache.commons.fileupload.FileItem for the input file component from the PortletRequest as follows. Once you have access to FileItem you can get the name, the I/O stream of the uploaded file.
4.JSFページでサブミットした後、下記でポートレットリクエストからインプットファイル・コンポーネントのFileItemが使用可能になる。一度FileItemのアクセスを取得すれば、アップロードされたファイルからnameやI/Oストリームが取得できる。
FacesContext facesContext = FacesContext.getCurrentInstance();
PortletRequest portletRequest = (PortletRequest) facesContext.getExternalContext().getRequest();
FileItem fileItem = (FileItem)portletRequest.getAttribute("name_of_the_component");



1 件のコメント:

  1. 初めまして。

    アップロード機能、確かに必要ですね!

    返信削除