如何有条件地更改JSR-168 portlet的初始JSP?
我有一个运行在WebSpherePortal6.0上的JSR-168 portlet应用程序。如何有条件地更改JSR-168 portlet的初始JSP?,jsp,portlet,jsr168,Jsp,Portlet,Jsr168,我有一个运行在WebSpherePortal6.0上的JSR-168 portlet应用程序。 在应用程序的portlet.xml文件中,特定的portlet定义如下: <portlet> <portlet-name>Individual Portlet</portlet-name> <display-name>Individual Portlet</display-name> <display-name xml
在应用程序的portlet.xml文件中,特定的portlet定义如下:
<portlet>
<portlet-name>Individual Portlet</portlet-name>
<display-name>Individual Portlet</display-name>
<display-name xml:lang="en">
Individual Portlet
</display-name>
<portlet-class>
com.companyname.util.hibernate.MHFacesHibernatePortlet
</portlet-class>
<init-param>
<name>com.ibm.faces.portlet.page.view</name>
<value>/TEIndividual/TEIndividualView.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>
<resource-bundle>
resources.nl.IndividualPortletResource
</resource-bundle>
<portlet-info>
<title>Individual Portlet</title>
</portlet-info>
<portlet-preferences>
<preference>
<name>portletType</name>
<value>individual</value>
</preference>
<preference>
<name>wmmAttribSalesmanId</name>
<value>facsimileTelephoneNumber</value>
</preference>
</portlet-preferences>
</portlet>
MHFacesPortlet类的源代码:
package com.companyname.util.hibernate;
import java.io.IOException;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import com.companyname.util.portlet.MHFacesPortlet;
public class MHFacesHibernatePortlet extends MHFacesPortlet {
/*
* (non-Javadoc)
*
* @see com.ibm.faces.webapp.FacesGenericPortlet#doConfigure(javax.portlet.RenderRequest,
* javax.portlet.RenderResponse)
*/
public void doConfigure(RenderRequest arg0,RenderResponse arg1)
throws PortletException,IOException {
super.doConfigure(arg0,arg1);
try {
HibernateUtil.commitTransaction();
} finally {
HibernateUtil.closeSession();
}
}
/*
* (non-Javadoc)
*
* @see javax.portlet.GenericPortlet#doView(javax.portlet.RenderRequest,
* javax.portlet.RenderResponse)
*/
public void doView(RenderRequest arg0,RenderResponse arg1)
throws PortletException,IOException {
super.doView(arg0,arg1);
// Close and commit open hibernate transactions
try {
HibernateUtil.commitTransaction();
} finally {
HibernateUtil.closeSession();
}
}
}
package com.companyname.util.portlet;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletMode;
import com.ibm.faces.webapp.FacesGenericPortlet;
public class MHFacesPortlet extends FacesGenericPortlet {
private static final String FACES_CURRENT_PAGE_STUB="com.ibm.faces.portlet.page.";
/** parameter used to fire an extended action */
public static final String PARAMETER_EXTENDED_ACTION="extAction";
/** Action to reset view mode of the portlet */
public static final String ACTION_VIEW_MODE_RESET="viewReset";
public MHFacesPortlet() {
super();
}
/*
* (non-Javadoc)
*
* @see javax.portlet.Portlet#processAction(javax.portlet.ActionRequest,
* javax.portlet.ActionResponse)
*/
public void processAction(ActionRequest request,ActionResponse response)
throws PortletException {
// Check if we need to process an extended action
String extendedAction=(String)request
.getParameter(PARAMETER_EXTENDED_ACTION);
if (extendedAction!=null&&!extendedAction.equals("")) {
// Reset view mode
if (extendedAction.equals(ACTION_VIEW_MODE_RESET)) {
PortletMode portletMode=request.getPortletMode();
String modeString=null;
if (portletMode.equals(PortletMode.EDIT)) modeString="edit";
else if (portletMode.equals(PortletMode.VIEW)) modeString="view";
else if (portletMode.equals(PortletMode.HELP)) modeString="help";
else modeString=portletMode.toString();
String homeJsp=getPortletConfig().getInitParameter(
FACES_CURRENT_PAGE_STUB+modeString);
request.getPortletSession().setAttribute(
FACES_CURRENT_PAGE_STUB+modeString,homeJsp);
}
}
//delegate to ibm faces
super.processAction(request,response);
}
}
这不应该涉及重定向,就像更改portlet分派到的JSP一样 正如我对您的问题所作的评论,查看
MHFacesHibernatePortlet
的源代码将非常有帮助。但是,至少在MHFacesHibernatePortlet
中,您可以重写init(PortletConfig配置)
,然后有条件地更改所使用的init参数的值。这可以遵循以下方法:在传入的PortletConfig
周围添加一个过滤器,如果使用相同的com.ibm.faces.portlet.page.view
键名调用该过滤器,则会覆盖该过滤器以返回getInitParameter
的备用值,然后使用过滤器实现调用super.init(…)
。但是,如果需要将不同的JSP返回给不同的portlet请求,则此将不起作用,因为此init参数将用于portlet实例服务的所有请求
但是,更好的方法是查看自定义portlet(或其父级之一)引用此init参数的位置,并将自定义逻辑放在那里
更新(以下是您更新的评论): 要更改初始(视图)JSP,需要覆盖
doView
,而不是processAction
。有关如何实现此目标的具体示例,请参见:
在没有JSF操作的情况下更改JSF portlet页面
您可以使用Faces操作结果和导航规则更改Facesportlet中的页面
如果要在不使用Faces操作的情况下更改页面,可以将JSP文件路径设置为以下会话属性之一:
例如,您可以创建Facesportlet的子类,并在doView()
方法中设置会话属性,以在某些情况下更改页面:
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
if (...) {
request.getPortletSession().setAttribute("com.ibm.faces.portlet.page.view", "/MyPage.jsp");
}
super.doView(request, response);
}
这不应该涉及重定向,就像更改portlet分派到的JSP一样 正如我对您的问题所作的评论,查看
MHFacesHibernatePortlet
的源代码将非常有帮助。但是,至少在MHFacesHibernatePortlet
中,您可以重写init(PortletConfig配置)
,然后有条件地更改所使用的init参数的值。这可以遵循以下方法:在传入的PortletConfig
周围添加一个过滤器,如果使用相同的com.ibm.faces.portlet.page.view
键名调用该过滤器,则会覆盖该过滤器以返回getInitParameter
的备用值,然后使用过滤器实现调用super.init(…)
。但是,如果需要将不同的JSP返回给不同的portlet请求,则此将不起作用,因为此init参数将用于portlet实例服务的所有请求
但是,更好的方法是查看自定义portlet(或其父级之一)引用此init参数的位置,并将自定义逻辑放在那里
更新(以下是您更新的评论): 要更改初始(视图)JSP,需要覆盖
doView
,而不是processAction
。有关如何实现此目标的具体示例,请参见:
在没有JSF操作的情况下更改JSF portlet页面
您可以使用Faces操作结果和导航规则更改Facesportlet中的页面
如果要在不使用Faces操作的情况下更改页面,可以将JSP文件路径设置为以下会话属性之一:
例如,您可以创建Facesportlet的子类,并在doView()
方法中设置会话属性,以在某些情况下更改页面:
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
if (...) {
request.getPortletSession().setAttribute("com.ibm.faces.portlet.page.view", "/MyPage.jsp");
}
super.doView(request, response);
}
为了正确回答这个问题,我们需要查看
MHFacesHibernatePortlet
的源代码。(给定com.ibm.faces…
的init param/name
,我猜这个portlet类必须扩展一个基本的IBMportlet类。)添加了一些信息和源代码。尝试了一个更改(在processAction方法中),但没有效果。Scott-请查看我的更新答案。要正确回答此问题,我们需要查看MHFacesHibernatePortlet
的源代码。(给定com.ibm.faces…
的init param/name
,我猜这个portlet类必须扩展一个基本的IBMportlet类。)添加了一些信息和源代码。尝试了更改(在processAction方法中),但没有效果。Scott-请查看我的更新答案。谢谢。我想我已经差不多明白了。重写的processAction方法具有读取参数的代码,然后将其传递到request.getPortletSession().setAttribute()。我应该能够更改其中的值。在与客户讨论后,我最终决定不需要这种复杂情况,但考虑到包含了有关此主题的IBM信息,我认为您的回答是正确的。谢谢。我想我已经差不多明白了。重写的processAction方法具有读取参数的代码,然后将其传递到request.getPortletSession().setAttribute()。我应该能够更改其中的值。在与客户讨论后,我最终决定不需要这个复杂的问题,但考虑到包含了有关该主题的IBM信息,我认为您的回答是正确的。