Chinaunix首页 | 论坛 | 博客
  • 博客访问: 771097
  • 博文数量: 140
  • 博客积分: 10288
  • 博客等级: 上将
  • 技术积分: 2895
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-03 13:19
文章分类

全部博文(140)

文章存档

2009年(50)

2008年(90)

我的朋友

分类: Java

2008-05-07 08:08:51

在上面实现LogonForm的时候你或许已经注意到,IDE最初生成的代码中有一个validate方法。通过实现这个方法我们可以对页面的表单作输入控制,这是最基本的通过编码手动进行表单验证的一种方法。

手动验证

1.IDEProjects窗口选择MyApp项目,展开Source Packages,打开LogonForm

2.IDE菜单Source中,选择Override Methods,从弹出框中选择validate()方法。

3.填充validate方法。

public ActionErrors validate(ActionMapping mapping,

HttpServletRequest request) {

ActionErrors errors = new ActionErrors();

if (getUsername() == null || getUsername().length() < 1) {

errors.add("name",

new ActionMessage("error.username.required"));

// TODO: add 'error.username.required' key to your resources

}

return errors;

}

4.Source Package下的messages.properties文件中添加错误信息提示。

error.username.required=Username is required.



5.在登录页面logon.jsp添加错误显示代码,在表单之前添加以下代码。

message="false"

header="errors.header"

