用登陆演示

Model-Driven(模型驱动)

、配置表单验证


本文主要在上一个视频(webwork初体验)的基本进行改动,所以在看本文之前,请先浏览上一个视频。


在 webwork 中 Action 根据 Form 的不同可分为二类:


一种是 Field-Driven (字段驱动) Action ;就是 Action 用自己的字段来充当 Form 的角色,上一个视频给大家演示的例子就是采用了这种方式。本人感觉有点像 struts 中的动态 Form 。


当然这只是我自己的一些看法。还有一种是 Model-Driven (模型驱动) Action 。它很像 Struts 的 Form, 但在 struts 中 Form 必须继承 org.apache.struts.action.ActionForm; 或是 org.apache.struts.validator 包下的几个 Form. 在 WebWork 中有所不同,只要普通 JavaBean 就可以充当模型部分 。只要我们在 Action 中实现 com.opensymphony.xwork. ModelDriven 接口就可以了,它有一个方法: Object getModel(); ,这个方法用于返回模型对象。


我们改动上个视频的 LoginAction 类。代码如下:

java 代码




1. package
2. import
3. import
4. import
5. import
6. public class LoginAction implements Action,ModelDriven
7. //注意这里的User一定要初始化 
8. private User user=new
9.    
10. public
11. return
12.     }    
13. public String execute() throws
14. if(user.getUserName().equals("lyx")){    
15. return this.SUCCESS;    
16. else{    
17. return this.ERROR;    
18.         }    
19.     }    
20.    public Object getModel() {
21. // TODO Auto-generated method stub 
22. return
23.     }   
24.    
25. }


红色字体部是我们后加部分。


然后我们就可以将 index.jsp 页面的代码修改如下:

< 
 form  
 action 
 = 
 "login.action" 
 >
 

    

 
username: 
 < 
 input  
 type 
 = 
 "text"  
 name 
 = 
 "userName" 
 />
 
password: 
 < 
 input  
 type 
 = 
 "password"  
 name 
 = 
 "userPwd" 
 />
 
< 
 input  
 type 
 = 
 "submit"  
 value 
 = 
 "login" 
 />
 
form>
 
也就是我们去掉了原有的表达式语言。
 

   xml 代码 
 
 
  
  
1. >
2. <xwork>
3. <include file="webwork-default.xml" />
4. <package name="default" extends="webwork-default">
5. <action name="login" class="com.lyx.web.action.LoginAction">
6. 
7. <result name="success" type="dispatcher">
8. <param name="location">/success.jspparam>
9. result>
10. 
11. <result name="error" type="dispatcher">
12. <param name="location">/error.jspparam>
13. result>
14. <interceptor-ref name="model-driven"/>
15. <interceptor-ref name="params"/>
16. action>
17. package>
18. xwork>

也就是在原有的基础上加了一行模型驱动的拦截器。作用就是将模型对象保存到值堆栈中。


这里要注意, model-driven 拦截器要在 params 的上面。可以测试一下看看。


整过过程,非常像struts中,Action与ActionForm的关系。


通过测试,功能和以前的一样。很简单吧。就不在多述了。


第二个重点我们来配置一个表单的验证:


在 src 目录下新建 validators.xml 文件,文件内容如下:

xml 代码




    1. <validators>
    2. <validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
    3. <validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
    4. <validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
    5. <validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
    6. <validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
    7. <validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
    8. <validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
    9. <validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
    10. <validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
    11. <validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
    12. <validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
    13. validators>


    这个文件可以在网上下得到。也可以在 webwork 的源码中得到。不是不想起了 struts 中有个 valiator-rules.xml 文件。这个文件在 struts 中是描述着验证的规则,里面有好多已经写好了的验证,我们可以很方便的调用。这里的这个文件功能和 struts 中的类似。


       要启动表单验证 , 需要增加一个拦截器 , 还有就是我们在 struts 的 struts-config.xml 配置文件中Action的配置有个input属性,它是用来当验证失败时所在跳到的页,在这里如果登陆失败我们应该跳到index页,显示失败的原因,重新登陆。在webwork中我们也用input来描述这个功能。在一个result.


    对 xwork.xml 文件进行修改 , 增加 < interceptor-ref name = " validationWorkflowStack " />


    修改后 xwork.xml 代码如下:

    xml 代码




      1. <include file="webwork-default.xml" />
      2. <package name="default" extends="webwork-default">
      3. <action name="login" class="com.lyx.web.action.LoginAction">
      4. 
      5. <result name="success" type="dispatcher">
      6. <param name="location">/success.jspparam>
      7. result>
      8. 
      9. <result name="error" type="dispatcher">
      10. <param name="location">/error.jspparam>
      11. result>
      12. <result name="input" type="dispatcher">
      13. <param name="location">/index.jspparam>
      14. result>
      15.                 
      16. <interceptor-ref name="model-driven"/>
      17. <interceptor-ref name="params"/>
      18. <interceptor-ref name="validationWorkflowStack" />
      19. action>
      20. package>


      我们已经用到了 success ,他指成功所要跳到的页。 Error 是错误所要跳到的页。 Input 是指失败时所要返回来登陆的页。在 webwork 中还有几个。以后我们会看得到,用到的时候在详细讲解。


         建立验证规则


       


            对 LoginAction 进行验证规则的配置 , 需要新建一个配置文件 , 文件名起名是以 Action 的名称开头以 validation 结尾,中间用 ” - ” 隔开.xml 并保存到 LoginAction.java 文件所在的目录中


              


       LoginAction-validation.xml

      xml 代码




      >    <validators>       <field name="userName">           <field-validator type="requiredstring">               <message>username is required!message>         field-validator>     field>     <field name="userPwd">           <field-validator type="requiredstring">               <message> password is required!message>         field-validator>     field> validators>



      这个文件很像 struts 中的 validation.xml 。功能和他是一样的。配置表单的验证。这里我们只验证也用户名和密码为必须填写。注意:这个 name 的属性一定要和 User 类中的对应。规则是和 struts 中一样的。对应才能有交的验证。


      为了能显示验证的信息再次修改 index 页面如下:

      < 
       ww:form  
       action 
       = 
       "login.action"  
       method 
       = 
       "POST" 
       >
       
               username:    
       < 
       ww:textfield  
       label 
       = 
       "Username"  
       name 
       = 
       "userName"  
       required 
       = 
       "true" 
       />
       
                password:  
       < 
       ww:password  
       label 
       = 
       "Password"  
       name 
       = 
       "userPwd"  
       required 
       = 
       "true" 
       />
       
                   
       < 
       ww:submit  
       value 
       = 
       "Submit" 
       />
       
            
       ww:form>

      这几行很简单,从字面上就可以看出,就不在多述了。


      基本代码就这些,测试一下,看看吧。


      哦,没有验证,还忘了一步,回头看看