QFaces 增强框架
Java Server Faces (JSF)  Ajax增强框架 –
QFaces
 
       随笔:
 
       “JSF 简直就是一个非常神奇,又魅力无穷的框架”。
       
       这是我学习这么久之后自己对JSF的一个总结。有一段时间没有写随笔了,不过最近工作一停下来就又有了时间来发点牢骚,看望一下Blog中的朋友,呵呵! 顺便搞点东西出来充实自己。
    有一些人感觉JSF上手难,使用不够自由,这只不过是对她还理解得不够透彻而已,当你理解得更深的时候,特别是当你能够完全自由的定制组件的时候,你一定会爱上她的,至少我现在是这样,呵呵!
 
       合理的使用组件,使你的项目效率提高10倍!这是某些使用JSF的强人说的,但是一点都不神奇!我并不是说一定会提高10倍,因为我也没有真正去计算过,但是我相信是真的,呵呵!你信也行不信也可,说服他人摒弃自己的观点并且同意一个不可思议的新观点并不容易!所以我也不想这么做。
 
       记得…
 
       前不久跟一位朋友说过“某些时候内存分页会更实用”的时候,费了九牛二虎的唇舌(这里好像有点用词搭配不当!但是,将就吧)才将朋友勉强说服,然后朋友第二天使用了10万条数据来考验我的观点!最终我失败了,架构上采用了朋友的分页方式继续进行。
 
       这里不讨论对与错。实际上朋友架构上的设计做得很好,至少这点上统一了分页形式:“按需索取”数据的方式。事实上,后来在项目的进行中也体现了统一规范对整个系统的好处。但始终我也没有认为自己的观点是错的。哈哈!
 
       所以,有时候我们做不到摒弃自己的观点,但是我们可以保留自己的观点,然后学习他人的一些新观点。
 
       好了,继续JSF的话题,
 
       为什么写这个增强框架
 
       写这个增强框架, 一是为了锻炼提高自己的能力, 二是为了总结一下自已各方面的一些知识!另一个我也希望JSF这么好的一个框架, 会有更多人喜欢! 尽管他入门并不容易,而且目前资料也还是太少! 不过作为一个设计如此优雅的框架,我相信会有很多人喜欢她的!
还有一个就是最近又有点无所事事,一停下手头的工作就想弄点什么东西出来,这使自己一直对编程保留激情,保持自信。最近又与朋友聊了很多这方面的东西,网络真是个好东西,不用见面有时候就可以聊得很投机。没事的时候与朋友聊聊天,谈谈编程方面的东西,也不会使自己整天坐在电脑前时感觉郁闷!(我写文章总是喜欢偏题),想到什么就写什么,这样很舒服!
 
       这个东东(QFaces)有什么好处
 
       它可以帮助你实现很美好的用户体验,并完全简化你的开发过程。比如validator, inputHelp这两个组件。
       但这不仅仅是一个组件库,他还是一个增强的Ajax框架,后面我会写有关如何使用这个东东实现自己的Ajax组件的教程,你会发现做一个带有Ajax功能的组件会是多么容易。你会发现 “Java Server Faces完全参考手册”也没有的一些东西,这是一本好书,但它也不可能面面俱到,否则就不会只是793页了。
所以他是一本参考书,真正的东西还是需要自己去发掘。
 
       为什么叫“增强”
 
       我一直在想办法使它不需要修改你的代码逻辑,甚至html代码,就可以非常简单的使用这个组件库,只要简单的将它挂上去就可以将你的其它组件变得很神奇。所以使用方法也会非常简单,如:
       <q:validator
for=”sid” />
只要加上这么一句,就可以将你的其它inputText组件突然之间变成Ajax方式的,呵呵!
 
       关于性能
 
       框架已经对Ajax的性能作了最优的处理,基本上与原生的Ajax性能是一致的,因为你不需要在其中跑完JSF生命周期的6个阶段,(只需要1个阶段,用于POST方式请求数据的),并且当你使用Get方式请求数据时,这与你使用servlet直接处理Ajax请求无异。只需要遵守一点简单得不能再简单的小小的约定就可以了。
 
       目前WEB框架多得让人眼花,各个都有优缺点,欢迎朋友互相讨论,学习研究,批评指正, 共同交流学习。
