借助 Ajax 自动保存 JSF 表单: 第 3 部分:保存 JSF 表单中的用户输入
2009-11-10 00:00:00 来源:WEB开发网在上面描述的场景中处理 GET 请求时,JSF 框架很可能不能在请求处理生命周期的第 1 阶段(Restore View)恢复 JSF 组件树。即使 JSF 实现可以这样做,请求将不具备参数,因为用户刚刚返回到应用程序中。
根据 JSF 规范,如果视图不能被恢复或者请求没有包含查询参数或 POST 数据,JSF 实现必须在 Restore View 阶段调用 faces 上下文的 renderResponse() 方法。因此,请求处理将跳至最后一个阶段(Render Response),该阶段将生成 HTML 输出并同时构建组件树,因为之前没有恢复树。这意味着应用程序在处理 GET 请求的过程中没有机会处理组件树,而且输出已经被发送给用户浏览器。
发送 POST 请求以恢复 JSF 表单
上述问题的解决方法就是让 JSF 框架处理 GET 请求并随后发送新的 POST 请求,这将允许应用程序处理 JSF 组件树,恢复组件值。POST 请求可通过表单对象的 JavaScript submit() 方法发送。这一次不能使用 XMLHttpRequest,因为您需要在发出 POST 请求后刷新页面。
如果查看表单页面的 HTML 输出,您将注意到 JSF 为隐藏的元素生成了 supportForm:restoreTrigger ID。因此,您需要使用像 getFormElement() 这样的 JavaScript 函数(如 清单 7 所示)在 Web 页面中查找表单元素对象:
清单 7. 查找使用 JSF 组件呈现的表单元素function getFormElement(formId, elemId) {
return document.getElementById(formId + ":" + elemId);
}
清单 8 展示了另一个 JavaScript 函数,它将发送恢复表单数据的请求。在调用 supportForm 对象的 submit() 方法之前,submitRestoreRequest() 函数将修改隐藏元素的值,以在服务器端处理请求时触发 ViewRestorer bean 的 valueChangeListener() 方法。您可以在 SupportForm.jsp 文件中找到 submitRestoreRequest() 函数。
更多精彩
赞助商链接