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>