jsp中怎么判断密码中不能含有空格,帐号只能由字母、数字、汉字、下划线“_”组成呢

a2bb 2007-07-18 01:44:53
2个问题。。会的一定帮帮忙啊。希望说的详细点~^^
...全文
3868 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
a2bb 2007-07-18
  • 打赏
  • 举报
回复
到底怎么写呢。。。
比如
var username = document.form1.username.value;
后面的JS怎么写提示username中不能有空格呢
heyang714 2007-07-18
  • 打赏
  • 举报
回复
mark
kjah 2007-07-18
  • 打赏
  • 举报
回复
mark
zxhzh2007 2007-07-18
  • 打赏
  • 举报
回复
望高手解答
a2bb 2007-07-18
  • 打赏
  • 举报
回复
贴子回复次数大于跟给分次数。。啥情况
zjf405 2007-07-18
  • 打赏
  • 举报
回复
正则表达式实现

Pattern p = Pattern.compile("^[a-zA-Z0-9\u4e00-\u9fa5_]+$");
Matcher m = p.matcher(str); //str为你要验证的串
if(m.find()){
System.out.println("匹配成功!");
}else{
System.out.println("匹配失败!");
}
a2bb 2007-07-18
  • 打赏
  • 举报
回复
if(/\s+/g.test(str)){

//包含空白字符 空格 tab ..

}else{

// 不包含空白字符

}

/.../ 代表正则表达式

\s 表示匹配空白

+ 代表一到多个

* 代表0到多个

g 代表全局查找,应该是对多行有效

test(str) 代表对str 进行匹配验证

/^\s+/ 开头存在空白

/\s+$/ 结尾存在空白
===============================
<form id="form1" action="reg.php" method="post" onsubmit="judge();">

<input type="text" id="name">

</form>

方法很多

可以象下面这样

/** getObject **/

function getObejct(id)

{

if (document.getElementById) {

return document.getElementById(id);

}else if (document.all) {

return document.all[id];

}else if (document.layers) {

return document.layers[id];

}

}

/** judge **/

function judeg() {

var obj = getObject("name"); //取得text

if (/\s*/g.test(obj.value)) {

document.write('存在空格');

} else {

document.write('不存在空格');

}

}

<form id="form1" action="reg.php" method="post" >

<input type="text" id="name">

</form>

-------------------
刚搜到
a2bb 2007-07-18
  • 打赏
  • 举报
回复
-.-谢谢qianzongli同志的热情。。。过会再给你分了~


不过我帐号密码里不能含有空格怎么判定啊。。。
好像没看到。。。
  • 打赏
  • 举报
回复
正则表达式
qianzongli 2007-07-18
  • 打赏
  • 举报
回复
用js!!

