别人博客上考下来的

JS判断数字/字母/中文
关键字: javascript, js, js判断数字/字母/中文
1.


var reg = /^(\w|[\u4E00-\u9FA5])*$/;
if(arr=username.match(reg))
{
ti=1;
return ture;
}
else
{
alert("用户名只允许为英文,数字和汉字的混合,\n请检查是否前后有空格或者其他符号");
ti=0;
return false;
}

2.利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:οnkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用正则表达式限制只能输入全角字符: οnkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

用正则表达式限制只能输入数字:οnkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

用正则表达式限制只能输入数字和英文:οnkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"


21:51 浏览 (268) 评论 (0) 分类: js 2009
-05-08缩略显示JScript语法错误
关键字: javascript, js, jscript语法错误
JScript语法错误

  JScript语法错误是指当JScript语句违反了JScript脚本语言的一条或多条语法规则时导致的错误。JScript语法错误发生在程序编译阶段,在开始运行该程序之前。(错误发生在开发过程中),以下是32个语法错误  

  错误号描述

  十进制 十六进制 说明

  1001 800A03E9 内存不足

  1002 800A03EA 语法错误

  1003 800A03EB 需要“:”

  1004 800A03EC 需要“;”

  1005 800A03ED 需要“(”

  1006 800A03EE 需要“)”

  1007 800A03EF 需要“]”

  1008 800A03F0 需要“{”

  1009 800A03F1 需要“}”

  1010 800A03F2 需要标识符

  1011 800A03F3 需要“=”

  1012 800A03F4 需要“/”

  1013 800A03F5 无效数

  1014 800A03F6 非法字符

  1015 800A03F7 字符串常数未结束

  1016 800A03F8 注释未结束

  1018 800A03FA 函数外有’return’语句

  1019 800A03FB 在循环外不能有“break”

  1020 800A03FC 在循环外不能有“continue”

  1023 800A03FF 需要十六进制数

  1024 800A0400 需要“while”

  1025 800A0401 标签定义重复

  1026 800A0402 未找到标签

  1027 800A0403 一条“switch”语句中只能有一个“default”

  1028 800A0404 需要标识符、字符串或者数字

  1029 800A0405 需要“@end”

  1030 800A0406 条件编译已关闭

  1031 800A0407 需要常数

  1032 800A0408 需要“@”

  1033 800A0409 需要“catch”

  1034 800A040A 需要“var”

  1035 800A040B “Throw”的后面必须跟有一个表达式,且在同一源代码行上  

  JScript运行时错误

  JScript运行时错误是指当JScript脚本试图执行一个系统不能运行的动作时导致的错误。当正在运行脚本、计算变量表达式、或者正在动态分配内存时出现JScript运行时错误时。

  以下是76个运行时错误  

  错误号描述

  十进制 十六进制 说明

  5 800A0005 非法过程调用或参数

  6 800A0006 溢出

  7 800A0007 内存不足

  9 800A0009 下标超界

  10 800A000A 此数组被固定或临时锁定

  11 800A000B 零除错误

  13 800A000D 类型失配

  14 800A000E 串空间不足

  17 800A0011 不能执行所请求的操作

  28 800A001C 栈空间不足

  35 800A0023 子过程或函数未找到

  48 800A0030 装载DLL出错

  51 800A0033 内部出错

  52 800A0034 坏文件名或数

  53 800A0035 文件未找到

  54 800A0036 坏文件模式

  55 800A0037 文件已经打开

  57 800A0039 设备I/O错误

  58 800A003A 文件已经存在

  61 800A003D 磁盘空间已满

  62 800A003E 输入超出文件尾

  67 800A0043 文件太多

  68 800A0044 设备不可用

  70 800A0046 权限禁用

  71 800A0047 磁盘未准备好

  74 800A004A 不能用不同的驱动重命名

  75 800A004B 路径/文件访问错误

  76 800A004C 路径未找到

  91 800A005B 对象变量或With块变量未设置

  92 800A005C For循环未初始化

  94 800A005E Null使用无效

  322 800A0042 不能建立所需的临时文件

  424 800A01A8 需要对象

  429 800A01A9 Automation服务器不能建立对象

  430 800A01AE 类不支持Automation

  432 800A01B0 在Automation操作中找不到文件名或类名

  438 800A01B6 对象不支持这个属性或方法

  440 800A01B8 Automation错误

  445 800A01BD 对象不支持这个动作

  446 800A01BE 对象不支持指定的参数

  447 800A01BF 对象不支持当前区域设置

  448 800A01C0 指定的参数未找到

  449 800A01C1 参数不可选

  450 800A01C2 错误的参数数目或非法属性分配

  451 800A01C3 对象不是一个集合

  453 800A01C5 指定的dll函数未找到

  458 800A01CA 变量使用了一个Jscript不支持的Automation类型

  462 800A01CE 远程服务器机器不存在或不可用

  501 800A01F5 不能分配给变量

  502 800A01F6 对象对于脚本不安全

  503 800A01F7 对象对于初始化不安全

  504 800A01F8 对象对建立不安全

  5000 800A1388 不能分配给“this”

  5001 800A1389 需要Number类型

  5002 800A138A 需要Function对象

  5003 800A138B 不能给函数返回值赋值

  5004 800A138C 不能索引对象

  5005 800A138D 需要String

  5006 800A138E 需要Date对象

  5007 800A138F 需要Object类型

  5008 800A1390 非法赋值

  5009 800A1391 未定义标识符

  5010 800A1392 需要Boolean

  5011 800A1393 不能执行来自一个自由脚本的代码

  5012 800A1394 需要对象的成员

  5013 800A1395 需要VBArray

  5014 800A1396 需要JScript对象

  5015 800A1397 需要Enumerator对象

  5016 800A1398 需要正则表达式对象

  5017 800A1399 正则表达式语法错误

  5018 800A139A 未预期的限定符

  5019 800A139B 正则表达式中缺少“]”

  5020 800A139C 正则表达式中缺少“)”

  5021 800A139D 字符集范围无效

  5022 800A139E 异常抛出,但无法抓住

  5023 800A139F 函数没有合法的Prototype(原型)对象

  5024 800A13A0 待解码的URI包含有非法字符

  5025 800A13A1 待解码的URI编码非法

  5026 800A13A2 小数部分的位数越界

  5027 800A13A3 精度越界

  5028 800A13A4 需要Array或arguments对象

  5029 800A13A5 数组长度必须为一有限正整数

  5030 800A13A6 必须赋给数组长度

=====================
5028 需要 Array 或 arguments 对象
5010 需要 Boolean
5003 不能给函数返回值赋值
5000 不能给 'this' 赋值
5006 需要 Date 对象
5015 需要 Enumerator 对象
5022 异常抛出,但无法抓住
5020 正则表达式中缺少“)”
5019 正则表达式中缺少“]”
5023 函数没有合法的 Prototype 对象
5002 需要 Function 对象
5008 非法赋值
5021 字符集范围无效
5014 需要 JScript 对象
5001 需要 Number 类型
5007 需要 Object 类型
5012 需要对象的成员
5016 需要正则表达式对象
5005 需要 String
5017 正则表达式语法错误
5026 小数部分的位数越界
5027 精度越界
5025 待解码的 URI 编码非法
5024 待解码的 URI 包含有非法字符
5009 未定义标识符
5018 未预期的限定符
5013 需要 VBArray

