我有一个非常复杂的形式,有很多输入和验证器.对于用户来说,完成该操作需要相当长的时间(甚至超过一小时),因此他们希望能够保存草稿数据,即使它违反了未输入的必填字段等规则.
我相信这个问题在许多Web应用程序中很常见,但是找不到任何公认的模式应该如何实现.你能告诉我如何实现这个目标吗?
现在我可以看到以下选项:
但是你看,没有人真的合情合理.这个问题真的没有简单的解决方案吗?
这确实不那么容易.在JSF生命周期中,验证非常紧密.
我个人会选择1.真的,肮脏的工作,但你可以把它藏在一个实用工具类左右.只需<h:form>从viewroot中获取问题,递归迭代它的子节点,然后测试if是否component instanceof EditableValueHolder为真,将找到的id-value对存储起来Map并最终保持它.
作为第四种选择,您可以使用ajaxical powers独立保存所有数据.jQuery对此很有帮助.
$.post('/savedraft', $('#formid').serialize());
Run Code Online (Sandbox Code Playgroud)
它只需要客户端的Javascript支持.
更新:JSF实用程序库OmniFaces具有<o:ignoreValidationFailed>用于确切目的的标记处理程序.这确实不是一个简单的解决方案,因为它也需要一个习惯<h:form>.它通过FacesContext在验证期间提供自定义实例并更新模型值阶段来完成其工作,这些阶段在validationFailed()和renderResponse()方法中执行NOOP .因此组件仍然无效并且消息仍然附加,但它仍将继续进行更新模型值并调用应用程序阶段.