您的位置:首页 > 编程语言 > Java开发

Struts2表单验证、模型驱动、防重复提交、数据回显笔记整理

2016-06-17 13:50 736 查看
 刚学完一些零散的struts内置功能,做点笔记,就当回顾一遍,也便以后使用。
----------------------------------------------------------------------------------------------------------------------------------------
                  1)表单验证
                    strus的表单验证通过使用struts内置的vlidation拦截器来完成。使用相对比较简单,有以下步骤需要完成。       
                        a,写一个xml配置文件(和需要验证的action必须同包),文件名字有要求必须为  actionName+methodName+validation.xml例如:InsertAction-insert-validation.xml,需要注意的是,如果不使用methodName即InsertAction-validation.xml
的格式的话,则InsertAction中所有的方法都会被验证,加上方法名则只验证指定的方法。
                         b,如何写xml文件,如下:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC

    "-//Apache Struts//XWork Validator 1.0.3//EN"

    "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">  

<validators>

   <field name="name">

                    <field-validator type="requiredstring">

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

                    </field-validator>

                    <field-validator type="stringlength">

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

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

                        <message>长度必须3-6位之间!</message>

                    </field-validator>

                </field>

              <field name="gender">

                    <field-validator type="requiredstring">

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

                    </field-validator>

                </field> 

                <field name="phone">

                    <field-validator type="requiredstring">

                        <message>电话不能为空!</message> 

                    </field-validator>

                </field>

                <field name="qq">

                    <field-validator type="requiredstring">

                        <message>QQ不能为空!</message> 

                    </field-validator>

                </field>

                <field name="email">

                    <field-validator type="requiredstring">

                        <message>email不能为空!</message> 

                    </field-validator>

                    <field-validator type="email">

                        <message>邮箱格式不正确!</message> 

                    </field-validator>

                </field>

                <field name="address">

                    <field-validator type="requiredstring">

                        <message>地址不能为空!</message> 

                    </field-validator>

                </field>          

</validators>   
struts内置了很多常用的验证拦截器,  <field-validator type="">type的类型可以写什么可以参照一下代码,

 <validators>

                    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>

                    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>

                    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>

                    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>

                    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>

                    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>

                    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>

                    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>

                    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>

                    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>

                    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>

                    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>

                    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>

                    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>

                    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>

                    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>

                </validators>
-------------------------------------------------------------------------------------------------------------------------------
2)模型驱动:使用模型驱动是为了简化表单中每个表单项的name属性值,我们都知道如果想要用action中定义的bean来封装表单信息,则表单中的每个表单项的name属性值必须为 action中beanName.bean对应的属性 即如果是Person person =new Person()来封装表单,则名字必须为person.name/person.gender这样比较麻烦,也可能对美工人员造成不便。使用驱
4000
动模型后则可以直接使用属性名即可.
       a,action实现ModelDriven<T>接口,传入实体对象如,ModelDriven<Person>实现一个方法:
public T getModel() ,返回一个实体对象,值得注意的是必须要new 出实体对象,在之前的封装中我们只要声明一个属性变量即可,但是现在必须要new出其实例,以便getModel() 调用。
-------------------------------------------------------------------------------------------------------------------------------------
               3)防表单重复提交,同样使用Struts内置的拦截器token来完成功能。
                     a,在Struts的默认拦截器中没有防表单重复提交功能,我们需要在action节点下注册一个,代码如下:
                        <interceptor-ref name="defaultStack" />

                        <!-- 增加令牌拦截器 -->

                         <interceptor-ref name="token">

                        <!-- 哪些方法被令牌拦截器拦截 -->

                        <param name="includeMethods">insert</param>

                        </interceptor-ref>
                    param中可以指定另一个值excludeMethods即指定除了哪些方法都执行拦截器,             includeMethods指定为哪些方法执行拦截器
                     b,配置一个错误视图,即拦截到重复提交后跳转到那个页面:
                      <!-- 当用户重复提交表单的时候,struts2会自动转到此错误页面 -->

                      <result name="invalid.token">/WEB-INF/jsp/message.jsp</result>
                       但是这里有个疑问:转到某个页面后我们如何设置提示信息给用户呢?一切验证都是struts内部完成,我们怎么知道什么时候用户重复提交了呢?希望大神指点
-------------------------------------------------------------------------------------------------------------------------------------
                     4)数据回显,很多地方都需要用到数据回显,比如编辑页面,或者是验证的时候验证失败,之前的数据回显是通过将数据存放到域中然后再每个表单项中设置value相对比较麻烦.。struts的回显则相对比较简单,但必须使用struts的控件。

                       a,在跳转到比如编辑页面或者提交页面的方法中加上如下代码:
                       //到到值栈
                       ValueStack vs = ActionContext.getContext().getValueStack();
                       //清空栈顶元素,避免不必要的回显数据

                       vs.pop();
                       //压栈,cus即用来封装数据的实体。

                       vs.push(cus);
 
                       数据回显功能比较强大,如之前比较烦躁的radio或者select等控件同样不需要特殊处理,处理方式和其他控件一致,但是必须使用struts的控件。struts的控件radio和select等控件和html控件差别很大,其他控件则大同小异。例如
                      <s:radio name="gender"  id="gender" list="#{'男':'男','女':'女'}"></s:radio>
                       使用map的形式给radio赋值,list项必须填,客户端生成 的html代码显示为map的value,值即为map的key  
                       <s:select list="#session.departlist" listKey="id" listValue="dname" name="depart"
></s:select>      
                        下拉框的值来自session域中的Bean集合,需要指定每一项显示的值listValue和每一项真正的值listKey都是Bean的属性
-------------------------------------------------------------------------------------------------------------------------------------
  学完struts后,感觉是方便了不少,但是有些困惑,java和.net相比,运行效率不才是java的优势吗?明显感觉到使用struts框架和控件后运行速度慢了不少,如果只是效率来讲的话.net那套控件使用起来更方便。。。。。。。

转自:http://708990141.iteye.com/blog/2111648

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2 数据回显