天天看点

struts2_03表单校验ognl国际化

一、用户输入验证

 1、编程方式:

  动作类中的所有方法进行验证:

   步骤:

   a、动作类继承ActionSupport

   b、覆盖调用public void validate()方法

   c、在validate方法中,编写不符合要求的代码判断,并调用父类的addFieldError(String fieldName,String errorMessage)

    如果fieldError(存放错误信息的Map)有任何的元素,就是验证不通过,动作方法不会执行。

    Struts2框架会返回到name=input的result

   d、在name=input指定的页面上使用struts2的标签显示错误信息。<s:fielderror/> 或 ${errors.名字}

  动作类中指定的方法进行验证:

   编写步骤与上面相同

   验证方法书写有要求:

    public void validateXxx()   Xxx代表的是要验证的动作方法名,其中要把动作方法名的首字母变为大写。

 2、基于XML配置文件的方式:

  动作类中的所有方法进行验证:

   在动作类的包中,建立一个名称为:动作简单类名-validation.xml ,比如要验证的动作类名是UserAction   UserAction-validation.xml

   内容如下:

   <?xml version="1.0" encoding="UTF-8"?>

   <!DOCTYPE validators PUBLIC

     "-//OpenSymphony Group//XWork Validator 1.0.3//EN"

     "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"><!--dtd在xwork包下-->

   <validators>

    <field name="username"><!--jsp中可以通过${errors.username}或<s:fielderror></s:fielderror>输出错误信息-->

     <!-- 内置验证器都是定义好的,在xwork-core.jar com.opensymphony.xwork2.validator.validators包中的default.xml文件中 -->

     <field-validator type="requiredstring"><!-- 不能为null或者""字符串,默认会去掉前后的空格 -->

      <message>用户名不能为空</message>

     </field-validator>

    </field>

   </validators>

  动作类中指定的方法进行验证:

   配置文件的名称书写有一定要求。

     动作类名-动作名(配置文件中的动作名)-validation.xml

     UserAction-user_add-validation.xml

struts2提供的校验器列表

系统提供的校验器如下:

required (必填校验器,要求field的值不能为null)

requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)

stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)

regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)

int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)

double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)

fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)

email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)

url(网址校验器,要求如果field的值非空,则必须是合法的url地址)

date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

conversion(转换校验器,指定在类型转换失败时,提示的错误信息)

visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)

expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)

2. 校验器的使用例子

required  必填校验器

<field-validator type="required">

       <message>性别不能为空!</message>

</field-validator>

requiredstring  必填字符串校验器

<field-validator type="requiredstring">

       <param name="trim">true</param>

       <message>用户名不能为空!</message>

</field-validator>

stringlength:字符串长度校验器

<field-validator type="stringlength">

 <param name="maxLength">10</param>

 <param name="minLength">2</param>

 <param name="trim">true</param>

 <message><![CDATA[产品名称应在2-10个字符之间]]></message>

</field-validator>

email:邮件地址校验器

<field-validator type="requiredstring">

    <param name="trim">true</param>

    <message>邮箱不能为空</message>

</field-validator>

<field-validator type="email">

    <message>邮件格式不正确</message>

</field-validator>

regex:正则表达式校验器

<field-validator type="regex">

     <param name="expression"><![CDATA[^1[358]\d{9}$]]></param>

     <message>手机号格式不正确!</message>

</field-validator>

int:整数校验器

<field-validator type="int">

 <param name="min">1</param>

 <param name="max">150</param>

 <message>年龄必须在1-150之间</message>

</field-validator>

字段OGNL表达式校验器

<field name="imagefile">

 <field-validator type="fieldexpression">

  <param name="expression"><![CDATA[imagefile.length() <= 0]]></param>

  <message>文件不能为空</message>

 </field-validator>

</field>

3、自定义基于XML的验证器

  a、编写一个类,继承FieldValidatorSupport类。

  b、在public void validate(Object object)编写你的验证逻辑

    不符合要求的就向fieldErrors中放消息

  c、一定注册你的验证器才能使用

    在WEB-INF/classes目录下建立一个名称为validators.xml的配置文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!-- 注册自定义的验证器 -->

<!DOCTYPE validators PUBLIC

        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"

        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">

<validators>

    <validator name="strongpassword" class="cn.itcast.validators.StrongPasswordValidator"/>

</validators>

  d、日后就可以像使用Struts2提供的16个验证器方式去使用了。

二、Struts2对于i18n的支持

 全局资源文件/包范围资源文件/动作类的资源文件

 全局资源文件:放到WEB-INF/classes目录下

 包范围资源文件:服务于Java类中的包下的动作类的。

   取名:package_语言_国家.properties

 动作类的资源文件:放到与动作类相同的包中

   取名:动作类名_语言_国家.properties

 jsp中如何读取国际化的消息

 动作类中如何读取国际化的消息

三、OGNL表达式:

 OGNL是从ActionContext中获取数据的。

 ActionContext的结构:

  ValueStack:

   List:动作类放在此处。取存放在ValueStack中的root的对象的属性,直接写即可

   访问以下内容中的对象要使用#+(范围)session

  application:ServletContext中的那个Map

  session:HttpSession中的那个Map

  request:ServletRequest中的那个Map

  parameters:请求参数的那个Map。(如同EL表达式的paramValues内置对象)

  attr:相当于PageContext的findAttribute方法。${username}

 小技巧:在页面中使用<s:debug/>查看上下文中的对象

