1,struts2有属性驱动方式与模型驱动两种方式:之前的例子都是使用属性驱动,下面来看看模型驱动的方式
先将之前RegisterAction中的所有属性取出,如username,password,repassword等 。。。。,在bean包下新建一个JavaBean类User,将从RegisterAction中属性放入此Bean中。
User.java
package com.test.bean;
import java.sql.Date;
public class User {
private String username;
private String password;
private String repassword;
private int age;
private Date birthday;
private Date graduation;
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;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Date getGraduation() {
return graduation;
}
public void setGraduation(Date graduation) {
this.graduation = graduation;
}
}
然后新建一个RegisterAction2.java.需实现ModelDriven接口
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.test.bean.User;
public class RegisterAction3 extends ActionSupport implements ModelDriven {
private User user = new User();
public Object getModel() {
return user;
}
}
这样就实现了struts2的模型驱动。但还是建议使用属性驱动。
模型驱动是由拦截器实现的,具体的拦截器为ModelDrivenInterceptor,在struts-default.xml文件中有对此拦截器定义。
2,Preparable接口
此接口有一个prepare()方法,实现此接口的action,会先执行prepare()方法,如
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.test.bean.User;
public class RegisterAction3 extends ActionSupport implements ModelDriven,Preparable {
private User user = new User();
public Object getModel() {
return user;
}
public void prepare() throws Exception {
System.out.println("hello world");
}
}
这个action会首先打印出hello world,再执行其它方法。
2,将struts2的错误提示显示在每个表单的后面
<s:form action="register" theme="simple">
<tr>
<td>username:</td>
<td>
<s:textfield name="username">
</s:textfield>
</td>
<td>
<s:fielderror>
<s:param>username</s:param>
</s:fielderror>
</td>
</tr>
3,验证表单重复提交,有些页面只允许提交一次,如注册页面
在jsp页面上加一个token标签
<s:form action="register" theme="simple">
<s:token name="hello"></s:token>
查看其生成页面的HTML文件,如下
<input type="hidden" name="hello" value="8S6MOOA3YX76ZUXZ8WZ1I29NNFC2E3JW" />
其中的value值是由struts2加密生成的,此页面提交后,value值会放在session中,在用户下一次再提交时,页面的value值不变,但服务器session中的value值已被删除,导致验证不通过,以达到避免重复提交。
由于此功能是由TokenInterceptor拦截器实现的。在struts-default.xml文件中有声明此拦截器,但默认拦截器栈并没有包含此拦截器。
因此需要在自己的action中引用此拦截器,并且要加一个特别result,用户指定当token不合法时,跳转的页面
<result name="invalid.token">/register.jsp</result> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref>
用户提交成功后,若想刷新页面再提交一次,则会不成功。