==================================================================
QFaces下载,基于JSF的ajax增强框架(附javadoc,demo,完整文档)
一、安装说明
 
 
1. 组件安装:
将组件包qfaces.jar放到项目的类路径下(一般为:/WEB-INF/lib/),然后打开项目的web.xml配置文件,增加以下的servlet即可,请注意拼写正确。
 
<servlet>
        <servlet-name>QFaces</servlet-name>
       
<servlet-class>name.huliqing.qfaces.FacesServlet</servlet-class>
   
</servlet>
   
<servlet-mapping>
       
<servlet-name>QFaces</servlet-name>
       
<url-pattern>*.qfaces</url-pattern>
   
</servlet-mapping>
 
2.组件使用:
       在jsp页面头部增加以下的标签引用即可使用控件。
 
<%@ taglib
prefix="q" uri="http://huliqing.name/qfaces" %>
 
 
二、组件标签
 
1. validator标签
       
       该组件可将标准JSF组件的默认验证方式转化为Ajax验证方式(包括Converter),通过组件的for属性所指定的目标组件将会被转化为Ajax验证方式,从此你再也不需要为前端表单页面写javascript验证而发愁。
       只在前端用javascript验证并不安全,在后台验证又不能提高用户体验, 前后台一起验证,?!代码太多,又麻烦!并且维护及更改也不容易,但是这个组件可以帮助你轻松完成这一切:    (1) 使用这个组件可以帮助你将两者统一起来,前后台验证,完全兼容原生JSF验证。
       (2)
完全不用破坏你的原有代码逻辑,也就是说,你根本不用修改你的原有代码。
 
       (3)
你完全可以不知道javascript,ajax是什么东东。(有兴趣的话,去了解一下也很好)
 
    
        
            | 属性 | 类型 | 说明 | 必需 | 
        
            | for | String | 指定到需要验证的关联组件 | 是 | 
        
            | type | String | 给目标组件指定一个简单的类型,如: “123” 表示只能填数字类型。 “0.0” 表示只能填小数类型。 “abc”
            表示只能填小写字母。 “ABC”
            表示只能填大写字母。 “Abc”
            表示只能填字母(不限大小写)。 用这样表示数据类型,看起来似乎有点怪异,但却很形象生动. J   | 否 | 
        
            | minLength | Integer | 表示目标组件必须填的最少字符长度。 | 否 | 
        
            | maxLength | Integer | 表示目标组件可填的最大字符长度。 | 否 | 
        
            | required    | Boolean | 表示目标组件是否是必填的 | 否 | 
        
            | regex | String | 正则表达式,可用于辅助对目标控件进行高级验证,这里你必须填的是一个正则表达式的字符串,如: regex="[a-z]{1,6}"  匹配1-6个小写字母  | 否 | 
        
            | ajax | Boolean | 组件默认会使用ajax验证,如果你不需要进行ajax方式验证,可以使用该属性关闭ajax调用,如:ajax=”false” | 否 | 
    
 
用法示例(1):
       简单的将目标控件sid的验证方式转化为Ajax验证
<h:inputText id=”sid” value="#{UIValidatorBean.domain1.sid1}"
required="true" />
<q:validator for=”sid” />
 
用法示例(2):
       限制目标组件sid的值只能填字母,不区分大小写,并且长度必须在2-10个字符之间。
<h:inputText id=”sid”
value="#{UIValidatorBean.domain1.sid1}" />
<q:validator for=”sid” type=”Abc” minLength=”2” maxLength=”10” />
 
用法示例(3):
       使用正则表达式进行验证,限制目标组件sid的值只能由1-6个字母组件,使用该方式你需要了解正则表达式的使用方法。
