IBM Portal 8.0中的请求范围问题
我有一个在Websphere Portal Server 8.0中运行的JSR 286 portlet。在那里,我做了一个文件上传,并在显示处理结果后。最初,我负责处理这个文件的托管bean有一个请求范围(@RequestScoped)。当我点击命令按钮上传文件时,MB中的方法会正确处理并填充必须在JSP页面中显示的结果集合(以下MB为dadosCarga属性)。然而,当我重新页面时,我得到了一个堆栈跟踪,说明我的Managed Bean类未找到(ClassNotFoundException),并且结果未显示。我使用ViewScoped获得了相同的结果。就在我将请求范围改为Session(@SessionScoped)时,结果显示出来了。IBM Portal 8.0中的请求范围问题
对于某些回答我找到googled后,我发现this page解释了Portlet中动作和呈现请求之间的区别。建议使用JSF Portlet bridge。但是,此页面不再有效。有一个Portlet bridge for Apache Myfaces(IBM门户运行MyFaces)。但是,我看不出如何使用它。它只是把两个罐子(API和实施)在WEB-INF/lib?我试过了,但是当我尝试在应用程序中加载页面时遇到了异常。所以我删除它们。
下面,我将显示我的Portlet配置,Managed Bean和JSP页面。有没有其他的选择,更好的想法如何处理这个?或者可能是关于如何使用correclty MyFaces Bridge的解释(我在主页中找不到任何内容)。
谢谢,
圣拉斐尔丰索
portlet配置:
<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>
Manged豆:
@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...
}
Ĵ SP页面(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>
你说得对有关渲染和动作请求,JSF(或CDI)请求和ViewScoped不能正常工作。但解决方案可以使用JBoss Portlet Bridge,其中包含全新的范围 - PortletLifecycleScoped和PortletRedisplayScoped。第一个将像RequestScope一样运行,您将在docs中找到更多信息。但是,我不确定能否在GateIn以外的其他门户网站中使用这些范围。
请尝试在portlet中添加以下内容。XML,看看它的工作原理:
<container-runtime-option>
<name>javax.portlet.actionScopedRequestAttributes</name>
<value>true</value>
</container-runtime-option>
欲了解更多信息,请下载并检查的Portlet V2.0规范以下部分: PLT.10.4.4运行选项 javax.portlet.actionScopedRequestAttributes
IBM使用它自己的portlet桥。除此之外,不建议使用任何桥接器。