footer="errors.footer">



  • 6.运行项目测试效果,保留username为空,提交表单。

    我们也可以在Action中实现输入验证。

    1.打开LogonAction类,添加以下代码。

    ActionMessages errors=new ActionMessages();

    if(!”test”.equals(username)&&!”test”.equals(password))){

    System.out.println("authication failed!");

    errors.add(ActionMessages.GLOBAL_MESSAGE,

    new ActionMessage("error.authenticated.failed"));

    saveErrors(request,errors);

    return mapping.getInputForward();

    }

      这里是验证用户人合法性,还没有逻辑实现,先不必理会。

      2.同样,在messages.properties中添加错误信息提示定义。

    error.authenticated.failed=Logon failed.

    3.重新运行项目进行测试。

    在实际项目中,与后台逻辑相关的验证,如上面账号的合法性,要通过数据库访问才能进行校验,这时一般采用手动编码的方法进行验证。而一般性的输入校验采用Struts的验证框架更为方便一些。

    使用Struts验证框架



    这里我们通过一个用户注册功能来展示如何使用Struts的验证框架。

    1.创建一个注册页面register.jsp文件,包含几个最基本的输入字段,除了登录时用到的usernamepassword之外,还需要一个confirmPassword来验证两次密码输入是否一致,另外再添加一个email字段。将文件body的部分改成如下。

    Registeration Page

    message="false"

    header="errors.header"

    footer="errors.footer">

  • 2.创建对应的UserForm类,注意,这里我们选择继承ValidatorForm类。

    public class UserForm extends ValidatorForm {}

    同样,清除文件内容,添加几个字段,usernamepasswordconfirmPasswordemail。使用IDE自动生成settergetter方法。

    3.创建RegisterAction,处理注册请求。在Struts Action 创建向导框,指定path/register,在ActionForm参数设置中,使用刚刚创建的register.jsp作为输入页面,使用上面的UserForm作为ActionForm Bean

    public ActionForward execute(ActionMapping mapping, ActionForm form,

    HttpServletRequest request, HttpServletResponse response)

    throws Exception {

    UserForm registerationForm=(UserForm)form;

    ActionMessages errors=new ActionMessages();

    String username=registerationForm.getUsername();

    String password =registerationForm.getPassword();

    String confirmPasswod=registerationForm.getConfirmPassword();

    String email=registerationForm.getEmail();

    if(”test”.equals(username)){

    errors.add(ActionMessages.GLOBAL_MESSAGE,

    new ActionMessage("error.register.failed"));

    saveErrors(request,errors);

    return mapping.getInputForward();

    }

    request.setAttribute("username",username);

    request.setAttribute("password",password);

    return mapping.findForward(SUCCESS);

    }

    4.添加一个注册成功页面registerSuccess.jsp,打印注册内容。

    Registeration Successfully...

    Thank you for registeration ,

    , your password is :

    Logon Now...



    打开Struts配置文件struts-config.xml,在刚刚创建的RegisterAction定义中添加一个forward定义。

    一个注册过程所需要的文件已经创建好了,现在集中如何使用验证框架。

    5.展开Configuration Files,打开validation.xml文件。

    formset之间添加自己的应用规则。

    property="username"

    depends="required,minlength,maxlength,mask">

    mask

    ^[0-9a-zA-Z]*$

    minlength

    3

    maxlength

    20

    property="password"

    depends="required,minlength,maxlength,mask">

    mask

    ^[0-9a-zA-Z]*$

    minlength

    3

    maxlength

    20

    depends="required">

    depends属性中指定要使用的规则,requiredemailminlengthmaxlength都是内置的验证规则。arg0arg1指定了对应的错误提示信息中参数值。它可以在messages.properties文件中定义,也可以在validation.xml直接指定,如上面的minlength直接在下面进行定义。


    minlength

    3



      6.messages.properties中进行定义上面文件中所用到提示信息。

    error.register.failed=Registeration failed.

    label.userForm.username=Username

    label.userForm.password=Password

    label.userForm.confirmPassword=Confirm Password

    label.userForm.email=Email

    7.重新运行项目进行测试。

    这里简要的看一下,使用Struts验证框架的一些必要条件。

    首先,打开Struts配置struts-config.xml文件,在文件plugin部分声明了使用ValidatorPlugin

    property="pathnames"

    value="/WEB-INF/validator-rules.xml,

    /WEB-INF/validation.xml"/>

    其次,页面使用的ActionForm类必须继承ValidatorForm

    还有,就是对应的Action定义中必须指定属性validate=”true”(默认),如果指定了值为false,验证失效。

    这些细节几乎都是IDE自动完成的。

    复用ActionForm



    在上一节中,我们可以看到LogonForm与注册使用UserForm的字段完全重复,很自然的想到,如果用UserForm来代替LogonForm,这样就省下了一个ActionForm类文件。

    1.Struts配置文件struts-config中,在path/logonAction中使用UserForm

    name="UserForm"

    path="/logon"

    scope="session"

    type="com.myapp.web.LogonAction"/>



    2.修改LogonAction中的相关代码,使用UserForm代替原来的LogonForm

    UserForm logonForm=(UserForm)form;



    3.运行项目进行测试登录。

    结果并不像所想像的那样,问题出现了。提交表单后,会返回错误信息,要求你输入confirmPasswordemail两个字段,而在登录页面的表单中,我们并不需要使用这两个字段。

    Struts提供了ValidatorActionForm,可以优雅的解决这个问题。

    1.打开UserForm,让UserForm继承ValidatorActionForm

    public class UserForm extends ValidatorActionForm {}

    2.打开validation.xml文件,把formname属性改成使用Action path作为识别标志,这里,将其中的UserForm改成/register

    另外,再定义一个针对Action path/logon的验证。

    property="username"

    depends="required">

    property="password"

    depends="required">

    3.再次运行项目,一切正常了。

    使用客户端验证



    实际应用中,输入验证使用Javascript在客户端完成,与业务相关的验证在服务器端进行(常常是需要访问数据库的情况),下面我们使用客户端验证用户输入,以register.jsp为例说明。

    1.register.jsp文件的末尾添加以下代码。

    dynamicJavascript="true"

    staticJavascript="true"/>

    2.标签中添加onsubmit事件,表示在提交表单时进验证。



    3.在将验证配置文件validation.xml中的“/register”还原成“UserForm”



    4.运行项目,进行测试。

    从上面可以看到,使用客户端验证时要在中指定formName,它必须与struts-config.xml文件中form定义名称一致。onsubmit事件中的返回语句的规则是validate+Form名称。

    美中不足的是,我们打开运行的register.jsp页面的源代码,可以看到,页面生成了大量的javascript代码,包括公共的和页面私有的。其实可以将公共的javascript放到一个公共的页面中供所有的页面使用。

    1.register.jsp页面中的部分代码替换成如下。

    dynamicJavascript="true"

    staticJavascript="false"/>

    阅读(954) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~