struts2 validation

首先 用myeclipse自动创建ssh很方便但也很操蛋,有的会没有添加需要自己添加,且spring4和hibernate5会在application。xml出错所以用myeclipse构建ssh时选spring4和hibernate4,

1在struts.xml中添加和package同级<constant name="struts.objectFactory" value="spring" /> struts的action交给spring管理 即在struts.xmlaction的class写为application.xml中对应bean的id号有的书都没写所以说老版本的书很操蛋

2在application.xmldatasource中没有driverclass,没有驱动类怎么能行会报错所以在对应位置添加<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>

不过myeclipse也还是不错的,反转引擎自动由表转换成实体类和hbm如果配置好多表的外键关系,也会自动解决多表关系烦人的多对多等

好进入正题

struts的validation验证框架

struts验证为服务器端的验证js为客户端的验证js的验证不靠谱,用bs可绕过,所以需要在服务器端再验证一下,虽说struts的远程执行漏洞,但其mvc也不错

struts常用字段验证比较清晰在对应action类下建一个类名-validation.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC
      "-//Apache Struts//XWork Validator 1.0.3//EN"
      "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

< validators >
<!-- 用户名验证 -->
< field name ="user.username" >
< field-validator type ="requiredstring" >
< param name ="trim" >true </ param >
< message >用户名不能为空! </ message >
</ field-validator >
< field-validator type ="stringlength" >
< param name ="minLength" >4 </ param >
< param name ="maxLength" >16 </ param >
< param name ="trim" >true </ param >
< message >用户名必须为${minLength}至${maxLength}个字符!,当前为${user.username} </ message >
</ field-validator >
</ field >
<!-- 密码 -->
< field name ="user.password" >
< field-validator type ="requiredstring" >
< param name ="trim" >true </ param >
< message >密码不能为空! </ message >
</ field-validator >
< field-validator type ="stringlength" >
<!-- 去掉前后的空格 -->
< param name ="trim" >true </ param >
< param name ="minLength" >6 </ param >
< param name ="maxLength" >20 </ param >
< message >密码必须为${minLength}至${maxLength}个字符,当前为${user.password} </ message >
</ field-validator >
</ field >
<!-- 年龄 -->
< field name ="user.age" >
< field-validator type ="required" >
< param name ="trim" >true </ param >
< message >年龄不能为空 </ message >
</ field-validator >
< field-validator type ="int" >
< param name ="trim" >true </ param >
< param name ="min" >1 </ param >
< param name ="max" >200 </ param >
< message >年龄为${min}---${max}岁之间 </ message >
</ field-validator >
</ field >
< field name ="user.email" >
< field-validator type ="requiredstring" >
< param name ="trim" >true </ param >
< message >邮箱不能为空 </ message >
</ field-validator >
< field-validator type ="email" >
< param name ="trim" >true </ param >
< message >邮箱格式不正确! </ message >
</ field-validator >
</ field >
</ validators >

也可在action中addfielderror添加错误,如验证用户是否存在 只要有一个验证不通过就会转到input 即result name为input的 例注册注册不成功重新注册就把input对应register。jsp,在jsp界面对应位置可通过<s:fielderror>输出


   fieldName 命名是否和jsp以及 action中的属性一致 如: 
       action中有userName 属性, 
       jsp 中有标签:<s:textfield name="userName"/> 
       validation.xml中需有:<field name="userName">...</field> 
       上述的三个userName一定要一致。 

还有struts还有个模型驱动实际就是封装了个实体bean,其jspname属性值要和实体bean中的值对应相同,要不然怎么setget

其actionimplement实现modeldriven,实例化new bean getset

这个问题困扰了很多Struts2的初学者,我这里提供一些建议:

(1)请你统一整个系统中的Action使用的驱动模型,即要么都是用属性驱动,要么都是用模型驱动。

(2)如果你的DB中的持久层的对象与表单中的属性都是一一对应的话,那么就使用模型驱动吧,毕竟看起来代码要整洁得多。

(3)如果表单的属性不是一一对应的话,那么就应该使用属性驱动,否则,你的系统就必须提供两个Bean,一个对应表单提交的数据,另一个用与持久层。

 

action method为指定action内的方法,也可在提交表单时更改url !method为静态方法调用须在struts。xml配置允许动态方法调用

多方法Action情况如何使用配置文件进行校验?

我们知道大多数据情况下,Action可能会有多个方法,面我们上面所说的都是针对execute()方法进行的校验,如果存在多方法的情况下,需要进行校验的信息肯定是不样的,一个配置文件肯定解决不了问题,所有在多方式需要校验的情况下,我们需要在Action同级别的目录下,创建命名规则如下的配置文件:ActionName-method-validation.xml 配置文件,比如:RegisterAction中有个test()方法需要校验,可以创建

RegisterAction-test-validation.xml 配置文件进行配置,这个文件就会针对tets()方法进行校验,但是需要注意的是:在调用test()方法时,使用RegisterAction-test-vaidation.xml  文件进行校验后,还会调用RegisterAction-vaidation.xml 文件进行校验,这样的话,肯定会产生干扰,为了解决这样问题,可以在开发过程中,不提供RegisterAction-validtion.xml 这样的文件,对于execute()方法,可以提供一个RegisterAction-execute-validation.xml 文件进行配置校验。

 将Action类中的每一个处理方法都定义成一个逻辑Action方法,在action后添加method属性,validation.xml校验不通过后,会默认返回  input所在 页面

struts2中的Action接收表单传递过来的参数有3种方法:

如,登陆表单login.jsp:

<form action="login" method="post" name="form1">
  用户名:<s:textfield name="username"/><br/>
   密 码:<s:password name="password"/><br/>
               <s:submit value="提交"/>
   </form>

1.在Action类中定义表单属性,两者属性名称必须一致。提供setter,getter方法。即可接收到表单传过来的参数.

这种接收参数的方法,方便简单,但是结构性不是很好,且当表单传递来的参数很多的时候,整个Action类中充斥着setter,getter方法,程序结构不是很美观。

2.把表单传递过来的参数封装成一个类,然后调用其中的属性.

如,把login.jsp页面要传来的参数进行封装(例如:封装于Users 类)

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;
}

然后再Action方法中,定义该类的对象就可以了,如

public class loginAction extends ActionSupport{

private Users users;

public Users getUsers(){

return users;

}

public void setUsers(Users users){

this.users=users;

}



}

通过这种方法传值,还必须在jsp页面做一下处理,login.jsp中from1的属性名应该改成这样:

登陆表单login.jsp:

<form action="login" method="post" name="form1">
  用户名:<s:textfield name="users.username"/><br/>
   密 码:<s:password name="users.password"/><br/>
               <s:submit value="提交"/>
   </form>

这种方法,在struts开发中是很常用的一种方法!

3.通过实现ModelDriven接口接收表单数据

首先Action类必须实现ModelDriven接口,同样把表单传来的数据封装起来,Action类中必须实例化该对象,并且要重写getModel()方法

public class loginAction extends ActionSupport implements ModelDriven<Users>{

private Users users =new Users();

public Users getModel(){

return users;

}



}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值