Struts2 之 modelDriven & prepare 拦截器详解 (2)

Employee.java

public class Employoee { private Integer empId; private String empName; private String empAddress; private String empNum; @Override public String toString() { return "Employoee{" + "empId=" + empId + ", empName='" + empName + '\'' + ", empAddress='" + empAddress + '\'' + ", empNum='" + empNum + '\'' + '}'; } public Employoee(Integer empId, String empName, String empAddress, String empNum) { this.empId = empId; this.empName = empName; this.empAddress = empAddress; this.empNum = empNum; } public Employoee() { } //getXxx()、setXxx() 方法此处省略 }

EmployeeCurd.java

public class EmployeeCurd implements RequestAware { private Dao dao = new Dao(); private Map<String, Object> requestMap; private Integer empId; private String empName; private String empAddress; private String empNumber; private Employee employee; /*getXxx()、setXxx() 方法此处省略*/ public String delete() { dao.deleteEmp(String.valueOf(empId)); return "delete"; } public String add() { // 将表单的字段值为该类的属性赋值,即可初始化 Employee 对象 Employee employoee = new Employoee(null, empName, empAddress, empNumber); // 调用 Dao 方法将该对象加入 dao.addEmp(employoee); return "add"; } public String show() { // 调用 Dao 的方法获得所有员工信息 List<Employoee> employees = dao.getEmployee(); // 将所有员工信息存入 request 域,并在页面进行显示 requestMap.put("empList", employees); return "show"; } // 获得 WEB 资源 request @Override public void setRequest(Map<String, Object> map) { this.requestMap = map; } }

Employee-edit.jsp

<s:form action="emp-update"> <s:hidden></s:hidden> <s:textfield label="EmpName"></s:textfield> <s:textfield label="EmpAddress"></s:textfield> <s:textfield label="EmpNumber"></s:textfield> <s:submit value="Submit"></s:submit> </s:form>

思考

如上代码,我们在EmployeeCurd.java 中以 show()、add()、delete() 方法为例,其中在 add() 方法时所使用的 Employee 对象以该类的属性初始化,那么该类的属性是如何被初始化的?执行 delete 方法时传入的 empId 又是如何给对应的属性赋值?

这些操作看似我们没有对其进行任何处理,但实际上 struts2 的 params 拦截器为我们将这些都做了,params 拦截器的功能是将表单属性值为栈顶对象的对应的属性赋值,即 add() 方法执行前将表单中对应的字段值赋值给栈顶对象(栈顶对象默认为 Action 类的对象,即 EmployeeCurd 对象)。

删除操作时执行 delete() 方法会根据 empId 而去操作对象,这就使得我们需要在执行 delete() 方法前获取到传入的 empId,我们知道 params 拦截器会根据栈顶属性去赋值,但是在默认拦截器栈中 paramsModelDriven 拦截器其后,这时就需要使用 paramsPrepareParamsStack 拦截器栈,相比于默认拦截器此拦截器会在 ModelDriven 拦截器执行前先去执行一次 params 拦截器,在其后再执行一次 params 拦截器,这样的话 getModel 拦截器就会用到传入的 empId 参数,而我们也可以利用 empId 是否为空压入栈顶对应的对象,即添加操作时需要一个空的对象,更新操作时需要根据 empId 获取到已有对象压入栈顶以便回显

Struts2 之 modelDriven & prepare 拦截器详解

在 struts.xml 文件中配置使用 paramsPrepareParamsStack 拦截器栈,如下配置需要在

<default-interceptor-ref></default-interceptor-ref>

回显问题

对现有员工信息进行编辑的时候在编辑表单会进行回显,是因为 struts2 的表单标签会自动在值栈中寻找匹配的属性值进行回显,例如执行了 emp-edit.action 执行的后 getModel() 方法会根据 empId 将从 Map 集合中获取到的对象压入栈顶,那么在显示页面的时候会从栈顶获取对应的对象为 struts2 的表单标签赋值

缺点

EmployeeCurdEmployee 类中属性存在冗余,那么我们该如何解决?Struts2 默认的拦截器栈为我们提供了 ModelDriven 拦截器以解决此问题

实现

Action 类实现 ModelDriven

使用 ModelDriven 拦截器的优点

Action 类和 Model 类将不存在冗余,Action 类更加简洁

实现 ModelDriven 接口的 Action 类 public class EmployeeCurd implements RequestAware, ModelDriven<Employoee> { private Dao dao = new Dao(); private Map<String, Object> requestMap; private Employoee employoee; private Integer empId; public Integer getEmpId() { return empId; } public void setEmpId(Integer empId) { this.empId = empId; } public String delete() { dao.deleteEmp(String.valueOf(empId)); return "delete"; } public String update() { dao.updateEmp(employoee); return "update"; } public String add() { dao.addEmp(employoee); return "add"; } public String show() { List<Employoee> employees = dao.getEmployee(); requestMap.put("empList", employees); return "show"; } public String edit() { return "edit"; } @Override public void setRequest(Map<String, Object> map) { this.requestMap = map; } @Override public Employoee getModel() { /* * 判断调用该拦截器的时候是 edit 还是 show,这取决于是否有参数 empId,决定了 Employee 对象是新建还是依据 empId 获取 * */ if (empId != null) { employoee = dao.getEmployee(String.valueOf(empId)); } else { employoee = new Employoee(); } return employoee; } }

详解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygyjf.html