Struts2学习笔记(3)--输入校验

2020-01-08 17:12:05 浏览数 (1)

Struts2学习笔记(3)--输入校验

输入校验

===================================== 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>

===================================== 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; //毕业时间

 //setter...getter...

 @Override  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/>

======================================= 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>

如果系统发现输入的数据类型有错误的话,就自动到配置文件中找input对应的页面, 如果找不到,则报错。

======================================= 5. 校验

在Action中重写validate()方法,ActionSupport的该方法来自于Validateable接口

struts构架会去找所有实现了Validateable接口的类,然后找到validate()方法进行验证

客户端发出请求后,首先会进入validate()方法校验,成功后进入execute()方法

@Override public void validate() {

 if( username == null || username.length() < 6 || username.length() > 10 ) {

  //调用这个方法,将把信息包含到一个域里面,页面通过<s:fielderror>标签输出域里所有的信息   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");   }  } }

【初步完成】

=======================================

遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面

流程

1. 首先Struts2对客户端传来的数据进行类型转换

2. 类型转换完毕后再进行输入校验

3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)

注:如果类型转换不成功,也同样要进行输入校验

======================================= 替换Struts2自动产生的错误信息

=======================================

@@@@@@@@@@@@@@@@@@@@@@@@   【全局的输入校验】 ---- @@@@@@@@@@@@@@@@@@@@@@@@

struts.xml

<include> 用于包含其他的配置文件

<constant> 在struts框架里使用的常量,这些常量就会替换掉struts中内置的常量

=====替换系统默认的错误信息=====

《1》 <struts>                默认的国际化的资源文件        指定自己定义的资源文件为message.properties  <constant name="struts.custom.i18n.resources" value="message"></constant>  <package> ...  ... </struts>

《2》 message.properties文件要放在classes下,也就是项目的src目录下,同struts.xml目录

内容:

                固定的  ___________|_____________     错误信息 |                                      |      | xwork.default.invalid.fieldvalue={0} error                                             |                                   表单属性的名字 表示: 当哪个字段发生错误的时候,显示那个字段的名字 和 错误信息

=======================================

@@@@@@@@@@@@@@@@@@@@@@@@@    【局部的输入校验】 @@@@@@@@@@@@@@@@@@@@@@@@@

要求资源文件要和需要验证的action类在同一个目录下

如:对com....action.RegisterAction进行验证 需要在com....action下创建和Action相同名字的资源文件:RegisterAction.properties

=====替换系统默认的错误信息=====

RegisterAction.properties 内容:        固定的  ________|________ |                   | invailid.fieldvalue.age=age conversion error                         |   |________________|                   属性名          |                                错误信息 表示: 当年龄发生“类型转换”错误的时候,显示age conversion error这个错误信息

======================================= 注: 如果类型转换错误的话,Struts自动将int类型设置成0,将对象类型设置成null

=======================================

#################################   相关问题----资源文件中的中文 #################################

jdkbinnative2ascii.exe 可以将任何一个文件的字符集转换为Unicode

使用方式: ------------------ (1)串方式 ------------------

需要转换的串:invailid.fieldvalue.age=年龄信息输入不正确

到cmd命令行, d:>native2acsii invailid.fieldvalue.age=年龄信息输入不正确 【回车】 得到结果 invailid.fieldvalue.age= u5e74 u9f84 u4fe1...

Ctrl C 终止

------------------- (2)文件到文件方式 -------------------

到cmd命令行, d:>native2acsii test.txt test.properties

test.txt ---源文件 test.properties ---要转换到的文件

#################################    相关问题----输入数据回填 #################################

当发生错误时,如果不使用struts的form标签,回到输入页面,以前输入的数据会消失

可以中EL表达是解决,如: <input type="text" name="username" value="${username}" />

如果使用struts的form标签,将会自动回填输入信息

注:并且struts的form标签会自动生成一个表格

@@@@@@@@@@@@@@@@@@@@@@@@@   输入校验------分类 @@@@@@@@@@@@@@@@@@@@@@@@@

错误校验的级别有2种:

1.Action级别的错误

 通过  void addActionError(String errorMessage)、  void addActionMessage(String message)   方法完成

 actionError的信息实际上放在了一个ArrayList中

2.Field级别的错误

 通过  void addFieldError(String fieldName, String errorMessage)  方法完成

 fieldError的信息实际上放在了一个Map中,fieldName作为键,errorMessage作为值 ---------------------------------------- 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");  }   ... }

---------------------------------------- 2》 struts的form标签已经内置的错误信息,但只内置的fieldError错误

在jsp的input页面可以通过添加 <s:actionerror/> 标签来显示actionError的信息 该标签将以列表的方式显示出所有的actionError信息

*** 更改错误信息的CSS :<s:actionerror cssStyle="color:red"/>     直接设置css代码    <s:actionerror cssClass="errorCss"/>      引入一个css定义

---------   补充1 ---------

ValidationAware接口的boolean hasErrors()用于判断错误,返回false,表示验证错误 返回 hasActionError() 或者 hasFieldError() 当这两个方法中有一个为假,说明转换或验证是错误的,返回到input页面

hasActionError()是判断ArrayList,如果该list为空的话,表示验证通过 hasFieldError()是判断Map,如果该Map为空的话,表示验证通过

然后执行execute()方法

---------   补充2 ---------

theme : 主题 (simple | ajax | ...)

<s:textfield name="username" label="username" theme="simple" /> theme设置为simple时,该field将不在struts自动生成的表格中定义

这样的话,label将失效,并且不再在表单中显示错误信息

将<s:form ... theme="simple"> 表单的所有field将不在自动生成表格,label将失效,不显示错误信息,会自动回填信息 可以将这些field根据需要添加到自己的表格中。

---------   补充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 name="register" class="...RegisterAction">  <result> ... </result>  ... </action>

<action name="addUser" class="...RegisterAction" method="add">  <result> ... </result>  ... </action>

<action name="deleteUser" class="...RegisterAction" method="delete">  <result> ... </result>  ... </action>

----------- 对应的,RegisterAction中

public String execute() throws Exception { .... } public String add() throws Exception { .... } public String delete() throws Exception { .... }

----------- 每个执行业务逻辑的方法都应对应不同的验证方法

          对应于 execute() ------> public void validate() { ... }

对于自定义的方法,可以写自定义的validate方法:validate 对应的逻辑方法名

          对应于 add() ----------> public void validateAdd() { ... }

          对应于 delete() -------> public void validateDelete() { ... }

----------- 通过下面的URL调用: [url]http://..../register.action[/url] [url]http://..../addUser.action[/url] [url]http://..../deleteUser.action[/url]

----------- 在有多个业务逻辑方法和验证方法时, 执行顺序: validateAdd()-->validate()-->add() 不管有多少个验证方法,validate()总会被执行

解决策略:

不重写validate(),让他什么也不执行 用validateExecute()对execute()进行验证

【完成】

0 人点赞