我正在为GateIn 3.6开发portlet。目前我已经创建了一个列出表中记录的页面。当用户单击任何行时,它将转到描述页面。
现在,当用户点击行时,它会加载详细信息页面,但值不可用。我在做什么细节在这里..
@RenderMode(name = "view")
public void display(RenderRequest request, RenderResponse response) throws PortletException, IOException, NamingException {
RecordsDAO recordsDAO = new RecordsDAOImpl();
// Records listing available on listing page
request.setAttribute("recordsList", recordsDAO.getAllRecords());
// tried to load record detail page when user click one row
if(actionJsp == null || actionJsp.equals("")){
getPortletContext().getRequestDispatcher("/jsp/ListRecords.jsp").
include(request, response);
} else {
getPortletContext().getRequestDispatcher("/jsp/DetailsBoxRecord.jsp").
include(request, response);
}
actionJsp = "";
}
并且流程操作是
@ProcessAction(name = "details")
public void details(ActionRequest request, ActionResponse response) throws PortletException, IOException {
RecordsDAO recordsDAO = new RecordsDAOImpl();
int id = Integer.parseInt(request.getParameter("id"));
RecordsForm recordsForm = recordsDAO.getRecord(id);
// way 1 set request attribute
request.setAttribute("details", recordsForm);
// way 2 set response attribute -- display error that cannot set Form type values
response.setRenderParameter("details", recordsForm);
actionJsp = "values";
}
选项1: 我试图在request.setAttribute中设置RecordsForm类型值,它已完成,但请求中的值在jsp页面中不可用。
选项2: 使用response.setRenderParameter我无法在response.setRenderParameter中设置RecordsForm类型值以在jsp页面中访问这些值。
任何人都可以指导我在我的情况下哪一个是正确的方式以及如何在jsp页面中提供这些值,以便我可以加载详细信息页面。
答案 0 :(得分:1)
这行代码
response.setRenderParameter("details", recordsForm);
只会将recordsForm
对象作为参数传递给doView
方法。您的JSP可能正在尝试使用RenderRequest上的属性。这意味着在您的doView
中,您需要执行以下操作
RecordsForm recordsForm = request.getParameter("details");
request.setAttribute("details", recordsForm);
还可以选择使用portlet容器运行时选项javax.portlet.actionScopedRequestAttributes。您可以在portlet.xml中设置它,它应该采用您在action方法中设置的属性,并在render方法中将它们作为属性提供,从而无需将对象从参数映射移动到属性映射中。
无关注:看起来您在portlet中使用actionJsp
作为对象变量。不推荐这样做,因为应该将portlet编码为线程安全的。对象变量在用户和线程之间共享,因此当您获得多个用户时,在其中保存用户特定的状态数据将导致错误。
答案 1 :(得分:0)
在portlet.xml中添加actionScopedRequestAttributes后,我可以在请求中设置值,这些值在jsp页面中可用。
<container-runtime-option>
<name>javax.portlet.actionScopedRequestAttributes</name>
<value>true</value>
</container-runtime-option>
和流程操作就像那样
@ProcessAction(name = "details")
public void details(ActionRequest request, ActionResponse response) throws PortletException, IOException {
RecordsDAO recordsDAO = new RecordsDAOImpl();
int id = Integer.parseInt(request.getParameter("id"));
RecordsForm recordsForm = recordsDAO.getRecord(id);
request.setAttribute("details", recordsForm);
}