2012-03-12 155 views
1

我正在嘗試編寫一小段代碼,以在Liferay的portlet中顯示用戶登錄的名稱。如何在沒有任何外部視圖組件的情況下編寫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

由於在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頁面。

1

請記住,你不能寫,從在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")); 
} 
+0

我知道你的意思。我正在學習Portlet,我只用了3天。我已經用view.jsp完成了我的任務,只是按照你的建議行,但現在我想用java類實現它,這就是爲什麼我問了這個問題。 – agapitocandemor 2012-03-12 16:18:36

+0

好吧,看我的編輯 – 2012-03-12 20:30:49

+0

我終於做到了這一點: PrintWriter writer = response.getWriter(); \t \t \t \t writer.write(String.format(「

%s

」,userinfo2)); (「

%s

」,name)); \t \t writer.close(); 但現在我嘗試你的,謝謝你;) – agapitocandemor 2012-03-13 14:33:07

相關問題