struts2:数据校验,通过Action中的validate()方法实现校验,图解

根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种。服务器端验证目前有两种方式:

第一种

Struts2中提供了一个com.opensymphony.xwork2.Validateable接口,此接口只有一个方法:validate()。如果有某个类实现了Validatable接口,Struts2就可以直接调用该类中的validate()方法。ActonSupport类实现Validateable接口。本文讨论此验证格式。

本文演示了一个模拟简单登录的场景:用户打开一个JSP页面,输入信息,提交登录。如果用户提交的信息格式有错误,则返回登录页面提示用户。数据格式正确则验证用户名与密码是否正确,登录成功则转向列表页面,显示当前用户的一些信息;如果登录错误则转向错误页面。

  • 将表单参数封装进一个JavaBean(属性驱动);
  • 如果用户输入信息有错误,直接返回提示用户再次输入;
  • 如果用户名,密码错误,转向错误页面;
  • 如果用户名、密码正确,则转向到另一个action类(并且传进一个id参数,用途自定),由此类处理进一步的业务逻辑,然后转向到显示列表的JSP页面。

第二种

参考:struts2:数据校验,通过XWork校验框架实现(validation.xml)

1. 修改Web.xml

2. 创建struts.xml

3. 在struts.xml中注册action和result

        <action name="login" class="com.clzhang.ssh.member.action.LoginAction">
            <result name="input">/ssh/demo2/login.jsp</result>
            <result name="error">/ssh/demo2/wrong.jsp</result>
            <result name="list" type="redirectAction">
                <param name="idInList">${id}</param>
                <param name="actionName">listBook</param>
            </result>
        </action>
        <action name="listBook" class="com.clzhang.ssh.member.action.ListAction">
            <result name="showList">/ssh/demo2/bookList.jsp</result>
        </action>
  • 第一个action的name为login,对应处理类为LoginAction;
  • result为input的JSP页面指明,如果验证用户输入失败,则转向到此页面(如用户名为空等);
  • result为error的JSP页面指明,如果登录失败(密码错误等等),则转向到此页面;
  • result为list的配置指明,登录成功后,做一个redirect操作,由另一个action业务类去处理相关业务逻辑,并且在其中配置了参数传递(id字段);
  • 第二个action的name为listBook,对应处理类为ListAction。

4. 创建登录JSP页面

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <body>
        <s:form action="login" method="post">
            <s:textfield name="loginInfoRef.username" label="账号"></s:textfield>
            <br />
            <s:textfield name="loginInfoRef.password" label="密码"></s:textfield>
            <br />
            <s:submit value="提交"></s:submit>
        </s:form>
        <br />
    </body>
</html>

其中用到了struts标签,在以后章节中予以解读。

注意:因为将表单封装进了JavaBean所以,表单中元素的名称有所改变,如:loginInfoRef.username,此名称必须与相关action类中的变量名称一致

5. 创建登录表单对应的实体类

package com.clzhang.ssh.member.action;

public class LoginInfo {

    private String username;

    private String password;

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

}

6. 创建登录业务处理action类

package com.clzhang.ssh.member.action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 模拟登录 
 * 1.如果输入为空,提示错误,返回到登录页面;
 * 2.登录错误,转向错误页面;
 * 3.登录成功,转向列表页面。
 */
public class LoginAction extends ActionSupport {
    public static final long serialVersionUID = 1;
    
    // a.这个参数是转到列表页面需要的
    private int id;
    // b.将JSP提交的表单封装为一个JavaBean
    private LoginInfo loginInfoRef;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public LoginInfo getLoginInfoRef() {
        return loginInfoRef;
    }

    public void setLoginInfoRef(LoginInfo loginInfoRef) {
        this.loginInfoRef = loginInfoRef;
    }

    @Override
    // 重载ActionSupport类的方法(Validateable接口)
    public void validate() {
        super.validate();
        
        // 验证方式一:
        if ("".equals(loginInfoRef.getUsername())) {
            this.addFieldError("loginInfoRef.username", "对不起,用户名不可以为空!");
        }
        if ("".equals(loginInfoRef.getPassword())) {
            this.addFieldError("loginInfoRef.password", "对不起,密码不可以为空!");
        }        
        
        // 如果执行了addFieldError()/addActionError()等方法,则会转到input对应的页面
    }

