SSH---整合案例----添加功能(7)

1.使用继承了ModelDriven<T>,Preparable接口的action类,把前台页面的表单数据封装到对应的实体类对象中。

    1.1 准备对应的表单输入页面。  emp-input.jsp

<body>
     <h4>Employee Input page</h4>
     <s:form action="emp-save" method="post">
        <s:textfield name="lastName" label="LasatName"></s:textfield>
        <s:textfield name="email" label="Email"></s:textfield>
        <s:textfield name="brith" label="Brith"></s:textfield> 
         <s:select list="#request.depatements" listKey="id" listValue="departmentName"
                name="depatement.id"
                label="Department"
         ></s:select>
         <s:submit></s:submit>
     </s:form>
</body>

     1.2 如何能实现将页面表单数据添加到对应的的Employee类的对象中呢?

           1.2.1 实现ModelDriven<Employee>接口,调用getModel() 方法将目标对象放置在栈顶。(如何使用ModelDriven<T>

                     如下是实现了ModelDriven接口后需要提供具体实现的方法。struts会自动调用getModel() 方法将model,置于栈顶

                    。但是此时只是,如果你有Employee类型的model的话,会置于栈顶。但是此时还没有model

private Employee model;
@Override
public Employee getModel() {
	return model;
}

              1.2.2 实现Preparable接口,来为ModelDriven准备具体的需要返回的model。(如何使用Preparable接口

                       如下是实现了Preparable接口需要提供具体实现的方法。但是我们不需要使用该方法,需要为不同的action定制专

                       属的prepare方法。比如prepareSave()方法。具体原因参看上面Preparable接口的使用。

@Override
public void prepare() throws Exception {}

             1.2.3  所以如何禁止sturts调用重写的prepare()方法呢?

                        需要再struts.xml文件配置新的拦截器站。(PrepareInterceptor拦截器

 <!-- 定义新的拦截器,配置prepare拦截器栈的 prepare.alwaysInvokePrepare参数为false-->
<interceptors>
	<interceptor-stack name="mystack">
		<interceptor-ref name="paramsPrepareParamsStack">
			<param name="prepare.alwaysInvokePrepare">false</param>
			</interceptor-ref>
	</interceptor-stack>
</interceptors>
<!-- 使用新的拦截器栈 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>

             1.2.4 配置完之后,就不会调用默认的重写的prepare()方法,而使用我们自己定制的prepareSave()

                      方法,在该方法中提供需要返回的model的具体实例。这样就会在栈顶放入Employee的model

                      对象,当jsp页面发送emp-save的表单提交请求到action后,struts会自动装配对应的属性到栈顶的

                      model中,然后在action的对应的save方法中,就可以获取带着属性的Employee对象。就可以

                     接着执行对象的插入操作。

                

                   PS:先执行   prepareSave()方法,为getModel()方法提供需要的model

                                       然后getmodel()方法将model放到栈顶

                                       然后调用paramsPrepareParamsStack拦截器,将页面的表单数据赋值到model

public class EmployeeAction extends ActionSupport implements RequestAware,
		ModelDriven<Employee>, Preparable {

	public void prepareSave() throws Exception {
		model = new Employee();
	}
	public String save() {
		System.out.println(model);
		return SUCCESS;
	}
	@Override
	public void prepare() throws Exception {
	}

	private Employee model;
	@Override
	public Employee getModel() {
		return model;
	}

}

         1.2.5 插入操作完成后,返回success,根据struts.xml文件中配置的result,重定向到emp-list.jsp页面,

                 在jsp页面显示刚才出入的新员工。(中间需要注意brith日期类型转换的问题)

<result name="success" type="redirect">/emp-list</result>

(具体的执行过程参看ssh整合案例11---小结)

猜你喜欢

转载自blog.csdn.net/lsh15846393847/article/details/89704072
今日推荐