1

我有一个控制器,用户在其中将信息填写到表单中。保存表单时,会创建 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中,我正在加载 formId viewParam

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

loadForm我想访问在saveForm. 我目前正在查看 Rodmar Conde 发布的关于在 Session Map 中存储数据的链接。这是解决这个问题的正确方法吗?

感谢您迄今为止的帮助!

4

2 回答 2

1

代码看起来不错。对于需要通过幂等请求打开目标页面的情况,这也是推荐的方法。另请参阅如何在 JSF 中导航?如何使 URL 反映当前页面(而不是前一个页面)以获得一些一般提示。

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

请注意,这超出了 JSF 的范围。滥用 JSF 会话范围是另一种方式,但不是正确的方式。在由 GET 请求分隔的两个视图范围 bean 实例之间共享数据是不可能的,因为它们的生命周期结束并以 GET 请求开始。另请参阅JSF ViewScoped 变量无法重定向到同一页面

于 2013-04-05T16:30:13.273 回答
0

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

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");

希望这可以帮助某人。

于 2016-09-21T20:03:32.683 回答