博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2:数据校验,通过Action中的validate()方法实现校验,图解
阅读量:5736 次
发布时间:2019-06-18

本文共 5876 字,大约阅读时间需要 19 分钟。

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

第一种

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

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

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

第二种

参考:

1. 修改Web.xml

2. 创建struts.xml

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

/ssh/demo2/login.jsp
/ssh/demo2/wrong.jsp
${id}
listBook
/ssh/demo2/bookList.jsp
  • 第一个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"%>            

其中用到了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;        }    }}
  • 如果用户名、密码为空,则在validate()方法调用时出错,然后转向到reuslt配置为input的JSP页面;
  • 用户名、密码不为空,执行execute()方法,验证通过转向result配置为list的action; 验证不通过则转向到result配置为error的JSP页面。
  • 如果Action中存在多个逻辑处理方法,每个逻辑处理方法都需要自己的校验规则时,请参考阅读:

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

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

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
bookList = new ArrayList
(); private int idInList; public ArrayList
getBookList() { return bookList; } public void setBookList(ArrayList
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"%>            
request:
session:
application:

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

10. 测试

10.1 打开IE

输入地址:,显示如下界面:

10.2 直接提交,显示错误:

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

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

 

图解

 

转载地址:http://omrwx.baihongyu.com/

你可能感兴趣的文章
Fast R-CNN学习总结
查看>>
Miniwake
查看>>
jquery选择器、事件
查看>>
(转载)C#获取当前应用程序所在路径及环境变量
查看>>
Spring Bean的生命周期(非常详细)
查看>>
2."结对项目"的心得体会
查看>>
【vagrant】第一次安装添加box报错:The box failed to unpackage properly....
查看>>
Django__WSGI
查看>>
Linux 简介
查看>>
用HTML5/CSS3/JS开发Android/IOS应用
查看>>
java实现邮箱发送邮件功能
查看>>
Ftl常用标签
查看>>
4.3差错控制-CRC
查看>>
nginx location
查看>>
暴力 Codeforces Round #183 (Div. 2) A. Pythagorean Theorem II
查看>>
Manacher HDOJ 3068 最长回文
查看>>
虚拟机中linux使用本地iso作为yum源
查看>>
django 认证模块auth,表单组件form
查看>>
asp.net 小结1
查看>>
vim 中Ctags的安装和使用
查看>>