我正在使用spring MVC for portlets,我发现了一个问题。
我需要将一个Object List从动作阶段传递到渲染阶段。我试过使用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;
}
但这不起作用,因为在渲染阶段,它无法将String转换为我的对象列表。我怎么能这样做..?
起初,我在类级别使用私有List mylist,但据我所知,控制器是单例模式,所以我们不能使用这种方法。
答案 0 :(得分: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 上可用。< / p>
<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>
如果出现任何问题,请与我们联系。
答案 1 :(得分:0)
您可以尝试使用JSR 286操作范围的请求属性。请参阅http://www.theserverside.com/news/1363818/JSR-286-Portlets-Action-scoped-Request-Attributes。
此外,它可能是一个拼写错误,但使用@ActionMapping(params = ACTION_MYACTION)
答案 2 :(得分:-2)
我找到了答案!
我需要使用
PortletUtils.setSessionAttribute(actionrequest, "mylist", mylist);
而不是actionresponse.setRenderParameter。
有效!