Как написать портлет без внешнего компонента просмотра - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь написать небольшой фрагмент кода для отображения в портлете Liferay имени зарегистрированного пользователя.

Моя проблема, являющаяся частью проблемы программирования, заключается в том, что я не понимаю, как именно существует связь между классом java и файлом view.jsp.

Я знаю, и я могу показать имя пользователя и фотографию только с помощью файла view.jsp, но я не могу достичь, используя также класс Java.

Я пробовал это с методом processAction () и методом doView (). Я предполагаю, что нам нужно сохранить параметры, чтобы показать информацию в actionResponse, чтобы отобразить ее в портлете, но на самом деле я немного растерялся и запутался. Например, один из моих вопросов: я должен написать также в файле 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 ]

2 голосов
/ 12 марта 2012

Имейте в виду, что вы не можете писать в выходной поток из processAction () - это должна быть фаза рендеринга портлета.

Относительно места, где вы генерируете фактический вывод HTML: я настоятельно рекомендую что-нибудь «выше уровня сервлета» - например, JSP, JSF или любой другой технологии, даже в самых простых случаях. Портлет Liferay MVC предоставляет некоторые хорошие настройки по умолчанию, которые вам просто нужно использовать и перейти к view.jsp.

outputStream.write («мой HTML-код»); не поддается ремонту для чего-либо выше этого уровня сложности - вам лучше выбрать технологию просмотра сейчас. Это может помочь рассмотреть портлет как контроллер, который нуждается в представлении и работает на модели.

Редактировать (после вашего комментария):

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 голосов
/ 23 марта 2012

Поскольку в жизненном цикле портлета процесс рендеринга следует за процессом действия, за исключением resourceRequest, метод doView будет вызван после завершения обработки действия. Несмотря на то, что вы можете выводить html-материалы оттуда, это не очень хорошая идея. Класс портлета лучше рассматривать как контроллер, который отправляет запросы на рендеринг другим jsps. Таким образом, вы не будете раздувать свой класс портлета и не будете легко поддерживать ваши коды.

Там может быть несколько способов сделать это. Если информация, которую вы хотите передать, является строкой, вы можете использовать ActionResponse для установки параметров рендеринга - ActionResponse.setRenderParameter(name, value), которые будут получены RenderRequest. Если есть объекты для передачи, и ваш портлет-сервер поддерживает спецификации портлета 2.0, вы можете установить атрибут ActionRequest и считывать его из кодов представления - вам нужно установить для actionScopedRequestAttributes значение true, как это в файле portlet.xml.

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

В стороне метода doView, вызовите:

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

для отправки запроса рендеринга на нужную страницу jsp.

...