一、概述
在我们做用户模块操作的时候,新增需要有密码项,而在我们修改的时候,密码一栏不能显示,那么我们如何保持修改的时候保证密码不丢失,下面是利用Struts的prepare拦截器作为一个解决方案。prepare拦截器表示在Action中所有的方法未执行之前执行此方法
使用paramsPrepareParamsStack拦截器栈
1、paramsPrepareParams从字面上理解,这个stack的拦截器调用的顺序为:首先调用params,然后调用prepare,接下来调用modelDriven,然后再调用params;
2、Struts2.0的设计上要求modelDriven在params之前调用,而业务中prepare要负责准备model,准备model又需要参数,这就需要在prepare之前调用params拦截器设置相关参数,这个也就是创建paramsPrepareParamsStack的原因。
3、执行流程如下:
3.1、params拦截器首先给action中的相关参数赋值,如id;
3.2、prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象;
3.3、modelDriven拦截器将model对象压入valuestack,这里的model对象就是在prepare中创建的;
3.4、params拦截器在将参数赋值给model对象;
3.5、action的业务逻辑执行。
二、前端示例
<s:debug></s:debug>
<s:form namespace="/" action="employee_saveOrUpdate" >
<table border="1" cellpadding="0" cellspacing="0">
<s:hidden name="employee.id" />
<tr>
<td>员工名称</td>
<td><s:textfield name="employee.name"/></td>
</tr>
<s:if test="employee.id == null" >
<tr>
<td>员工密码</td>
<td><s:password name="employee.password"/></td>
</tr>
</s:if>
<tr>
<td>员工的工资</td>
<td><s:textfield name="employee.salary"/></td>
</tr>
<tr>
<td colspan="2"><s:submit value="保存"></s:submit></td>
</tr>
</table>
</s:form>
三、后端
首先我们要实现Prepare接口,然后写实现接口中的prepare方法,然后prepare+要执行的方法,从后端查出来的数据,前端表单的数据对后端查询来的数据进行覆盖,如果表单有相关字段的值,就进行覆盖,没有就不进行覆盖
public class EmployeeAction extends ActionSupport implements Preparable{
private static final String LIST = "list";
private IEmployeeDao dao = new EmployeeDaoImpl();
@Getter
private Employee employee = new Employee();
@Getter
private EmployeeQueryObject qo = new EmployeeQueryObject();
/**
* 增加和修改
* @return
*/
public String saveOrUpdate(){
System.out.println("employee = " + employee);
if(null == employee.getId()){
employee.setPassword(MD5.encode(employee.getPassword()));
dao.save(employee);
}else{
dao.update(employee);
}
System.out.println("增加或者修改");
return SUCCESS;
}
// 在所有的aciton方法之前预先执行
public void prepare() throws Exception {
System.out.println("EmployeeAction.prepare");
}
// 在saveOrUpdate方法之前预先执行
public void prepareSaveOrUpdate() throws Exception {
if(null != employee.getId()){
employee = dao.get(this.employee.getId());
}
System.out.println("EmployeeAction.prepareSaveOrUpdate");
}
}
四、配置文件
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.ui.theme" value="simple" />
<package name="p2" extends="struts-default" namespace="/" >
<!--当前package默认的拦截器栈-->
<default-interceptor-ref name="paramsPrepareParamsStack"/>
<action name="employee_*" class="com.shenzhenair.action.EmployeeAction" method="{1}" >
<result name="input" >/WEB-INF/view/employee_add.jsp</result>
<result name="list" >/WEB-INF/view/employee_list.jsp</result>
<result name="success" type="redirectAction" >
<param name="actionName">employee</param>
<param name="qo.currentPage">${qo.currentPage}</param>
employee
</result>
</action>
</package>
<!--<include file="/com/struts/web/valuestack/struts_vs.xml"></include>-->
</struts>