<h:inputText id=”sid”
value="#{UIValidatorBean.domain1.sid1}" />
<q:validator for=”sid” regex=”[a-zA-Z]{1,6}”
/>
 
2. InputHelp标签
 
该组件可以辅助InputText等的录入工作,提供录入帮助信息!
 
    
        
            | 属性 | 类型 | 说明 | 必需 | 
        
            | for | String | 指定到需要提供需入帮助的组件ID | 是 | 
        
            | listener | Method | 方法表达式,提供录入帮助的方法,方法签名必须是这样: List<String>
            listener(String[])   或者是这样: List<List<String>>
            listener(String[]) 该方法通过Ajax方式给页面的目标输入组件提供选项列表,以供选择.   | 是 | 
        
            | header | String | 给组件提供标题头,各个标题头以”,”号分隔,如: header=”帐号,用户名,电话” | 否 | 
        
            | footer | String | 给组件提供一些额外信息,或帮助描述,如: footer=”Welcome
            to use QFaces!” | 否 | 
        
            | ref | String | 组件默认提供一个引用值给listener所绑定的方法参数,可以从listener的方法参数中获得这个值,如: args[0]. 当你需要引用页面中的多个组件的值时,你可以使用ref这个参数,如: ref=”id1,id2,id3” 这样可以从后台的args参数中依次获得页面组件id1,id2,id3的值,像这样: String
            id1Value = args[0]; String
            id2Value = args[1]; String
            id3Value = args[2]; | 否 | 
        
            | styleClass | String | 组件样式 | 否 | 
    
 
用法示例(1):
 
       将for指定到目标组件的id, 后台提供侦听方法, 返回选项列表, 即可为目标组件提供录入支持.
 
<q:inputHelp for="myInput1"
listener="#{UIInputHelpBean.listenerRefOneValue}">
<h:inputText
id="myInput1" value="" />
</q:inputHelp>
 
后台的listenerRefOneValue方法可以像这样,从args[0]中获得当前目标组件的页面值,并返回选项列表.
 
public List<String>
listenerRefOneValue(String[] args) {
   
List<String> result = new ArrayList<String>(5);
   
String targetValue = args[0];   //
取回目标组件的值
   
for (int i = 0; i < 5; i++) {
        result.add("row" + i +
targetValue);
    }
   
return result;
}
 
用法示例(2):
 
    高级一点的用法, 组件引用到了页面中的多个组件的值,id1,id2,id3, 并且显示了表格标题,页页脚信息.
 
<h:inputText id="id1"
value="value1" />
<h:inputText id="id2"
value="value2" />
<h:inputText id="id3"
value="value3" />
<q:inputHelp for="myInput2" ref="id1,id2,id3"
listener="#{UIInputHelpBean.listenerRefManyValue}" 
header="帐号,用户名,电话"  
footer="QQ:31703299 huliqing@live.com" >
<h:inputText
id="myInput2" value="" />
</q:inputHelp>
 
后台listener所绑定的方法listenerRefManyValue可以像下面这样, 返回列表以多列形式,这样可以提供更多的信息给操作用户!具体效果请请参考示例图片.
 
public List<List<String>>
listenerRefManyValue(String[] args) {
   
List<List<String>> result = new
ArrayList<List<String>>();
   
String refValue1 = args[0]; // 依次取得所引用的组件的值
   
String refValue2 = args[1];
   
String refValue3 = args[2];
   
for (int i = 0; i < 5; i++) {
       
List<String> aa = new ArrayList<String>(3);
       
aa.add("row" + i + refValue1);
       
aa.add("row" + i + refValue2);
       
aa.add("row" + i + refValue3);
       
result.add(aa);
    }
   
return result;
}
 
===================================================================
作者:胡李青(Huliqing)
QQ:31703299
Email:huliqing@live.com
Blog:http://www.blogjava.net/huliqing/
HomePage:http://www.huliqing.name
- huliqing@huliqing.name
- http://www.huliqing.name