preparable和ModenDriven拦截器
最近读starting struts2 online,里面有一节Move CRUD Operations into the same Action,提供了Move CRUD Operations into the same Action大概的sample,于是进行了补充,记录下来,以备使用。
一、思路
在这本书里,lan roughley提到在结合preparable和ModenDriven拦截器实现Move CRUD Operations into the same Action,采用通配符的方式为所有的crud只写一个action配置,当然,这也要求相关文件的命名和目录组织的时候要遵循一定的要求,示例如下:
<action name="**" 的形式似乎不行,不得以改成了"*_*"了,哈哈,要是能改成"^_^"就更好了注:在struts.xml中增加<constant name="struts.enable.SlashesInActionNames" value="true" />,可以使用"* public String delete() throws Exception { log.info("delete the person"); service.deletePerson(id); return SUCCESS; } public String edit() { return "input"; } public String update() throws Exception { if (id == null || id.length() == 0) { log.info("add the person"); service.addPerson(person); } else { log.info("update the person"); service.updatePerson(person); } return SUCCESS; } public String view() { return SUCCESS; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public PersonService getService() { return service; } public void setService(PersonService service) { this.service = service; } public String getId() { return id; } public void setId(String id) { this.id = id; } public Person getModel() { return person; }} PersonListAction.java :package com.work.action.person;import java.util.List;import com.work.action.BaseSupport;import com.work.model.Person;import com.work.service.PersonService;public class PersonListAction extends BaseSupport { private static final long serialVersionUID = 1810482163716677456L; private List<Person> people; private PersonService service=new PersonServiceImpl(); ; public String execute() throws Exception { log.info("list persons"); people = service.getAllPersons(); return SUCCESS; } public List<Person> getPeople() { return people; } public void setPeople(List<Person> people) { this.people = people; } public PersonService getService() { return service; } public void setService(PersonService service) { this.service = service; }}paramsPrepareParamsStack
An example of the params-prepare-params trick. This stack is exactly the same as the defaultStack, except that it includes one extra interceptor before the prepare interceptor:the params interceptor.This is useful for when you wish to apply parameters directly to an object that you wish to load externally (such as a DAO or database or service layer), but can't load that object until at least the ID parameter has been loaded. By loadingthe parameters twice, you can retrieve the object in the prepare() method, allowing the second params interceptor toapply the values on the object. <interceptor-stack name="paramsPrepareParamsStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="params"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="i18n"/><interceptor-ref name="chain"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="staticParams"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><param name="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-ref name="workflow"><param name="excludeMethods">input,back,cancel</param></interceptor-ref></interceptor-stack>PersonServiceImpl.javapackage com.work.service;import java.util.ArrayList;import java.util.List;import java.util.Random;import com.work.model.Person;public class PersonServiceImpl implements PersonService { private List<Person> personList; public PersonServiceImpl() { personList = new ArrayList<Person>(); Person p1 = new Person("202", "name1", "beijing"); Person p2 = new Person("203", "name2", "beijing"); Person p3 = new Person("204", "name3", "tianjing"); personList.add(p1); personList.add(p2); personList.add(p3); } public void addPerson(Person person) { if (person == null) { throw new RuntimeException("add kong"); } person.setId(getID(200)); personList.add(person); } public void deletePerson(String personID) { int target = findLocation(personID); if (target != -1) personList.remove(target); } public List<Person> getAllPersons() { return personList; } public void updatePerson(Person person) { if (person == null) { throw new RuntimeException("update kong"); } int target = findLocation(person.getId()); personList.remove(target); personList.add(person); } private int findLocation(String personID) { int target = -1; for (int i = 0; i < personList.size(); i++) { if (personID.equals(personList.get(i).getId())) { target = i; break; } } return target; } public Person find(String personID) { Person person = null; int target = findLocation(personID); if (target != -1) { person = personList.get(target); } return person; } private String getID(int round) { Random rand = new Random(); int needed = rand.nextInt(round) + 1; // 1-linesum+1 return needed+""; }}
<s:form action="Person_update.action" > <s:textfield label="your ID" name="id" readonly="true"/> <s:textfield label="Please enter your name" name="name" required="true" /> <s:textfield label="Please enter your homeaddr" name="homeAddr" required="true"/> <s:submit /></s:form>view.jsp <%@ page contentType="text/html; charset=UTF-8"%><%@ taglib prefix="s" uri="/struts-tags"%><html><head><title>person view</title></head><body><s:actionerror /><table> <tr> <td>id</td> <td>name</td> <td>address</td> <td></td> <td></td> </tr> <s:iterator value="people"> <tr> <td><s:property value="id" /></td> <td><s:property value="name" /></td> <td><s:property value="homeAddr" /></td> <td><s:url id="update" action="Person_edit.action" > <s:param name="id"> <s:property value="%{id}" /> </s:param> </s:url> <s:a href="%{update}">修改</s:a> </td> <td><s:url id="delete" action="Person_delete.action"> <s:param name="id"> <s:property value="%{id}" /> </s:param> </s:url> <s:a href="%{delete}">删除</s:a> </td> </tr> </s:iterator></table><ul> <li><a href="<s:url action="Person_input"/>">Create a new person</a></li></ul></body></html>