0

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

4

2 回答 2

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 中设置它,它应该采用您在操作方法中设置的属性并将它们作为属性提供在您的渲染方法中,从而无需自己将对象从参数映射移动到属性映射。

不相关的注释:看起来您actionJsp在 portlet 中用作对象变量。不建议这样做,因为 portlet 应该被编码为线程安全的。对象变量在用户和线程之间共享,因此在其中保存用户特定的状态数据会在获得多个用户时导致错误。

于 2013-09-02T23:02:44.720 回答
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);
}
于 2013-09-03T13:16:58.477 回答