JSF通过URL来传递参数

开发 后端
本文介绍JSF可以通过URL来传递参数,在Backing Bean里可以通过ValueBinding的getValue取得URL参数。

当初看上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是很麻烦的。 

【编辑推荐】

  1. JSF标记与JSTL标记混合使用
  2. 简单介绍JSF生命周期
  3. 升级JSF1.2的艰难之旅
  4. 简述学习JSF小记
  5. JSF应用程序的生命周期
责任编辑:佚名 来源: JavaEye
相关推荐

2010-09-26 17:21:07

2010-09-10 09:55:13

SQL参数变量

2009-06-01 09:30:51

JSF2.0FaceletsAjax4JSF

2012-02-21 14:04:15

Java

2015-09-08 10:16:41

Java参数按值传递

2010-06-09 09:15:58

JSF 2Ajax组件

2023-03-29 23:23:00

MyBatis参数框架

2017-12-05 08:53:20

Golang参数传递

2009-09-23 17:56:45

JSF入门

2009-09-04 11:00:13

通过C#引用传递

2009-12-17 17:04:09

Ruby函数参数传递

2009-06-25 11:11:25

控制JSF切入点

2024-02-22 09:21:09

.NETActionOptions

2021-09-06 07:45:08

LinuxLinux内核

2011-03-16 16:06:46

iptables日志MySQL

2021-07-12 06:23:38

抓包gRpcRPC 框架

2009-06-26 14:06:08

JSF基础框架

2009-06-26 13:48:57

G4JSFGWTJSF

2009-09-04 16:10:49

JSP页面间传递参数

2021-01-13 05:21:59

参数
点赞
收藏

51CTO技术栈公众号