Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1199152
  • 博文数量: 89
  • 博客积分: 10546
  • 博客等级: 上将
  • 技术积分: 1510
  • 用 户 组: 普通用户
  • 注册时间: 2004-10-16 01:24
文章分类

全部博文(89)

文章存档

2012年(7)

2011年(4)

2010年(5)

2009年(52)

2008年(21)

分类: Java

2009-03-16 18:16:12

处理表单

当你提交一个表单时,Stripes 会进行以下处理。

  • 首先会检查要求必填 (required) 的字段是否已经填充。
  • 如果必填字段没有出现错误,则执行下面步骤。
    1. 执行最小/最大长度检测和模式匹配验证。
    2. 如果上一步没有错误出现,将字段值转换成相应的类型,并绑定到 ActionBean 的属性上。
    3. 如果类型转换过程没有出现错误,执行最小值/最大值检测(针对数值型)。
  • 执行自定义的检测方法。

如果在验证和数据转换过程中出现错误,默认情况下 Stripes 会返回原页面,所有数据都会重新填充到表单中,并可以在页面显示错误信息。

用户注册程序

为了节省时间你可以复制一份helloworld项目。在 NetBeans 中,直接在项目结点,右键点击“Copy”,输入新项目名称 registration 。

在这个项目中,将会创建一个resgiter.jsp 页面,一个打印结果的页面 success.jsp和一个注册处理的ActionBean

创建 register.jsp 页面。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="stripes" uri="" %>
"">




Registeration Page


User Registeration




Username:

Password:

Confirm Password:

Email:







创建一个 ActionBean ,名为 RegisterActionBean

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tutorial.action;

import net.sourceforge.stripes.action.ForwardResolution;
import net.sourceforge.stripes.action.Resolution;

/**
*
* @author hantsy
*/
public class RegisterationActionBean extends BaseActionBean {

private String username;
private String password;
private String email;
private String confirmPassword;

public String getConfirmPassword() {
return confirmPassword;
}

public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public Resolution register() {
return new ForwardResolution("/success.jsp");
}
}

创建一个结果页面 success.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
"">




Registeration Result Page


Registered Successfully!


Your username is ${actionBean.username}.




在服务器上运行这个程序,体验一下流程。但是这个程序对输入信息没有作任何限制。下面我们会一步步的完善这个程序。

添加 required 约束

在 RegisterActionBean 要求输入字段上加 @Validate(required=true)

	@Validate(required=true)
private String username;

@Validate(required=true)
private String password;

@Validate(required=true)
private String email;

@Validate(required=true)
private String confirmPassword;

如果验证出错,Stripes 会默认返回原页面,即 register.jsp

register.jsp 页面添加以下代码片断。

		

User Registeration



Stripes 包中复制一份 StripesResources.properties 到项目的源代码目录下。

运行程序,看看验证是否生效。浏览地址 ,不输入任何字段,直接提交表单。如果你看到下面信息,那么验证已经生效。

Please fix the following errors:

1. Confirm Password is a required field
2. Email is a required field
3. Password is a required field
4. Username is a required field

其它输入控制

对于输入的信息,还可以添加字符长度范围,及字符匹配条件。如 username,password 要求输入6-20位字符,并且必须是数字或者字母。

RegisterActionBeanusernamepassword上的Annotation 作出一点修改。

 	@Validate(required = true, minlength = 6, maxlength = 20)
private String username;
@Validate(required = true, minlength = 6, maxlength = 20)
private String password;

重新运行程序,在 username 和 password 输入的字符如果不够6位,提交后你会看到如下错误信息。

Please fix the following errors:

1. Password must be at least 6 characters long
2. Username must be at least 6 characters long

这时你没有限制输入字符类型,可以借助正则表达式来完成。

 	@Validate(required = true,  mask = "[0-9a-zA-Z]{6,20}")
private String username;

这里限制 username 只能是字母或数字,并且长度是6到20。

重新运行程序,当 username 输入不符合要求。会看到类似下面的错误信息。

		Please fix the following errors:

1. test is not a valid Username

数据类型转换

在输入数据正式绑定 ActionBean 之前,需要将它们转换成相应的类型。

Stripes 内置了多个 TypeConverter。对于基本的数据类型,如byte,int,float,double,long,boolean 及其包装类 Byte,Integer,Float,Double,Long,Boolean 及 BigDecimal,BigInteger 都能自动转换成相应的类型。Date, Enum 等也有相应的 TypeConverterDateTypeConverterEnumeratedTypeConverter

Email 地址合法性检测常常被认为应该属于 validation 范围,Stripes 利用 TypeConverter 来检测其合法性,显得有些牵强。Stripes 提供了一个 EmailTypeConverter ,实际它就是利用 JavaMail 的 API 检测地址的合法性。

Stripes 还提供另外两个其它框架少有 TypeConverterPercentageTypeConverter 可以将百分比转换成实数。OneToManyTypeConverter 将字符串按分隔符转换成一个List。

修改 RegiterActionBean , 在 email字段上的Validate Annotation 中使用 EmailTypeConverter 。另外追回两个字段,一个 java.util.Date 类型的 birthDate ,另一个 boolean 类型的 subscriptionEnabled

	@Validate(required = true, converter=EmailTypeConverter.class)
private String email;

@Validate(converter=DateTypeConverter.class)
Date birthDate;

@Validate(converter=BooleanTypeConverter.class)
boolean subscriptionEnabled;

页面 register.jsp的修改。

Birth Date:

Would like receive our product infomation by email?

If you would like, check on please. It is free.

StripesResources.properties中定义 Date 的格式。

stripes.dateTypeConverter.formatStrings=yyyy MM dd		

自定义验证方法

在表单输入数据转换完成后,就绑定到 ActionBean 的对应的字段上。

在这个程序中,还有其它需要验证的地方。如,两次密码一致性,注册用户名的唯一性。

    @Validate(required = true, expression="this eq password")
private String confirmPassword;

一些验证需要与后台数据进行对比,比如检测用户名的唯一性。Stripes 提供了自定义的方法进行验证。

  @ValidationMethod(on="register")
public void userExsited(ValidationErrors errors) {
if("testuser".equals(username)){
errors.add("username", new SimpleError("This username is taken , please select a different one."));
}
}

重新运行这个程序,检测验证是否生效。

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