    @Override
    // 重载ActionSuppoer类的方法(Action接口)
    public String execute() {
        if (loginInfoRef.getUsername().equals("test")
                && loginInfoRef.getPassword().equals("123")) {
            System.out.println(loginInfoRef.getUsername() + "成功登录...");
            this.setId(100);

            return "list";
        } else {
            System.out.println(loginInfoRef.getUsername() + "成功失败!");
            
            // 这些属于属于Action接口
            return ERROR;
        }
    }
}

7. 创建显示登录错误JSP页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <body>
        wrong! :(
    </body>
</html>

8. 创建生成列表的action类

package com.clzhang.ssh.member.action;

import java.util.ArrayList;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 登录成功后显示的列表处理
 * @author acer
 *
 */
public class ListAction extends ActionSupport {
    public static final long serialVersionUID = 1;

    private ArrayList<String> bookList = new ArrayList<String>();

    private int idInList;

    public ArrayList<String> getBookList() {
        return bookList;
    }

    public void setBookList(ArrayList<String> bookList) {
        this.bookList = bookList;
    }

    public int getIdInList() {
        return idInList;
    }

    public void setIdInList(int idInList) {
        this.idInList = idInList;
    }

    public String execute() {

        bookList.add("book1");
        bookList.add("book2");
        bookList.add("book3");
        bookList.add("book4");
        bookList.add("idInList=" + idInList);

        ServletActionContext.getRequest().setAttribute("usernameRequest",
                "你现在怎样");
        ServletActionContext.getRequest().getSession().setAttribute(
                "usernameSession", "我现在不怎样");
        ServletActionContext.getServletContext().setAttribute(
                "usernameApplication", "你怎样");

        return "showList";
    }

}
  • 其中,idInList参数是由struts.xml为配置的;
  • 处理完成后,转向result配置为idInList的JSP页面,那就是bookList.jsp。

9. 创建显示列表的JSP页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <body>
        <c:forEach var="bookName" items="${bookList}">
            <c:out value="${bookName}"></c:out>
            <br />
        </c:forEach>

        <br />
        request:
        <s:property value="#request.usernameRequest" />
        <br />
        <br />
        session:
        <s:property value="#session.usernameSession" />
        <br />
        <br />
        application:
        <s:property value="#application.usernameApplication" />
        <br />
        <br />
    </body>
</html>

同样,此JSP用到了struts的标签,以后章节予以介绍。

10. 测试

10.1 打开IE

输入地址:http://127.0.0.1:8080/st/ssh/demo2/login.action,显示如下界面:

10.2 直接提交,显示错误:

10.3 输入用户名:test,密码:456,提交:

10.4 返回登录页面,输入用户名:test,密码:123,提交:

 

图解

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,可以通过自定义注解来进行数据验证。下面是一个简单的例子: 1. 定义注解 ```java @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value() default ""; int minLength() default 0; int maxLength() default Integer.MAX_VALUE; String regex() default ""; } ``` 这个注解可以用在类的字段上,可以指定字段的值、最小长度、最大长度和正则表达式。 2. 使用注解 ```java public class User { @MyAnnotation(minLength = 3, maxLength = 10, regex = "[a-zA-Z0-9_]+") private String username; // getter and setter } ``` 在这个例子,我们给User类的username字段加上了MyAnnotation注解,并指定了最小长度为3,最大长度为10,只能包含字母、数字和下划线。 3. 验证数据 ```java public class Validator { public static boolean validate(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); for (Field field : clazz.getDeclaredFields()) { MyAnnotation annotation = field.getAnnotation(MyAnnotation.class); if (annotation != null) { field.setAccessible(true); String value = (String) field.get(obj); if (value == null || value.length() < annotation.minLength() || value.length() > annotation.maxLength() || !value.matches(annotation.regex())) { return false; } } } return true; } } ``` 这个Validator类可以用来验证任意对象的字段是否符合注解的要求。它通过反射获取对象的所有字段,并检查是否有MyAnnotation注解,然后根据注解的要求验证字段的值。 使用方法: ```java public static void main(String[] args) throws IllegalAccessException { User user = new User(); user.setUsername("abc_123"); boolean isValid = Validator.validate(user); System.out.println(isValid); // true } ``` 在这个例子,我们创建了一个User对象,并将username设置为"abc_123",然后使用Validator类来验证这个对象的所有字段是否符合注解的要求。由于username符合要求,所以验证结果为true。 这样,我们就可以通过自定义注解来进行数据验证了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值