`

[原]Struts2输入校验

阅读更多

[标题]:[原]Struts2输入校验
[时间]:2009-7-26
[摘要]:替换struts默认的类型转换错误信息、给Struts标签指定主题、使用自定义业务方法和验证方法。
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,输入校验,validate,validation
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
1、知识点
a.validate()中添加验证错误信息
    当校验出错时,可以向客户端输出两种类型的Error:
    addFiledError() //可以用<s:filederror />显示,也可以直接由Struts输入标签自动显示。
    addActionError() //用<s:actionerror />显示。

b.替换struts默认的类型转换错误信息
    例如:如果为int型的age输入字母,将出现类型转换错误信息:Invalid field value for field "age"。

    这个信息是由Struts自动提供的,可以使用全局或局部配置文件对其进行替换。
    a).替换struts默认的类型转换错误信息的全局配置:
    在struts.xml中增加constant,指明全局配置文件的名称为"message":
    <struts>
        <constant name="struts.custom.i18n.resources " value="message">
        </constant>
    </struts>

    在struts.xml相同目录下新建message.properties,message.properties内容可使用中文,但需要JDK的native2ascii进行转换。内容如下({0}代表出现错误的字段):
    xwork.default.invalid.fieldvalue ={0} error

    b).替换struts默认的类型转换错误信息的局部配置:
    在RegisterAction.java相同目录下新建RegisterAction.properties("\u5E74\u9F84\u8F6C\u6362\u9519\u8BEF" = "年龄转换错误"):
    invalid.fieldvalue.age =\u5E74\u9F84\u8F6C\u6362\u9519\u8BEF

c.给Struts标签指定主题
    <s:textfield name="name" label="name" theme="simple" >
    指定simple主题,则Struts不生成table等布局。
    同时,不会显示label,也不会显示field errror。
    但与HTML input不同的是,可以保存提交失败后的值。

d.指定自定义业务方法register()替代execute()
    在struts.xml中配置:
    <action name="register"
                class="wintys.struts2.validation.RegisterAction"
                method="register" >
    并在类RegisterAction中添加方法register(),与execute()签名相同:
    public String register()throws Exception{
        System.out.println("register()...");
        
        return SUCCESS;
    }

e.使用自定义验证方法validateRegister()
    在类RegisterAction中添加方法validateRegister(),与validate()签名相同:
    public void validateRegister(){
        System.out.println("validateRegister()...");
    }

    validateRegister()并不替换validate(),而是先于validate()执行。Struts从struts.xml中的配置得知register(),而使用反射寻找validateRegister()。如果有validateRegister(),则执行之。然后再执行validate()。执行流程:validateRegister() => validate() => register()。

f.最佳实践
    给默认execute()指定另一个validateExecute(),而不重写validate()。不把所有验证写在validate()中,则可以根据需要执行个性化验证。

2、详细代码
/StrutsHelloWorld/WebRoot/validation/input.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>struts validation</title>

  </head>
 
  <body>
      <s:actionerror cssStyle="color:red"/>
      <s:fielderror></s:fielderror>
    <s:form name="register" action="register"  theme="simple">
        用户名:<s:textfield name="name" label="用户名"></s:textfield><br/>
        密码:<s:textfield name="age" label="年龄"></s:textfield><br/>
        <s:submit value=" 确定 "></s:submit> <br/>
    </s:form>
  </body>
</html>



/StrutsHelloWorld/WebRoot/validation/output.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
 
  <body>

      <s:property value="name"/><br/>
      <s:property value="age"/><br/>
      
  </body>
</html>



/StrutsHelloWorld/src/wintys/struts2/validation/RegisterAction.java:

package wintys.struts2.validation;

import com.opensymphony.xwork2.ActionSupport;

/**
 *
 * @author Winty (wintys@gmail.com)
 * @version 2009-07-26
 * http://www.blogjava.net/wintys
 */
@SuppressWarnings("serial")
public class RegisterAction extends ActionSupport {
    private String name;
    private int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
    @Override
    public void validate() {
        System.out.println("validate()...");
        //Action Error
        if(name == null || name.length() < 6 || name.length()>10){
            addActionError("invalid name");
        }
        
        //Filed Error
        if(age <= 0 || age > 150){
            addFieldError("age", "invalid age");
        }
    }
    
    @Override
    public String execute() throws Exception {
        System.out.println("execute()...");
        
        return SUCCESS;
    }
    
    /**
     * 自定义验证方法,用于验证register()。
     *
     * 如果客户端请求的action name="register" ,
     * 该验证会自动执行。
     */
    public void validateRegister(){
        System.out.println("validateRegister()...");
    }
    
    /**
     *     自定义method,代替execute(),
     * 则最终只运行register() , 而不运行execute()。
     *
     * 需在struts.xml中配置:method="register"
     * <action  name="register"
     *                 class="wintys.struts2.validation.RegisterAction"
     *                 method="register">
     */
    public String register()throws Exception{
        System.out.println("register()...");
        
        return SUCCESS;
    }
}



/StrutsHelloWorld/src/wintys/struts2/validation/RegisterAction.properties:

invalid.fieldvalue.age=\u5E74\u9F84\u8F6C\u6362\u9519\u8BEF



/StrutsHelloWorld/src/struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <!-- 定义全局错误信息资源文件message.properties -->
    <constant name="struts.custom.i18n.resources" value="message"></constant>
    
    <package name="MyStruts" extends="struts-default">
        <action name="register" class="wintys.struts2.validation.RegisterAction" method="register">
            <result name="success">/validation/output.jsp</result>
            <result name="input">/validation/input.jsp</result>
        </action>
    </package>
</struts>



/StrutsHelloWorld/src/message.properties:

#chinese characters needs conversion by "native2ascii"
xwork.default.invalid.fieldvalue={0} error.


[参考资料]:
    《浪曦视频之Struts2应用开发系列》
[附件]:
    源代码:  struts_StrutsValidation.zip

分享到:
评论

相关推荐

    Struts2 用户输入校验教程

    基于Struts2框架的用户输入校验的完整讲解!是我的原创! 非常感谢大家提出宝贵意见

    Java Web程序设计教程

    6.3.3应用struts2输入校验框架 128 6.3.4自定义校验器 130 6.4国际化 131 6.4.1国际化实现原理 131 6.4.2准备国际化资源文件 131 6.4.3调用国际化资源文件 134 6.5上传和下载 135 6.5.1文件上传的实现原理 ...

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...

    java web开发技术大全

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...

    ARCH4系统开发指南

    2.28.2 Struts2校验框架应用 71 2.28.2.1 校验配置文件 71 2.28.2.2 角色Insert页面示例 71 2.28.2.3 用户Query页面示例 73 2.28.2.4 多行输入域校验 75 2.29 多语言管理 77 2.29.1 定义输入域的name属性和资源文件 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...

    Spring-Reference_zh_CN(Spring中文参考手册)

    15.4. Struts 15.4.1. ContextLoaderPlugin 15.4.1.1. DelegatingRequestProcessor 15.4.1.2. DelegatingActionProxy 15.4.2. ActionSupport 类 15.5. Tapestry 15.5.1. 注入 Spring 托管的 beans 15.5.1.1. 将 ...

    Java 面试宝典

    2、Java 有没有 goto? ....................................................................................................... 8 3、说说&和&&的区别。 ......................................................

Global site tag (gtag.js) - Google Analytics