Added wildcard method selection child module
git-svn-id: https://svn.apache.org/repos/asf/struts/sandbox/trunk@1499089 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/struts2examples/pom.xml b/struts2examples/pom.xml
index 9ca8737..0c59c79 100644
--- a/struts2examples/pom.xml
+++ b/struts2examples/pom.xml
@@ -41,6 +41,7 @@
<module>debugging_struts</module>
<module>form_tags</module>
<module>form_xml_validation</module>
+ <module>wildcard_method_selection</module>
</modules>
<dependencies>
diff --git a/struts2examples/wildcard_method_selection/README.txt b/struts2examples/wildcard_method_selection/README.txt
new file mode 100644
index 0000000..67a3f47
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/README.txt
@@ -0,0 +1,16 @@
+This is the example project referred to in the
+Struts 2 documentation, Wildcard Method tutorial.
+See: http://struts.apache.org.
+
+To build the application's war file run mvn clean package
+from the project's root folder.
+
+The war file is created in the target sub-folder.
+
+Copy the war file to your Servlet container (e.g. Tomcat, GlassFish) and
+then startup the Servlet container.
+
+In a web browser go to: http://localhost:8080/wildcard_method_selection/Person.action
+
+You should see a web page with People listed.
+
diff --git a/struts2examples/wildcard_method_selection/pom.xml b/struts2examples/wildcard_method_selection/pom.xml
new file mode 100644
index 0000000..d8c0881
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/pom.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>struts.apache.org</groupId>
+ <artifactId>struts2examples</artifactId>
+ <version>1.0.0</version>
+ </parent>
+
+ <artifactId>wildcard_method_selection</artifactId>
+
+ <name>wildcard method selection</name>
+
+ <description>Wildcard method selection example application for the
+ Struts 2 getting started tutorials</description>
+ <packaging>war</packaging>
+ <build>
+ <finalName>wildcard_method_selection</finalName>
+ </build>
+
+</project>
diff --git a/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/action/PersonAction.java b/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/action/PersonAction.java
new file mode 100644
index 0000000..55cdfda
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/action/PersonAction.java
@@ -0,0 +1,129 @@
+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;
+ }
+
+
+
+
+
+}
diff --git a/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/model/Person.java b/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/model/Person.java
new file mode 100644
index 0000000..84abec3
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/model/Person.java
@@ -0,0 +1,55 @@
+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;
+
+ }
+
+
+
+
+}
diff --git a/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/service/PersonService.java b/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/service/PersonService.java
new file mode 100644
index 0000000..4e85eb7
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/java/org/apache/struts/tutorials/wildcardmethod/service/PersonService.java
@@ -0,0 +1,133 @@
+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));
+
+ }
+
+
+
+
+ }
+
+
+}
diff --git a/struts2examples/wildcard_method_selection/src/main/resources/log4j.dtd b/struts2examples/wildcard_method_selection/src/main/resources/log4j.dtd
new file mode 100644
index 0000000..8868820
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/resources/log4j.dtd
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Authors: Chris Taylor, Ceki Gulcu. -->
+
+<!-- Version: 1.2 -->
+
+<!-- A configuration element consists of optional renderer
+elements,appender elements, categories and an optional root
+element. -->
+
+<!ELEMENT log4j:configuration (renderer*, appender*,plugin*, (category|logger)*,root?,
+ (categoryFactory|loggerFactory)?)>
+
+<!-- The "threshold" attribute takes a level value below which -->
+<!-- all logging statements are disabled. -->
+
+<!-- Setting the "debug" enable the printing of internal log4j logging -->
+<!-- statements. -->
+
+<!-- By default, debug attribute is "null", meaning that we not do touch -->
+<!-- internal log4j logging settings. The "null" value for the threshold -->
+<!-- attribute can be misleading. The threshold field of a repository -->
+<!-- cannot be set to null. The "null" value for the threshold attribute -->
+<!-- simply means don't touch the threshold field, the threshold field -->
+<!-- keeps its old value. -->
+
+<!ATTLIST log4j:configuration
+ xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/"
+ threshold (all|trace|debug|info|warn|error|fatal|off|null) "null"
+ debug (true|false|null) "null"
+ reset (true|false) "false"
+>
+
+<!-- renderer elements allow the user to customize the conversion of -->
+<!-- message objects to String. -->
+
+<!ELEMENT renderer EMPTY>
+<!ATTLIST renderer
+ renderedClass CDATA #REQUIRED
+ renderingClass CDATA #REQUIRED
+>
+
+<!-- Appenders must have a name and a class. -->
+<!-- Appenders may contain an error handler, a layout, optional parameters -->
+<!-- and filters. They may also reference (or include) other appenders. -->
+<!ELEMENT appender (errorHandler?, param*,
+ rollingPolicy?, triggeringPolicy?, connectionSource?,
+ layout?, filter*, appender-ref*)>
+<!ATTLIST appender
+ name CDATA #REQUIRED
+ class CDATA #REQUIRED
+>
+
+<!ELEMENT layout (param*)>
+<!ATTLIST layout
+ class CDATA #REQUIRED
+>
+
+<!ELEMENT filter (param*)>
+<!ATTLIST filter
+ class CDATA #REQUIRED
+>
+
+<!-- ErrorHandlers can be of any class. They can admit any number of -->
+<!-- parameters. -->
+
+<!ELEMENT errorHandler (param*, root-ref?, logger-ref*, appender-ref?)>
+<!ATTLIST errorHandler
+ class CDATA #REQUIRED
+>
+
+<!ELEMENT root-ref EMPTY>
+
+<!ELEMENT logger-ref EMPTY>
+<!ATTLIST logger-ref
+ ref CDATA #REQUIRED
+>
+
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+ name CDATA #REQUIRED
+ value CDATA #REQUIRED
+>
+
+
+<!-- The priority class is org.apache.log4j.Level by default -->
+<!ELEMENT priority (param*)>
+<!ATTLIST priority
+ class CDATA #IMPLIED
+ value CDATA #REQUIRED
+>
+
+<!-- The level class is org.apache.log4j.Level by default -->
+<!ELEMENT level (param*)>
+<!ATTLIST level
+ class CDATA #IMPLIED
+ value CDATA #REQUIRED
+>
+
+
+<!-- If no level element is specified, then the configurator MUST not -->
+<!-- touch the level of the named category. -->
+<!ELEMENT category (param*,(priority|level)?,appender-ref*)>
+<!ATTLIST category
+ class CDATA #IMPLIED
+ name CDATA #REQUIRED
+ additivity (true|false) "true"
+>
+
+<!-- If no level element is specified, then the configurator MUST not -->
+<!-- touch the level of the named logger. -->
+<!ELEMENT logger (level?,appender-ref*)>
+<!ATTLIST logger
+ name CDATA #REQUIRED
+ additivity (true|false) "true"
+>
+
+
+<!ELEMENT categoryFactory (param*)>
+<!ATTLIST categoryFactory
+ class CDATA #REQUIRED>
+
+<!ELEMENT loggerFactory (param*)>
+<!ATTLIST loggerFactory
+ class CDATA #REQUIRED>
+
+<!ELEMENT appender-ref EMPTY>
+<!ATTLIST appender-ref
+ ref CDATA #REQUIRED
+>
+
+<!-- plugins must have a name and class and can have optional parameters -->
+<!ELEMENT plugin (param*, connectionSource?)>
+<!ATTLIST plugin
+ name CDATA #REQUIRED
+ class CDATA #REQUIRED
+>
+
+<!ELEMENT connectionSource (dataSource?, param*)>
+<!ATTLIST connectionSource
+ class CDATA #REQUIRED
+>
+
+<!ELEMENT dataSource (param*)>
+<!ATTLIST dataSource
+ class CDATA #REQUIRED
+>
+
+<!ELEMENT triggeringPolicy ((param|filter)*)>
+<!ATTLIST triggeringPolicy
+ name CDATA #IMPLIED
+ class CDATA #REQUIRED
+>
+
+<!ELEMENT rollingPolicy (param*)>
+<!ATTLIST rollingPolicy
+ name CDATA #IMPLIED
+ class CDATA #REQUIRED
+>
+
+
+<!-- If no priority element is specified, then the configurator MUST not -->
+<!-- touch the priority of root. -->
+<!-- The root category always exists and cannot be subclassed. -->
+<!ELEMENT root (param*, (priority|level)?, appender-ref*)>
+
+
+<!-- ==================================================================== -->
+<!-- A logging event -->
+<!-- ==================================================================== -->
+<!ELEMENT log4j:eventSet (log4j:event*)>
+<!ATTLIST log4j:eventSet
+ xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/"
+ version (1.1|1.2) "1.2"
+ includesLocationInfo (true|false) "true"
+>
+
+
+
+<!ELEMENT log4j:event (log4j:message, log4j:NDC?, log4j:throwable?,
+ log4j:locationInfo?, log4j:properties?) >
+
+<!-- The timestamp format is application dependent. -->
+<!ATTLIST log4j:event
+ logger CDATA #REQUIRED
+ level CDATA #REQUIRED
+ thread CDATA #REQUIRED
+ timestamp CDATA #REQUIRED
+ time CDATA #IMPLIED
+>
+
+<!ELEMENT log4j:message (#PCDATA)>
+<!ELEMENT log4j:NDC (#PCDATA)>
+
+<!ELEMENT log4j:throwable (#PCDATA)>
+
+<!ELEMENT log4j:locationInfo EMPTY>
+<!ATTLIST log4j:locationInfo
+ class CDATA #REQUIRED
+ method CDATA #REQUIRED
+ file CDATA #REQUIRED
+ line CDATA #REQUIRED
+>
+
+<!ELEMENT log4j:properties (log4j:data*)>
+
+<!ELEMENT log4j:data EMPTY>
+<!ATTLIST log4j:data
+ name CDATA #REQUIRED
+ value CDATA #REQUIRED
+>
diff --git a/struts2examples/wildcard_method_selection/src/main/resources/log4j.xml b/struts2examples/wildcard_method_selection/src/main/resources/log4j.xml
new file mode 100644
index 0000000..ea94c42
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/resources/log4j.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+ <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
+ <layout class="org.apache.log4j.SimpleLayout"/>
+ </appender>
+
+
+ <!-- specify the logging level for loggers from other libraries -->
+ <logger name="com.opensymphony">
+ <level value="ERROR" />
+ </logger>
+
+ <logger name="org.apache.struts2">
+ <level value="ERROR" />
+ </logger>
+
+ <!-- log only ERROR and above messages for loggers with
+ a name of the name value below -->
+ <logger name="org.apache.struts.tutorials">
+ <level value="DEGUG" />
+ </logger>
+
+
+
+ <!-- for all other loggers log only info and above log messages -->
+ <root>
+ <priority value="WARN"/>
+ <appender-ref ref="STDOUT" />
+ </root>
+
+</log4j:configuration>
+
diff --git a/struts2examples/wildcard_method_selection/src/main/resources/struts.xml b/struts2examples/wildcard_method_selection/src/main/resources/struts.xml
new file mode 100644
index 0000000..c8ea023
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/resources/struts.xml
@@ -0,0 +1,26 @@
+<?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>
diff --git a/struts2examples/wildcard_method_selection/src/main/webapp/META-INF/MANIFEST.MF b/struts2examples/wildcard_method_selection/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/struts2examples/wildcard_method_selection/src/main/webapp/WEB-INF/web.xml b/struts2examples/wildcard_method_selection/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..7951a40
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+<display-name>Wildcard_Method_Struts2_Mvn</display-name>
+ <welcome-file-list>
+ <welcome-file>input.jsp</welcome-file>
+ </welcome-file-list>
+
+
+ <filter>
+ <filter-name>struts2</filter-name>
+ <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>struts2</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+</web-app>
diff --git a/struts2examples/wildcard_method_selection/src/main/webapp/input.jsp b/struts2examples/wildcard_method_selection/src/main/webapp/input.jsp
new file mode 100644
index 0000000..741d1d1
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/webapp/input.jsp
@@ -0,0 +1,40 @@
+<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
+<%
+String path = request.getContextPath();
+String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
+%>
+<%@ taglib prefix="s" uri="/struts-tags" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <base href="<%=basePath%>">
+
+ <title>Edit Person</title>
+ <meta http-equiv="pragma" content="no-cache">
+ <meta http-equiv="cache-control" content="no-cache">
+ <meta http-equiv="expires" content="0">
+
+ </head>
+
+ <body>
+ <s:if test="id > 0">
+ <h3>Edit Person</h3>
+ </s:if>
+ <s:else>
+ <h3>Create Person</h3>
+
+ </s:else>
+
+ <s:form action='saveOrUpdatePerson'>
+
+ <p><s:textfield name="person.firstName" label="First name" /> <br />
+ <s:textfield name="person.lastName" label="Last name" /> </p>
+
+ <s:hidden name="person.id" />
+ <s:submit value="Save" />
+
+ </s:form>
+
+
+ </body>
+</html>
diff --git a/struts2examples/wildcard_method_selection/src/main/webapp/view.jsp b/struts2examples/wildcard_method_selection/src/main/webapp/view.jsp
new file mode 100644
index 0000000..4c5e7f6
--- /dev/null
+++ b/struts2examples/wildcard_method_selection/src/main/webapp/view.jsp
@@ -0,0 +1,60 @@
+<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
+<%
+String path = request.getContextPath();
+String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
+%>
+<%@ taglib prefix="s" uri="/struts-tags" %>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <base href="<%=basePath%>">
+ <title>View People</title>
+ <meta http-equiv="pragma" content="no-cache">
+ <meta http-equiv="cache-control" content="no-cache">
+ <meta http-equiv="expires" content="0">
+
+ </head>
+
+ <body>
+ <h3>People</h3>
+
+
+ <s:if test="personList.size > 0">
+ <ol>
+ <s:iterator value="personList">
+ <li>
+ <s:property value="firstName" />
+
+ <s:property value="lastName" />
+
+ <%--Put the name of the method we want to call
+ in front of Person. This action will cause
+ the method named edit to be called in the
+ ActionSupport class (see struts.xml) --%>
+ <s:url action="editPerson" var="editUrl">
+ <s:param name="id" value="id"/>
+ </s:url>
+
+ <s:url action="deletePerson" var="deleteUrl">
+ <s:param name="id" value="id"/>
+ </s:url>
+
+ <a href="<s:property value='#editUrl' />" >Edit</a>
+
+ <a href="<s:property value='#deleteUrl' />" >Delete</a>
+ </li>
+ </s:iterator>
+ </ol>
+ </s:if>
+
+ <%--Put the name of the method we want to call
+ in front of Person. This action will cause
+ the method named create to be called in the
+ ActionSupport class (see struts.xml) --%>
+ <s:url action="createPerson" var="newUrl">
+ <s:param name="id" value="0"/>
+ </s:url>
+
+ <p><a href="<s:property value='#newUrl' />" > Create new person.</a></p>
+ </body>
+</html>