【问题标题】:How to conditionally change the initial JSP for a JSR-168 portlet?如何有条件地更改 JSR-168 portlet 的初始 JSP?
【发布时间】:2012-02-01 01:38:37
【问题描述】:

我有一个在 WebSphere Portal 6.0 上运行的 JSR-168 portlet 应用程序。
在应用程序的 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>

请注意,它定义了一个名为“com.ibm.faces.portlet.page.view”的参数,其值为“/TEIndividual/TEIndividualView.jsp”,这是呈现 portlet 时使用的初始 JSP。
我需要根据数据库查询的结果有条件地更改该参数的值。

我认为这可能涉及 MHFacesHibernatePortlet 类中某处的重定向。
是否正确,我应该修改类的什么方法?

编辑,包含更多信息和两个类的源代码...

我已经为下面的 MHFacesHibernatePortlet 类以及它扩展的 MHFacesPortlet 类添加了代码。

在应用程序的 portlet.xml 文件中,多个 portlet 都配置为使用 MHFacesHibernatePortlet 类,但每个 portlet 使用不同的初始 JSP。上面的“个人 Portlet”只是一个例子。

我只需要有条件地更改某些 portlet 的初始 JSP,因此我有一些代码应该能够根据我想要更改的列表检查 JSP 名称,然后运行 ​​Hibernate 查询,然后仅在必要时更改 JSP 名称。

我在MHFacesPortlet.processAction 中看到它读取相关参数并在某些情况下将其传递给request.getPortletSession().setAttribute(),因此我尝试将代码放在那里并更改homeJsp 变量,但这不起作用。添加一些日志记录后,我发现当我转到具有这些 portlet 之一的页面时,甚至没有调用 processAction。

MHFacesHibernatePortlet 类的来源:

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(); } } }

MHFacesPortlet 类的来源:

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); } }

【问题讨论】:

  • 要正确回答这个问题,我们需要查看MHFacesHibernatePortlet 的来源。 (鉴于com.ibm.faces...init-param/name,我猜这个portlet 类必须扩展一个基础IBM portlet 类。)
  • 添加了一些信息和源代码。尝试了无效的更改(在 processAction 方法中)。
  • Scott - 请查看我的更新答案。

标签: jsp portlet jsr168


【解决方案1】:

这不应该涉及重定向,就像更改 portlet 分派到的 JSP 一样。

正如我对您的问题的评论,查看MHFacesHibernatePortlet 的来源真的很有帮助。但是,至少在MHFacesHibernatePortlet 内,您可以覆盖init(PortletConfig config),然后有条件地更改所使用的init 参数的值。这可以遵循在传入的PortletConfig 周围添加过滤器的方法,如果使用相同的com.ibm.faces.portlet.page.view 键名调用getInitParameter,则该过滤器被覆盖以返回getInitParameter 的备用值 - 然后使用您的过滤器实现调用super.init(...)。但是,如果您需要将不同的 JSP 返回到不同的 portlet 请求,则此将不起作用,因为此 init 参数将用于 portlet 实例服务的所有请求。

但是,更好的方法是查看自定义 portlet(或其父级之一)在哪里引用此 init 参数,然后将您的自定义逻辑放在那里。


更新(在您更新的 cmets 之后):

要更改初始(视图)JSP,您需要覆盖doView,而不是processAction。有关如何完成此操作的具体示例,请参阅 http://publib.boulder.ibm.com/infocenter/radhelp/v6r0m1/index.jsp?topic=%2Fcom.ibm.etools.portal.doc%2Ftopics%2Ftnoactionmode.html

在没有 JSF 操作的情况下更改 JSF portlet 页面

您可以使用 Faces 操作结果和导航规则更改 Faces portlet 中的页面。

如果您想在不使用 Faces 操作的情况下更改页面,可以将 JSP 文件路径设置为以下会话属性之一:

...

例如,您可以创建 Faces portlet 的子类,并在 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);
}

【讨论】:

  • 谢谢。我想我已经差不多明白了。重写的 processAction 方法具有读取参数然后将其传递给 request.getPortletSession().setAttribute() 的代码。我应该能够改变那里的价值。
  • 在与客户讨论后最终决定不需要这种复杂性,但考虑到包含有关该主题的 IBM 信息,您的答案是正确的。
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多