我有一个控制器,用户将信息填入表格。在保存表单时,将创建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链接。这是解决这个问题的正确方法吗?
到目前为止,感谢您的帮助!
答案 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 {
希望这有助于某人。