21:49 浏览 (81) 评论 (0) 分类: js 2009
-05-08缩略显示js验证集合
关键字: javascript, js, js验证集合
JS验证集合

在b/s开发中经常用到的javaScript技术
一、验证类
1、数字验证内
1.1 整数
1.2 大于0的整数 (用于传来的ID的验证)
1.3 负整数的验证
1.4 整数不能大于iMax
1.5 整数不能小于iMin
2、时间类
2.1 短时间,形如 (13:04:06)
2.2 短日期,形如 (2003-12-05)
2.3 长时间,形如 (2003-12-05 13:04:06)
2.4 只有年和月。形如(2003-05,或者2003-5)
2.5 只有小时和分钟,形如(12:03)
3、表单类
3.1 所有的表单的值都不能为空
3.2 多行文本框的值不能为空。
3.3 多行文本框的值不能超过sMaxStrleng
3.4 多行文本框的值不能少于sMixStrleng
3.5 判断单选框是否选择。
3.6 判断复选框是否选择.
3.7 复选框的全选,多选,全不选,反选
3.8 文件上传过程中判断文件类型
4、字符类
4.1 判断字符全部由a-Z或者是A-Z的字字母组成
4.2 判断字符由字母和数字组成。
4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
4.4 字符串替换函数.Replace();
5、浏览器类
5.1 判断浏览器的类型
5.2 判断ie的版本
5.3 判断客户端的分辨率

6、结合类
6.1 email的判断。
6.2 手机号码的验证
6.3 身份证的验证

二、功能类

1、时间与相关控件类
1.1 日历
1.2 时间控件
1.3 万年历
1.4 显示动态显示时钟效果(文本,如OA中时间)
1.5 显示动态显示时钟效果 (图像,像手表)
2、表单类
2.1 自动生成表单
2.2 动态添加,修改,删除下拉框中的元素
2.3 可以输入内容的下拉框
2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送)

3、打印类
3.1 打印控件
4、事件类
4.1 屏蔽右键
4.2 屏蔽所有功能键
4.3 --> 和<-- F5 F11,F9,F1
4.4 屏蔽组合键ctrl+N
5、网页设计类
5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现)
5.2 html编辑控件类
5.3 颜色选取框控件
5.4 下拉菜单
5.5 两层或多层次的下拉菜单
5.6 仿IE菜单的按钮。(效果如rongshuxa.com的导航栏目)
5.7 状态栏,title栏的动态效果(例子很多,可以研究一下)
5.8 双击后,网页自动滚屏
6、树型结构。
6.1 asp+SQL版
6.2 asp+xml+sql版
6.3 java+sql或者java+sql+xml
7、无边框效果的制作
8、连动下拉框技术
9、文本排序
js验证集合.rar (8.9 KB)
下载次数: 20
21:43 浏览 (97) 评论 (0) 分类: js 2009
-05-08缩略显示javascript函数库
关键字: javascript, js, javascript函数库, js函数库
javascript函数库
trim() lTrim() rTrim()
校验字符串是否为空: checkIsNotEmpty(str)
校验字符串是否为整型: checkIsInteger(str)
校验整型最小值: checkIntegerMinValue(str,val)
校验整型最大值: checkIntegerMaxValue(str,val)
校验整型是否为非负数: isNotNegativeInteger(str)
校验字符串是否为浮点型: checkIsDouble(str)
校验浮点型最小值: checkDoubleMinValue(str,val)
校验浮点型最大值: checkDoubleMaxValue(str,val)
校验浮点型是否为非负数: isNotNegativeDouble(str)
校验字符串是否为日期型: checkIsValidDate(str)
校验两个日期的先后: checkDateEarlier(strStart,strEnd)
校验字符串是否为email型: checkEmail(str)

校验字符串是否为中文: checkIsChinese(str)
计算字符串的长度,一个汉字两个字符: realLength()
校验字符串是否符合自定义正则表达式: checkMask(str,pat)
得到文件的后缀名: getFilePostfix(oFile)
-------------- 函数检索 --------------
*/

/**
* added by LxcJie 2004.6.25
* 去除多余空格函数
* trim:去除两边空格 lTrim:去除左空格 rTrim: 去除右空格
* 用法:
* var str = " hello ";
* str = str.trim();
*/
String.prototype.trim = function()
{
return this.replace(/(^[\\s]*)|([\\s]*$)/g, "");
}
String.prototype.lTrim = function()
{
return this.replace(/(^[\\s]*)/g, "");
}
String.prototype.rTrim = function()
{
return this.replace(/([\\s]*$)/g, "");
}

/**
*校验字符串是否为空
*返回值:
*如果不为空,定义校验通过,返回true
*如果为空,校验不通过,返回false 参考提示信息:输入域不能为空!
*/
function checkIsNotEmpty(str)
{
if(str.trim() == "")
return false;
else
return true;
}

/**
*校验字符串是否为整型
*返回值:
*如果为空,定义校验通过, 返回true
*如果字串全部为数字,校验通过,返回true
*如果校验不通过, 返回false 参考提示信息:输入域必须为数字!
*/
function checkIsInteger(str)
{
//如果为空,则通过校验
if(str == "")
return true;
if(/^(\\-?)(\\d+)$/.test(str))
return true;
else
return false;
}

/**
*校验整型最小值
*str:要校验的串。 val:比较的值
*
*返回值:
*如果为空,定义校验通过, 返回true
*如果满足条件,大于等于给定值,校验通过,返回true
*如果小于给定值, 返回false 参考提示信息:输入域不能小于给定值!
*/
function checkIntegerMinValue(str,val)
{
//如果为空,则通过校验
if(str == "")
return true;
if(typeof(val) != "string")
val = val + "";
if(checkIsInteger(str) == true)
{
if(parseInt(str,10)>=parseInt(val,10))
return true;
else
return false;
}
else
return false;
}

/**
*校验整型最大值
*str:要校验的串。 val:比较的值
*
*返回值:
*如果为空,定义校验通过, 返回true
*如果满足条件,小于等于给定值,校验通过,返回true
*如果大于给定值, 返回false 参考提示信息:输入值不能大于给定值!
*/
function checkIntegerMaxValue(str,val)
{
//如果为空,则通过校验
if(str == "")
return true;
if(typeof(val) != "string")
val = val + "";
if(checkIsInteger(str) == true)
{
if(parseInt(str,10)<=parseInt(val,10))
return true;
else
return false;
}
else
return false;
}

/**
*校验整型是否为非负数
*str:要校验的串。
*
*返回值:
*如果为空,定义校验通过,返回true
*如果非负数, 返回true
*如果是负数, 返回false 参考提示信息:输入值不能是负数!
*/
function isNotNegativeInteger(str)
{
//如果为空,则通过校验
if(str == "")
return true;
if(checkIsInteger(str) == true)
{
if(parseInt(str,10) < 0)
return false;
else
return true;
}
else
return false;
}

/**
*校验字符串是否为浮点型
*返回值:
*如果为空,定义校验通过, 返回true
*如果字串为浮点型,校验通过, 返回true
*如果校验不通过, 返回false 参考提示信息:输入域不是合法的浮点数!
*/
function checkIsDouble(str)
{
//如果为空,则通过校验
if(str == "")
return true;
//如果是整数,则校验整数的有效性
if(str.indexOf(".") == -1)
{
if(checkIsInteger(str) == true)
return true;
else
return false;
}
else
{
if(/^(\\-?)(\\d+)(.{1})(\\d+)$/g.test(str))
return true;
else
return false;
}
}