如下:
1. 检查一段字符串是否全由数字组成
---------------------------------------
<script language="Javascript"><!--
function checkNum(str){return str.match(/\D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>

2. 怎么判断是否是字符
---------------------------------------
if (/[^\x00-\xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");

3. 怎么判断是否含有汉字
---------------------------------------
if (escape(str).indexOf("%u")!=-1) alert("含有汉字");
else alert("全是字符");

4. 邮箱格式验证
---------------------------------------
//函数名:chkemail
//功能介绍:检查是否为Email Address
//参数说明:要检查的字符串
//返回值:0:不是 1:是
function chkemail(a)
{ var i=a.length;
var temp = a.indexOf('@');
var tempd = a.indexOf('.');
if (temp > 1) {
if ((i-temp) > 3){
if ((i-tempd)>0){
return 1;
}

}
}
return 0;
}

5. 数字格式验证
---------------------------------------
//函数名:fucCheckNUM
//功能介绍:检查是否为数字
//参数说明:要检查的数字
//返回值:1为是数字,0为不是数字
function fucCheckNUM(NUM)
{
var i,j,strTemp;
strTemp="0123456789";
if ( NUM.length== 0)
return 0
for (i=0;i<NUM.length;i++)
{
j=strTemp.indexOf(NUM.charAt(i));
if (j==-1)
{
//说明有字符不是数字
return 0;
}
}
//说明是数字
return 1;
}

6. 电话号码格式验证
---------------------------------------
//函数名:fucCheckTEL
//功能介绍:检查是否为电话号码
//参数说明:要检查的字符串
//返回值:1为是合法,0为不合法
function fucCheckTEL(TEL)
{
var i,j,strTemp;
strTemp="0123456789-()# ";
for (i=0;i<TEL.length;i++)
{
j=strTemp.indexOf(TEL.charAt(i));
if (j==-1)
{
//说明有字符不合法
return 0;
}
}
//说明合法
return 1;
}

7. 判断输入是否为中文的函数
---------------------------------------
function ischinese(s){
var ret=true;
for(var i=0;i<s.length;i++)
ret=ret && (s.charCodeAt(i)>=10000);
return ret;
}

8. 综合的判断用户输入的合法性的函数
---------------------------------------
<script language="javascript">
//限制输入字符的位数开始
//m是用户输入,n是要限制的位数
function issmall(m,n)
{
if ((m<n) && (m>0))
{
return(false);
}
else
{return(true);}
}

9. 判断密码是否输入一致
---------------------------------------
function issame(str1,str2)
{
if (str1==str2)
{return(true);}
else
{return(false);}
}

10. 判断用户名是否为数字字母下滑线
---------------------------------------
function notchinese(str){
var reg=/[^A-Za-z0-9_]/g
if (reg.test(str)){
return (false);
}else{
return(true); }
}

11. form文本域的通用校验函数
---------------------------------------
作用:检测所有必须非空的input文本,比如姓名,账号,邮件地址等等。
该校验现在只针对文本域,如果要针对form里面的其他域对象,可以改变判断条件。

使用方法:在要检测的文本域中加入title文字。文字是在提示信息,你要提示给用户的该字段的中文名。比如要检测用户名
html如下<input name="txt_1" title="姓名">,当然,最好用可视化工具比如dreamweaver什么的来编辑域。
如果要检测数字类型数据的话,再把域的id统一为sz.
javascript判断日期类型比较麻烦,所以就没有做日期类型校验的程序了.高手可以补充。

程序比较草,只是提供一个思路。抛砖引玉! :)
哦,对了,函数调用方法:< form onsubmit="return dovalidate()">

function dovalidate()
{
fm=document.forms[0] //只检测一个form,如果是多个可以改变判断条件
for(i=0;i<fm.length;i++)
{
//检测判断条件,根据类型不同可以修改
if(fm[i].tagName.toUpperCase()=="INPUT" &&fm[i].type.toUpperCase()=="TEXT" && (fm[i].title!=""))

if(fm[i].value="/blog/="")//
{
str_warn1=fm[i].title+"不能为空!";
alert(str_warn1);
fm[i].focus();
return false;
}
if(fm[i].id.toUpperCase()=="SZ")//数字校验
{
if(isNaN(fm[i].value))
{ str_warn2=fm[i].title+"格式不对";
alert(str_warn2);
fm[i].focus();
return false;
}
}
}
return true;
}


2 >表单提交验证类


2.1 表单项不能为空

<script language="javascript">
<!--
function CheckForm()
{
if (document.form.name.value.length == 0) {
alert("请输入您姓名!");
document.form.name.focus();
return false;
}
return true;
}
-->
</script>

2.2 比较两个表单项的值是否相同

<script language="javascript">
<!--
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) {
alert("您两次输入的密码不一样!请重新输入.");
document.ADDUser.PWD.focus();
return false;
}
return true;
}
-->
</script>

2.3 表单项只能为数字和"_",用于电话/银行帐号验证上,可扩展到域名注册等

<script language="javascript">
<!--
function isNumber(String)
{
var Letters = "1234567890-"; //可以自己增加可输入值
var i;
var c;
if(String.charAt( 0 )=='-')
return false;
if( String.charAt( String.length - 1 ) == '-' )
return false;
for( i = 0; i < String.length; i ++ )
{
c = String.charAt( i );
if (Letters.indexOf( c ) < 0)
return false;
}
return true;
}
function CheckForm()
{
if(! isNumber(document.form.TEL.value)) {
alert("您的电话号码不合法!");
document.form.TEL.focus();
return false;
}
return true;
}
-->
</script>


bign_hdl 2007-07-18
  • 打赏
  • 举报
回复
判断length是否大于0
lishuhuajava 2007-07-18
  • 打赏
  • 举报
回复
帮你顶一下,学习...
js大全 . 1.1 全是数字.. 3 1.2 限制 期限 不能大于 100 年.. 4 1.3 将日期格式由yyyy-MM-dd,转换为yyyymmdd,以直接比较两个日 期的大小.. 4 1.4 判断字符串是否全部由数字组成. 5 1.5 判断字符串是否全部由字母组成. 6 1.6 对于月和日,如果前面有零,去除,如 01 变为 1 .. 6 1.7 为 1 位的日月在前面补零,如将 1 变为 01 .. 7 1.8 在删除按钮的onclick事件触发.. 8 1.9 对输入控件的内容进行非空检验,如果为空,弹出提示信息.. 10 1.10 检验控件值是否是固定位数的有效数字 11 1.11 所输内容应为字母 12 1.12 过滤掉"'"、"%"、"&"、"/"、"" 13 1.13 删除字符串两侧的空格. 14 1.14 取字符串长度(不包含两端的空格) 14 1.15 清空查询条件.. 16 1.16 价格输入是否合法(99,999.00) 17 1.17 检验货票号为 1 位字母+6 位数字.. 17 1.18 检验起始货票号必须小于截至货票号. 18 1.19 检验查询条件是否为空,为空则提示"查询条件不能为空!" 19 1.20 检验是不是最短位数的数字,用于模糊查询. 20 1.21 输入为Decimal格式的数,且小数点前后都不能超过规定的位数 20 1.22 电话号码校验(只能为横线—、()、或数字) . 21 1.23 检测输入是否为正整数数字,如果结果为非给出相应提示. 22 1.24 避免多次提交页面 在jsp嵌入该文件,在每个jsp页面的提交语23 1.25 检查EMail格式 23 1.26 电话号码由数字和-组成 24 1.26 检验输入的日期yyyy-MM-dd 27 1.27 去掉界面上开头的空格,过滤掉"'" 和""" . 33 1.29 去掉汉字空格. 35 1.30 大小写转换 36 1.31 过滤掉"'"和""" . 36 1.32 清空查询条件.. 37 1.33 过滤掉"'"和"""和空格. 37 1.34 操作员代码为 7 位数字,密码最少为 4 位 .. 38 1.35 身份证为 15 或 18 位数字字母 38 1.36 检验输入的时间段,日期格式yyyy-MM-dd 39 1.37 检验输入的时间段,日期格式yyyy-MM-dd 41 1.39 检查EMail格式是否正确.. 47 1.40 电话号码校验(只能下划线—、()、或数字) 49 1.41 所输内容应为字母 50 1.41 所输内容不能非空 50 1.42 价格输入是否合法(99,999.00) 51 1.43 价格输入是否合法(99,999.00) 52 1.44 判断文本内容是否少于 2 个汉字/字符(js汉字和字符占位一 样).. 53 1.45 检测输入是否只有字母数字. 53 1.46 检测输入是否只有数字或不详,且输入数值不能过大(不能超过 32767).. 54 1.47 检测输入是否为数字.. 55 1.48 监测输入是否为数字,且所输入数值不能过大(不能超过 5 位 32767).. 56 1.49 检测输入是否为整形数字,且所输数值不能过大(不能超过 10 位 2147483647). 57 1.52 输入为Decimal格式的数,且小数点前后都不能超过规定的位数 /************************************ .. 59 1.53 可以为负数的数字,数值不能超过 5 位 32767 . 60 1.54 险情报告编号为四位年份加三位数字. 61 1.55 检验度数控制值是否是数字,并且小于或等于 180; /************************************ .. 62 1.56 删除字符串两侧的空格,返回的是删除两侧空格的字符串. 63 1.57 打开模式窗口,窗口居 65 1.59 检验输入的时间段,日期格式yyyy-MM-dd 67 1.60 检验输入的日期yyyy-MM-dd 69 1.61 用下拉框显示月、日,日下拉框根据年月确定 73 1.62 检验租赁合同号为 4 位年份+2 位月份+本月合同的顺序号 2 位 75 1.63 用于多行校验,校验每一行,每一列值是否为空,传入的必须是 . 76 1.64 检查某列得多值是否存在重复值.. 79 1.65 检查某列得多值与某一值得比较是否相同,例如多个到站路局与 一个发站路局是否相同 80 1.66 检查两多值列是否相同,例如同一行的装车路局是否与卸车站所 属路局是否相同 80 1.67 检查箱数与组数. 81 1.68 检查箱数与组数. 82 1.69 检查箱数与组数. 84 1.70 检查单列多值不能超过一定得长度.. 85 1.71 取字符串长度(不包含两端的空格 . 86 1.72 向表格添加一行 86 1.73 将添加的输入框元素和Validator进行绑定。.. 89 1.74 根据标签展示的 的validator属性获取校验器类名(DecimalValidator) 91 1.75 删除一行. 92 1.76 根据箱型,校验箱数与组数的值是否符合规定 93 1.77 删除字符串两侧的空格. 95 1.78 检验单个集装箱箱号为 4 位字母+7 位数字. 95 1.79 检验多个集装箱箱号为 4 位字母+7 位数字. 97 1.80 检验单个集装箱箱号为'TBJU'+7 位数字用于租赁部分的箱号校验 .. 101 1.86 判断字符串是否全部由字母组成. 105 1.88 为 1 位的日月在前面补零,如将 1 变为 01 .. 107 1.90 检查EMail格式. 107 1.91 对输入控件的内容进行非空检验,如果为空,弹出提示信息. 109 1.92 检验控件值是否是固定位数的有效数字. 110 1.93 所输内容应为字母. 111 1.94 过滤掉"'"、"%"、"&"、"/"、"" . 112 1.95 取字符串长度(不包含两端的空格) . 113 1.96 将金额转化成按千分位的显示格式 114 1.97 清空查询条件 115 1.98 价格输入是否合法(99,999.00). 115 1.99 检验货票号为 1 位字母+6 位数字 116 2.00 检验起始货票号必须小于截至货票号.. 117 2.01 检验查询条件是否为空,为空则提示"查询条件不能为空!" . 118 2.02 检验是不是最短位数的数字,用于模糊查询.. 118 2.03 输入为Decimal格式的数,且小数点前后都不能超过规定的位数 .. 119 2.04 电话号码校验(只能为横线?、()、或数字) . 120 2.05(1)电话号码由数字和-组成 120 (2)电话号码为 7 到 13 位 . 120 (3)13 开头的头的手机号码必须为 11 位 120 2.06 检测输入是否为正整数数字,如果结果为非给出相应提示.. 121 2.07 避免多次提交页面 在jsp嵌入该文件,在每个jsp页面的提交语句 前执行该方法.. 121 2.08 检查EMail格式. 122 2.09 电话号码由数字和-组成. 123 2.10 检验IP地址 . 124 2.11 校验忽略样式内容后文本域的内容是否为空//校验忽略样式内容 后文本域的内容是否为空.. 124 2.12 计算天数差的函数. 125 2.13 把结束日期月份加上月末日期.. 125 2.14 检验输入的日期yyyy-MM 126
js大全 . 1.1 全是数字.. 3 1.2 限制 期限 不能大于 100 年.. 4 1.3 将日期格式由yyyy-MM-dd,转换为yyyymmdd,以直接比较两个日 期的大小.. 4 1.4 判断字符串是否全部由数字组成. 5 1.5 判断字符串是否全部由字母组成. 6 1.6 对于月和日,如果前面有零,去除,如 01 变为 1 .. 6 1.7 为 1 位的日月在前面补零,如将 1 变为 01 .. 7 1.8 在删除按钮的onclick事件触发.. 8 1.9 对输入控件的内容进行非空检验,如果为空,弹出提示信息.. 10 1.10 检验控件值是否是固定位数的有效数字 11 1.11 所输内容应为字母 12 1.12 过滤掉"'"、"%"、"&"、"/"、"" 13 1.13 删除字符串两侧的空格. 14 1.14 取字符串长度(不包含两端的空格) 14 1.15 清空查询条件.. 16 1.16 价格输入是否合法(99,999.00) 17 1.17 检验货票号为 1 位字母+6 位数字.. 17 1.18 检验起始货票号必须小于截至货票号. 18 1.19 检验查询条件是否为空,为空则提示"查询条件不能为空!" 19 1.20 检验是不是最短位数的数字,用于模糊查询. 20 1.21 输入为Decimal格式的数,且小数点前后都不能超过规定的位数 20 1.22 电话号码校验(只能为横线—、()、或数字) . 21 1.23 检测输入是否为正整数数字,如果结果为非给出相应提示. 22 1.24 避免多次提交页面 在jsp嵌入该文件,在每个jsp页面的提交语23 1.25 检查EMail格式 23 1.26 电话号码由数字和-组成 24 1.26 检验输入的日期yyyy-MM-dd 27 1.27 去掉界面上开头的空格,过滤掉"'" 和""" . 33 1.29 去掉汉字空格. 35 1.30 大小写转换 36 1.31 过滤掉"'"和""" . 36 1.32 清空查询条件.. 37 1.33 过滤掉"'"和"""和空格. 37 1.34 操作员代码为 7 位数字,密码最少为 4 位 .. 38 1.35 身份证为 15 或 18 位数字字母 38 1.36 检验输入的时间段,日期格式yyyy-MM-dd 39 1.37 检验输入的时间段,日期格式yyyy-MM-dd 41 1.39 检查EMail格式是否正确.. 47 1.40 电话号码校验(只能下划线—、()、或数字) 49 1.41 所输内容应为字母 50 1.41 所输内容不能非空 50 1.42 价格输入是否合法(99,999.00) 51 1.43 价格输入是否合法(99,999.00) 52 1.44 判断文本内容是否少于 2 个汉字/字符(js汉字和字符占位一 样).. 53 1.45 检测输入是否只有字母数字. 53 1.46 检测输入是否只有数字或不详,且输入数值不能过大(不能超过 32767).. 54 1.47 检测输入是否为数字.. 55 1.48 监测输入是否为数字,且所输入数值不能过大(不能超过 5 位 32767).. 56 1.49 检测输入是否为整形数字,且所输数值不能过大(不能超过 10 位 2147483647). 57 1.52 输入为Decimal格式的数,且小数点前后都不能超过规定的位数 /************************************ .. 59 1.53 可以为负数的数字,数值不能超过 5 位 32767 . 60 1.54 险情报告编号为四位年份加三位数字. 61 1.55 检验度数控制值是否是数字,并且小于或等于 180; /************************************ .. 62 1.56 删除字符串两侧的空格,返回的是删除两侧空格的字符串. 63 1.57 打开模式窗口,窗口居 65 1.59 检验输入的时间段,日期格式yyyy-MM-dd 67 1.60 检验输入的日期yyyy-MM-dd 69 1.61 用下拉框显示月、日,日下拉框根据年月确定 73 1.62 检验租赁合同号为 4 位年份+2 位月份+本月合同的顺序号 2 位 75 1.63 用于多行校验,校验每一行,每一列值是否为空,传入的必须是 . 76 1.64 检查某列得多值是否存在重复值.. 79 1.65 检查某列得多值与某一值得比较是否相同,例如多个到站路局与 一个发站路局是否相同 80 1.66 检查两多值列是否相同,例如同一行的装车路局是否与卸车站所 属路局是否相同 80 1.67 检查箱数与组数. 81 1.68 检查箱数与组数. 82 1.69 检查箱数与组数. 84 1.70 检查单列多值不能超过一定得长度.. 85 1.71 取字符串长度(不包含两端的空格 . 86 1.72 向表格添加一行 86 1.73 将添加的输入框元素和Validator进行绑定。.. 89 1.74 根据标签展示的 的validator属性获取校验器类名(DecimalValidator) 91 1.75 删除一行. 92 1.76 根据箱型,校验箱数与组数的值是否符合规定 93 1.77 删除字符串两侧的空格. 95 1.78 检验单个集装箱箱号为 4 位字母+7 位数字. 95 1.79 检验多个集装箱箱号为 4 位字母+7 位数字. 97 1.80 检验单个集装箱箱号为'TBJU'+7 位数字用于租赁部分的箱号校验 .. 101 1.86 判断字符串是否全部由字母组成. 105 1.88 为 1 位的日月在前面补零,如将 1 变为 01 .. 107 1.90 检查EMail格式. 107 1.91 对输入控件的内容进行非空检验,如果为空,弹出提示信息. 109 1.92 检验控件值是否是固定位数的有效数字. 110 1.93 所输内容应为字母. 111 1.94 过滤掉"'"、"%"、"&"、"/"、"" . 112 1.95 取字符串长度(不包含两端的空格) . 113 1.96 将金额转化成按千分位的显示格式 114 1.97 清空查询条件 115 1.98 价格输入是否合法(99,999.00). 115 1.99 检验货票号为 1 位字母+6 位数字 116 2.00 检验起始货票号必须小于截至货票号.. 117 2.01 检验查询条件是否为空,为空则提示"查询条件不能为空!" . 118 2.02 检验是不是最短位数的数字,用于模糊查询.. 118 2.03 输入为Decimal格式的数,且小数点前后都不能超过规定的位数 .. 119 2.04 电话号码校验(只能为横线?、()、或数字) . 120 2.05(1)电话号码由数字和-组成 120 (2)电话号码为 7 到 13 位 . 120 (3)13 开头的头的手机号码必须为 11 位 120 2.06 检测输入是否为正整数数字,如果结果为非给出相应提示.. 121 2.07 避免多次提交页面 在jsp嵌入该文件,在每个jsp页面的提交语句 前执行该方法.. 121 2.08 检查EMail格式. 122 2.09 电话号码由数字和-组成. 123 2.10 检验IP地址 . 124 2.11 校验忽略样式内容后文本域的内容是否为空//校验忽略样式内容 后文本域的内容是否为空.. 124 2.12 计算天数差的函数. 125 2.13 把结束日期月份加上月末日期.. 125 2.14 检验输入的日期yyyy-MM 126
JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>... <#else> ... 例子如下: <#assign age=23> <#if (age>60)>老年人 <#elseif (age>40)>年人 <#elseif (age>20)>青年人 <#else> 少年人 输出结果是:青年人 上面的代码的逻辑表达式用括号括起来主要是因为里面有>符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号. <#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today. <#else> Pythons are not cheaper than elephants today. 2、 switch , case , default , break指令 这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下: <#switch value> <#case refValue>...<#break> <#case refValue>...<#break> <#default>... 3、 list, break指令 list指令是一个迭代输出指令,用于迭代输出数据模型的集合,list指令的语法格式如下: <#list sequence as item> ... 上面的语法格式,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量: item_index:当前变量的索引值 item_has_next:是否存在下一个对象 也可以使用<#break>指令跳出迭代 例子如下: <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x> ${x_index + 1}.${x}<#if x_has_next>, <#if x="星期四"><#break>

We have these animals:

NamePrice <#list animals as being>
${being.name}${being.price} Euros
输出为:

We have these animals:

NamePrice
mouse50 Euros
elephant5000 Euros
python4999 Euros
4、include指令 include指令的作用类似于JSP的包含指令,用于包含指定页.include指令的语法格式如下: <#include filename [options]> 在上面的语法格式,两个参数的解释如下: filename:该参数指定被包含的模板文件 options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true. Test page

Test page

Blah blah... <#include "/copyright_footer.html"> 5、 import指令 该指令用于导入FreeMarker模板的所有变量,并将该变量放置在指定的Map对象,import指令的语法格式如下: <#import "/lib/common.ftl" as com> 上面的代码将导入/lib/common.ftl模板文件的所有变量,将这些变量放置在一个名为com的Map对象. 创建库 ? 下面是一个创建库的例子(假设保存在lib/my_test.ftl): <#macro copyright date>

Copyright (C) ${date} Julia Smith. All rights reserved.
Email: ${mail}

<#assign mail = "jsmith@acme.com"> ? 使用import指令导入库到模板,Freemarker会为导入的库创建新的名字空间,并可以通过import指令指定的散列变量访问库的变量: <#import "/lib/my_test.ftl" as my> <#assign mail="fred@acme.com"> <@my.copyrightdate="1999-2002"/> ${my.mail} ${mail} 输出结果:

Copyright (C) 1999-2002 Julia Smith. All rights reserved.
Email: jsmith@acme.com

jsmith@acme.com fred@acme.com 可以看到例子使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 l 可以使用assign指令在导入的名字空间创建或替代变量,下面是一个例子: <#import "/lib/my_test.ftl" as my> ${my.mail} <#assign mail="jsmith@other.com" in my> ${my.mail} l 输出结果: jsmith@acme.com jsmith@other.com l 数据模型的变量任何地方都可见,也包括不同的名字空间,下面是修改的库: <#macro copyright date>

Copyright (C) ${date} ${user}. All rights reserved.

<#assign mail = "${user}@acme.com"> l 假设数据模型的user变量的值是Fred,则下面的代码: <#import "/lib/my_test.ftl" as my> <@my.copyright date="1999-2002"/> ${my.mail} l 输出结果:

Copyright (C) 1999-2002 Fred. All rights reserved.

1.6 算术运算符 FreeMarker表达式完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , % 看如下的代码: <#assign x=5> ${ x * x - 100 } ${ x /2 } ${ 12 } 输出结果是: -75 2.5 2 在表达式使用算术运算符时要注意以下几点: 1,运算符两边的运算数字必须是数字 2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35 使用内建的int函数可对数值取整,如: <#assign x=5> ${ (x/2)?int } ${ 1.1?int } ${ 1.999?int } ${ -1.1?int } ${ -1.999?int } 结果是:2 1 1 -1 -1 1.7 比较运算符 表达式支持的比较运算符有如下几个: 1. =或者==:判断两个值是否相等. 2. !=:判断两个值是否不等. 3. >或者gt:判断左边值是否大于右边值 4. >=或者gte:判断左边值是否大于等于右边值 5. <或者lt:判断左边值是否小于右边值 6. <=或者lte:判断左边值是否小于等于右边值 注意:=和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比 较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)> 1.8 逻辑运算符 逻辑运算符有如下几个: 逻辑与:&& 逻辑或:|| 逻辑非:! 逻辑运算符只能作用于布尔值,否则将产生错误 1.9 内建函数 FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出变量.下面是常用的内建的字符串函数: html:对字符串进行HTML编码 cap_first:使字符串第一个字母大写 lower_case:将字符串转换成小写 upper_case:将字符串转换成大写 trim:去掉字符串前后的空白字符 下面是集合的常用内建函数 size:获取序列元素的个数 下面是数字值的常用内建函数 int:取得数字的整数部分,结果带符号 例如: <#assign test="Tom & Jerry"> ${test?html} ${test?upper_case?html} 结果是:Tom & Jerry TOM & JERRY 1.10 空值处理运算符 FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值 的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的 null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变 量完全相同. 为了处理缺失变量,FreeMarker提供了两个运算符: !: 指定缺失变量的默认值 ??: 判断某个变量是否存在 其,!运算符的用法有如下两种: variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象. 使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false ########################### 最常用的概念 1、 scalars:存储单值 字符串:简单文本由单或双引号括起来。 数字:直接使用数值。 日期:通常从数据模型获得 布尔值:true或false,通常在<#if …>标记使用 2、 hashes:充当其它对象的容器,每个都关联一个唯一的查询名字 具有一个唯一的查询名字和他包含的每个变量相关联。 3、 sequences:充当其它对象的容器,按次序访问 使用数字和他包含的每个变量相关联。索引值从0开始。 4、 集合变量: 除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由<#list...>指令使用的受限sequences。 5、 方法:通过传递的参数进行计算,以新对象返回结果 方法变量通常是基于给出的参数计算值在数据模型定义。 6、 用户自定义FTL指令:宏和变换器 7、 节点 节点变量表示为树型结构的一个节点,通常在XML处理使用。 在模板里对sequences和hashes初始化 sequences 1. [“you”,”me”,”he”] 2. 1..100 3. [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”}, {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”}, ] hashes {“you”:”a”,”me”:”b”,”he”:”c”} 注释标志 <#-- 这里是注释 --> 旧版本的freemarker采用的是<#comment> 注释 方法 sequences内置方法 sequence?first 返回sequence的第一个值;前提条件sequence不能是null sequence?last 返回sequence最后一个值 sequence?reverse 反转sequence的值 sequence?size 返回sequence的大小 sequence?sort 对sequence按里面的对象toString()的结果进行排序 sequence?sort_by(value) 对sequence 按里面的对象的属性value进行排序 如: sequence里面放入的是10 个user对象,user对象里面包含name,age等属性 sequence?sort_by(name) 表示所有的user按user.name进行排序 hashes内置方法 hash?keys 返回hash里的所有keys, 返回结果类型sequence hash?values 返回hash里的所有value, 返回结果类型sequence 模板 使用FTL(freeMarker模板语言)编写 组成部分 一、整体结构 1、注释:<#--注释内容-->,不会输出。 2、文本:直接输出。 3、interpolation:由 ${var} 或 #{var} 限定,由计算值代替输出。 4、FTL标记 二.表达式 1、直接指定值: 1-1、字符串: 由双引号或单引号括起来的字符串,其的特殊字符(如' " \等)需要转义。 1-2、raw字符串: 有一种特殊的字符串称为raw字符串,被认为是纯文本,其的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子: ${r"/${data}"year""}屏幕输出结果为:/${data}"year" 转义 含义 序列 \" 双引号(u0022) \' 单引号(u0027) \\ 反斜杠(u005C) \n 换行(u000A) \r Return (u000D) \t Tab (u0009) \b Backspace (u0008) \f Form feed (u000C) \l < \g > \a & \{ { \xCode 4位16进制Unicode代码 1-3、数字:直接输入,不需要引号 1)、精度数字使用“.”分隔,不能使用分组符号 2)、目前版本不支持科学计数法,所以“1E3”是错误的 3)、不能省略小数点前面的0,所以“.5”是错误的 4)、数字8、+8、08和8.00都是相同的 1-4、布尔值:true和false,不使用引号 1-5、序列:由逗号分隔的子变量列表,由[]方括号限定。 1)、子变量列表可以是表达式 2)、可以使用数字范围定义数字序列,不需要方括号限定,例如2..5等同于[2, 3, 4, 5],但是更有效率,可以定义反递增范围如:5..2。 1-6、散列(hash) 1)、由逗号分隔的键/值列表,由{}大括号限定,键和值之间用冒号分隔,如:{"key1":valu1,"key2":"character string"....} 2)、键和值都是表达式,但是键必须是字符串。 2、获取变量: 2-1、顶层变量:${变量名} 变量名只能字母数字下划线、$、#、@ 的组合,且不能数字开头。 2-2、散列:有两种方法 1)、点语法:变量名字和顶层变量的名字受同样的限制 2)、方括号语法:变量名字无限制,可以是任意的表达式的结果 book.author.name book.author.["name"] book["author"].name book["author"]["name"] 以上是等价的。 2-3、序列:使用散列的方括号语法获取变量,方括号的表达式结果必须为数字。注意:第一个项目的索引为0。可以使用 [startindex..endindex]语法获取序列片段。 2-4、特殊变量:FreeMarker内定义变量,使用.variablename语法访问。 3、字符串操作 3-1、interpolation:使用${}或#{}在文本部分插入表达式的值,例如: ${"hello${username}!"} ${"${username}${username}${username}"} 也可以使用+来获得同样的结果: ${"hello"+username+"!"} ${username+username+username} 注意:${}只能用于文本部分而不能出现于标记内。 <#if ${user.login}>或<#if "${user.login}">都是错误的; <#if user.login>是正确的。 本例user.login的值必须是布尔类型。 3-2、子串: 举例说明:假如user的值为"Big Joe" ${user[0]}${user[4]}结果是:BJ ${user[1..4]}结果是:ig J 4、序列操作 4-1、连接操作:可以使用+来操作,例如: ["title","author"]+["month","day"] 5、散列操作 5-1、连接操作:可以使用+来操作,如果有相同的KEY,则右边的值会替代左边的值,例如: {"title":散列,"author":"emma"}+{"month":5,"day":5}+{"month":6}结果month的值就是6。 6、算术运算 6-1、操作符:+、-、*、/、% 除+号以外的其他操作符两边的数据,必须都是数字类型。 如果+号操作符一边有一个字符型数据,会自动将另一边的数据转换为字符型数据,运算结果为字符型数据。 6-2、比较操作符: 1}、= 2}、== 3}、!= 4}、< 5}、<= 6}、> 7}、>= 1-3的操作符,两边的数据类型必须相同,否则会产生错误 4-7的操作符,对于日期和数字可以使用,字符串不可以使用。 注意: 1}、FreeMarker是精确比较,所以"x" "x " "X"是不等的。 2}、因为<和>对FTL来说是开始和结束标记,所以,可以用两种方法来避免这种情况: 一种是使用括号<#if (a 另一是使用替代输出,对应如下: < lt <= lte > gt >= gte 6-3、逻辑操作符:只能用于布尔值,否则会出现错误。 &&(and)与运算 ||(or)或运算 !(not)非运算 6-4、内建函数:使用方法类似于访问散列的子变量,只是使用?代替.例如:${test?upper_case?html} 常用的内建函数列举如下: 1}、字符串使用: html:对字符串进行HTML编码 cap_first:字符串第一个字母大写 lower_first:字符串第一个字母小写 upper_case:将字符串转换成大写 trim:去掉字符前后的空白字符 2)、序列使用: size:获得序列元素的数目 3)、数字使用: int:取得数字的整数部分 7、操作符的优先顺序: 后缀:[subbarName][subStringRange].(mathodParams) 一元:+expr、-expr、! (not) 内建:? 乘法:*、/、% 加法:+、- 关系:<、<=、>、>= (lt、lte、gt、gte) 相等:=、==、!= 逻辑与:&& (and) 逻辑或:|| (or) 数字范围:.. 四、interpolation inperpolation只能用于文本,有两种类型:通用interpolation及数字interpolation 1、通用interpolation 如${expr} 1-1、插入字符串值:直接输出表达式结果。 1-2、插入数字值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: <#setting number_format="currency" /> <#assign answer=42 /> ${answer} <#-- ¥42.00 --> ${answer?string} <#-- ¥42.00 --> ${answer?string.number} <#-- 42 --> ${answer?string.currency} <#-- ¥42.00 --> ${answer?string.percent} <#-- 42,00% --> 1-3、插入日期值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: ${lastupdata?string("yyyy-MM-dd HH:mm:ss zzzz")} <#-- 2003-04-08 21:24:44 Pacific Daylight Time --> ${lastupdata?string("EEE,MMM d, ''yy")} <#-- tue,Apr 8, '03 --> ${lastupdata?string("EEEE,MMMM dd, yyyy,hh:mm:ss a '('zzz')'")} <#-- Tuesday,April 08, 2003, 09:24:44 PM (PDT)--> 1-4、插入布尔值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: <#assign foo=ture /> ${foo?string("yes","no")} <#-- yes --> 2、数字interpolation: 有两种形式: 1)、#{expr} 2)、#{expr;format}:format可以用来格式化数字,format可以是如下: mX:小数部分最小X位 MX:小数部分最大X位 例如: <#assign x=2.582 /> <#assign y=4 /> #{x;M2} <#-- 2.58 --> #{y;M2} <#-- 4 --> #{x;m1} <#-- 2.582 --> #{y;m1} <#-- 4.0 --> #{x;m1M2} <#-- 2.58 --> #{y;m1M2} <#-- 4.0 --> 宏 宏和变换器变量是两种不同类型的用户自定义指令,他们的区别是: 宏可以在模板用macro指令来定义 变换器是在模板外由程序定义 1、宏:和某个变量关联的模板片段,以便在模板通过用户自定义指令使用该变量 1-1、基本用法: 例如: <#macro greet> Hello JOE! 使用时: <@greet> 如果没有体内容也可以用 <@greet /> 1-2、变量: 1)、可以在宏定义之后定义参数,宏参数是局部变量,只在宏定义有效。如: <#macro greet person> Hello ${person}! 使用时: <@greet person="emma"> and <@greet person="LEO"> 输出为: Hello emma! Hello LEO! 注意:宏的参数是FTL表达式,所以,person=emma和上面的例子具有不同的意义,这意味着将变量emma的值传给person,这个值可能是任意一种数据类型,甚至是一个复杂的表达式。 宏可以有多个参数,使用时参数的次序是无关的,但是只能使用宏定义的参数,并且对所有参数赋值。如: <#macro greet person color> Hello ${person}! 使用时: <@greet color="black" person="emma" />正确 <@greet person="emma" />错误,color没有赋值,此时,如果在定义宏时为color定义缺省值<#macro greet person color="black">这样的话,这个使用方法就是正确的。 <@greet color="black" person="emma" bgcolor="yellow" />错误,宏greet定义未指定bgcolor这个参数 2、嵌套内容: 2-1、自定义指令可以有嵌套内容,使用<#nested>指令,执行自定义指令开始和结束标记之间的模板片段。例如: <#macro greet> <#nested> <@greet>hello Emma! 输出为 hello Emma! 2-2、<#nested>指令可以被多次调用,例如 <#macro greet> <#nested> <#nested> <#nested> <#nested> <@greet>hello Emma! 输出为 hello Emma! hello Emma! hello Emma! hello Emma! 2-3、嵌套的内容可以是有效的FTL,例如: <#macro welcome> <#nested> <#macro greet person color="black"> Hello ${person}! <@welcome> <@greet person="Emma" color="red" /> <@greet person="Andrew" /> <@greet person="Peter" /> 输出为: Hello Emma! Hello Andrew! Hello Peter! 2-4、宏定义的局部变量对嵌套内容是不可见的,例如: <#macro repeat count> <#local y="test" /> <#list 1..count as x> ${y}${count}/${x}:<#nested /> <@repeat count=3> ${y?default("?")} ${x?default("?")} ${count?default("?")} 输出结果为 test 3/1:??? test 3/2:??? test 3/3:??? 2-5、在宏定义使用循环变量,通常用来重复嵌套内容,基本用法为:作为nested指令的参数,传递循环变量的实际值,而在调用自定义指令时,在标记的参数后面指定循环变量的名字。 例如: <#macro repeat count> <#list 1..count as x> <#nested x,x/2,x==count /> <@repeat count=4;c,halfc,last> ${c}. ${halfc} <#if last> last! 输出结果是 1. 0.5 2. 1 3. 1.5 4. 2last! 注意:指定循环变量的数目和用户定义指令开始标记指定的不同不会有问题 调用时,少指定循环变量,多指定的值会不见 调用时,多指定循环变量,多余的循环变量不会被创建 二、在模板定义变量 1、在模板定义的变量有三种类型 1-1、plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。 1-2、局部变量:在宏定义体有效,使用local指令创建和替换。 1-3、循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建。 注意: 1)、宏的参数是局部变量,不是循环变量。 2)、局部变量隐藏同名的plain变量 3)、循环变量隐藏同名的plain变量和局部变量。 例如: <#assign x="plain"> 1. ${x} <#-- plain --> <@test /> 6. ${x} <#list ["loop"] as x> 7. ${x} <#-- loop --> <#assign x="plain2"> 8. ${x} <#-- loop --> 9. ${x} <#-- plain2 --> <#macro test> 2. ${x} <#-- plain --> <#local x="local"> 3. ${x} <#-- local --> <#list ["loop"] as x> 4. ${x} <#-- loop --> 5. ${x} <#-- local --> 4)、内部循环变量隐藏同名的外部循环变量 <#list ["loop1"] as x> ${x} <#-- loop1 --> <#list ["loop2"] as x> ${x} <#-- loop2 --> <#list ["loop3"] as x> ${x} <#-- loop3 --> ${x} <#-- loop2 --> ${x} <#-- loop1 --> 5)、模板的变量会隐藏数据模型的同名变量,如果需访问数据模型的变量,使用特殊变量global。 例如: 假设数据模型的user值为Emma <#assign user="Man"> ${user} <#-- Man --> ${.global.user} <#-- Emma --> macro, nested, return 语法 <#macro name param1 param2 ... paramN> ... <#nested loopvar1, loopvar2, ..., loopvarN> ... <#return> ... 用例 <#macro test foo bar="Bar"[A1] baaz=-1> Test text, and the params: ${foo}, ${bar}, ${baaz} <@test foo="a" bar="b" baaz=5*5-2/> <@test foo="a" bar="b"/> <@test foo="a" baaz=5*5-2/> <@test foo="a"/> 输出 Test text, and the params: a, b, 23 Test text, and the params: a, b, -1 Test text, and the params: a, Bar, 23 Test text, and the params: a, Bar, -1 定义循环输出的宏 <#macro list title items> ${title?cap_first}:
XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。首先有两点是需要肯定的:   第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会;   第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高。不要害怕和逃避,毕竟我们还年轻。   本文共分五大部分。分别是XML快速入门,XML的概念,XML的术语,XML的实现,XML的实例分析。最后附录介绍了XML的相关资源。作者站在普通网页设计人员的角度,用平实生动的语言,向您讲述XML的方方面面,帮助你拨开XML的神秘面纱,快速步入XML的新领域。 • 第一章:XML快速入门 • 一. 什么是XML? • 二. XML是新概念吗? • 三. 使用XML有什么好处? • 四. XML很难学吗? • 五. XML和HTML的区别 • 六. XML的严格格式 • 七. 关于XML的更多 • 第二章:XML概念 • 一. 扩展性 • 二. 标识 • 三. 语言 • 四. 结构化 • 五. Meta数据 • 六. 显示 • 七. DOM • 第三章:XML的术语 • 导言 • 一.XML文档的有关术语 • 二.DTD的有关术语 • 第四章:XML的语法 • 一.XML语法规则 • 二.元素的语法 • 三.注释的语法 • 四.CDATA的语法 • 五.Namespaces的语法 • 六.entity的语法 • 七.DTD的语法 • 第五章:XML实例解释 • 一.定义新标识 • 二.建立XML文档 • 三.建立相应的HTML文件 • 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都含有标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的数据形式和结构。 这是一个质的区别:网页将数据和显示混在一起,而XML则将数据和显示分开来。 我们看上面的例子,在myfile.htm,我们只关心页面的显示方式,我们可以设计不同的界面,用不同的方式来排版页面,但数据是储存在myfile.xml,不需要任何改变。 (如果你是程序员,你会惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据处理方法,将使网络跨越到一个新的境界。 六. XML的严格格式 吸取HTML松散格式带来的经验教训,XML一开始就坚持实行"良好的格式"。 我们先看HTML的一些语句,这些语句在HTML随处可见: 1. sample 2.sample 3.sample 4.samplar 在XML文档,上述几种语句的语法都是错误的。因为: 1.所有的标记都必须要有一个相应的结束标记; 2.所有的XML标记都必须合理嵌套; 3.所有XML标记都区分大小写; 4.所有标记的属性必须用""括起来; 所以上列语句在XML正确的写法是 1. sample 2.sample 3.sample 4.samplar   另外,XML标记必须遵循下面的命名规则: 1.名字可以包含字母数字以及其它字母; 2.名字不能数字或"_" (下划线) 开头; 3.名字不能字母 xml (或 XML 或 Xml ..) 开头; 4.名字不能包含空格。 在XML文档任何的差错,都会得到同一个结果:网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下,比如将改为,然后用IE5直接打开myfile.xml,会得到一个出错信息页面: XML轻松学习手册 ajie

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