Strusts prepare拦截器

一、概述

   在我们做用户模块操作的时候,新增需要有密码项,而在我们修改的时候,密码一栏不能显示,那么我们如何保持修改的时候保证密码不丢失,下面是利用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>

猜你喜欢

转载自blog.csdn.net/m0_38068812/article/details/82956946
今日推荐