struts2-验证(手工)
struts2校验有两种实现方法:
1. 手工编写代码实现(基本验证)
2. 基于XML配置方式实现(验证框架)
基本验证(对action的所有方法进行校验)
Action中
* 要继承ActionSupport
* 重写Validateable接口中的validate()方法 ,在该方法中完成验证
* 步骤如下:
* validate()方法在其他的业务方法之前执行
* 验证出错转向的页面
struts.xml配置<result name="input">/validate/login.jsp</result>
其中input转向是在action中已经定义好的.
public static final String INPUT = "input";
* 什么时候表示验证出错(转向input所指向的页面)
* this.addFieldError("sss", "错误信息");方法指向的是一个集合
* 当集合不为空时,转向错误页面.
1 public class ValidateAction extends ActionSupport { 2 3 private String username; 4 private String psw; 5 6 //1 接收表单参数的方法 7 public void setUsername(String username) { 8 System.out.println("setUsername方法 "+username); 9 this.username = username; 10 } 11 12 //2 验证方法 13 public void validate(){ 14 //对用户名和密码的检测,,, 15 } 16 17 //3 业务方法 18 public String login(){ 19 System.out.println("login方法***********************"+username); 20 return "success"; 21 }
•要进行验证,action必须继承ActionSupport或者实现Validateable
•要重写Validateable该接口中的validate()方法
该方法与setUsername()方法和login()方法的执行顺序是
什么时候表示验证没有通过?
* 验证通过:1、集合存在,但集合中的内容为空;2、集合不存在
* 验证不通过:集合存在,并且集合中的内容不为空
如何往集合中存放错误信息:this.addFieldError("username","用户名错误");
* 参数1:key(用户字段名,Action中的属性名),fieldName="username"
* 参数2:错误信息,errorMessage="用户名错误"
底层代码:
public synchronized void addFieldError(String fieldName, String errorMessage) { final Map<String, List<String>> errors = internalGetFieldErrors(); //Map集合 List<String> thisFieldErrors = errors.get(fieldName); //list集合 if (thisFieldErrors == null) { //list集合为空 thisFieldErrors = new ArrayList<String>(); //创建一个新的list集合 errors.put(fieldName, thisFieldErrors); //放置list集合到Map集合中 } thisFieldErrors.add(errorMessage); //在list集合中放置错误信息 }
显示错误Jsp页面:
使用<s:fielderror/>显示错误消息
注:使用<s:fielderror/>标签即可将错误提示信息输出到页面中。
* validate()方法会校验action中所有与execute方法签名相同的方法。
* 要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。
* 当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败 信息(为了使用addFieldError()方法,action可以继承ActionSupport ),
如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。
* 在input视图中可以通过<s:fielderror/>显示失败信息。
1 public String add() throws Exception{ 2 return "success"; 3 } 4 对应的验证方法 5 public void validateAdd(){ 6 //验证代码 7 }
针对指定方法进行校验的这个名为什么要这样组成呢?validateAdd()
在ValidationInterceptor拦截器中可以看到以validate开始的方法
输入校验的流程
1 1。类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。 2 3 2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。 4 5 3。系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。 6 7 4。调用action中的validate()方法。 8 9 5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
struts2框架验证(手工) 总结:
struts2手动验证:
|
样例代码:
1、jsp
login.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <br> <s:fielderror/> <s:form name="loginForm" method="post" namespace="/validate" action="validateAction_login.action" theme="simple" > <table border="1"> <tr> <td>用户名</td> <td> <s:textfield name="username" /></td> </tr> <tr> <td>密码</td> <td><s:password name="psw" /></td> </tr> <tr> <td> </td> <td><s:submit value="登陆"/></td> </tr> </table> </s:form> </body> <a href="${pageContext.request.contextPath}/validate/validateAction_test.action">test其他的方法</a> </html>
success.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <br> <h1>验证成功</h1> </body> </html>
2、java
ValidateAction.java
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class ValidateAction extends ActionSupport { private String username; private String psw; public void setUsername(String username) { System.out.println("ValidateAction ************ setUsername()"); this.username = username; } /* * 验证方法: * * 该动作类action必须继承ActionSupport或者实现Validateable接口 * * 必须重写Validateable接口提供的validate()方法 * * * 必须要保证setUsername()、validate()、login()方法的执行顺序如下: * * setUsername() * * validate() * * login() * * * 如果登录失败,如何处理: * * this.addFieldError( key, value); * * key:错误提示字段 * * value:错误提示信息 * * * 通过底层代码说明: * public synchronized void addFieldError(String fieldName, String errorMessage) { final Map<String, List<String>> errors = internalGetFieldErrors(); //声明一个map集合 List<String> thisFieldErrors = errors.get(fieldName); //声明一个list集合,放入对应错误提示信息 if (thisFieldErrors == null) { //如果list集合为空 thisFieldErrors = new ArrayList<String>(); //重新创建一个list集合 errors.put(fieldName, thisFieldErrors); //把list集合放入到map集合中 } thisFieldErrors.add(errorMessage); //把错误提示信息放入到list集合中 } * * * 什么时候才是验证通过? * * 验证通过:1、map集合不存在;2、map集合存在并为空 * * 验证不通过:map集合存在并且不为空 * * * 分析需求: * * 用户名不能为null ,"" * 密码不能为null, "" ,并且密码的长度6-12之间 * * * 针对所有业务方法进行验证还是针对某个指定业务方法进行验证? * * 重写的validate()方法,针对所有业务方法进行验证 * * 重写的validate()方法加上要验证的指定的业务方法名(业务方法名的首字母大写),实现针对某个指定的业务方法进行验证 * * 为什么要这样进行拼接?因为struts2框架底层拼接,如果不这样写,底层就找不到对应方法名 * */ public void validateLogin() { System.out.println("ValidateAction ************ validate()"); if(username==null||username.equals("")){ this.addFieldError("error", "用户名不能为空!"); } if(psw==null||psw.equals("")){ this.addFieldError("error", "密码不能为空!"); }else{ String pattern = "^[0-9a-zA-Z]{6,12}$"; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(psw); boolean b = m.matches(); if(!b){ this.addFieldError("error", "密码的长度必须在6至12之间!"); } } } public String login(){ System.out.println("ValidateAction ********* login()"); System.out.println("username = "+username); System.out.println("password = "+psw); return "success"; } public String test(){ System.out.println("ValidateAction ********* test()"); return "success"; } public String getUsername() { return username; } public String getPsw() { return psw; } public void setPsw(String psw) { this.psw = psw; } }
3、xml
struts_validate.xml
<action name="validateAction_*" class="cn.itcast.validate.ValidateAction" method="{1}"> <result name="success">/validate/success.jsp</result> <result name="input">/validate/login.jsp</result> </action>
struts.xml
<include file="cn/zengfansheng/struts/validate/struts_validate.xml"></include>