16.Struts2_使用ParamsPrepareParams拦截器栈

本文介绍如何优化Struts2应用中的员工编辑功能。通过调整拦截器栈配置及getModel方法,实现根据EmployeeID参数自动选择新建或从数据库加载对象进行回显。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


页面修改Employee对象时,传入Aciton id属性,在页面中需要回显。通过id在数据库中取到emp,将各个字段赋值给

栈顶的新Employee。完成回显,并跳转到修改页面。


public String edit(){
		//传入的EmployeeID
		//根据EmployeeID获取数据库对象,emp是数据库取出来的
		Employee emp=dao.get(employee.getEmployeeId());
		//把栈顶对象属性装配
		employee.setFirstName(emp.getFirstName());
		employee.setLastName(emp.getLastName());
		
		return "edit";
	}


上述方法并不理想。应该通过将数据库中取出的对象,放入值栈栈顶来进行回显,但是因为跳转Action时,已经有一个Employee对象在值栈中,所以通过是否有id属性来判断在getModel时是新建还是从数据库中取出Employee放入值栈 。

但原先的拦截器栈在ModelDriven前没有params拦截器,所以要启用新的拦截器栈


<struts>


    <package name="default" namespace="/" extends="struts-default">

		<!-- 配置使用 paramsPrepareParamsStack 作为默认的拦截器栈 -->
		<!-- 修改 PrepareInterceptor 拦截器的 alwaysInvokePrepare 属性值为 false -->
		<interceptors>
		    <interceptor-stack name="atguigustack">
		        <interceptor-ref name="paramsPrepareParamsStack">
		            <param name="prepare.alwaysInvokePrepare">false</param>
		        </interceptor-ref>
		    </interceptor-stack>
		</interceptors>
 
		<default-interceptor-ref name="atguigustack"/>

		<action name="emp-*" 
			class="com.atguigu.struts2.app.EmployeeAction"
			method="{1}">
			<result name="{1}">/emp-{1}.jsp</result>
			<result name="success" type="redirectAction">emp-list</result>	
		</action>
		
		<action name="emp-list"
			class="com.atguigu.struts2.app.EmployeeAction"
			method="list">
			<result name="list">/emp-list.jsp</result>	
		</action>
			
    </package>


</struts>


使用新的拦截器后,就能提前判断params而决定是新建model还是从数据库里获取以供页面回显。

@Override
	public Employee getModel() {
		//若create 就new一个
		
		//若修改,则从数据库取
		
		//判断标准为是否有EmployeeID参数
		//所以在进入DrivelModel拦截器前要先执行params拦截器栈
		//通过paramsPrepaeParams拦截器栈可以实现
		if(employeeId == null){
			employee=new Employee();
		}else{
			employee=dao.get(employeeId);
		}
		
		return employee;
	}


但是在删除的时候,由于也会带入id值,所以值栈中会多余加载Employee对象!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值