JSF带来了什么?

当初看上JSF,是因为看中了几个好处:
1、获取或显示表单数据时用相同的EL即可,JSF之前的EL只能get不能set;
2、MyFaces实现里面有很多很“炫”的组件,例如下拉菜单,树型控件,日期选择控件等等,使用极其方便。
于是就在一个小项目中使用JSF开发,用着就发现其实这个东西也带来了很多比以前更麻烦的地方,就拿很常见的数据库操作——查询、修改、插入、删除来说明使用JSF来实现有什么麻烦:
1、 查询。对于小数据量,用一个dataTable就什么都搞定了。可是大数据量分页就比较麻烦了,因为dataTable的分页是把所有数据都取出来然后再 一页页显示,而大数据量下一般是要看哪一页就取哪一页。网上有个通用的分页存储过程,只要把一系列参数(页码,排序依据,每页大小等)传给它,就能获得某 一页的数据。如果直接通过URL来传递那些参数,服务器根据参数来调用存储过程,是很方便的事情。可是JSF却不通过URL来传递参数了,整个页面处理的 过程也比较复杂,没有以前那样直观。有人改了一下dataModel的实现方式,使它每次只取一页的数据,效果是达到了,但要跳到某一页,却只能点链接, 不能通过输入URL来到达了(也就是不能把某一页添加到收藏夹里了)。

这 两天做了一些试验,在jsf里还是可以通过URL传递参数的,在Backing Bean里可以通过ValueBinding的getValue取得 URL参数,然后根据参数来从数据库中取得相应的内容,生成某个对象的bean,再在页面上显示出来。不过这样一来,似乎就跟servlet差不多了。
如果可以通过配置来设定表单提交是get方式还是post方式就好了。可是目前一律只能post,这样造成的后果除了不能收藏,不能刷新(会提示是否重新提交数据)之外,还会使浏览器的后退功能失效。


2、 修改。在datatable中把数据显示出来后,可以每一行加一个commanButton,在它的action method中调用dataModel的getRowData()方法来得到该行的数据,把数据保存在一个request范围的bean里面,再转向到另 一个页面通过可编辑表单来显示该bean的内容,在那里就可以修改、提交了。由于是使用了forward方式转向,所以url显示的页面还是数据显示的那 个页面,只要一刷新,就又回到数据显示那一页而不是修改那一页了;如果不想修改,按一下浏览器的后退按钮,虽然回到了数据显示的那一页,但上面的 commandButton已经失效,例如点击修改按钮,没有任何反应,必须把那一页刷新一下再点才有效。

为了解决这个问题,我采用了URL传递参数的方法。通过在URL中指定ID来说明要修改的是哪个对象,在修改页面的backing bean的构造函数中,读取URL参数来获得ID,然后通过查询数据库得到该对象的其他内容,再显示在页面上。这样就可以刷新,可以后退。


3、 新增。新增跟修改可以用同一个页面来显示,只是commandButton对应不同的action method,例如“修改”按钮对应的是update,“新增”按钮对应的是create,在两个method里分别使用数据库的update语句和 insert语句即可。新增的时候是没有ID的,修改的时候则已经有了ID。

4、删除。在显示数据的dataTable里,每行可以添加一个commandButton,在它的action method里,读取该行数据,得到ID后执行SQL的DELETE语句即可,比较简单。

无 论是做什么,都离不开三个东西:页面,配置文件,Backing Bean。页面是表现层的东西,负责把页面上的东西与Backing Bean联系起来。配置文件则指定在页面上使用的Backing Bean的名字、类、使用范围,还有导航规则(Navigation Rules)。Backing Bean就是程序的逻辑部分了。即使实现最简单的功能,例如显示某个变量的值,这三个东西都是必不可少的。
修改页面的时候,虽然不用重启服务器,但必须在新的session里才能看出效果来,最简单的办法就是把浏览器关掉,打开一个新的,查看结果。修改了配置文件和backing bean 就必须重启服务器了。所以调试JSF是很麻烦的。

你可能感兴趣的:(JSF带来了什么?)