Struts数据校验
1.校验分类:
- 浏览器端校验:JavaScript,但不安全
- 服务器端校验:struts校验
2.struts校验介绍:
- 手动校验:编写代码
适用于需要与数据库交互。 - xml校验:编写配置文件
通用校验,逻辑简单。例如:不能为空,长度10,是否相等。
Struts手动校验
手动校验,必须实现接口:Validateable,提供一个方法 validate()。
1.action所有方法校验: 实现接口,并实现方法validate()
public class Demo1Action extends ActionSupport{
private String name;
public String execute(){
System.out.println(name);
return SUCCESS;
}
//---------------------------------------------------
@Override
public void validate() {
//验证代码放入该方法
//判断name参数合法性
if(name ==null || "".equals(name)){
//不合法=> 调用addFieldError,添加错误信息
addFieldError("name", "用户名不能为空!");
}
//写死,添加非表单字段错误信息
addActionError("用户名已经重复!");
//写死,添加提示信息
addActionMessage("哈哈,这就是提示没别的意思!");
}
//----------------------------------------------------
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.action单个方法校验:实现接口,并编写方法 validate方法() , 此处“方法”表示执行的方法名称,首字母大写。
例如:add() 执行前需要校验,必须编写 validateAdd()
注意:先执行“单个方法”校验,再执行“所有方法”校验
3.提供错误提示,阻止目标方法的执行
- this.addFieldError("", "") 给指定的字段设置提示信息
<s:fielderror>jsp显示错误 - this.addActionMessage(aMessage) action提示提示信息
<s:actionmessage/>jsp显示错误 - this.addActionError(anErrorMessage) action错误
<s:actionerror/>jsp显示错误
xml校验
1.单个方法校验:
位置:action类同包
名称:actionClass-actionName-validation.xml
actionClass :表示action类名
actionName:表示action访问名称,及<action name="...">
validation.xml :固定后缀
2.所有方法校验:
位置:action类同包
名称:actionClass-validation.xml,解释同上
3.struts提供的校验器:
校验配置文件位置:xwork-core-2.3.15.3.jar!/com/opensymphony/xwork2/validator/validators/default.xml
拦截器
struts提供拦截器,对action类进行增强的。struts已经实现多个拦截器,完成不同的功能。
例如:文件上传、数据校验、类型转换、参数封装等
默认拦截者栈
struts-default.xml 提供struts完成所有拦截器,也提供默认拦截器栈
<default-interceptor-ref name="defaultStack"/> 所有的action默认使用那个拦截器栈
<interceptor-stack name="defaultStack"> 声明一个拦截器栈,名称为“defaultStack”,通常称为:默认拦截器栈
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="debugging"/>
</interceptor-stack>
默认拦截器栈参数:
- servletConfig : 用于给action类注入Servlet api。
例如:action类实现ServletRequestAware就可以被struts框架注入HttpServletRequest对象 - modelDriven: 调用action类的getModel()方法,获得javabean实例,如果没为null,将交予struts。
- fileUpload:struts默认支持文件上传。
- params:给action类进行数据封装。如果使用ModelDriven,就给javabean封装数据。
- conversionError:将转换错误添加到action类的错误提示信息中。
将执行 action.addFieldError("属性","错误提示"); - validation:将执行action所有校验。先执行注解校验,再执行单个方法校验,最后所有方法的校验
- workflow :从action类获得添加的错误信息,如果没有发行。如果有返回“input”
方式1:默认情况,如果存在错误,返回值“input”
方式2:实现接口ValidationWorkflowAware,修改整个action的错误返回结果集名称,将执行方法 getInputResultName()
方式3:通过@InputConfig注解,给指定的方法配置出现错误时,返回结果result的名称。
public class Demo8Action extends ActionSupport implements ValidationWorkflowAware{
@Override
public String getInputResultName() {
return "xxx"; //出现错误不再返回input,二是xxx,所有的方法都使用。
}
@Override
public String execute() throws Exception {
System.out.println(this.getText("usernameMsg"));
System.out.println(this.getText("passwordMsg"));
System.out.println(this.getText("company"));
return NONE;
}
@InputConfig(resultName="loginInput") //如果登录出现异常,将返回不是input,而是loginInput
public String login(){
return SUCCESS;
}
@InputConfig(resultName="registerInput") //如果注册出现异常,将返回不是input,而是registerInput
public String register(){
return SUCCESS;
}
}
自定义拦截器
1.实现接口:com.opensymphony.xwork2.interceptor.Interceptor
//初始化方法
public void init() { }
//拦截方法
public abstract String intercept(ActionInvocation invocation) throws Exception;
invocation.getAction() 获得当前action类实例
invacation.invoke() 放行
//销毁方法
public void destroy() { }
2.继承父类:com.opensymphony.xwork2.interceptor.MethodFilterInterceptor
在使用自定义拦截器,可以对指定的方法进行操作(哪些方法不拦截,哪些必须拦截)
- 设置属性includeMethods,确定哪些方法进行拦截
- 设置属性excludeMethods,确定哪些方法不进行拦截
3.<default-interceptor-ref name="xxx">将指定的拦截器,声明成默认的。
注意:如果使用自定义xxx,“defaultStack”将被覆盖。
注意:拦截器只拦截action类,不拦截jsp文件。