处理门户网站服务器上的数据冲突

时间:2013-11-27 15:29:56

标签: java portlet websphere-portal

我在this article中读到,如果我们有2个portlet,则都会呈现一个jsp,其中一个文本框名称为userName。当我们在其中一个portlet的文本框中输入“test”时,如果我们在doView方法中有这样的内容:

String userName = request.getParameter("UserName");

然后两个portlet的userName都将进行值测试。

我知道当我们将processAction作为post方法调用时,将调用门户页面中所有portlet的doView方法。

出于某种原因,这不会发生在我身上,因为两个portlet的userName都没有值“test”。只有调用post方法的那个具有值“test”。

我正在使用IBM Websphere portal 8.0

   <FORM method="GET" action="<%=renderResponse.createRenderURL()%>">

 <INPUT name="<%=QuickSearchPortlet.FORM_TEXT%>" type="text"/>
        User Name: <input type="text" name="UserName"/>
 <INPUT name="<%=QuickSearchPortlet.FORM_SUBMIT%>" type="submit" value="Submit"/>
        <input type="file" name="imageFile">
  </FORM>.

多个portlet的doView()方法:String userName = request.getParameter(“UserName”);

3 个答案:

答案 0 :(得分:0)

根据portlet规范,您需要执行以下操作:

Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null)
15 ? (String)
userInfo.get(PortletRequest.P3PUserInfos.USER_NAME_GIVEN) : “”;
String lastName = (userInfo!=null)
? (String)
userInfo.get(PortletRequest.P3PUserInfos.USER_NAME_FAMILY) : “”;

答案 1 :(得分:0)

您的代码将其视为

request.getParameter("UserName");

这意味着它是您每次都要提交的请求的一部分。您要提交的请求是针对要为其调用操作方法的portlet。其他portlet只是调用doView方法。如果其他portlet也将userName称为request.getParameter("UserName");,那么很明显,该值未提交给它们。

如果您希望在portlet之间使用用户名,则必须进行portlet间通信,或者如果在其他portlet中的值相同,则在会话中共享该属性。另外,您是否尝试调试其他portlet的doView()方法以查看它们是否被调用?

答案 2 :(得分:0)

萨钦,

如果我理解你正确,你试图调用portlet的processAction,并期望参数在所有portlet的doView中可用?

如果要提交processAction(在表单操作中使用actionURL),则只会调用目标portlet的processAction。然后门户网站容器调用所有portlet的doView。 调用doViews时,参数不会从processAction传输到doView。所以你不会在任何doViews中看到参数。

编辑:如果你从表单提交doView(在表单操作中使用renderURL) - 我将不得不测试这个场景将在下周试用。

注意:通常您不提交表单来呈现阶段,因为您不应该在reder阶段更改portlet状态。 - refer to this also

请提供您的jsp表单代码和portlet控制器代码,以便为您提供更准确的答案。