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>