1

我想同时获取这两个值,并且由于在加载 portlet 时会执行 init(Portletconfig),因此我认为这些值是否应该可用没有任何疑问。

对于 portletId 我试过了

String portletId = ((PortletConfigImpl) portletConfig).getPortletId(); 

但似乎我不能。猜猜这是因为 impl 在另一个 jar 中,不应该从 portlet 访问

顺便说一句,我的主要目标是将两个参数都传递给另一个非请求上下文,这样我就可以做到

final PortletPreferences prefs = PortletPreferencesFactoryUtil.getLayoutPortletSetup(LayoutLocalServiceUtil.getLayout(plid), portletId);

实时读取 portlet 的首选项。如果有任何其他方式可以从 init() 中表明这一点,比如获得整个偏好,那就足够了

编辑:我找到了一种不同的方法,并打开了一个新问题,稍微改变 了 Liferay:从 init() 获取 PortletID 和 companyID

4

3 回答 3

3

所以...如果我理解正确,您的目标是在您的 Portlet 类的 init 方法中读出 portlet 首选项。

根据 API,PortletPreferences可以从实例中检索对象,该实例在和类PortletRequest中都可用。例如:doView()processAction()

public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
    String name = request.getPreferences().getValue("name", null);

    Writer writer = response.getWriter();
    writer.write("Hello, "+name+"!");
}

需要注意的是,在 Liferay 中,portlet 首选项默认只存在于页面范围内,或者,在 Liferay 术语中,aLayout由 a 标识,是plid页面布局 ID 的简写。

关于您的init()方法,portlet API 规定应该在“处理第一个 portlet 请求之前”调用此方法。在 Liferay 中,您的 portlet 类的一个新实例(并且只有一个实例)是在部署时创建的,而不是在您在页面上添加 portlet 时创建的。实例化后,门户容器将调用init()portlet 类的方法。

结论:在您的 portlet 类的方法中检索 portlet 首选项完全没有意义init(),因为此时 portlet 没有任何Layout应该从中检索首选项的上下文(读取:)。

于 2012-09-06T14:47:55.077 回答
2

如果您想获取 portlet 初始化的配置,那么您可以覆盖init(PortletConfig config)方法 fromGenericPortlet

公共类 MyLiferayTestPortlet 扩展 MVCPortlet {

  @Override
  public void init(PortletConfig config) throws PortletException {
    System.out.println("~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ init");
    super.init(config);
    Enumeration<String> parameterNames = config.getInitParameterNames();
    while(parameterNames.hasMoreElements()) {
        String name = parameterNames.nextElement();
        System.out.println("Parameter: " + name + " = " + config.getInitParameter(name));
    }
    System.out.println("~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ /init");
  }
}
于 2012-09-06T07:54:47.613 回答
1

为什么不将首选项检索代码放入渲染阶段,并在首选项被验证时制作一个标志?这样,您只需执行一次。

For example, in the controller you have have a static field

private static boolean checked = false;

And then in the render phase, you check

if(!checked) {
//validate preferences
checked = true;
}
于 2012-09-07T20:20:47.773 回答