PersonService package org.apache.struts.tutorials.wildcardmethod.service; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; import java.util.SortedMap; import java.util.TreeMap; import org.apache.log4j.Logger; import org.apache.struts.tutorials.wildcardmethod.model.Person; public class PersonService { //Create a Logger object private static final Logger logger = Logger.getLogger( PersonService.class.getName() ); private static SortedMap<Integer, Person> people = new TreeMap<Integer, Person>(); static { people.put(0, new Person(0, "Steve", "Smith") ); people.put(1, new Person(1, "Sue", "Jones") ); } private static List<Person> personList = new ArrayList<Person>(); static{ for (Integer id : people.keySet() ) { personList.add( people.get(id)); } } public static List<Person> getPersons() { return personList; } public void save(Person person) { int newId = getNewId(); person.setId( newId ); people.put( newId, person); rebuildPersonList(); } private int getNewId() { int newId = 0; try { newId = people.lastKey() + 1; } catch (NoSuchElementException ex) { logger.info("Id value set to 0"); } return newId; } public void update(Person person) { Person tempPerson = people.get( person.getId() ); tempPerson.setFirstName( person.getFirstName() ); tempPerson.setLastName(person.getLastName() ); rebuildPersonList(); } public void deletePerson(int ID) { people.remove(ID); rebuildPersonList(); } public Person getPerson(int id) { return people.get(id); } public static void rebuildPersonList() { personList = new ArrayList<Person>(); for (Integer id : people.keySet() ) { personList.add( people.get(id)); } } } PersonAction package org.apache.struts.tutorials.wildcardmethod.action; import java.util.List; import org.apache.log4j.Logger; import org.apache.struts.tutorials.wildcardmethod.model.Person; import org.apache.struts.tutorials.wildcardmethod.service.PersonService; import com.opensymphony.xwork2.ActionSupport; public class PersonAction extends ActionSupport { //Create a Logger object private static final Logger logger = Logger.getLogger( PersonAction.class.getName() ); private static final long serialVersionUID = 1L; Person person ; int id ; List<Person> personList = PersonService.getPersons(); PersonService personService = new PersonService(); public String execute() throws Exception { logger.debug("In execute method"); return SUCCESS; } public String create() { logger.debug("In create method"); person = new Person(); return INPUT; } public String edit() { logger.debug("In edit method"); person = personService.getPerson(id); return INPUT; } public String saveOrUpdate() { logger.debug("In saveOrUpdate method"); if ( person.getId() > -1 ) { personService.update(person) ; } else { personService.save(person); } personList = PersonService.getPersons() ; return SUCCESS; } public String delete() { logger.debug("In delete method"); personService.deletePerson(id); personList = PersonService.getPersons() ; return SUCCESS; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public List<Person> getPersonList() { return personList; } public void setPersonList(List<Person> personList) { this.personList = personList; } public int getId() { return id; } public void setId(int id) { this.id = id; } } Person package org.apache.struts.tutorials.wildcardmethod.model; public class Person { private int id; private String firstName; private String lastName; public Person() { this.id = -1; this.firstName = null; this.lastName = null; } public Person(int id, String firstName, String lastName) { super(); this.id = id; this.firstName = firstName; this.lastName = lastName; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String toString() { return firstName + " " + lastName; } } Struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <package name="wildcardmethodexample" extends="struts-default"> <!-- Whatever value is before Person for the name of the action will be the name of the method to call in class PersonAction. For example action createPerson will call a method named create in class PersonAction --> <action name="*Person" class="org.apache.struts.tutorials.wildcardmethod.action.PersonAction" method="{1}"> <result name="success">view.jsp</result> <result name="input">input.jsp</result> </action> </package> </struts> build.xml <?xml version="1.0"?> <!-- ====================================================================== Date: May 2010 Project: Wildcard Method Struts 2 Ant Author: Bruce Phillips ====================================================================== --> <project name="Wildcard_Method_Struts2_Ant" default="archive" basedir="."> <description> Struts 2 Wildcard Method Selection Java Web Application </description> <property file="build.properties"/> <!-- ==================== Clean Target ==================================== --> <!-- The "clean" target deletes any previous "build" and "dist" directory, so that you can be ensured the application can be built from scratch. --> <target name="clean" description="Delete old build and dist directories"> <delete dir="${dist.home}"/> <delete dir="${build.home}"/> </target> <!-- ==================== Init Target ================================== --> <!-- The "init" target is used to create the "build" destination directory, Normally, this task is executed indirectly when needed. --> <target name="init" depends="clean" description="Create build directory"> <mkdir dir="${build.home}" /> </target> <!-- ==================== Compile Target ================================== --> <!-- The "compile" target transforms source files (from your "src" directory) into class files in the appropriate location in the build directory. This example assumes that you will be including your classes in an unpacked directory hierarchy under "/WEB-INF/classes". --> <target name="compile" depends="init" description="Compile Java sources"> <mkdir dir="${build.home}/WEB-INF/classes" /> <javac srcdir="${source.home}" destdir="${build.home}/WEB-INF/classes" debug="${compile.debug}" deprecation="${compile.deprecation}" optimize="${compile.optimize}" source="1.6" target="1.6"> <classpath> <path> <fileset dir="${lib.home}" /> <fileset dir="${lib.external}" /> </path> </classpath> </javac> </target> <!-- ==================== Build Target ================================== --> <!-- The "build" target copies all non class files to build directory --> <target name="build" depends="compile" description="Copies all non Java classes to build directoy"> <copy todir="${build.home}"> <fileset dir="${webapp.home}" excludes="CVS,**/*.class" /> </copy> <copy todir="${build.home}/WEB-INF/classes"> <fileset dir="${source.home}" excludes="CVS,**/*.java" /> </copy> </target> <!-- ==================== Archive Target ================================== --> <!-- The "archive" target create a binary archive of all files in build.home --> <target name="archive" depends="build" description="Create binary archive of all files in dist.home"> <mkdir dir="${dist.home}" /> <!-- Create application WAR file --> <jar jarfile="${dist.home}/${app.name}.war" basedir="${build.home}" /> </target> </project> build.properties # # Modify this file to suit your environment. # The values of these properties will # override the values of properties of the # same name in the build.xml file. # # See build.xml for versions and descriptions # of each of the required JAR files. # # Use forward slashes for path names even if # you are in a Windows environment! # #==================== File and Directory Names ======================== app.name=Wildcard_Method_Struts2_Ant app.version=0.1 source.home=./src lib.home=./WebContent/WEB-INF/lib #used for Jar files that are needed for compiling #but should not be part of the war file lib.external=./lib_external webapp.home=./WebContent build.home=./build dist.home=./dist #==================== Compilation Control Options ===================== compile.debug=true compile.deprecation=false compile.optimize=true