我正在尝试编写一小段代码,以便在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);
}
}
答案 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页面。