rejister.jsp
先用Html语言来写个注册页面,来验证下输入校验
<form action="rejister.action" method="post">
<table align="center" width="40%" border="1">
<tr>
<td>
username
</td>
<td>
<input type="text"
name="username">
</td>
</tr>
<tr>
<td>
password
</td>
<td>
<input type="passwrd"
name="password">
</td>
</tr>
<tr>
<td>
re-password
</td>
<td>
<input type="password"
name="repassword">
</td>
</tr>
<tr>
<td>
age
</td>
<td>
<input type="text"
name="age">
</td>
</tr>
<tr>
<td>
birthday
</td>
<td>
<input type="text"
name="birthday">
</td>
</tr>
<tr>
<td>
graduation
</td>
<td>
<input type="text"
name="graduation">
</td>
</tr>
<tr>
<td>
<input type="submit"
value="submit">
</td>
<td>
<input type="reset"
value="reset">
</td>
</tr>
</table>
写出以上代码完成一个注册页面的样子然后写个Action
--------------------------------------------------------------------------
RejisterAction.java
当然要继承ActionSupport 基本每次都是这样的了
写上相应的属性然后再GET/SET一下,再添加execute方法直接return SUCCESS
就可以了。
因为继承了Action接口所以里面有这样的方法20~25分都再解释为什么可以这样写其实也
没什么意思。
-------------------------------------------------------------------------
success.jsp
写一个成功页面
直接复制前面的table好了快点,里面用EL表达式
然后再到struts.xml中配置一下就好了,启动服务器
-------------------------------------------------------------------------
因为要写验证了所以要了解下ActionSupport中的validate方法
这段内容讲解在37分钟的时候开始
--------------------------------------------------------------------------
RegisterAction.java
再里面添加验证validate方法
因为里面的判断都比较简单就把后面日期的前后判断写一下 我们需要调用Canlendar这
个类这个类里的before的方法我们会用到
before的方法: 就是对应日期谁再谁的前面 是的话就返回个true
if(null != birthday && null != graduation)
{
Calendar c1 = Calendar.getInstance();
c1.setTime(birthday);
Calendar c2 = Calendar.getInstance();
c2.setTime(graduation);
if(!c1.before(c2))
{
this.addFieldError("birthday", "birthday should be before graduation");
}
}
首先我们要把Date转换成一个Calendar
1.生成一个Calendar实例(birthday)
2.得到birthday的时间
3.生成一个Calendar实例(graduation)
4.得到graduation的时间
5.如果birthday的时间不再graduation的前面则返回个错误
这段代码的解说再43分钟开始的
-----------------------------------------------------------------------
register.jsp
要让验证后的报错显示出来要再这个里面添加一个struts2的标签
<s:fielderror></s:fielderror> 就会显示出来了
因为它好像是保存再相应的一个域里面的
======================================================================
第六讲 输入校验续
rejister.jsp
中的代码基本都是用HTML写的,提交错误后返回而里面原先填的数据都清空了,这是个不
完善的东西,而HTML只要添加个EL表达式就可以解决这个问题了,如下:
<input type="text" name="username" value="${requestScope.username/username}">
可以用EL表达式中的两种方法
-----------------------------------------------------------------
struts.xml
因为错误的输入struts2都会默认的报出不大友好的错误
所以我们要替换掉它的默认文件
就要再struts.xml中添加一行
<constant name="struts.custom.i18n.resources" value="message"></constant>
<constant></constant>的意思
你需要哪些常量,定义了就可以替换掉struts2内置的那些值
<constant name="名字(这里是一个国际化的资源文件)" value="我要生成的文件的名字
(名字后面会自动帮你加上.properties)"></constant>
-------------------------------------------------------------------
message.properties
这是一个全局的属性文件
这个文件的话是直接点击src生成在class下面的
xwork.default.invalid.fieldvalue={0} error
不合法的属性值=属性的名字(struts2会自动填充这个字段) xxx
谁出错了哪个属性的名字就会显示出来,可以说是个动态的
另外xwork.default.invalid.fieldvalue这些是不可以变的不能写错
--------------------------------------------------------------------
RejisterAction.properties
当然也会有局部的属性文件,这样的文件更加细致的表现出你的想法
和类型转换是差不多的
你要验证哪个属性就写该属性所在的类的名字再加上.properties这是这个的规则
写在该类所在包下
invalid.fieldvalue.age=age conversion error
格式为
invalid.fieldvalue.属性名=要显示的错误信息
基本和全局的差不多啦
意思是当年龄发生类型转换错误时报出你给的错误信息
此处要显示中文还可以使用native2ascii来把文字转换成字节码方便显示
这个应用程序是再JDK的文件夹里面的
再32分钟前几分钟有交你如何使用
----------------------------------------------------------------
rejister2.jsp
用struts2标签库重新写个注册页面
写完后别忘了再struts.xml里改下设置
为了满足需要,把全局的message.properties注释掉了
再局部的RejisterAction.properties中添加了几个错误显示
------------------------------------------------------------------
RejisterAction.java
因为程序需要
如果生日和毕业时间为空的话就不需要显示我们自己写的了而局部的会帮我们显示错误
所以我们把里面的判断为空的若干代码注释掉了
还有年龄也是一样需要改动下
-----------------------------------------------------------------
一下内容为本次的总结也算是一种流程
遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错
误信息,并且将该错误信息放到addFieldError里面
类型转换与输入校验的流程
1. 首先Struts2对客户端传来的数据进行类型转换
2. 类型转换完毕后再进行输入校验
3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)
注意:如果类型转换不成功,也同样要进行输入校验
==========================================================================
第七讲 输入校验续二
前面的9分钟内讲解了一下addActionErrors方法
它的组成之类的东西 下面做个例子来直观的理解下
--------------------------------------------------------------------
RejisterAction.java
把原有的注释掉,添加新的addActionErrors方法的代码
其实是和原来的差不多的样子,只是一点改变罢了
运行后页面不显示错误
原来两个方法显示的错误不是放在一个域里面的
addFieldErrors是放在MAP里面的
addActionErrors是放在LIST里面的
--------------------------------------------------------------------
rejister2.jsp
如上面所说两者并不再一个里面显示,要显示的话就要像HTML里的addFieldErrors那样添
加一个标签就可以显示了
而我们知道addActionErrors不会再form里面显示的,所以要在form上面添加一个标签为
<s:actionerror cssStyle="color:red"/>
在里面也是可以改变颜色的
在<s:textfield …… theme="simple"></s:textfield>标签中添加里面的内容
那么将不再会报出struts2默认的错误,只会把错误的那项提到表头上面去
对于进行Action验证是非常好的
theme主题设为simple
再form中也是可以设的 设了后所有格子都变成一排了就是说可以用表格标签来排版 就
是说基本标签都可以设theme的
设了这个的话可以方便排版啊什么的 听他说的很好的样子
基本上就是把这个文件里的代码都改一下放到表格里去
---------------------------------------------------------------------------
struts.xml
再原有基础上可以添加method属性:method="abc"
<action name="rejister" class="com.test.action.RejisterAction" method="abc">
<result name="success">/success.jsp</result>
<result name="input">/rejister2.jsp</result>
</action>
意思就是呢
如果一个form表单它的Action是rejister的话 就会生成这个
com.test.action.RejisterAction类的一个实例 接着由这个abc方法来接着处理就不会
去自动调用execute()方法了
-------------------------------------------------------------
RejisterAction.java
再里面添加abc方法其实和execute()方法差不多的
public String abc() throws Exception{
System.out.println("abc method invoked");
return SUCCESS;
}
显然这里调用了java的反射机制 进入到这个方法里去后和execute()方法一样先验证
validate()方法 再执行abc方法
-------------------------------------------------------------------
如果再struts2.xml中一个类需要转向多个方法,那我们可以
<action name="rejister" class="com.test.action.RejisterAction" method="abc">
<result name="success">/success.jsp</result>
<result name="input">/rejister2.jsp</result>
</action>
<action name="rejister" class="com.test.action.RejisterAction" method="xyz">
<result name="success">/success.jsp</result>
<result name="input">/rejister2.jsp</result>
</action>
当然这就需要你再相应的类里有相对应的方法了
而再类里相应的方法应该就有相应的验证方法那我们可以
public void validateAbc() {……}
public void validateXyz() {……}
就可以了注意第一个字母要大写,就是再原有的验证上加上你要用的方法名字就OK啦
再RejisterAction.java中有写例子
他的运行顺序是
1.自定义的方法validateAbc()
2.紧接着validate()方法 只要写了就会运行
3.一切通过abc()方法
上面的运行的话对你编写肯定是有影响的 但是呢你不写validate()方法就不会去运行
execute()方法了 所以如果你不想运行validate()方法可以不重写里面的方法 或者 写
validateExecute()方法 这个方法是专门会运行execute()方法逻辑的
这段讲解再45分左右
===========================================================================
第八讲 Struts2的校验框架
今天要讲的是用xml来验证输入的东西是否正确,一般来说用到xml来验证比用类里写代码
来的多,所以呢以后还是多用这个比较好点吧
-------------------------------------------------------------------
RejisterAction-validation.xml
这个文件是和所在类在一个包里面的,写法为
类名-validation.xml
后面是不可以改变的,其实蛮简单的
里面的.dtd头文件我们可以从下载下来的DEMO里去COPY一个来
就像struts.xml一样,我们不也是从DEMO里找了个文件COPY来的么,这里同理嘛
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim"></param>
<message>username shoud be not blank!</message>
</field-validator>
</field>
</validators>
<validators>
1.对一种属性的校验 属性名字="XXX"(可写多个:类里属性很多么
2.校验的一种方式 type="XXX"
3.具体的验证 (trim代表去除左右两边的空格
4.报错显示(一个验证只有必须有一次
2.校验的一种方式
1.对一种属性的校验
</validators>
required:是信息必须出现的校验 一般都用这个的字符串用下面的
requiredstring:必须要填的字符串一种校验 trim(true/false)默认为true 可不写咯
int:判断数字大小 min/max
double:
date:对日期验证 min/max 一个范围最小时间和最大时间
expression:
fieldexpression:
email:判断是否是个邮件地址 本身是采取的正则表达式
url:
visitor:
conversion:类型转换的
stringlength:字符串长度 minLength/maxLength
regex:对正则表达式进行校验
(以上有待添加)
因为上一次再struts2.xml中第一了 重定向or转发? 会有干扰所以我们去掉并且把类里
的那个方法注释掉
还有就是此处的信息是显示再fieldError中的,所以我们的rejister2.jsp也需要改动下
<s:fielderror cssStyle="color:red"></s:fielderror>这样的
----------------------------------------------------------------------------
RejisterAction-validation.xml
中代码为
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim"></param>
<message>username shoud be not blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>
username be between ${minLength} and
${maxLength}
</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim"></param>
<message>password should be not blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>
password should be between ${minLength} and
${maxLength}
</message>
</field-validator>
</field>
<field name="repassword">
<field-validator type="requiredstring">
<message>repassword should be not blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>
repassword should be between ${minLength} and
${maxLength}
</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<param name="trim"></param>
<message>age should be not blank!</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>age should be between ${min} and ${max}
</message>
</field-validator>
</field>
<field name="birthday">
<field-validator type="required">
<message>birthday should be not blank!</message>
</field-validator>
<field-validator type="date">
<param name="min">2001-01-01</param>
<param name="max">2005-12-31</param>
<message>
birthday should be between ${min} and ${max}
</message>
</field-validator>
</field>
<field name="graduation">
<field-validator type="required">
<message>graduation should be not blank!</message>
</field-validator>
<field-validator type="date">
<param name="min">2005-01-01</param>
<param name="max">2008-12-31</param>
<message>
graduation should be between ${min} and
${max}
</message>
</field-validator>
</field>
其实都很好理解的 我想就不用多介绍了
里面的年龄那的校验是否为空可以不写的 因为除非你写成其他的否则他都会转换成数值
类型的 不写就变成0了
=============================================================================
第九讲 校验框架续
Struts2同样支持客户端校验
1.form的主题(theme)一定不能设置为simple
2.将form的validate属性设置为TRUE(这里指的是struts2里的标签的form)
-----------当然咯最好不要使用struts2给我们提供的客户端校验-------------
如果再类里添加了test方法来校验,而且再struts.xml中配置了转发到test,那么再同包
的类外就要添加相应的校验文件,如下
RejisterAction-test-validation.xml
校验完毕后还是会调用原来的validate方法再次进行校验,这种可以说是局部校验
如果有多个逻辑(就是action类中的execute方法那种返回SUCCESS的那个),最好写多个上
面的那种局部校验,这样的话比较好
27分钟以前,讲解了以上这些,以及一个JS的客户端校验的代码,我没写
分析了两个校验的区别,是可以并存的,个人感觉字段校验容易理解点也清爽
字段校验:我去校验谁(name="username"),用谁来校验(type="requiredstring")
DEMO
<field name="username">
<field-validator type="requiredstring">
非字段校验:我用谁来校验(type="stringlength"),我去校验谁(username)
<validator type="stringlength">
<param name="fieldName">username</param>
非字段校验的DEMO:
<validator type="requiredstring">
<param name="fieldName">username</param>
<message>username shoud be not blank!</message>
</validator>
<validator type="stringlength">
<param name="fieldName">username</param>
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>
username be between ${minLength} and ${maxLength}
</message>
</validator>
--------------------------------------------------------------------------
我们可以再字段验证中添加short-circuit="false"(好像也叫短路?),如果改为TRUE的话那么下面的验证
将不在执行,这个的话可以根据逻辑来自己设定
<field name="username">
<field-validator type="requiredstring" short-circuit="false">
<param name="trim"></param>
<message>username shoud be not blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>
username be between ${minLength} and ${maxLength}
</message>
</field-validator>
</field>
转载于:https://www.cnblogs.com/liushengjie/archive/2012/05/01/2477941.html