amp@java

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  99 随笔 :: 0 文章 :: 228 评论 :: 0 Trackbacks
    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这个鸡肋了。

希望有高手给条生路走走!
posted on 2008-06-04 19:48 amp@java 阅读(2339) 评论(11)  编辑  收藏 所属分类: JSF

评论

# re: 缺少GET的JSF令人郁闷 2008-06-04 22:45 小武
也不至于就为了这个而放弃JSf吧,呵呵
http://www.laoge.info
  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-05 08:42 HiMagic!
要看JSF给你带了哪些好处,然后权衡一下是否值得,说实在的,我不反对这些框架,但还是觉得自己写的简易框架好,因为是量身定做的。各种框架的设计思想是我们的借鉴之处,但我们却不一定要上他的船。  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-05 11:01 Always BaNg.
根本上就没有搞懂JSF!!

UI只是model的直接显示。

定义一个bean,bean里面包含两个属性
class MyBean
{
private Role role; //角色
private int type; //未回复,已回复
public List getWorkList()
{
if (role == AuditRole)
....
if (type == 0)
. ..
return list; //最后提供给DataTable显示的列表
}
}

然后注册这个bean,在datatable里面 value=#{bean.workList}

  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-05 17:15 隔叶黄莺
JSF 不会不支持 Form 的 GET 吧,那这样的话,对 RESTful 就没法支持了  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-05 20:13 amp@java
@Always BaNg.

请问role和type的值从哪里获取呢?  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-05 20:15 amp@java
@隔叶黄莺

JSF的确不支持FROM的get,<h:form>里没有method这个属性。但是通过managed bean可以获取query string 里的参数值,只不过一提交就把参数丢掉了
  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-06 09:17 Always BaNg.
我可以给一个完全满足你需要的完整jsf例子,程序总是有办法的,关键是跳出思维圈、。  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-07 12:57 Always BaNg.
留下你的email 地址,我给你发过去demo,运行之后你就明白了,或者加我的msn: step.in@hotmail.com。当时搞工作流的时候很深入的修改过JSF,现在不搞了,但我觉得web framework中jsf是最强大的,也最难,因为思维和以往的web开发模式不连续。

JSF的核心就是基于一系列关联的request-response短期context,构造出一个面向应用的context即facecontext,其中的重点就是这一系列request-response交互的时候状态(state)保存的问题。

在做单个图形界面开发的时候,比如swing的jframe,我们根本不用考虑参数,状态的存取问题,因为它在process address space中,状态保存的地方和根据状态执行某个操作的方法在同一个scope中,而web开发就不是,一个request-response(体现在form submit中)中保存状态,而另外一个requst-reponse需要根据前一个request-response的状态来执行某个操作。

你碰到也是这个问题,想当然的利用query string来传递,但jsf不支持get,jsf提供了不只比get好很多倍的方法,那就是直接放到model中,page里面的control如select/input等直接跟model绑定。

还有一点,JSF不支持GET,但支持Query String,比如你在某个form里面这么写
<h:form action="foobar.jsf?a=1&b=2">

</h:form>

通过facecontext.getExternalContext().getRequestParameterMap().
是能获取到参数a和b的值得。

  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-10 09:38 amp@java
@Always BaNg.
您好,我的邮箱amplifier2000##163.com
还望赐教,感谢!  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-10 09:43 amp@java
@Always BaNg.
还有一点,JSF不支持GET,但支持Query String,比如你在某个form里面这么写
<h:form action="foobar.jsf?a=1&b=2">

</h:form>

通过facecontext.getExternalContext().getRequestParameterMap().
是能获取到参数a和b的值得。

——————————————————————

<h:form>是没有action这个属性的啊,只能提交到本身,并不能提交到其他页面,强行指定之后也是提交到本身,而且会把后面的querystring丢掉。  回复  更多评论
  

# re: 缺少GET的JSF令人郁闷 2008-06-11 10:35 Always BaNg.
不好意思,搞错了,应该是<form>的action属性,或者自定义h:form。

例子发过去了。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: