JSF只能采用POST的方法进行FORM提交,同一页面要显示不同的内容,只有通过POST来改变参数或者通过SESSION传递变量。有时候有大量相似的页面,这些页面只有很少一部分不同(例如不同用户、不同角色、不同页码等),通过跟在URL后面的query string本来可以很容易地实现,但在JSF里却不行,只要一提交,马上就把?后面那串东西丢掉。假如有一个页面,根据URL后面的id参数来显示FORM的内容,提交的时候如果验证出错,那个FORM的内容就丢失了,显示一个莫名其妙的页面,因为这时候那个id参数已经没有了。还有常用的分页操作,本来在URL后面加上个页码就可以了,但是JSF的分页控件却只能通过POST来翻页,一刷新就出来个“重试”“取消”的对话框,让人烦恼。如果页面内容根据不同用户角色有细微不同,就得每个角色建立一个页面,每个页面对应一个managed bean,这些页面的内容基本相同,bean的内容也基本相同,却要分别建立,一点重用的机会都没有。今天做的一个东西就遇到了这种问题:
一个简单的审批流程,只有3个角色,申请者、审批者、执行者,整个流程是这样的:申请者填单->审批者查看并审批->执行者执行并填入结果->申请者查看。这样,每种角色都有两种列表:未回复和已回复,这两种列表在三个角色里面都是相似的,但有细微区别:
|
申请者 |
审批者 |
执行者 |
未回复列表 |
自己已发出但未被执行者执行的列表 |
申请者已提交但自己未审批的列表 |
审批已通过但自己未执行的列表 |
已回复列表 |
自己已发出且执行者已执行的列表 |
申请者已提交且自己已审批的列表 |
审批已通过且自己已执行的列表 |
这些列表的不同之处在于:已登录用户的角色(可以从session中得到,但一个用户可能有多种角色,他可能以不同的角色查看列表),列表的当前状态(对每种角色都有两种状态),列表的页码。由于每个列表都有可能有大量数据,所以必须用到分页。通过JSF的DataTable空间和DataScroller控件可以简单地实现分页,然而,这种分页导致URL后面的参数无效了,这样一来,这六种列表就必须通过6个页面来显示了,通过页面的名称来区分当前用户的角色、所查看的列表的状态,每个页面通过POST来决定页码。本来一个页面+一个bean+3个参数就可以决定,现在需要6个页面+6个bean来完成了。
list.jsp?type=0&role=0&page=1->type0_role0.jsp
list.jsp?type=0&role=1&page=1->type0_role1.jsp
list.jsp?type=0&role=2&page=1->type0_role2.jsp
list.jsp?type=1&role=0&page=1->type1_role0.jsp
list.jsp?type=1&role=1&page=1->type1_role1.jsp
list.jsp?type=1&role=2&page=1->type1_role2.jsp
假如有n种状态m种角色那岂不是要n*m个页面+n*m个bean?
有点想放弃JSF这个鸡肋了。
希望有高手给条生路走走!