Struts2学习笔记(3)--输入校验
输入校验
=====================================
1.register.jsp
1.register.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<from action="register.action" method="post">
<s:fielderror></s:fielderror> 用于显示错误信息
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
确认密码:<input type="password" name="repassword"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birthday"/><br/>
毕业时间:<input type="text" name="graduation"/><br/>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
确认密码:<input type="password" name="repassword"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birthday"/><br/>
毕业时间:<input type="text" name="graduation"/><br/>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
=====================================
2.action
2.action
public class RegisterAction extends ActionSupport {
private String username;
private String password;
private String repassword;
private int age;
private Date birthday;
private Date graduation; //毕业时间
private String password;
private String repassword;
private int age;
private Date birthday;
private Date graduation; //毕业时间
//setter...getter...
@Override
public String execute() throws Exception {
public String execute() throws Exception {
return SUCCESS;
}
}
}
======================================
3.success.jsp
用户名: ${ requestScope.username } <br/>
密码: ${ requestScope.password } <br/>
确认密码: ${ requestScope.repassword } <br/>
年龄: ${ requestScope.age } <br/>
生日: ${ requestScope.birthday } <br/>
毕业时间: ${ requestScope.graduation } <br/>
密码: ${ requestScope.password } <br/>
确认密码: ${ requestScope.repassword } <br/>
年龄: ${ requestScope.age } <br/>
生日: ${ requestScope.birthday } <br/>
毕业时间: ${ requestScope.graduation } <br/>
=======================================
4.struts.xml
4.struts.xml
<package name="struts2" extends="struts-default">
<action name="register" class="com....action.RegisterAction" >
<result name="success">/success.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
<result name="success">/success.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
如果系统发现输入的数据类型有错误的话,就自动到配置文件中找input对应的页面,
如果找不到,则报错。
如果找不到,则报错。
=======================================
5. 校验
在Action中重写validate()方法,ActionSupport的该方法来自于Validateable接口
struts构架会去找所有实现了Validateable接口的类,然后找到validate()方法进行验证
客户端发出请求后,首先会进入validate()方法校验,成功后进入execute()方法
@Override
public void validate() {
public void validate() {
if( username == null || username.length() < 6 || username.length() > 10 ) {
//调用这个方法,将把信息包含到一个域里面,页面通过<s:fielderror>标签输出域里所有的信息
this.addFieldError("username","username invalid");
//匹配页面字段名 输出信息
}
......
this.addFieldError("username","username invalid");
//匹配页面字段名 输出信息
}
......
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");
}
}
}
c1.setTime(birthday);
Calendar c2 = Calendar.getInstance();
c2.setTime(graduation);
//如果生日不在毕业时间前面
if(!c1.before(c2)) {
this.addFieldError("birthday","birthday should be before graduation");
}
}
}
【初步完成】
=======================================
遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面
流程
1. 首先Struts2对客户端传来的数据进行类型转换
2. 类型转换完毕后再进行输入校验
3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)
注:如果类型转换不成功,也同样要进行输入校验
=======================================
替换Struts2自动产生的错误信息
替换Struts2自动产生的错误信息
=======================================
@@@@@@@@@@@@@@@@@@@@@@@@
【全局的输入校验】 ----
@@@@@@@@@@@@@@@@@@@@@@@@
struts.xml
<include> 用于包含其他的配置文件
<constant> 在struts框架里使用的常量,这些常量就会替换掉struts中内置的常量
=====替换系统默认的错误信息=====
《1》
<struts> 默认的国际化的资源文件 指定自己定义的资源文件为message.properties
<constant name="struts.custom.i18n.resources" value="message"></constant>
<package> ...
...
</struts>
<struts> 默认的国际化的资源文件 指定自己定义的资源文件为message.properties
<constant name="struts.custom.i18n.resources" value="message"></constant>
<package> ...
...
</struts>
《2》
message.properties文件要放在classes下,也就是项目的src目录下,同struts.xml目录
message.properties文件要放在classes下,也就是项目的src目录下,同struts.xml目录
内容:
固定的
___________|_____________ 错误信息
| | |
xwork.default.invalid.fieldvalue={0} error
|
表单属性的名字
表示:
当哪个字段发生错误的时候,显示那个字段的名字 和 错误信息
___________|_____________ 错误信息
| | |
xwork.default.invalid.fieldvalue={0} error
|
表单属性的名字
表示:
当哪个字段发生错误的时候,显示那个字段的名字 和 错误信息
=======================================
@@@@@@@@@@@@@@@@@@@@@@@@@
【局部的输入校验】
@@@@@@@@@@@@@@@@@@@@@@@@@
要求资源文件要和需要验证的action类在同一个目录下
如:对com....action.RegisterAction进行验证
需要在com....action下创建和Action相同名字的资源文件:RegisterAction.properties
需要在com....action下创建和Action相同名字的资源文件:RegisterAction.properties
=====替换系统默认的错误信息=====
RegisterAction.properties
内容:
固定的
________|________
| |
invailid.fieldvalue.age=age conversion error
| |________________|
属性名 |
错误信息
表示:
当年龄发生“类型转换”错误的时候,显示age conversion error这个错误信息
=======================================
注:
如果类型转换错误的话,Struts自动将int类型设置成0,将对象类型设置成null
=======================================
#################################
相关问题----资源文件中的中文
#################################
jdk\bin\native2ascii.exe 可以将任何一个文件的字符集转换为Unicode
使用方式:
------------------
(1)串方式
------------------
------------------
(1)串方式
------------------
需要转换的串:invailid.fieldvalue.age=年龄信息输入不正确
到cmd命令行,
d:\>native2acsii
invailid.fieldvalue.age=年龄信息输入不正确 【回车】
得到结果
invailid.fieldvalue.age=\ u5e74\ u9f84\ u4fe1...
d:\>native2acsii
invailid.fieldvalue.age=年龄信息输入不正确 【回车】
得到结果
invailid.fieldvalue.age=\ u5e74\ u9f84\ u4fe1...
Ctrl+C 终止
-------------------
(2)文件到文件方式
-------------------
(2)文件到文件方式
-------------------
到cmd命令行,
d:\>native2acsii test.txt test.properties
d:\>native2acsii test.txt test.properties
test.txt ---源文件
test.properties ---要转换到的文件
test.properties ---要转换到的文件
#################################
相关问题----输入数据回填
#################################
当发生错误时,如果不使用struts的form标签,回到输入页面,以前输入的数据会消失
可以中EL表达是解决,如:
<input type="text" name="username" value="${username}" />
<input type="text" name="username" value="${username}" />
如果使用struts的form标签,将会自动回填输入信息
注:并且struts的form标签会自动生成一个表格
@@@@@@@@@@@@@@@@@@@@@@@@@
输入校验------分类
@@@@@@@@@@@@@@@@@@@@@@@@@
输入校验------分类
@@@@@@@@@@@@@@@@@@@@@@@@@
错误校验的级别有2种:
1.Action级别的错误
通过
void addActionError(String errorMessage)、
void addActionMessage(String message)
方法完成
void addActionError(String errorMessage)、
void addActionMessage(String message)
方法完成
actionError的信息实际上放在了一个ArrayList中
2.Field级别的错误
通过
void addFieldError(String fieldName, String errorMessage)
方法完成
void addFieldError(String fieldName, String errorMessage)
方法完成
fieldError的信息实际上放在了一个Map中,fieldName作为键,errorMessage作为值
----------------------------------------
1》
Action中
public void validate() {
----------------------------------------
1》
Action中
public void validate() {
if( null == username || username.trim().length() < 1 ) {
this.addActionError("username invalid");
}
if( null == password || password.trim().length() < 1 ) {
this.addActionError("password invalid");
}
...
}
this.addActionError("username invalid");
}
if( null == password || password.trim().length() < 1 ) {
this.addActionError("password invalid");
}
...
}
----------------------------------------
2》
struts的form标签已经内置的错误信息,但只内置的fieldError错误
2》
struts的form标签已经内置的错误信息,但只内置的fieldError错误
在jsp的input页面可以通过添加 <s:actionerror/> 标签来显示actionError的信息
该标签将以列表的方式显示出所有的actionError信息
该标签将以列表的方式显示出所有的actionError信息
*** 更改错误信息的CSS :<s:actionerror cssStyle="color:red"/> 直接设置css代码
<s:actionerror cssClass="errorCss"/> 引入一个css定义
<s:actionerror cssClass="errorCss"/> 引入一个css定义
---------
补充1
---------
补充1
---------
ValidationAware接口的boolean hasErrors()用于判断错误,返回false,表示验证错误
返回 hasActionError() 或者 hasFieldError()
当这两个方法中有一个为假,说明转换或验证是错误的,返回到input页面
返回 hasActionError() 或者 hasFieldError()
当这两个方法中有一个为假,说明转换或验证是错误的,返回到input页面
hasActionError()是判断ArrayList,如果该list为空的话,表示验证通过
hasFieldError()是判断Map,如果该Map为空的话,表示验证通过
hasFieldError()是判断Map,如果该Map为空的话,表示验证通过
然后执行execute()方法
---------
补充2
---------
theme : 主题 (simple | ajax | ...)
<s:textfield name="username" label="username" theme="simple" />
theme设置为simple时,该field将不在struts自动生成的表格中定义
theme设置为simple时,该field将不在struts自动生成的表格中定义
这样的话,label将失效,并且不再在表单中显示错误信息
将<s:form ... theme="simple">
表单的所有field将不在自动生成表格,label将失效,不显示错误信息,会自动回填信息
可以将这些field根据需要添加到自己的表格中。
表单的所有field将不在自动生成表格,label将失效,不显示错误信息,会自动回填信息
可以将这些field根据需要添加到自己的表格中。
---------
补充3
---------
在一个action中实现多个业务方法 对应于struts1的DispatchAction的操作
补充3
---------
在一个action中实现多个业务方法 对应于struts1的DispatchAction的操作
<action name="..." class="..." method="abc">
如果指定了method="abc",将会不在调用action中的execute(),而是调用abc()方法
abc()的写法与execute()相同
public String abc() throw Exception { .... }
----------------------
配置多个 action 的时候:
----------------------
struts.xml中
配置多个 action 的时候:
----------------------
struts.xml中
<action name="register" class="...RegisterAction">
<result> ... </result>
...
</action>
<result> ... </result>
...
</action>
<action name="addUser" class="...RegisterAction" method="add">
<result> ... </result>
...
</action>
<result> ... </result>
...
</action>
<action name="deleteUser" class="...RegisterAction" method="delete">
<result> ... </result>
...
</action>
<result> ... </result>
...
</action>
-----------
对应的,RegisterAction中
对应的,RegisterAction中
public String execute() throws Exception { .... }
public String add() throws Exception { .... }
public String delete() throws Exception { .... }
public String add() throws Exception { .... }
public String delete() throws Exception { .... }
-----------
每个执行业务逻辑的方法都应对应不同的验证方法
每个执行业务逻辑的方法都应对应不同的验证方法
对应于
execute() ------> public void validate() { ... }
execute() ------> public void validate() { ... }
对于自定义的方法,可以写自定义的validate方法:validate + 对应的逻辑方法名
对应于
add() ----------> public void validateAdd() { ... }
add() ----------> public void validateAdd() { ... }
对应于
delete() -------> public void validateDelete() { ... }
delete() -------> public void validateDelete() { ... }
-----------
通过下面的URL调用:
[url]http://..../register.action[/url]
[url]http://..../addUser.action[/url]
[url]http://..../deleteUser.action[/url]
-----------
在有多个业务逻辑方法和验证方法时,
执行顺序:
validateAdd()-->validate()-->add()
不管有多少个验证方法,validate()总会被执行
在有多个业务逻辑方法和验证方法时,
执行顺序:
validateAdd()-->validate()-->add()
不管有多少个验证方法,validate()总会被执行
解决策略:
不重写validate(),让他什么也不执行
用validateExecute()对execute()进行验证
用validateExecute()对execute()进行验证
【完成】