`
longzijian
  • 浏览: 39370 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

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

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

 

 


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

jdk\bin\native2ascii.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调用:
http://..../register.action
http://..../addUser.action
http://..../deleteUser.action

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

解决策略:

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


【完成】

分享到:
评论

相关推荐

    struts2学习笔记.doc

    ### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...

    struts2学习笔记

    5. **类型转换与输入校验**:Struts2在类型转换过程中也会进行基本的校验,如检查非空、数值范围等。 **四.Struts2的核心:拦截器** 拦截器是Struts2的核心组件,它们在Action执行前后介入处理流程。拦截器可以...

    struts2综合笔记

    - **发展历程**: Struts2 是在 WebWork 框架的基础上发展起来的,因此学习 Struts2 实际上也是学习 WebWork。 #### 二、Struts2 的核心组件分析 **控制器**: - **Servlet VS Filter**: - **Servlet**: - 在内存...

    struts2校验器与校验框架精彩学习笔记

    本学习笔记主要探讨了Struts2中的校验器(Validator)和校验框架,帮助开发者理解如何有效地实现数据验证,确保应用程序的健壮性。 首先,我们来看Struts2的校验框架。这个框架提供了强大的功能,可以对用户输入...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

    传智播客struts2全程学习笔记

    ### 传智播客Struts2全程学习笔记 #### Struts2的优点 1. **无侵入式设计**:与Struts1相比,Struts2的设计更为先进,它不依赖于Servlet API或Struts API,这使得Struts2更加灵活且易于集成到其他环境中。在代码...

    Struts2.1学习笔记

    ### Struts2.1学习笔记 #### Struts2的来源与优点 - **来源**:Struts2是在WebWork2的基础上发展起来的,它继承了WebWork2的优点,并且进行了改进,使其更适合现代Web应用程序的需求。与Struts1相比,Struts2的...

    struts2学习笔记五(第5讲.Struts2的输入校验)

    在Struts2的学习过程中,第五讲主要探讨的是输入验证,这是确保应用程序数据安全和准确性的关键步骤。输入验证通常发生在客户端和服务器端,防止恶意数据的提交,并确保用户输入的数据符合预设的格式和规则。 首先...

    struts2学习笔记六(第6讲.Struts2的输入校验续一)

    在学习Struts2输入验证的过程中,还需要理解Action上下文(ActionContext)和值栈(Value Stack)的概念。ActionContext存储了与当前请求相关的所有信息,而值栈则是将Action对象和ActionForm对象组织在一起的地方,...

    【张冰Struts2学习笔记】0202_Struts2的三种接收用户输入的方法

    在"【张冰Struts2学习笔记】0202_Struts2的三种接收用户输入的方法"中,我们主要探讨的是如何在Struts2中有效地获取并处理用户提交的数据。以下是对这三种方法的详细解析: ### 1. 使用Action属性 Struts2的核心是...

    struts2学习笔记九(第9讲.Struts2的校验框架 续)

    在第九讲中,我们将深入探讨Struts2的校验框架,这是一个非常重要的功能,它有助于确保输入数据的准确性和完整性,防止非法数据导致的系统异常。 在传统的Java web开发中,数据验证通常在服务器端进行,如Servlet或...

    struts2学习笔记八(第8讲.Struts2的校验框架)

    本讲主要探讨Struts2的校验框架,它提供了对用户输入数据进行验证的功能,确保数据的有效性和安全性。 在传统的MVC模式中,数据验证通常在控制器或模型层进行,但在Struts2中,校验逻辑被移到了专门的校验框架中,...

    Struts2学习笔记

    3. **配置灵活性**:Struts2的配置文件(struts.xml)允许开发者灵活地配置Action、结果类型、拦截器栈等,同时支持注解配置,使配置更加简洁。 4. **插件系统**:Struts2拥有丰富的插件库,如Tiles、FreeMarker、...

Global site tag (gtag.js) - Google Analytics