/**
*校验浮点型最小值
*str:要校验的串。 val:比较的值
*
*返回值:
*如果为空,定义校验通过, 返回true
*如果满足条件,大于等于给定值,校验通过,返回true
*如果小于给定值, 返回false 参考提示信息:输入域不能小于给定值!
*/
function checkDoubleMinValue(str,val)
{
//如果为空,则通过校验
if(str == "")
return true;
if(typeof(val) != "string")
val = val + "";
if(checkIsDouble(str) == true)
{
if(parseFloat(str)>=parseFloat(val))
return true;
else
return false;
}
else
return false;
}

/**
*校验浮点型最大值
*str:要校验的串。 val:比较的值
*
*返回值:
*如果为空,定义校验通过, 返回true
*如果满足条件,小于等于给定值,校验通过,返回true
*如果大于给定值, 返回false 参考提示信息:输入值不能大于给定值!
*/
function checkDoubleMaxValue(str,val)
{
//如果为空,则通过校验
if(str == "")
return true;
if(typeof(val) != "string")
val = val + "";
if(checkIsDouble(str) == true)
{
if(parseFloat(str)<=parseFloat(val))
return true;
else
return false;
}
else
return false;
}

/**
*校验浮点型是否为非负数
*str:要校验的串。
*
*返回值:
*如果为空,定义校验通过,返回true
*如果非负数, 返回true
*如果是负数, 返回false 参考提示信息:输入值不能是负数!
*/
function isNotNegativeDouble(str)
{
//如果为空,则通过校验
if(str == "")
return true;
if(checkIsDouble(str) == true)
{
if(parseFloat(str) < 0)
return false;
else
return true;
}
else
return false;
}

/**
*校验字符串是否为日期型
*返回值:
*如果为空,定义校验通过, 返回true
*如果字串为日期型,校验通过, 返回true
*如果日期不合法, 返回false 参考提示信息:输入域的时间不合法!(yyyy-MM-dd)
*/
function checkIsValidDate(str)
{
//如果为空,则通过校验
if(str == "")
return true;
var pattern = /^((\\d{4})|(\\d{2}))-(\\d{1,2})-(\\d{1,2})$/g;
if(!pattern.test(str))
return false;
var arrDate = str.split("-");
if(parseInt(arrDate[0],10) < 100)
arrDate[0] = 2000 + parseInt(arrDate[0],10) + "";
var date = new Date(arrDate[0],(parseInt(arrDate[1],10) -1)+"",arrDate[2]);
if(date.getYear() == arrDate[0]
&& date.getMonth() == (parseInt(arrDate[1],10) -1)+""
&& date.getDate() == arrDate[2])
return true;
else
return false;
}

/**
*校验两个日期的先后
*返回值:
*如果其中有一个日期为空,校验通过, 返回true
*如果起始日期早于等于终止日期,校验通过, 返回true
*如果起始日期晚于终止日期, 返回false 参考提示信息: 起始日期不能晚于结束日期。
*/
function checkDateEarlier(strStart,strEnd)
{
if(checkIsValidDate(strStart) == false || checkIsValidDate(strEnd) == false)
return false;
//如果有一个输入为空,则通过检验
if (( strStart == "" ) || ( strEnd == "" ))
return true;
var arr1 = strStart.split("-");
var arr2 = strEnd.split("-");
var date1 = new Date(arr1[0],parseInt(arr1[1].replace(/^0/,""),10) - 1,arr1[2]);
var date2 = new Date(arr2[0],parseInt(arr2[1].replace(/^0/,""),10) - 1,arr2[2]);
if(arr1[1].length == 1)
arr1[1] = "0" + arr1[1];
if(arr1[2].length == 1)
arr1[2] = "0" + arr1[2];
if(arr2[1].length == 1)
arr2[1] = "0" + arr2[1];
if(arr2[2].length == 1)
arr2[2]="0" + arr2[2];
var d1 = arr1[0] + arr1[1] + arr1[2];
var d2 = arr2[0] + arr2[1] + arr2[2];
if(parseInt(d1,10) > parseInt(d2,10))
return false;
else
return true;
}

