将数据设置为ActionResponse Portlet GateIn

时间:2013-09-02 13:51:35

标签: java jsp portlet gatein

我正在为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页面中提供这些值,以便我可以加载详细信息页面。

2 个答案:

答案 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);
}