0

Websphere Portal Server 8.0 で JSR 286 ポートレットを実行しています。そこで、ファイルのアップロードを行い、処理の結果を表示します。最初に、このファイルの処理を担当するマネージド Bean にはリクエスト スコープ (@RequestScoped) があります。コマンド ボタンをクリックしてファイルをアップロードすると、MB 単位のメソッドが正しく処理され、JSP ページに表示する必要がある結果のコレクション (以下の MB 単位の dadosCarga 属性) が入力されます。ただし、ページを再デライゼーションすると、Managed Bean クラスが見つからなかったこと (ClassNotFoundException) を説明するスタックトレースが表示され、結果が表示されません。ViewScoped を使用しても同じ結果が得られました。Request から Session (@SessionScoped) にスコープを変更すると、結果が表示されます。

いくつかの答えをグーグルで検索した後、ポートレットでのアクションとレンダリング要求の違いについて説明しているこのページを見つけました。JSF Portlet bridgeを使用することが提案されました。ただし、このページはもうアクティブではありません。Apache Myfaces 用のポートレット ブリッジがあります (IBM ポータルは MyFaces 上で実行されます)。しかし、私はそれを使用する方法を見ることができませんでした。両方の jar (api と実装) を WEB-INF/lib に入れるだけですか? 試してみましたが、アプリケーションでページをロードしようとすると例外が発生しました。だから私はそれらを削除します。

以下に、私のポートレット構成、マネージド Bean、および JSP ページを示します。これに対処する方法について、代替案、より良いアイデアはありますか? または、適切な MyFaces Bridge の使用方法についての説明かもしれません (ホームページには何も見つかりませんでした)。

ありがとう、

ラファエル・アフォンソ

ポートレット構成:

<portlet>
    <portlet-name>CargaUsuarios</portlet-name>
    <display-name>CargaUsuarios</display-name>
    <portlet-class>com.ibm.faces20.portlet.FacesPortlet</portlet-class>
    <init-param>
        <name>com.ibm.faces.portlet.page.view</name>
        <value>/pages/carga/cargaUsuarios.jsp</value>
    </init-param>
    <init-param>
        <name>wps.markup</name>
        <value>html</value>
    </init-param>
    <expiration-cache>0</expiration-cache>
    <supports>
        <mime-type>text/html</mime-type>
        <portlet-mode>view</portlet-mode>
    </supports>
    <portlet-info>
        <title>Carga de Usuarios</title>
        <short-title>Carga deUsuarios</short-title>
        <keywords>Carga Usuario</keywords>
    </portlet-info>
</portlet>

管理された Bean :

@ManagedBean(name = "cargaUsuariosMB")
@RequestScoped
public class CargaUsuariosMB extends AbstractMB {

    private String nomeArquivo; // FIle name

    private Collection<CargaUsuarioInfoBean> dadosCarga; // processing result.

    public String doUploadArquivo() {
        this.dadosCarga = ... // process file and receives a collection 

        this.nomeArquivo = ... // get uploaded file name

        return null; // Return to same origin page
    }

    // Getters...

}

JSP ページ (cargaUsuarios.jsp) :

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<%@taglib
    uri="http://www.ibm.com/xmlns/prod/websphere/portal/v6.1/portlet-client-model"
    prefix="portlet-client-model"%>
<%@page language="java" contentType="text/html"
    pageEncoding="ISO-8859-1" session="false"%>

<portlet:defineObjects />
<portlet-client-model:init>
    <portlet-client-model:require module="ibm.portal.xml.*" />
    <portlet-client-model:require module="ibm.portal.portlet.*" />
</portlet-client-model:init>
<f:view>
    <h2>Carga de Usuários</h2>
    <h:form enctype="multipart/form-data">
        <p>
            <label for="arquivoCarga"> <span>File:</span> </label> <input
                type="file" name="arquivoCarga" id="FileCarga" />
        </p>
        <br />
        <br />
        <h:commandButton value="Salvar File"
                    action="#{cargaUsuariosMB.doUploadArquivo}"></h:commandButton>
    </h:form>
    <h:panelGroup id="pnlProcessamento"
        rendered="#{not empty cargaUsuariosMB.dadosCarga }">
        <h:outputText
            value="Dados do File #{cargaUsuariosMB.nomeArquivo} processados com sucesso."></h:outputText>
        <br />
        <h:dataTable id="tblDadosProcessamento"
            columnClasses="numLinha,cpf,status"
            value="#{cargaUsuariosMB.dadosCarga}" var="dadosCarga"
            styleClass="dadosProcessamento" width="100%" border="1">
            <%-- Show processing results. --%>
        </h:dataTable>
    </h:panelGroup>
    <h:messages styleClass="messages" id="msgsPesquisaCadastro"
        errorClass="mensagensErro" errorStyle="color: red;"></h:messages>
</f:view>
4

4 に答える 4

1

portlet.xml に以下を追加してみて、動作するかどうかを確認してください。

<container-runtime-option>
    <name>javax.portlet.actionScopedRequestAttributes</name>
    <value>true</value>
</container-runtime-option>

詳細については、ポートレット V2.0 仕様の次のセクションをダウンロードして確認してください。 PLT.10.4.4 ランタイム オプション javax.portlet.actionScopedRequestAttributes

于 2013-10-31T10:09:43.957 に答える
0

レンダリングとアクション リクエスト、JSF (または CDI) リクエスト、および ViewScoped が正しく機能しないことについては正しいです。しかし、ソリューションは、まったく新しいスコープ (PortletLifecycleScoped および PortletRedisplayScoped) を含むJBoss Portlet Bridgeを使用することです。最初のものは RequestScope とまったく同じように動作します。詳細についてはdocsを参照してください。ただし、GateIn 以外のポータルでこれらのスコープを使用できるかどうかはわかりません。

于 2013-07-06T10:48:06.257 に答える
0

IBM は、独自のポートレット ブリッジを使用しています。それに加えてブリッジを使用することはお勧めしません。

于 2014-02-07T13:13:22.633 に答える