代码之家  ›  专栏  ›  技术社区  ›  Whimusical

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

  •  1
  • Whimusical  · 技术社区  · 14 年前

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

    为了portletId我试过了

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

    但我似乎做不到。我猜这是因为impl在另一个不打算从Portlet访问的jar中

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

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

    实时读取portlet的pref。如果有任何其他方式可以从init()中指示,比如获取整个首选项,那就足够了

    编辑: 我找到了一种不同的方法,并提出了一个略有变化的新问题 Liferay: get PortletID and companyID from init()

    3 回复  |  直到 9 年前
        1
  •  3
  •   p.mesotten    14 年前

    所以…如果我理解正确的话,您的目标是读取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术语来说 Layout ,由 plid ,页面布局id的缩写。

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

    结论:在 初始化() 方法,因为此时portlet没有任何上下文(请阅读: 布局 )它应该从中检索偏好。

        2
  •  2
  •   Mark    14 年前

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

    公共类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");
      }
    }
    
        3
  •  1
  •   semonte    14 年前

    为什么不将首选项检索代码放入渲染阶段,并在验证了首选项后制作一个标志呢?这样你只需要做一次。

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

    private static boolean checked = false;
    

    然后在渲染阶段,检查

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