Jsf 在可视范围控制器之间共享数据

Jsf 在可视范围控制器之间共享数据,jsf,view-scope,Jsf,View Scope,我有一个控制器,用户在其中将信息填写到表单中。保存表单时,将创建JPA对象并将其持久化到数据库,用户将重定向到另一个控制器以查看表单。我对在控制器之间传递整个对象不感兴趣,只对表示对象的字符串感兴趣。我可以从数据库中重新加载对象,但是由于加载时间太慢,有没有办法在不访问数据库的情况下传递数据 编辑: 当一个控制器重定向到另一个控制器时,我感兴趣的是将字符串从第一个控制器“发送”到重定向的控制器,以便可以显示这些字符串 谢谢你的帮助 编辑2: 以下是第一个控制器中的代码: //Called by

我有一个控制器,用户在其中将信息填写到表单中。保存表单时,将创建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";
}
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
在第二个名为
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发布的关于在会话映射中存储数据的链接。这是正确的方法吗


谢谢你迄今为止的帮助

代码看起来不错。对于需要通过幂等请求打开目标页的情况,这也是推荐的方法。请参阅进一步了解一些一般提示

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


注意,这超出了JSF的范围。滥用JSF会话范围是另一种方式,但不是正确的方式。由于两个视图范围的bean实例的生命周期以GET请求结束和开始,因此无法在由GET请求分隔的两个bean实例之间共享数据。另请参见。

代码看起来不错。对于需要通过幂等请求打开目标页的情况,这也是推荐的方法。请参阅进一步了解一些一般提示

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


注意,这超出了JSF的范围。滥用JSF会话范围是另一种方式,但不是正确的方式。由于两个视图范围的bean实例的生命周期以GET请求结束和开始,因此无法在由GET请求分隔的两个bean实例之间共享数据。另请参见。

以下是我的目标。将会话中的值保存在第一个
ViewScoped
控制器中,如下所示:

//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";
}
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
并在第二个
ViewScoped
控制器(或任意位置)的
PreRenderView
中检索值,如下所示:

ExternalContext etx = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest httpReq = (HttpServletRequest)etx.getRequest();
HttpSession session = httpReq.getSession();
String formId = (String)session.getAttribute("formId");

希望这对某人有所帮助。

这就是我的目的。将会话中的值保存在第一个
ViewScoped
控制器中,如下所示:

//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";
}
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
并在第二个
ViewScoped
控制器(或任意位置)的
PreRenderView
中检索值,如下所示:

ExternalContext etx = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest httpReq = (HttpServletRequest)etx.getRequest();
HttpSession session = httpReq.getSession();
String formId = (String)session.getAttribute("formId");

希望这对某人有所帮助。

我不确定是否理解您的具体问题。如果您的意思是在视图范围内的bean之间传递数据,如
action=“#{otherBean.doSomething(oneBean.entity)}”
,则此数据不会以任何方式在HTML/HTTP中公开,并且可能不可能影响“加载时间”。请澄清具体问题。@BalusC我已将问题编辑为更具描述性。这真的是重定向到新的GET请求还是回发时的导航(前进)?您可以在controller1中保存字符串到HttpSession对象中,然后在controller2中恢复它们@巴卢斯我不完全确定我是否理解其中的区别。当按下“Save”命令按钮时,我的backingbean中的一个动作被调用,我计划从那里重定向到另一个控制器/页面。很抱歉,我不太清楚,我刚刚开始使用JSF/JEE。我不确定我是否理解您的具体问题。如果您的意思是在视图范围内的bean之间传递数据,如
action=“#{otherBean.doSomething(oneBean.entity)}”
,则此数据不会以任何方式在HTML/HTTP中公开,并且可能不可能影响“加载时间”。请澄清具体问题。@BalusC我已将问题编辑为更具描述性。这真的是重定向到新的GET请求还是回发时的导航(前进)?您可以在controller1中保存字符串到HttpSession对象中,然后在controller2中恢复它们@巴卢斯我不完全确定我是否理解其中的区别。当按下“Save”命令按钮时,我的backingbean中的一个动作被调用,我计划从那里重定向到另一个控制器/页面。很抱歉,我不太清楚,我刚刚开始使用JSF/JEE。这不是更容易吗???不是更容易吗???