3

我正在为 portlet 使用 spring MVC,但我发现了一个问题。

我需要将一个对象列表从动作阶段传递到渲染阶段。我尝试使用 setRenderParameter,如下所示:

actionresponse.setRenderParameter(String string, String[] strings);
actionresponse.setRenderParameter("myList",myList.toString());

这里我们有两种方法:

@RequestMapping(params = ACTION_MYACTION)
public final void doAction(MyBean search, Errors errors, ActionRequest actionrequest, ActionResponse actionresponse) {
    String processName = UtilLog.getProcessName(CLASS_NAME, "doAction");
    successMessage.clear();
    justlist = null;

    validateBean(consulta, errors);

    if (!errors.hasErrors()) {
        try {

            mylist = myBpelImpl.getList(search);
    actionresponse.setRenderParameter("myList",myList.toString());

        } catch (Exception ex) {
            LOG.error(processName, ex);
            processError(actionrequest, null, ex);
        }
    }

    informSuccessMessage(actionrequest, errors, status);

}

@RequestMapping(params = ACTION_MYACTION)
public final String doRender(@ModelAttribute(value = "myBean") MyBean search, Errors errors, RenderRequest renderrequest) {

List<otherBean> mylist =   renderrequest.getParameter("myList");

    renderrequest.setAttribute(ServletContextKeys.SC_JUSTIFICANTE_LIST, myList);

    return ServletContextKeys.SC_CONSULTA_JUSTIFICANTES;

}

但这不起作用,因为在渲染阶段,它无法将字符串转换为我的对象列表。我怎么能这样做..?

起初,我在类级别使用私有 List mylist,但据我所知,控制器是单例模式,所以我们不能使用这种方法。

4

3 回答 3

1

将 ActionRequest 请求对象添加到您的方法签名中,如下所示,并将对象添加为属性

@ActionMapping(params = "doAction=searchDeviceResults")
public void searchResults(@ModelAttribute(value = "searchForm") SearchForm searchForm,
                          BindingResult bindingResult, 
                          ActionRequest request, 
                          ActionResponse response, 
                          SessionStatus sessionStatus) {

    searchFormValidator.validate(searchForm, bindingResult);

    if (!bindingResult.hasErrors()) {
        response.setRenderParameter("doAction", "showDeviceResults");
        sessionStatus.setComplete();    
        List<AccountDetail> accList = accountService.getAccountDetail(adp);
        request.setAttribute("accountList", accList); // here we go
    }

}

另一件重要的事情是在portlet.xml中添加下面的配置标记,因此无需获取并再次放入 render 方法,您的请求属性将在JSP上可用。

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

如果出现任何问题,请告诉我。

于 2013-06-05T13:35:21.383 回答
0

您可以尝试使用 JSR 286 Action-scoped Request Attributes。请参阅http://www.theserverside.com/news/1363818/JSR-286-Portlets-Action-scoped-Request-Attributes

此外,它可能是一个错字,但注释你的 doAction@ActionMapping(params = ACTION_MYACTION)

于 2012-11-16T12:44:50.677 回答
-2

我找到了答案!

我需要使用

PortletUtils.setSessionAttribute(actionrequest, "mylist", mylist);

而不是 actionresponse.setRenderParameter。

有用!

于 2012-11-19T13:19:58.017 回答