输入校验:(对用户输入的数据,判断用户输入的数据是否合法,一般会使用正则表达式)
一.客户端校验: 过滤正常用户的误操作,通过JS代码完成(可以绕开).
二.服务端校验: 整个应用阻止非法数据的最后防线(必须),使用Java代码.
三.数据库校验:在保存数据进数据库时候,对数据的合法性做校验
Struts2校验方式:
1.代码方式校验:开发中常用;
2.配置校验:
2.1.基于XML配置校验(推荐使用)。
2.2.基于Annotation配置校验。
Action中
* 要继承ActionSupport
* 重写Validateable接口中的validate()方法 ,在该方法中完成验证
* 步骤如下:
* validate()方法在其他的业务方法之前执行
* 验证出错转向的页面
struts.xml配置/validate/login.jsp
其中input转向是在action中已经定义好的.
public static final String INPUT = “input”;
* 什么时候表示验证出错(转向input所指向的页面)
* super.addFieldError(“字段名称”, “错误信息”);
* 当集合不为空时,转向错误页面.
* 若校验失败,不会再执行Action中的业务方法.
需求:对登陆操作进行校验
账号:必须在6-16个字符之间
密码:必须在6-16个字符之间
//输入校验
public class LoginAction extends ActionSupport {
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
/**
* 覆盖父类方法
* 账号密码不少于6位
*/
public void validate() {
if (username == null || !username.matches("^[a-zA-Z]\\w{5,15}$")){
//错误信息先存储
super.addFieldError("username","账号第一个字必须为字母6~16位");
}
if (password == null || !password.matches("^[a-zA-Z]\\w{5,15}$")){
//错误信息先存储
super.addFieldError("password","密码第一个字必须为字母6~16位");
}
}
@Override
public String execute() throws Exception {
System.out.println(username+","+password);
return NONE;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
Title
/views/validation/login.jsp
-----------------分隔符------------------------
问题1:为什么在执行input方法之前,没有执行validate方法.
问题2:Action中某些方法不需要校验,却也执行了validate方法,如何避免问题.
问题3.为什么校验失败,默认跳转到input结果视图.
问题4.开发中在一个Action中,校验的方法是少数,大多数方法都不需要校验.
问题5:从workflow的拦截可以看出,校验失败会跳到默认的结果视图(“input”).
问题6.错误信息提示丑陋.
===============================================
问题1:为什么在执行input方法之前,没有执行validate方法.
在validation和workflow拦截中,设置了不被校验的默认方法.
input,back,cancel,browse
问题2:Action中某些方法不需要校验,却也执行了validate方法,如何避免问题.
可以为不需要校验的方法上,使用@SkipValidation(跳过验证).
问题3.为什么校验失败,默认跳转到input结果视图.
validation:判断该方法执行之前是否需要校验,如果需要,把校验的错误信息存储起来(Map
workflow:判断 fieldErrors集合有错误信息,决定了应该跳转到哪一个结果视图
问题4.开发中在一个Action中,校验的方法是少数,大多数方法都不需要校验.
难道大多数方法都要使用@SkipValidation标签吗?
针对于指定的Action方法编写校验方法
编写validateXxx方法,---针对于-->xxx方法的校验.
比如:对save方法提供校验:-->validateSave();
问题5:从workflow的拦截可以看出,校验失败会跳到默认的结果视图(“input”).
问题:是否可以修改默认的结果视图?----?校验失败跳到"edit"视图
@InputConfig(resultName=“edit”)
被校验的方法
问题6.错误信息提示丑陋.
theme="simple"