首先 用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">
1.在Action类中定义表单属性,两者属性名称必须一致。提供setter,getter方法。即可接收到表单传过来的参数.
这种接收参数的方法,方便简单,但是结构性不是很好,且当表单传递来的参数很多的时候,整个Action类中充斥着setter,getter方法,程序结构不是很美观。
2.把表单传递过来的参数封装成一个类,然后调用其中的属性.
如,把login.jsp页面要传来的参数进行封装(例如:封装于Users 类)
private String username;
private String password;
public String getUsername() {
}
public void setUsername(String username) {
}
public String getPassword() {
}
public void setPassword(String 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">
这种方法,在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;
}
}