Struts2(17):Struts2深入探索续

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>

 用户提交成功后,若想刷新页面再提交一次,则会不成功。

猜你喜欢

转载自mynote.iteye.com/blog/1070714