分类: Java
2008-05-07 08:08:51
在上面实现LogonForm的时候你或许已经注意到,IDE最初生成的代码中有一个validate方法。通过实现这个方法我们可以对页面的表单作输入控制,这是最基本的通过编码手动进行表单验证的一种方法。
1.从IDE的Projects窗口选择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的验证框架。
1.创建一个注册页面register.jsp文件,包含几个最基本的输入字段,除了登录时用到的username,password之外,还需要一个confirmPassword来验证两次密码输入是否一致,另外再添加一个email字段。将文件body的部分改成如下。
Registeration Page
message="false" header="errors.header" footer="errors.footer">
2.创建对应的UserForm类,注意,这里我们选择继承ValidatorForm类。
public class UserForm extends ValidatorForm {}
同样,清除文件内容,添加几个字段,username, password, confirmPassword, email。使用IDE自动生成setter和getter方法。
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...
打开Struts配置文件struts-config.xml,在刚刚创建的RegisterAction定义中添加一个forward定义。
一个注册过程所需要的文件已经创建好了,现在集中如何使用验证框架。
5.展开Configuration Files,打开validation.xml文件。
在formset之间添加自己的应用规则。
property="username"
depends="required,minlength,maxlength,mask">
property="password"
depends="required,minlength,maxlength,mask">
depends="required">
在depends属性中指定要使用的规则,required,email,minlength,maxlength都是内置的验证规则。arg0,arg1指定了对应的错误提示信息中参数值。它可以在messages.properties文件中定义,也可以在validation.xml直接指定,如上面的
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自动完成的。
在上一节中,我们可以看到LogonForm与注册使用UserForm的字段完全重复,很自然的想到,如果用UserForm来代替LogonForm,这样就省下了一个ActionForm类文件。
1.在Struts配置文件struts-config中,在path为/logon的Action中使用UserForm。
name="UserForm"
path="/logon"
scope="session"
type="com.myapp.web.LogonAction"/>
2.修改LogonAction中的相关代码,使用UserForm代替原来的LogonForm。
UserForm logonForm=(UserForm)form;
3.运行项目进行测试登录。
结果并不像所想像的那样,问题出现了。提交表单后,会返回错误信息,要求你输入confirmPassword和email两个字段,而在登录页面的表单中,我们并不需要使用这两个字段。
Struts提供了ValidatorActionForm,可以优雅的解决这个问题。
1.打开UserForm,让UserForm继承ValidatorActionForm。
public class UserForm extends ValidatorActionForm {}
2.打开validation.xml文件,把form的name属性改成使用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.在
3.在将验证配置文件validation.xml中的“/register”还原成“UserForm”。
4.运行项目,进行测试。
从上面可以看到,使用客户端验证时要在
美中不足的是,我们打开运行的register.jsp页面的源代码,可以看到,页面生成了大量的javascript代码,包括公共的和页面私有的。其实可以将公共的javascript放到一个公共的页面中供所有的页面使用。
1.将register.jsp页面中的
dynamicJavascript="true"
staticJavascript="false"/>
src="
2.在web目录根目录下创建一个新文件staticJavascript.jsp,写入以下内容。
<%@ page language="java" %>
<%@ page contentType="application/x-javascript" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
3.运行项目,进行测试。