zoukankan      html  css  js  c++  java
  • 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,提交:

    图解

  • 相关阅读:
    21322
    9-1
    作业五1
    作业五2
    实验9-2
    作业4函数应用
    实验九 1
    实验八 数组2 输出一张九九乘法口诀表。要求必须将乘积放入一个二维数组中,再输出该数组,程序运行效果如下
    实验八 (调试)
    实验6剩余部分
  • 原文地址:https://www.cnblogs.com/nayitian/p/3439371.html
Copyright © 2011-2022 走看看