/**
*校验字符串是否为email型
*返回值:
*如果为空,定义校验通过, 返回true
*如果字串为email型,校验通过, 返回true
*如果email不合法, 返回false 参考提示信息:Email的格式不正確!
*/
function checkEmail(str)
{
//如果为空,则通过校验
if(str == "")
return true;
if (str.charAt(0) == "." || str.charAt(0) == "@" || str.indexOf(\'@\', 0) == -1
|| str.indexOf(\'.\', 0) == -1 || str.lastIndexOf("@") == str.length-1 || str.lastIndexOf(".") == str.length-1)
return false;
else
return true;
}

/**
*校验字符串是否为中文
*返回值:
*如果为空,定义校验通过, 返回true
*如果字串为中文,校验通过, 返回true
*如果字串为非中文, 返回false 参考提示信息:必须为中文!
*/
function checkIsChinese(str)
{
//如果值为空,通过校验
if (str == "")
return true;
var pattern = /^([\\u4E00-\\u9FA5]|[\\uFE30-\\uFFA0])*$/gi;
if (pattern.test(str))
return true;
else
return false;
}

/**
* 计算字符串的长度,一个汉字两个字符
*/
String.prototype.realLength = function()
{
return this.replace(/[^\\x00-\\xff]/g,"**").length;
}

/**
*校验字符串是否符合自定义正则表达式
*str 要校验的字串 pat 自定义的正则表达式
*返回值:
*如果为空,定义校验通过, 返回true
*如果字串符合,校验通过, 返回true
*如果字串不符合, 返回false 参考提示信息:必须满足***模式
*/
function checkMask(str,pat)
{
//如果值为空,通过校验
if (str == "")
return true;
var pattern = new RegExp(pat,"gi")
if (pattern.test(str))
return true;
else
return false;
}

/**
* added by LxcJie 2004.6.25
* 得到文件的后缀名
* oFile为file控件对象
*/
function getFilePostfix(oFile)
{
if(oFile == null)
return null;
var pattern = /(.*)\\.(.*)$/gi;
if(typeof(oFile) == "object")
{
if(oFile.value == null || oFile.value == "")
return null;
var arr = pattern.exec(oFile.value);
return RegExp.$2;
}
else if(typeof(oFile) == "string")
{
var arr = pattern.exec(oFile);
return RegExp.$2;
}
else
return null;
}

21:21 浏览 (50) 评论 (0) 分类: js 2009
-05-08缩略显示spring优点
关键字: spring, spring优点

Spring主要有两种事务管理方式:编程式、声明式。




一、Spring提供两种方式的编程式事务管理,分别是:使用TransactionTemplate和直接使用PlatformTransactionManager。



二、Spring也提供声明式事务管理。这是通过AOP实现的。



Spring优点:

★ 为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate、iBATIS数据库层JDO
★ 提供比大多数事务API更简单的、易于使用的编程式事务管理API
★ 整合Spring数据访问抽象
★ 支持Spring声明式事务管理



还有.........



1. 提供了一种管理对象的方法,可以把中间层对象有效地组织起来。一个完美的框架“黏合剂”。

  2. 采用了分层结构,可以增量引入到项目中。

  3. 有利于面向接口编程习惯的养成。

  4. 目的之一是为了写出易于测试的代码。

  5. 非侵入性,应用程序对Spring API的依赖可以减至最小限度。

  6. 一致的数据访问介面。

  6. 一个轻量级的架构解决方案。

21:04 浏览 (313) 评论 (0) 分类: SSH 2009
-05-08缩略显示JDBC编程总结
关键字: jdbc
JDBC是JAVA操作数据库的基本技术,并不是唯一技术。

Hibernate、TopLink等OR Mapping操作数据库的技术都是建立JDBC技术之上的,实际来说,他们的性能和JDBC是有很大差距的,但反过来说,如果JDBC用不好,还不如hibernate呢。暂且不说这些孰优孰劣的话了,再次主要是对Java的基础技术做个总结,以加深认识。

一、JDBC的基本原理JDBC是Java操作数据库的技术规范。

他实际上定义了一组标准的操作数据库的接口。为了能让Java操作数据库,必须要有实现了JDBC这些接口的类,不同的数据库厂商为了让Java语言能操作自己的数据库,都提供了对JDBC接口的实现——这些实现了JDBC接口的类打成一个jar包,就是我们平时看到的数据库驱动。由于不同的数据库操作数据的机制不一样,因此JDBC的具体实现也就千差万别,但是你作为java程序员,你只和Java JDBC的接口打交到,才不用理会他们怎么实现的!呵呵,现在知道JDBC驱动是怎么回事了。当然,这些类可以自己去写——如果你很牛!

二、JDBC编程的步骤为了说明这个步骤

假设你要通过java程序执行一个sql查询,你需要按照如下的步骤去走:

1、创建指定数据库的URL这个URL实际上还是统一资源定位器,里面包含了一些连接数据库的信息:数据库类型、端口、驱动类型、连接方式、数据库服务器的ip(或名字)、数据库名(有的是别名)等。其格式如下:

jdbc:subProtocol:subName://DBserverIP:port/DatabaseName例如mysql的一个url:jdbc:mysql://192.168.3.143:3306/zfvims

2、加载驱动类到JVM内存区域中有两种方法:一种是用Class.forName()方法加载指定的驱动程序。

一种是将驱动程序添加到java.lang.System的属性jdbc.drivers中。

最后说明一点,有时候添加到系统的CLASSPATH环境变量是不行的,原因是在使用JDBC接口操作数据库前,JVM还没有加载上驱动。

Class.forName("com.mysql.jdbc.Driver")

3、、通过DriverManager类管理驱动、创建数据库连接。

DriverManager类作用于程序员和JDBC驱动程序之间,提供注册管理驱动建立连接细节等方法,它所有成员均为静态的。通过其getConnection方法会创建一个JDBC Connection对象。

Connection conn=DriverManager.registerDriver("jdbc:mysql://192.168.3.143:3306/zfvims","lavasoft","password");

4、Connection类——数据库连接这里所说的Connection类实际上是实现了JDBC的Connection接口的类,这个类一般都是jdbc驱动程序实现了。Connection类表示了数据库连接,通过其对象可以获取一个获取数据库和表等数据库对象的详细信息。但更多的是通过这个连接更进一步去向数据库发送SQL语句去执行,下面会讲到。

数据库的连接的建立是很耗费资源和时间的,因此在不用连接的情况下要通过其close()方法将连接关闭,以释放系统资源。

5、Statement类——发送并执行(静态)SQL语句通过Connection对象的createStatement()方法可以创建一个Statement对象,通过该对象的方法可以(发送)并执行一个静态sql语句。如果要执行动态的sql(sql串中有参数),那么就用PreparedStatement类,用法和Statement类似。

Statement stmt=con.createStatement()

6、ResultSet类——结果集当你执行一条sql查询后,就会产生一个查询结果。ResultSet就表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。ResultSet 对象具有指向其当前数据行的指针。通过ResultSet对象不但可以结果集数据,还可以获取结果集表的列名、数据类型等信息。

ResultSet rs=stmt.executeQuery(sql)

7、关闭数据库连接当对sql操作完成后,应该关闭数据库连接,这样避免因为连接未关闭而耗费系统资源,如果每次都不关闭,多次操作将建立多个连接,最终数据库连接会达到最大限度,或者耗尽系统的资源,从而导致应用崩溃。因此要注意关闭资源,尤其是数据库连接。

三、JDBC编程最基本的实例

下面通过一个执行一条简单的MySQL查询来说名上面的JDBC编程的一般方法和步骤。

public class TestJDBC(){ public static Connection getConnectionByJDBC() { Connection conn = null;try { //装载驱动类Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) { System.out.println("装载驱动异常!");e.printStackTrace();} try { //建立JDBC连接conn = DriverManager.getConnection(""jdbc:mysql://192.168.3.143:3306/zfvims","lavasoft","password");} catch (SQLException e) { System.out.println("链接数据库异常!");e.printStackTrace();} return conn;}

public static String test() { String sqlx = "select t.code,t.name from province t order by t.code asc";try { //创建一个JDBC声明Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);//执行查询ResultSet = stmt.executeQuery(sqlx);while (rs.next()) { String code = rs.getString("code");String name = rs.getString("name");System.out.println(code+name);} } catch (SQLException e) { System.out.println(e.getMessage());e.printStackTrace();} finally { //预防性关闭连接(避免异常发生时在try语句块关闭连接没有执行)

try { if (conn != null) conn.close();} catch (SQLException e) { System.out.println(e.getMessage());e.printStackTrace();} public static void main(String args[]) { new TestJDBC()。test();}

四、JDBC的陷阱

1、conn一定要在finally语句块进行关闭。

2、Statement、ResultSet尽可能缩小其变量作用域。

3、Statement可以使用多次,定义多个。一个Statement对象只和一个ResultSet对象关联,并且是最后一次查询。

4、ResultSet在Connection、ResultSet关闭后自动关闭。

19:19 浏览 (177) 评论 (1) 分类: JAVA 2009
-05-08缩略显示OGNL表达式
关键字: ognl
OGNL
  OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
  WebOGNL是一种构建以servlet为基础的组件化应用的web表现层框架,它的模板语言建立在OGNL表达式的基础上,具有别的web层框架不能匹敌的适应性。
  OGNL可以让我们用非常简单的表达式访问对象层,例如,当前环境的根对象为user1,则表达式person.address[0].province
  可以访问到user1的person属性的第一个address的province属性。
  这种功能是模板语言的一个重要补充,象jsp2.0,velocity,jelly等等,都有类似的功能,但是ognl比它们完善得多,而且以一个独立的lib出现,方便我们构建自己的框架。
  webwork2和现在的Struts2.x中使用OGNL取代原来的EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素(例如一个textfield,hidden)和对象层某个类的某个属性绑定在一起,修改和显示自动同步。
  和struts1.x的formbean相比,这样做的好处非常明显:在webwork中不需要为每个页面专门写formbean,可以直接利用对象层的对象。例如在对象设计中,我们的User和Person是分开的,而一个注册用户界面需要填写两者的内容,在webwork中,就可以保持后台的对象结构,把属于用户属性的界面元素用user.person.xxx绑定,把属于账号属性的界面元素用user.xxx绑定。
18:55 浏览 (205) 评论 (0) 分类: 表达式语言 2009
-05-08缩略显示jstl 表达式
关键字: 各种表达式,jstl, el
定义
  JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。

  JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。

  两个 JSTL 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。可以配置 ScriptFreeTLV 验证器以在 JSP 页面中禁用各种类型的 JSP 脚本元素 — scriptlet、表达式和声明。类似地,PermittedTaglibsTLV 验证器可以用来限制可能由应用程序的 JSP 页面访问的定制标记库集(包括 JSTL 标记库)。

  尽管 JSTL 最终将会成为 J2EE 平台的必需组件,但目前只有少数应用程序服务器包括它。JSTL 1.0 的参考实现可作为 Apache 软件基金会(Apache Software Foundation)的 Jakarta Taglibs 项目(请参阅参考资料)的一部分而获得。可以将该参考实现中的定制标记库合并到任何支持 JSP 1.2 和 Servlet 2.3 规范的服务器,以添加对 JSTL 的支持。

  如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到classpath中,如果你还需要使用XML processing及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。这个zip文件可以从http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip下载。

JSTL的优点
  1、 在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各应用服务器之间的移植。

  2、 简化了JSP和WEB应用程序的开发。

  3、 以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。

详细介绍
  JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。在 developerWorks 上其新系列的第一篇文章中,软件工程师 Mark Kolb 向您展示了如何使用 JSTL 标记来避免在 JSP 页面中使用脚本编制元素。您还将了解如何通过从表示层删除源代码来简化软件维护。最后,您将了解 JSTL 经过简化的表达式语言,它允许在不必使用功能齐全的编程语言的情况下对 JSTL 操作指定动态属性值。

  JavaServer Pages(JSP)是用于 J2EE 平台的标准表示层技术。JSP 技术提供了用于执行计算(这些计算用来动态地生成页面内容)的脚本编制元素和操作。脚本编制元素允许在 JSP 页面中包括程序源代码,在为响应用户请求而呈现页面时可以执行这些源代码。操作将计算操作封装到很象 HTML 或 XML 标记的标记中,JSP 页面的模板文本通常包含这些标记。JSP 规范只将几种操作定义成了标准,但从 JSP 1.1 开始,开发人员已经能够以定制标记库的方式创建其自己的操作了。

  JSP 标准标记库(JSTL)是 JSP 1.2 定制标记库集,这些标记库实现大量服务器端 Java 应用程序常用的基本功能。通过为典型表示层任务(如数据格式化和迭代或条件内容)提供标准实现,JSTL 使 JSP 作者可以专注于特定于应用程序的开发需求,而不是为这些通用操作“另起炉灶”。

  当然,您可以使用 JSP 脚本编制元素(scriptlet、表达式和声明)来实现此类任务。例如,可以使用三个 scriptlet 实现条件内容,清单 1 中着重显示了这三个 scriptlet。但是,因为脚本编制元素依赖于在页面中嵌入程序源代码(通常是 Java 代码),所以对于使用这些脚本编制元素的 JSP 页面,其软件维护任务的复杂度大大增加了。例如,清单 1 中的 scriptlet 示例严格地依赖于花括号的正确匹配。如果不经意间引入了一个语法错误,则条件内容中的嵌套其它 scriptlet 可能会造成严重破坏,并且在 JSP 容器编译该页面时,要使所产生的错误信息有意义可能会很困难。

  清单 1. 通过 scriptlet 实现条件内容

  <% if (user.getRole() == "member")) { %>

  <p>Welcome, member!</p>

  <% } else { %>

  <p>Welcome, guest!</p>

  <% } %>

  修正此类问题通常需要相当丰富的编程经验。尽管通常会由十分精通页面布局和图形设计的设计人员来开发和维护 JSP,但是同一页面中的脚本编制元素出现问题时,需要程序员的介入。这种状况将单个文件中代码的责任分担给多人,因而使得开发、调试和增强此类 JSP 页面成为很麻烦的任务。通过将常用功能包装到定制标记库的标准集合中,JSTL 使 JSP 作者可以减少对编制脚本元素的需求,甚至可以不需要它们,并避免了相关的维护成本。

  JSTL 1.0

  JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库( core 、 format 、 xml 和 sql )和一对通用标记库验证器( ScriptFreeTLV 和 PermittedTaglibsTLV )组成。 core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义, format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。 xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。

  两个 JSTL 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。可以配置 ScriptFreeTLV 验证器以在 JSP 页面中禁用各种类型的 JSP 脚本元素 ― scriptlet、表达式和声明。类似地, PermittedTaglibsTLV 验证器可以用来限制可能由应用程序的 JSP 页面访问的定制标记库集(包括 JSTL 标记库)。

  尽管 JSTL 最终将会成为 J2EE 平台的必需组件,但目前只有少数应用程序服务器包括它。JSTL 1.0 的参考实现可作为 Apache 软件基金会(Apache Software Foundation)的 Jakarta Taglibs 项目(请参阅 参考资料)的一部分而获得。可以将该参考实现中的定制标记库合并到任何支持 JSP 1.2 和 Servlet 2.3 规范的服务器,以添加对 JSTL 的支持。

  表达式语言

  在 JSP 1.2 中,可以使用静态字符串或表达式(如果允许的话)指定 JSP 操作的属性。例如,在清单 2 中,对 <jsp:setProperty> 操作的 name 和 property 属性指定了静态值,而用表达式指定了其 value 属性。这个操作的效果是将请求参数的当前值赋予命名的 bean 特性。以这种形式使用的表达式被称为 请求时属性值(request-time attribute value),这是构建到 JSP 规范中的用于动态指定属性值的唯一机制。

  清单 2. 合并请求时属性值的 JSP 操作

  <jsp:setProperty name="user" property="timezonePref"

  value='<%= request.getParameter("timezone") %>'/>

  因为请求时属性值是用表达式指定的,所以它们往往有和其它脚本元素一样的软件维护问题。因此,JSTL 定制标记支持另一种用于指定动态属性值的机制。可以用简化的 表达式语言(EL)而不使用完整的 JSP 表达式来指定 JSTL 操作的属性值。EL 提供了一些标识符、存取器和运算符,用来检索和操作驻留在 JSP 容器中的数据。EL 在某种程度上以 EcmaScript(请参阅 参考资料)和 XML 路径语言(XML Path Language,XPath)为基础,因此页面设计人员和程序员都应该熟悉它的语法。EL 擅长寻找对象及其特性,然后对它们执行简单操作;它不是编程语言,甚至不是脚本编制语言。但是,与 JSTL 标记一起使用时,它就能使用简单而又方便的符号来表示复杂的行为。EL 表达式的格式是这样的:用美元符号($)定界,内容包括在花括号({})中,如清单 3 所示。

  清单 3. 说明 EL 表达式定界符的 JSTL 操作

  <c:out value="${user.firstName}"/>

  此外,您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值,如清单 4 所示。单独的表达式由标识符、存取器、文字和运算符组成。标识符用来引用存储在数据中心中的数据对象。EL 有 11 个保留标识符,对应于 11 个 EL 隐式对象。假定所有其它标识符都引用 限制了作用域的变量。存取器用来检索对象的特性或集合的元素。文字表示固定的值 ― 数字、字符、字符串、布尔型或空值。运算符允许对数据和文字进行组合以及比较。

  清单 4. 组合静态文本和多个 EL 表达式以指定动态属性值

  <c:out value="Hello ${user.firstName} ${user.lastName}"/>

  限制了作用域的变量

  JSP API 通过 <jsp:useBean> 操作允许从 JSP 容器内的四个不同作用域中存储和检索数据。JSTL 通过提供用于指定和除去这些作用域中的对象的附加操作来扩展这一能力。此外,EL 提供将这些对象作为限制了作用域的变量进行检索的内置支持。特别地,任何出现在 EL 表达式中但不对应于任何 EL 隐式对象的标识符,都被自动假定为引用存储在四个 JSP 作用域的其中某个中的对象,这四个作用域是:

  页面作用域
  请求作用域
  会话作用域
  应用程序作用域
  您可能还记得,只有在为特定请求处理页面期间才能检索存储在该页面作用域中的对象。如果对象是存储在请求作用域中的,可以在处理所有参与处理某请求的页面期间检索这些对象(譬如在对某个请求的处理中遇到了一个或多个 <jsp:include> 或 <jsp:forward> 操作)。如果对象是存储在会话作用域中的,则在与 Web 应用程序的交互式会话期间,可以由用户访问的任何页面检索它(即,直到与该用户交互相关联的 HttpSession 对象无效为止)。可以由任何用户从任何页面访问存储在应用程序作用域中的对象,直到卸载 Web 应用程序本身为止(通常是由于关闭 JSP 容器所致)。

  通过将字符串映射为期望作用域中的对象来将对象存储到该作用域。然后,就可以通过提供相同字符串来从该作用域检索该对象。在作用域的映射中查找字符串,并返回被映射的对象。在 Servlet API 中,将此类对象称为相应作用域的 属性。但是,在 EL 的上下文中,也将与属性相关联的字符串看作变量的名称,该变量通过属性映射的方式获得特定的值。

  在 EL 中,与隐式对象无关联的标识符被认为是存储在四个 JSP 作用域中的名称对象。首先对页面作用域检查是否存在这样的标识符,其次对请求作用域、然后对会话作用域、最后对应用程序作用域依次进行这样的检查,然后测试该标识符的名称是否与存储在该作用域中的某个对象的名称匹配。第一个这样的匹配作为 EL 标识符的值被返回。通过这种方法,可以将 EL 标识符看作引用限制了作用域的变量。

  从更技术的方面来说,没有映射到隐式对象的标识符是用 PageContext 实例的 findAttribute() 方法求值的,该实例表示对页面的处理,在该页面上,当前正在处理用于请求的表达式。标识符的名称作为参数传递给这个方法,然后该方法依次在四个作用域中搜索具有相同名称的属性。并将所找到的第一个匹配项作为 findAttribute() 方法的值返回。如果未在这四个作用域中找到这样的属性,则返回 null 。

  最终,限制了作用域的变量是四个 JSP 作用域的属性,这些属性具有可以用作 EL 标识符的名称。只要对限制了作用域的变量赋予由字母数字组成的名称,就可以通过 JSP 中提供的用于设置属性的任何机制来创建它们。这包括内置的 <jsp:useBean> 操作,以及由 Servlet API 中的几个类定义的 setAttribute() 方法。此外,四个 JSTL 库中定义的许多定制标记本身就能够设置作为限制了作用域的变量使用的属性值。

  隐式对象

  表 1 中列出了 11 个 EL 隐式对象的标识符。不要将这些对象与 JSP 隐式对象(一共只有九个)混淆,其中只有一个对象是它们所共有的。

  表 1. EL 隐式对象

  类别 标识符 描述

  JSP pageContext PageContext 实例对应于当前页面的处理

  作用域 pageScope 与页面作用域属性的名称和值相关联的 Map 类

  requestScope 与请求作用域属性的名称和值相关联的 Map 类

  sessionScope 与会话作用域属性的名称和值相关联的 Map 类

  applicationScope 与应用程序作用域属性的名称和值相关联的 Map 类

  请求参数 param 按名称存储请求参数的主要值的 Map 类

  paramValues 将请求参数的所有值作为 String 数组存储的 Map 类

  请求头 header 按名称存储请求头主要值的 Map 类

  headerValues 将请求头的所有值作为 String 数组存储的 Map 类

  Cookie cookie 按名称存储请求附带的 cookie 的 Map 类

  初始化参数 initParam 按名称存储 Web 应用程序上下文初始化参数的 Map 类

  尽管 JSP 和 EL 隐式对象中只有一个公共对象( pageContext ),但通过 EL 也可以访问其它 JSP 隐式对象。原因是 pageContext 拥有访问所有其它八个 JSP 隐式对象的特性。实际上,这是将它包括在 EL 隐式对象中的主要理由。

  其余所有 EL 隐式对象都是映射,可以用来查找对应于名称的对象。前四个映射表示先前讨论的各种属性作用域。可以用它们来查找特定作用域中的标识符,而不用依赖于 EL 在缺省情况下使用的顺序查找过程。

  接下来的四个映射用来获取请求参数和请求头的值。因为 HTTP 协议允许请求参数和请求头具有多个值,所以它们各有一对映射。每对中的第一个映射返回请求参数或头的主要值,通常是恰巧在实际请求中首先指定的那个值。每对中第二个映射允许检索参数或头的所有值。这些映射中的键是参数或头的名称,但这些值是 String 对象的数组,其中的每个元素都是单一参数值或头值。

  cookie 隐式对象提供了对由请求设置的 cookie 名称的访问。这个对象将所有与请求相关联的 cookie 名称映射到表示那些 cookie 特性的 Cookie 对象。

  最后一个 EL 隐式对象 initParam 是一个映射,它储存与 Web 应用程序相关联的所有上下文的初始化参数的名称和值。初始化参数是通过 web.xml 部署描述符文件指定的,该文件位于应用程序的 WEB-INF 目录中。

  存取器

  因为 EL 标识符是作为隐式对象或限制了作用域的变量(通过属性来实现)解析的,因此有必要将它们转换成 Java 对象。EL 可以自动包装和解包其相应的 Java 类中的基本类型(例如,可以在后台将 int 强制转换成 Integer 类,反之亦可),但大多数的标识符将成为指向完整的 Java 对象的指针。

  结果是,对这些对象的特性或(在对象是数组和集合的情况下)对其元素的访问通常是令人满意的。就为了实现这种用途,EL 提供了两种不同的存取器(点运算符( . )和方括号运算符( [] )),也支持通过 EL 操作特性和元素。

  点运算符通常用于访问对象的特性。例如,在表达式 ${user.firstName} 中,使用点运算符来访问 user 标识符所引用对象的名为 firstName 的特性。EL 使用 Java bean 约定访问对象特性,因此必须定义这个特性的 getter 方法(通常是名为 getFirstName() 的方法),以便表达式正确求值。当被访问的特性本身是对象时,可以递归地应用点运算符。例如,如果我们虚构的 user 对象有一个实现为 Java 对象的 address 特性,那么也可以用点运算符来访问这个对象的特性。例如,表达式 ${user.address.city} 将会返回这个地址对象嵌套的 city 特性。

  方括号运算符用来检索数组和集合的元素。在数组和有序集合(也即,实现了 java.util.List 接口的集合)的情况下,把要检索的元素的下标放在方括号中。例如,表达式 ${urls[3]} 返回 urls 标识符所引用的数组或集合的第四个元素(和 Java 语言以及 JavaScript 中一样,EL 中的下标是从零开始的)。

  对于实现 java.util.Map 接口的集合,方括号运算符使用关联的键查找存储在映射中的值。在方括号中指定键,并将相应的值作为表达式的值返回。例如,表达式 ${commands["dir"]} 返回与 commands 标识符所引用的 Map 中的 "dir" 键相关联的值。

  对于上述两种情况,都可允许表达式出现在方括号中。对嵌套表达式求值的结果将被作为下标或键,用来检索集合或数组的适当元素。和点运算符一样,方括号运算符也可以递归应用。这使得 EL 能够从多维数组、嵌套集合或两者的任意组合中检索元素。此外,点运算符和方括号运算符还可以互操作。例如,如果数组的元素本身是对象,则可以使用方括号运算符来检索该数组的元素,并结合点运算符来检索该元素的一个特性(例如 ${urls[3].protocol} )。

  假定 EL 充当指定动态属性值的简化语言,EL 存取器有一个有趣的功能(与 Java 语言的存取器不同),那就是它们在应用于 null 时不抛出异常。如果应用 EL 存取器的对象(例如, ${foo.bar} 和 ${foo["bar"]} 中的 foo 标识符)是 null ,那么应用存取器的结果也是 null 。事实证明,在大多数情况下,这是一个相当有用的行为,不久您就会了解这一点。

  最后,点运算符和方括号运算符可能实现某种程度的互换。例如,也可以使用 ${user["firstName"]} 来检索 user 对象的 firstName 特性,正如可以用 ${commands.dir} 获取与 commands 映射中的 "dir" 键相关联的值一样。

  运算符

  EL 还可以通过使用标识符和存取器,遍历包含应用程序数据(通过限制了作用域的变量公开)或关于环境的信息(通过 EL 隐式对象)的对象层次结构。但是,只是访问这些数据,通常不足以实现许多 JSP 应用程序所需的表示逻辑。

  最终,EL 还包括了几个用来操作和比较 EL 表达式所访问数据的运算符。表 2 中汇总了这些运算符。

  表 2. EL 运算符

  类别 运算符

  算术运算符 + 、 - 、 * 、 / (或 div )和 % (或 mod )

  关系运算符 == (或 eq )、 != (或 ne )、 < (或 lt )、 > (或 gt )、 <= (或 le )和 >= (或 ge )

  逻辑运算符 && (或 and )、 || (或 or )和 ! (或 not )

  验证运算符 empty

  算术运算符支持数值的加法、减法、乘法和除法。还提供了一个求余运算符。注:除法和求余运算符都有替代的、非符号的名称(为的是与 XPath 保持一致)。清单 5 中显示了一个演示算术运算符用法的示例表达式。对几个 EL 表达式应用算术运算符的结果是将该算术运算符应用于这些表达式返回的数值所得的结果。

  清单 5. 利用算术运算符的 EL 表达式

  ${item.price * (1 + taxRate[user.address.zipcode])}

  关系运算符允许比较数字或文本数据。比较的结果作为布尔值返回。逻辑运算符允许合并布尔值,返回新的布尔值。因此,可以将 EL 逻辑运算符应用于嵌套的关系或逻辑运算符的结果,如清单 6 所示。

  清单 6. 利用关系和逻辑运算符的 EL 表达式

  ${(x >= min) && (x <= max)}

  最后一种 EL 运算符是 empty ,它对于验证数据特别有用。 empty 运算符采用单个表达式作为其变量(也即, ${empty input} ),并返回一个布尔值,该布尔值表示对表达式求值的结果是不是“空”值。求值结果为 null 的表达式被认为是空,即无元素的集合或数组。如果参数是对长度为零的 String 求值所得的结果,则 empty 运算符也将返回 true 。

  表 3 显示了 EL 运算符的优先级。正如清单 5 和 6 所示,可以用圆括号对表达式分组,高于普通的优先级规则。

  表 3. EL 运算符优先级(自顶到底,从左到右)

  [] , .

  ()

  unary - 、 not 、 ! 、 empty

  * 、 / 、 div 、 % 、 mod

  + 、binary -

  () <</code> 、 > 、 <= 、 >= 、 lt 、 gt 、 le 、 ge

  == 、 != 、 eq 、 ne

  && 、 and

  || 、 or

  文字

  在 EL 表达式中,数字、字符串、布尔值和 null 都可以被指定为文字值。字符串可以用单引号或双引号定界。布尔值被指定为 true 和 false 。

  Taglib 伪指令

  正如我们先前讨论的,JSTL 1.0 包括四个定制标记库。为了演示 JSTL 标记和表达式语言的交互,我们将研究几个来自 JSTL core 库的标记。和使用任何 JSP 定制标记库一样,必须在您想要使用这个库标记的任何页面中包括 taglib 伪指令。清单 7 显示了用于这个特定库的伪指令。

  清单 7. 用于 JSTL core 库 EL 版本的 taglib 伪指令

  <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

  实际上,对应于 JSTL core 库的 taglib 伪指令有两种,因为在 JSTL 1.0 中,EL 是可选的。所有四个 JSTL 1.0 定制标记库都有使用 JSP 表达式(而不是 EL)指定动态属性值的备用版本。因为这些备用库依赖于 JSP 的更传统的请求时属性值,所以它们被称为 RT库,而那些使用表达式语言的则被称为 EL 库。开发人员用不同的 taglib 伪指令来区分每个库的这两个版本。清单 8 显示了使用 core 库的 RT 版本的伪指令。但是,由于现在我们讨论的重点是 EL,所以首先需要这些伪指令。

  清单 8. 用于 JSTL core 库 RT 版本的 taglib 伪指令

  <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt" %>

  变量标记

  我们首先要考虑的 JSTL 定制标记是 <c:set> 操作。正如已经说明的,限制了作用域的变量在 JSTL 中起关键作用, <c:set> 操作提供基于标记的机制来创建和设置限制了作用域的变量。清单 9 中显示了该操作的语法,其中 var 属性指定了限制了作用域的变量的名称, scope 属性表明了该变量驻留在哪个作用域中, value 属性指定了分配给该变量的值。如果指定变量已经存在,则简单地将所指明的值赋给它。如果不存在,则创建新的限制了作用域的变量,并用该值初始化这个变量。

  清单 9. <c:set> 操作的语法

  <c:set var="name"

  scope="scope"

  value="expression"/>

  scope 属性是可选的,其缺省值是 page 。

  清单 10 中显示了 <c:set> 的两个示例。在第一个示例中,将会话作用域变量设置成 String 值。在第二个示例中,用表达式来设置数值:将页面作用域内名为 square 的变量赋值为名为 x 的请求参数的值的平方。

  清单 10. <c:set> 操作示例

  <c:set var="timezone" scope="session" value="CST"/>

  <c:set var="square" value="${param['x'] * param['x']}"/>

  您还可以将限制了作用域的变量的值指定为 <c:set> 操作的主体内容,而不是使用属性。使用这种方法,您可以重新编写清单 10 中的第一个示例,如清单 11 所示。此外,正如我们马上可以看到的, <c:set> 标记的主体内容本身也可以使用定制标记。 <c:set> 主体内生成的所有内容都将作为一个 String 值赋给指定变量。

  清单 11. 通过主体内容指定 <c:set> 操作的值

  <c:set var="timezone" scope="session">CST</c:set>

  JSTL core 库包含第二个用于管理限制了作用域的变量的标记 ― <c:remove> 。顾名思义, <c:remove> 操作是用来删除限制了作用域的变量的,它获取两个属性。 var 属性指定待删除变量的名称, scope 属性是可选的,它表示待删除变量来自哪个作用域,缺省为 page ,如清单 12 所示。

  清单 12. <c:remove> 操作示例 <c:remove var="timezone" scope="session"/>

  输出

  尽管 <c:set> 操作允许将表达式结果赋给限制了作用域的变量,但开发人员通常会希望只显示表达式的值,而不存储它。JSTL <c:out> 定制标记承担这一任务,其语法如清单 13 所示。该标记对由其 value 属性指定的表达式进行求值,然后打印结果。如果指定了可选属性 default ,那么,在对 value 属性的表达式求值所得结果为 null 或空 String 的情况下, <c:out> 将打印其值。

  清单 13. <c:out> 操作的语法

  <c:out value="expression"

  default="expression"

  escapeXml="boolean"/>

  escapeXml 属性也是可选的。它控制当用 <c:out> 标记输出诸如“<”、“>”和“&”之类的字符(在 HTML 和 XML 中具有特殊意义)时是否应该进行转义。如果将 escapeXml 设置为 true,则会自动将这些字符转换成相应的 XML 实体(此处提到的字符分别转换成 < 、 > 和 & )。

  例如,假定有一个名为 user 的会话作用域变量,它是一个类的实例,该类为用户定义了两个特性: username 和 company 。每当用户访问站点时,这个对象被自动分配给会话,但直到用户实际登录后,才会设置这两个特性。假定是这种方案,请考虑清单 14 中的 JSP 片段。在用户登录之后,这个片段将显示单词“Hello”,其后是他/她的用户名和一个惊叹号。但是,在用户登录之前,由这个片段生成的内容则是短语“Hello Guest!”。在这种情况下,因为 username 特性还有待初始化,所以 <c:out> 标记将转而打印出 default 属性的值(即字符串“Guest”)。

  清单 14. 带缺省内容的 <c:out> 操作示例

  Hello <c:out value="${user.username}" default=="Guest"/>!

  接下来,考虑清单 15,它使用了 <c:out> 标记的 escapeXml 属性。如果在这种情况下已经将 company 特性设置成 Java String 值 "Flynn & Sons" ,那么,实际上该操作生成的内容将是 Flynn & Sons 。如果这个操作是生成 HTML 或 XML 内容的 JSP 页面的一部分,那么,这个字符串中间的“&”符号最终可能被解释为 HTML 或 XML 控制字符,从而妨碍了对该内容的显示或解析。但是,如果将 escapeXml 属性值设置成 true ,则所生成的内容将是 Flynn & Sons 。浏览器或解析器不会因在解释时遇到这种内容而出问题。假定 HTML 和 XML 是 JSP 应用程序中最常见的内容类型,所以 escapeXml 属性的缺省值是 true 就不足为奇了。

  清单 15. 禁用转义的 <c:out> 操作示例

  <c:out value="${user.company}" escapeXml=="false"/>

  用缺省值设置变量

  除了简化动态数据的显示之外,当通过 <c:set> 设置变量值时, <c:out> 指定缺省值的能力也很有用。正如 清单 11 所示,用来赋给限制了作用域的变量的值可以指定为 <c:set> 标记的主体内容,也可以通过其值属性来指定。通过将 <c:out> 操作嵌套在 <c:set> 标记的主体内容中,变量赋值就可以利用其缺省值能力。

  清单 16 中说明了这种方法。外部 <c:set> 标记的行为非常简单:它根据其主体内容设置会话作用域 timezone 变量的值。但是,在这种情况下,主体内容是通过 <c:out> 操作生成的。这个嵌套操作的值属性是表达式 ${cookie['tzPref'].value} ,它尝试通过 cookie 隐式对象返回名为 tzPref 的 cookie 值。( cookie 隐式对象将 cookie 名称映射到相应的 Cookie 实例,这意味着必须通过对象的 value 特性使用点运算符来检索储存在 cookie 中的实际数据。)

  清单 16. 合并 <c:set> 和 <c:out> 以提供缺省变量值

  <c:set var="timezone" scope=="session">

  <c:out value="${cookie['tzPref'].value}" default=="CST"/>

  </c:set>

  但是,请考虑以下情况,用户是第一次尝试使用这段代码的 Web 应用程序。结果是,请求中没有提供名为 tzPref 的 cookie。这意味着使用隐式对象的查找将返回 null ,在这种情况下整个表达式将返回 null 。因为对 <c:out> 标记的 value 属性求值的结果是 null ,所以 <c:out> 标记会转而输出对其 default 属性求值的结果。在这里是字符串 CST 。因此,实际的结果是将 timezone 限制了作用域的变量设置成用户的 tzPref cookie 中存储的时区,或者,如果没有,则使用缺省时区 CST 。

  EL 和 JSP 2.0

  目前,表达式语言仅可用于指定 JSTL 定制标记中的动态属性值。但 JSTL 1.0 表达式语言的一个扩展已经被提出,会把它包括到 JSP 2.0 中去,眼下正在进行最后评审。这个扩展将允许开发人员通过自己的定制标记来使用 EL。页面作者将可以在目前允许使用 JSP 表达式的任何地方使用 EL 表达式,譬如将动态值插入模板文本中: <p>Your preferred time zone is $</p> 。

  这个 JSP 2.0 功能(就象 JSTL 本身一样)将支持页面作者进一步减少对 JSP 编制脚本元素的依赖,从而改进 JSP 应用程序的可维护性。

  结束语

  EL(与四个 JSTL 定制标记库提供的操作结合起来)允许页面作者不使用脚本元素即可实现表示层逻辑。例如,对比本文开头 清单 1 中的 JSP 代码和清单 17 中显示的通过 JSTL 实现的同样功能。(JSTL core 库中其余的标记,包括 <c:choose> 及其子标记,将在本系列的下一篇文章中讨论。)尽管显然执行了条件逻辑,但是 JSTL 版本中没有 Java 语言源代码,并且标记之间的关系(尤其是关于嵌套需求)对于任何精通 HTML 语法的人都应该是熟悉的。

  清单 17. 合并 <c:set> 和 <c:out> 以提供缺省变量值

  <c:choose><c:when test="${user.role == 'member'}">

  <p>Welcome, member!</p>

  </c:when><c:otherwise>

  <p>Welcome, guest!</p>

  </c:otherwise></c:choose>

  通过提供大多数 Web 应用程序常用功能的标准实现,JSTL 有助于加速开发周期。与 EL 结合起来,JSTL 可以不需要对表示层程序编写代码,这极大地简化了 JSP 应用程序的维护。

18:53 浏览 (68) 评论 (0) 分类: 表达式语言 2009
-05-08缩略显示SOAP知识
关键字: soap
soap

  n.

  (英文)肥皂

  SOAP:简单对象访问协议

  (SOAP:Simple Object Access Protocol)

  简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。

  SOAP 包括三个部分:

  SOAP 封装:它定义了一个框架 , 该框架描述了消息中的内容是什么,谁应当处理它以及它是可选的还是必须的。

  SOAP 编码规则:它定义了一种序列化的机制,用于交换应用程序所定义的数据类型的实例。

  SOAP RPC 表示:它定义了用于表示远程过程调用和应答的协定。

  SOAP 消息基本上是从发送端到接收端的单向传输,但它们常常结合起来执行类似于请求 / 应答的模式。所有的 SOAP 消息都使用 XML 编码。一条 SOAP 消息就是一个包含有一个必需的 SOAP 的封装包,一个可选的 SO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值