多页面提交,统一持久化解决方案

需求:

人员信息包括一张主表和若干张子表,点击某链接进入某人员信息详情页面后,可以针对主表和子表信息进行修改。所有的修改统一保存后,打包提交到上级审核(相当于做底层的持久化操作),审核通过后,进行实际修改操作,审核不通过时,保留原信息。

计划采用Command和Strategy模式,将修改操作抽象为若干Command,每个Command都有changeStrategy函数做实际的变更。在Command之上建立Transaction概念,用以表示一批的修改内容,要么同时生效,要么同时不生效。

问题:

每个保存操作会提交一个单独的http请求到后台,此时需要作Command的持久化。多个修改操作需要多次重复此过程,最终每个Command都与同一个Transaction相关联。因此,需要在多次http请求之间共享Transaction信息。

解决方案:

使用JSP的session机制进行信息共享。考虑到客户端的不可靠,不能依赖浏览器的onclose事件来判断用户操作是否完成。

在session中建立Map,key为人员id,value为Transaction对象。

进入人员主表信息页面之前,先根据该人员信息的id在上述map中查询,如果有Transaction对象则删除,之后建立新的Transaction对象。

在每个修改请求的处理函数中,根据人员id在session中查找到Transaction对象,新建command并与之关联,一并存入session中。

点击统一的保存后,根据人员id查找到Transaction对象,修改状态并作持久化,进入下一流程。

优点:

依赖于用户的明确操作,即“点击保存按钮”,来完成持久化动作,避免浏览器异常退出后,流程不能正常完成。