关于JSF懒模型的设计与使用

开通这个博客的目的是随时记录工作中所涉及到的一些比较有趣的知识,而且****上关于JSF的相关知识点有些许少,也正好借此机会,与同我一样为小白的人分享知识。

首先在JSF中懒模型是什么?什么情况下会使用?怎么设计使用?

一.懒模型是什么?

在JSF中懒模型就是一个继承了LazyDataModele<T>的类,他通过继承父类,可以重写父类的load()方法。通过重写父类的load()方法,可以直接获取我们现在想要的数据集合,而不是一下子查找出所有的数据然后再筛选,这样会有损搜索的性能,后续会具体介绍load()方法中应该需要写些什么。


二.懒模型在什么情况下会使用?

众所周知,如果你想在数据库中按几个条件搜索数据,或者是对搜索出来的数据进行分页,直接使用findAll()方法对其查找所有然后再进行筛选也可以,但这样效率会非常的低。这时候使用JSF懒模型就显得非常有必要了。


三.如何设计设计使用懒模型?

1.首先创建一个类继承LazyDataModele<T>,然后重写其父类的load()方法。在进入到这个懒模型的class中时,会主动执行其load()方法。大家可以注意到,load方法后面跟着的参数有first,pagesize,sortField,sortOrder,filters。那这五个参数具体都代表着什么?

first:分页时,从第几条数据开始

pagesize:一页中最大的数据条数

sortField:对哪个字段(列名)进行排序

sortOrder:排序的规则(正续or倒叙)

filters:过滤筛选条件

这边就重点介绍一下Map<String,Object>filter,这个参数主要用于存放筛选条件(例如你想在从user表中搜索nam为“张三”的人,那么你可以写一个存放条件:filters.put("name",张三),将其放入filters中,那么下次在运行这个懒模型的时候,会直接执行你的过滤条件)。至于其他的四个参数,他们主要用于table分页。

关于JSF懒模型的设计与使用

关于JSF懒模型的设计与使用

2.调用service的getResultList()方法获取经过处理筛选的集合,注:getResultList()方法需要自己书写,无法通过继承获得。

     getResultList()方法不做过多详解,主要看其方法中间部分的筛选过程,也就是if(filters!=null&&filters.size()>0){.......}这一部分。

这边提一下我们之前在懒模型里面设置的filters Map集合,把我们想要筛选过滤的条件以键值对的形式存放在了filters中。这时候if(){...}方法,主要就是把每一个键从map中取出来,然后再一个一个进行对比,是否有这组键值对,如果存在的话,就将键值对的值与实体类中对应的搜索字段进行匹配赋值。就好比在select * from ...后面增加一个以这组建制对为基础的过滤条件(例如:select * from user where name=“张三”)


关于JSF懒模型的设计与使用

关于JSF懒模型的设计与使用关于JSF懒模型的设计与使用


四.最后统筹讲一下懒模型的运行流程

1.首先看到页面中有个p:datalist标签,这个标签主要就是存放需要遍历的集合,value="#{inventoryView.lazyInventory}"就是对我们所写的懒模型进行遍历。

关于JSF懒模型的设计与使用


2.下面是viewbean层,searchCustomerName,seachrStatus这些就是我们存放搜索条件也就是过滤条件的地方,例如我前段页面搜索客户姓名为张三,那么后台对应的serchCustomerName值就会被赋值为张三。

然后再看lazyInventory=new LazyInventory(inventoryService),new了一个LazyInventory懒模型,并以InventoryService为参数。那么LazyInventory会返回一个什么数据?会返回一个List集合,因为进入到LazyInventory类中会主动执行其load()方法,而load()方法最终会retrun一个筛选过滤后的List集合。而为什么要以InventoryService为参数,因为懒模型里面会需要调用inventoryService中写好的getResultList及其他一些方法。

进入到懒模型之后,主动执行load()方法,load方法判断每一个搜索的变量是否有值(有值则代表在前端页面中有对该变量赋值),如果有值的话,就将该变量存入一个键值对放入filters,存入的键值对的键的值也不是随便命名,它应该代表的是该变量所对应的对象中的某个字段(例如contract中的contractId字段,map.put("contractId",value))

service.getResultList(....)将所有设置完成的过滤条件作为参数传递到service,dao层进行处理。最后返回一个处理过的LIst集合

在daoImpl实现类中,getResultList()方法,将filters中每个搜索条件的键值对取出,并将其挨个比对,检测其是否存在。若存在,就找到该键值对中的值所对应的表对象中对应的字段,并将键值对中的value值赋值给他,也就是说,在查询语句后面新增了一个过滤条件。



关于JSF懒模型的设计与使用


关于JSF懒模型的设计与使用关于JSF懒模型的设计与使用