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>
用户提交成功后,若想刷新页面再提交一次,则会不成功。