如何在没有任何外部视图组件的情况下编写portlet

时间:2012-03-12 15:52:44

标签: java jsp liferay portlet

我正在尝试编写一小段代码,以便在Liferay的portlet中显示所记录用户的名称。

我的问题,编程问题的一部分,是我不明白java类和view.jsp文件之间的连接究竟是什么。

我知道,我只能使用view.jsp文件显示用户名和照片,但我也无法使用java类。

我已经使用processAction()方法和doView()方法尝试过它。我想我们需要保存参数以显示actionResponse中的信息以在portlet中呈现它,但实际上我有点迷失和混乱。我的一个问题是,例如:我是否应该在view.jsp文件中写入?或者我可以只用我的java类做一切吗?我附上了我的java类的代码。

任何帮助都会非常棒。 提前谢谢了。 拉法

public class UserInfo extends MVCPortlet{

@Override
public void processAction( ActionRequest actionRequest, ActionResponse actionResponse) 
        throws IOException, PortletException 
        {               
            ThemeDisplay themeDisplay = (ThemeDisplay) 
                    actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
            User user = themeDisplay.getUser();

            PortletPreferences prefs = actionRequest.getPreferences(); 
            String userName = (String) actionRequest.getParameter("UserInfo");
            userName = user.getFullName();

            if (userName != null) 
            { 
                prefs.setValue("UserInfo", userName); 
                prefs.store(); 
            }  

            actionResponse.setRenderParameter("userName", userName);
            super.processAction(actionRequest, actionResponse); 
    }
}

2 个答案:

答案 0 :(得分:2)

请记住,您无法从processAction()写入输出流 - 它需要是portlet的呈现阶段。

关于生成HTML实际输出的位置:我强烈推荐“高于servlet级别”的任何内容 - 例如jsp,jsf或任何其他技术,即使在最简单的情况下。 Liferay的MVC Portlet提供了一些很好的默认设置,您只需要使用它们并转到view.jsp。

outputStream.write(“my html code”);对于超出这种复杂程度的任何东西都是不可维护的 - 你现在最好选择视图技术。将portlet视为需要视图并在模型上运行的控制器可能会有所帮助。

编辑(发表评论后):

public void doView(
        RenderRequest renderRequest, RenderResponse renderResponse)
    throws IOException, PortletException {
    // Note: This is not HTML-escaped. Just for demo. Don't try this at home
    renderResponse.getWriter().write("The username is " + 
            renderRequest.getParameter("userName"));
}

答案 1 :(得分:0)

由于在Portlet的生命周期中,渲染过程遵循除了resourceRequest之外的动作过程,因此在动作处理完成后将调用doView方法。即使你可以从那里输出html东西,这样做也不是一个好主意。 portlet类最好被视为一个控制器,它将渲染请求分派给其他jsps。这样,您就不会破坏portlet类并使代码易于维护。

有几种方法可以做到这一点。如果要传递的信息是字符串,则可以使用ActionResponse设置渲染参数 - ActionResponse.setRenderParameter(name, value),后者将由RenderRequest检索。如果有对象要传递并且您的portlet服务器支持portlet 2.0规范,则可以将属性设置为ActionRequest并从视图代码中读取它 - 您需要在portlet.xml文件中将actionScopedRequestAttributes设置为true。

<container-runtime-option> 
   <name>javax.portlet.actionScopedRequestAttributes</name>
   <value>true</value> 
<container-runtime-option> 

在doView方法的旁边,调用:

getPortletContext().getRequestDispatcher(jspPage).include(request, response);

将渲染请求分派给你想要的jsp页面。