Liferay:从init(PortletConfig)获取PortletId和Plid [即,没有请求对象,只有PortletConfig]

时间:2012-08-31 10:13:32

标签: java liferay portlet init

我想获得这两个值,并且因为在加载portlet时执行了init(Portletconfig),所以我不确定这些值是否可用。

对于portletId,我试过

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

但似乎我做不到。猜猜是因为impl在另一个不能从portlet访问的jar中

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

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

实时读取portlet的prefs。如果有任何其他方式来表示来自init(),就像获取整个首选项一样就足够了

编辑:我发现了一种不同的方法,并稍微改变了一个新问题  Liferay: get PortletID and companyID from init()

3 个答案:

答案 0 :(得分:3)

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

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

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术语中,Layoutplid标识,简称 - 用于页面布局ID。

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

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

答案 1 :(得分:2)

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

中的GenericPortlet方法
  

public class 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");
  }
}

答案 2 :(得分:1)

为什么不直接将首选项检索代码放到呈现阶段,并在首选项经过验证后制作标记?这样你只需要做一次。

例如,在控制器中,您有一个静态字段

private static boolean checked = false;

然后在渲染阶段,检查

if(!checked) {
//validate preferences
checked = true;
}