一)OGNL简介

   (1)回顾EL的作用

 A)能获取域对象(page/request/session/application)中的数据,例如:${sessionScope.username} 

 B)运算和判断,例如:${10 * 10},${!empty sessionScope.username?sessionScope.username:'游客'}

 C)EL函数,例如:${fn:toUpper('www.itcast.cn')}

   (2)OGNL的作用(对象图导航语言,struts2专用的标记语言,比EL更强大)      

  A)获取ActionContext中的数据

  B)集合操作,即访问list,map

   (3)理解ActionContext对象 

 A)ActionContext对象是struts2的数据中心,在一次符合 

  //向sessionMap中存入数据

  //actionContext.getSession().put("username","sessionMap");

  //向applicationMap中存入数据

  //actionContext.getApplication().put("username","applicationMap");

  //向ValueStack中存入数据

  //actionContext.getValueStack().set("username","ValueStack");

  return this.SUCCESS;

 }

}

    <%@ page language="java" pageEncoding="UTF-8"%>

<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

 <body>

  <%

   //pageContext.setAttribute("username","page");

  %>

  获取ActionContext对象中六个子对象的数据<br/>

  requestMap:<s:property value="#request.username"/><br/>   

  sessionMap:<s:property value="#session.username"/><br/>   

  applicationMap:<s:property value="#application.username"/><br/>   

  ValueStack:<s:property value="username"/><br/>  

  parameters:<s:property value="#parameters.username"/><br/>

  <b>attr:<s:property value="#attr.username"/></b> 

 </body>

</html>

二)OGNL的4种符号用法

   *(1)#

 >>访问ActionContext对象

 >>访问集合Map:#{'male':'[男]','female':'[女]'}

 >>访问集合List

   A)集合的投影:userList.{username,JavaBean的某个属性值}

   B)集合的过滤:userList.{?#this.age>22}

         userList.{^#this.age>22}

                       userList.{$#this.age>22}.{?#this.gender=="男"}

         ?#表示所有对象  

         ^#表示第一个对象  

         $#表示最后一个对象 

   this表示当前迭代的这个对象 

          C)集合的投影和过滤:userList.{?#this.age>22}[0]

        [0]表示符合条件的第一个对象 

               [1]表示符合条件的第二个对象 

 什么情况下使用#:

 A)非值栈

 B)获取JavaBean属性值

   (2)%{}:

  >><s:textfield label="%{usernameTIP变量}" name="username"/>

  >><s:textfield label="%{'usernameTIP'常量}" name="username"/>

   (3)${}不是EL:

  >><field-validator type="double">

  <param name="minInclusive">4000</param>

  <param name=" maxInclusive">6000</param>

  <message>薪水必须介于${minInclusive}到${maxInclusive}之间</message>

    </field-validator> 

    ${}可以访问xml本身的数据

         >><param name="contentDisposition">attachment;filename=${filename}</param> 

    ${}也可以访问Action实例变量,前提Action一定要对该实例变量提供getXxx()方法

   (4)访问集合List或{}

         >>value='{"AA","BB","CC","DD"}'

         >><s:property value="stringList.isEmpty"/>

         >><s:property value="stringList.size"/>

  在迭代List或数组时,#可要可不要

三)struts2常用标签介绍 

    1)标签(M) :为了显示出某种特殊的效果,struts2对普通进封装后产生的对象,叫标签。

    struts2标签底层,都是处理类,例如:<s:textfield/> 

    2)模板(N) :将所有风格显示相类型的标签,形成一个集合,该集合就叫做模板。 

    1个模板对应N个标签

    3)主题(1) :将N个模板所表现出来的内容,形成一个集合,该集合就叫做主题。

    1个主题对应N个模板   

    4)struts2的四类主题

       A)simple主题:checkbox,无<table>,灵活  

       B)xhtml主题:checkbox(struts2默认主题)有<table>

       C)css_xhtml主题:checkbox,无<table>,用div替换<table>

       D)ajax主题:checkbox        

    5)修改主题的三种方式

       A)在某个表单标签中修改,例如:<s:textfield label="用户名" name="username" theme="simple"/> 

       B)在<s:form>标签中使用theme,争对整个表单中的所有表单项元素<s:form theme="simple"/>

       C)在struts.property文件中,覆盖系统的整体风格,struts.ui.theme=simple 

       当A,B,C同时作用某一个表单标签时,A起决定作用 

    6)标签的四种作用

       A)[布局]

       B)表单项数据回显  

       C)错误信息显示   

       D)国际化          

    7)常用标签

      *>>s:fielderror

      *>>s:property

      *>>s:text

      *>>s:form

      *>>s:textfield

      *>>s:password

      *>>s:submit

      *>>s:reset

      *>>s:hidden   

      *>>s:textarea

         当需要将jquery加入进来时,需要注意二点:

  A)引用jquery的路径,使用绝对路径,例如:/day34/js/jquery-1.8.2.min.js

  B)定位某个标签时,不能使用struts2标签,只能使用普标签

      *>>s:radio【listValue页面中显示的值,listKey页面中隐藏的值】

      *>>s:select

      *>>s:checkboxlist

      *>>s:property

       >>s:bean

       >>s:param

       >>s:url

       >>s:set

       >>s:include

       >>s:date

      *>>s:if-s:elseif-s:else

      *>>s:iterator

       >>s:sort【实现Comparator接口】

继续阅读