0

我有一个在 Websphere Portal Server 8.0 中运行的 JSR 286 portlet。在那里,我进行文件上传,然后显示处理结果。最初,我负责处理此文件的托管 bean 有一个请求范围 (@RequestScoped)。当我单击命令按钮上传文件时,MB 中的方法正确处理并填充必须在 JSP 页面中显示的结果集合(以下 MB 中的dadosCarga 属性)。但是,当我重新处理页面时,我得到一个堆栈跟踪,解释说我的托管 Bean 类未找到 (ClassNotFoundException) 并且未显示结果。我使用 ViewScoped 得到了相同的结果。就在我将范围从 Request 更改为 Session (@SessionScoped) 时,结果就会显示出来。

在我搜索了一些答案后,我发现这个页面解释了 Portlets 中动作和呈现请求之间的区别。建议使用JSF Portlet bridge。但是,此页面不再处于活动状态。Apache Myfaces有一个Portlet 桥接器(IBM 门户在 MyFaces 上运行)。但是,我看不到如何使用它。是否只是将两个 jars(api 和 implementation)放在 WEB-INF/lib 中?我试过了,但是当我尝试在应用程序中加载页面时出现异常。所以我删除它们。

下面,我展示了 My Portlet 配置、Managed 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>

豆角

@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>

有关更多信息,请下载并查看 Portlet V2.0 规范中的以下部分:PLT.10.4.4 Runtime Option javax.portlet.actionScopedRequestAttributes

于 2013-10-31T10:09:43.957 回答
0

您对渲染和操作请求是正确的,JSF(或 CDI)请求和 ViewScoped 无法正常工作。但解决方案可能是使用包含全新范围的JBoss Portlet Bridge - PortletLifecycleScoped 和 PortletRedisplayScoped。第一个的行为与 RequestScope 完全相同,您将在docs中找到更多信息。但是,我不确定是否能够在 GateIn 以外的其他门户中使用这些范围。

于 2013-07-06T10:48:06.257 回答
0

当您使用请求范围时,需要将数据从 portlet 操作传送到 portlet 呈现阶段。通常通过 portlet 渲染参数为请求范围的 bean 携带数据,这些参数是一个字符串。为了将您的数据保存在那里,您的对象需要可序列化。

除此之外,您可能希望将 WebSphere Portal 下的 WebSphere Application Server 升级到版本 8.0.0.6,以避免PM79460和 Portal 本身也升级到最新的 FixPack。

希望这可以帮助。

顺便说一句:JSR286 和 JEE6 没有指定 CDI 如何与 Portlet 编程模型交互。您可能想为此查看JSR362

于 2013-07-31T20:55:58.877 回答
0

IBM 使用自己的 portlet 桥。除此之外,不建议使用任何桥梁。

于 2014-02-07T13:13:22.633 回答