`
一日一博
  • 浏览: 229899 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2的服务器端的四种输入校验方式

阅读更多
Struts2的服务器端验证框架有四种方式校验,一种是利用dojo插件使用ajax实现页面无刷新的校验,一种是调用验证框架即配置一个xml文件的形式,另一种是在Action中的validate()方法手动校验,还有一种是零配置里面用annotation的形式校验。

如果要使用Struts2的验证框架,首先要开启这个拦截器。在文档中是这样介绍的:
默认的拦截器堆栈defaultStack已经在开启验证。在创建自己的interceptor-stack时一定要包括validation和workflow拦截器。

<interceptor-stack name="defaultStack">
   ...
   <interceptor-ref name="validation">
      <param name="excludeMethods">input,back,cancel,browse</param>
   </interceptor-ref>
   <interceptor-ref name="workflow">
      <param name="excludeMethods">input,back,cancel,browse</param>
   </interceptor-ref>
</interceptor-stack>


1.加上dojo plugin这个jar包使用struts2的ajax校验。
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <message>You must enter a name</message>
        </field-validator>
    </field>
    <field name="age">
        <field-validator type="int">
            <param name="min">13</param>
            <param name="max">19</param>
            <message>Only people ages 13 to 19 may take this quiz</message>
        </field-validator>
    </field>
</validators>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
	
<struts>
    <package>
         <action name="quizAjax" class="org.apache.struts2.showcase.validation.QuizAction">
             <interceptor-ref name="jsonValidationWorkflowStack"/>
             <result name="input">quiz-ajax.jsp</result>
             <result>quiz-success.jsp</result>
         </action>
    </package>
......

<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<html>
<head>
    <title>Validation - AJAX</title>
    <sx:head />
</head>
<s:url id="url" namespace="/validation" action="quizAjax"/>
<body>
<s:form method="post" theme="xhtml" namespace="/nodecorate" action="quizAjax" id="form">
    <s:textfield label="Name" name="name" />
    <s:textfield label="Age" name="age" />
    <s:textfield label="Favorite color" name="answer"/>
    <sx:submit validate="true" />
</s:form>

需要注意的:
1.<sx:head /> must be in the page, to be able to use AJAX functionality.
2.The form tag does not have validate set to true, which would perform client validation before the AJAX validation.
3.The submit tag must have validate set to true in order to perform AJAX validation.
4.如果action实现了ModelDrive接口。返回的JSON数据里的"model."将从字段名称被切割。如果验证成功,讲返回空JSON字符串。


2.在Action中实现手动校验:
如果我们重写了validate方法,则该方法会应用于此Action中的所有提供服务的业务方法。例如某个Action中有一个login()业务方法,我们可以写一个validateLogin()方法来进行login()的特殊校验,那么Action里执行方法的顺序就是:
validateLogin()------->validate()------->login()
在validateXXX方法里可以用addFiledError()讲相应的错误信息保存到fieldError中并返回input视图用<s:if test="hasFieldErrors()"><s;filederror/><s;if/>来展示。


3.在xml文件里面配置:

当一个Action中有多个业务方法时,我们可能需要对其中的某个方法配置单独的校验规则,比如注册时的要求用户两次输入的密码必须相同等,这时我们可以配置一个单独的校验文件,命名规则为:<actionName>-<methodName>-validation.xml,可以看到这里多了一个方法名,这个方法名就是要校验的业务逻辑在struts.xml配置文件中配置的name,这个文件也要同Action放在同一个目录下。注意这个方法名不是指的Action里面的方法名,而是action请求的name
当有多个校验文件时:
例如有一个LoginAction继承BaseAction,这两个Action中都有业务方法login,并且存在4份校验规则文件如下:BaseAction-vadition.xml, BaseAction-login-validation.xml , LoginAction-validation.xml, LoginAction-login-validation.xml那么用户访问LoginAction的login方法里,会按照以上的顺序执行校验规则,实际的校验规则是以上四个校验规则的总和,但是如果存在冲突的情况下,后面的校验规则优先。



4.用注解配置:

<interceptor-ref name="validation">
    <param name="validateAnnotatedMethodOnly">true</param>
    <param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>


An Annotated Interface
@Validation()
public interface AnnotationDataAware {

    void setBarObj(Bar b);

    Bar getBarObj();

    @RequiredFieldValidator(message = "You must enter a value for data.")
    @RequiredStringValidator(message = "You must enter a value for data.")
    void setData(String data);

    String getData();
}

An Annotated Class
@Validation()
public class SimpleAnnotationAction extends ActionSupport {

    @RequiredFieldValidator(type = ValidatorType.FIELD, message = "You must enter a value for bar.")
    @IntRangeFieldValidator(type = ValidatorType.FIELD, min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")
    public void setBar(int bar) {
        this.bar = bar;
    }

    public int getBar() {
        return bar;
    }

    @Validations(
            requiredFields =
                    {@RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "customfield", message = "You must enter a value for field.")},
            requiredStrings =
                    {@RequiredStringValidator(type = ValidatorType.SIMPLE, fieldName = "stringisrequired", message = "You must enter a value for string.")},
            emails =
                    { @EmailValidator(type = ValidatorType.SIMPLE, fieldName = "emailaddress", message = "You must enter a value for email.")},
            urls =
                    { @UrlValidator(type = ValidatorType.SIMPLE, fieldName = "hreflocation", message = "You must enter a value for email.")},
            stringLengthFields =
                    {@StringLengthFieldValidator(type = ValidatorType.SIMPLE, trim = true, minLength="10" , maxLength = "12", fieldName = "needstringlength", message = "You must enter a stringlength.")},
            intRangeFields =
                    { @IntRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "intfield", min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
            dateRangeFields =
                    {@DateRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "datefield", min = "-1", max = "99", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
            expressions = {
                @ExpressionValidator(expression = "foo > 1", message = "Foo must be greater than Bar 1. Foo = ${foo}, Bar = ${bar}."),
                @ExpressionValidator(expression = "foo > 2", message = "Foo must be greater than Bar 2. Foo = ${foo}, Bar = ${bar}."),
                @ExpressionValidator(expression = "foo > 3", message = "Foo must be greater than Bar 3. Foo = ${foo}, Bar = ${bar}."),
                @ExpressionValidator(expression = "foo > 4", message = "Foo must be greater than Bar 4. Foo = ${foo}, Bar = ${bar}."),
                @ExpressionValidator(expression = "foo > 5", message = "Foo must be greater than Bar 5. Foo = ${foo}, Bar = ${bar}.")
    }
    )
    public String execute() throws Exception {
        return SUCCESS;
    }
}
分享到:
评论

相关推荐

    Struts2的输入校验

    通过这种方式,开发者可以轻松地在Struts2中实现输入校验,既保证了数据的正确性,又提高了应用的安全性。不仅如此,Struts2的灵活性还允许开发者扩展和定制自己的校验器,以满足不同项目的需求。总的来说,Struts2...

    struts2实现服务器端校验示例

    在这个"struts2实现服务器端校验示例"中,我们将探讨如何在Struts2中实现高效的服务器端数据校验,并结合Dojo实现类似AJAX的实时验证。 首先,Struts2的校验框架是基于Action类的,每个Action类都可以关联一个或多...

    struts2输入校验

    在Struts2中,输入校验通常分为两种方式:客户端校验和服务器端校验。客户端校验主要通过JavaScript在用户端进行,可以提供即时反馈,但安全性较低,因为用户可以禁用JavaScript或绕过校验。服务器端校验则是在...

    Struts2 校验器

    在Struts2中,可以使用`&lt;s:fielderror&gt;`标签显示服务器端验证错误。 3. **配置校验规则**:Struts2的校验规则可以通过XML或注解方式定义。XML方式通常在struts.xml或相应的action类配置文件中定义,而注解方式则...

    Struts2 用户输入校验教程

    总结起来,Struts2的用户输入验证涉及客户端和服务器端两个层面,通过编程或配置两种方式实现。为了确保系统的健壮性,通常需要结合两者,提供多层防线。在编写验证代码时,应注重错误信息的友好性和安全性,以提供...

    Struts2的输入校验实例代码

    Struts2支持两种服务器端校验方式:代码校验和配置校验。 3. **代码校验**: 代码校验是通过编写Java代码来实现的。具体步骤如下: - **步骤一:封装数据**:将用户输入的值封装到Action类的属性中,如在`...

    基于struts2和DWR的Ajax输入校验实例

    总结一下,Struts2和DWR的集成为Ajax输入校验提供了一种高效的方法。Struts2负责处理业务逻辑和数据校验,而DWR则作为桥梁,实现了客户端与服务器端的实时通信。这种组合使用不仅可以确保数据的准确性,还能提升Web...

    浪曦_Struts2应用开发系列_第5讲.Struts2的输入校验.rar

    - Struts2提供了一种灵活且可扩展的方式来实现输入校验,包括在服务器端和客户端进行。 2. **服务器端校验** - 在Struts2中,服务器端校验通常使用Action类的属性注解或者基于XML的配置文件来完成。 - 使用注解...

    struts2 对action中的所有方法进行校验

    总的来说,Struts2提供了灵活且强大的数据校验机制,无论是在XML配置文件中定义,还是利用注解,甚至自定义校验逻辑,都能有效地保证Action中各个方法的输入数据合法,从而提高应用程序的稳定性和安全性。...

    struts2输入校验深入总结

    这篇博客"Struts2输入校验深入总结"可能详细介绍了Struts2框架中的验证机制,包括其工作原理、配置方式以及最佳实践。 在Struts2中,输入校验主要用于检查用户提交的数据是否符合预期格式,例如,检查电子邮件地址...

    struts2的自定义校验器例子

    在Struts2中,数据验证分为两种类型:客户端验证和服务器端验证。客户端验证通常通过JavaScript在用户浏览器中进行,而服务器端验证则在服务器上执行,确保即使禁用JavaScript也能保证数据安全。本示例主要关注...

    struts2笔记之校验表单信息

    本篇笔记将详细讲解Struts2中服务器端与客户端对表单数据的校验方式。 首先,Struts2提供了一系列内置的校验器,包括: 1. Irequired:检查字段是否为空,是必填项。 2. IIrequiredstring:验证字段是否为非空字符...

    Struts2登陆+输入验证+动态调用实例

    Struts2提供两种主要的输入验证方式:客户端验证和服务器端验证。 1. 客户端验证:通过JavaScript在用户提交表单前检查输入,可以提供实时反馈,但安全性较低,因为JavaScript可以被禁用或篡改。 2. 服务器端验证:...

    struts1的服务器端验证

    服务器端验证是Struts1框架的一个关键特性,用于确保用户输入的数据质量和安全性。在这个主题中,我们将深入探讨Struts1的服务器端验证机制,以及它如何处理线程安全问题。 服务器端验证的重要性在于,它可以防止...

    Struts2简单数据校验源码 20120417

    - Struts2还提供了与Dojo JavaScript库的集成,可以实现客户端的数据校验,增强用户体验,减少服务器端的压力。 8. **实际应用场景** - 数据校验在用户注册、订单处理、登录验证等场景下非常重要,防止非法数据...

    Struts2中的validation_多国语言版 国际化i18n+struts2数据校验.zip

    Struts2提供了一种灵活的机制来验证用户输入,通过在Action类中定义校验规则或使用XML配置文件。当用户提交表单时,框架会自动执行这些校验规则,并在验证失败时返回错误信息。这种校验可以在前端(浏览器)或后端...

    struts2实现登陆注册+服务器校验+上传下载+简单的留言讨论区+分页显示

    3. **服务器校验**:服务器端验证是确保用户输入数据有效性的关键步骤。Struts2提供了丰富的验证机制,如Validator插件和注解方式,可以在Action类或Model对象上定义验证规则,一旦数据不符合规则,会返回错误信息并...

Global site tag (gtag.js) - Google Analytics