在ViewScoped控制器之间共享数据

时间:2013-04-05 13:44:03

标签: jsf view-scope

我有一个控制器,用户将信息填入表格。在保存表单时,将创建JPA对象并将其持久保存到数据库,并将用户重定向到另一个控制器以查看表单。我不想在控制器之间传递整个对象,只是表示对象的字符串。我可以从数据库重新加载对象,但由于加载时间较慢,有没有办法在不访问数据库的情况下传递数据?

修改 当一个控制器重定向到另一个控制器时,我感兴趣的是从第一个控制器“发送”字符串到重定向的控制器,以便显示这些字符串。

感谢您的帮助!

编辑2:

这是第一个控制器中的代码:

//Called by a commandButton
public String saveForm() {
    //Objects are created and persisted to DB
    //Store the Objects' names as strings. These are the values I want to access in the second controller
    return "view_form.jsf?formId=" + formId.toString() + "&faces-redirect=true";
}

在名为viewForm的第二个控制器中,我正在使用viewParam加载formId:

<f:metadata>
  <f:viewParam name="formId" value="#{secondController.formId}" required="true"/>   
  <f:event type="preRenderView" listener="#{secondController.loadForm}"/>
</f:metadata>

loadForm中,我想访问saveForm中创建的字符串。 我目前正在查看关于在会话地图中存储数据的Rodmar Conde链接。这是解决这个问题的正确方法吗?

到目前为止,感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

代码看起来很好。对于需要通过幂等请求打开目标页面的情况,这也是推荐的方法。另请参阅How to navigate in JSF? How to make URL reflect current page (and not previous one)以获取一些一般性提示。

您真正的问题显然只是数据库性能(尽管正确索引表上的单个选择应该相对便宜,确保它不仅仅是连接成本(使用连接池)或网络延迟(主机数据库服务器)靠近网络服务器))。在持久层中引入一种二级缓存可能会有很大帮助。请使用关键字“二级缓存”或“二级缓存”参阅相关持久层的文档。

请注意,这超出了JSF的范围。滥用JSF会话范围是另一种方式,但不是正确的方式。由GET请求分隔的两个视图范围的bean实例之间共享数据是不可能的,因为它们的生命周期结束并以GET请求开始。另请参阅JSF ViewScoped variable not surviving redirect to same page

答案 1 :(得分:0)

这是我的定居点。在第一个ExternalContext etx = FacesContext.getCurrentInstance().getExternalContext(); HttpServletRequest httpReq = (HttpServletRequest)etx.getRequest(); HttpSession session = httpReq.getSession(); session.setAttribute("formId", "formId_value_here"); //use a map if you have multiple values 控制器中保存会话中的值,如下所示:

PreRenderView

并检索第二个ViewScoped控制器(或任何地方)的ExternalContext etx = FacesContext.getCurrentInstance().getExternalContext(); HttpServletRequest httpReq = (HttpServletRequest)etx.getRequest(); HttpSession session = httpReq.getSession(); String formId = (String)session.getAttribute("formId"); 中的值,如下所示:

if s == nil {

希望这有助于某人。