我想获得这两个值,并且因为在加载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()
答案 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术语中,Layout
由plid
标识,简称 - 用于页面布局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;
}