Added Spring Struts 2 example application

git-svn-id: https://svn.apache.org/repos/asf/struts/sandbox/trunk@1499432 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/struts2examples/pom.xml b/struts2examples/pom.xml
index 758c515..fcdd3a0 100644
--- a/struts2examples/pom.xml
+++ b/struts2examples/pom.xml
@@ -43,6 +43,7 @@
     <module>form_xml_validation</module>
     <module>wildcard_method_selection</module>
     <module>themes</module>
+    <module>spring_struts</module>
   </modules>
   
   	<dependencies>
diff --git a/struts2examples/spring_struts/README.txt b/struts2examples/spring_struts/README.txt
new file mode 100644
index 0000000..cb5053d
--- /dev/null
+++ b/struts2examples/spring_struts/README.txt
@@ -0,0 +1,16 @@
+This is the example project referred to in the
+Struts 2 documentation, Struts 2 Spring 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/spring_struts/index.action.
+
+You should see a web page with Welcome to Struts 2!
+
diff --git a/struts2examples/spring_struts/pom.xml b/struts2examples/spring_struts/pom.xml
new file mode 100644
index 0000000..6ba3a6b
--- /dev/null
+++ b/struts2examples/spring_struts/pom.xml
@@ -0,0 +1,28 @@
+<?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>spring_struts</artifactId>
+
+  <name>spring_struts</name>
+
+  <packaging>war</packaging>
+  
+  <dependencies>
+  		<dependency>
+			<groupId>org.apache.struts</groupId>
+			<artifactId>struts2-spring-plugin</artifactId>
+			<version>${struts2.version}</version>
+		</dependency>
+  </dependencies>
+      <build>
+		<finalName>spring_struts</finalName>
+	</build>
+
+</project>
diff --git a/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/action/EditAction.java b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/action/EditAction.java
new file mode 100644
index 0000000..c157d9e
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/action/EditAction.java
@@ -0,0 +1,108 @@
+package org.apache.struts.edit.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.struts.edit.model.Person;
+import org.apache.struts.edit.model.State;
+import org.apache.struts.edit.service.EditService;
+
+
+import com.opensymphony.xwork2.ActionSupport;
+
+/**
+ * Acts as a controller to handle actions
+ * related to editing a Person.
+ * @author bruce phillips
+ *
+ */
+public class EditAction extends ActionSupport {
+	
+	private static final long serialVersionUID = 1L;
+	
+	private EditService editService ;
+	
+	private Person personBean;
+	
+	private String [] sports = {"football", "baseball", "basketball" };
+	
+	private String [] genders = {"male", "female", "not sure" };
+	
+	private List<State> states ;
+
+	private String [] carModelsAvailable = {"Ford","Chrysler","Toyota","Nissan"};
+
+	public String execute() throws Exception {
+		
+	    editService.savePerson( getPersonBean() );
+		
+		return SUCCESS;
+		
+	}
+	
+	
+	public String input() throws Exception {
+		
+		setPersonBean( editService.getPerson() );
+		
+		return INPUT;
+	}
+	
+	public Person getPersonBean() {
+		
+		
+		return personBean;
+		
+	}
+	
+	public void setPersonBean(Person person) {
+		
+		personBean = person;
+		
+	}
+
+
+	public List<String> getSports() {
+		return Arrays.asList(sports);
+	}
+	
+	public List<String> getGenders() {
+		
+		return Arrays.asList(genders);
+		
+	}
+
+
+
+	public List<State> getStates() {
+		
+		states = new ArrayList<State>();
+		states.add( new State("AZ", "Arizona") );
+		states.add( new State("CA", "California") );
+		states.add( new State("FL", "Florida") );
+		states.add( new State("KS", "Kansas") );
+		states.add( new State("NY", "New York") );
+		
+		return states;
+	}
+
+
+
+	public String [] getCarModelsAvailable() {
+		return carModelsAvailable;
+	}
+
+
+	public EditService getEditService() {
+		return editService;
+	}
+
+
+	public void setEditService(EditService editService) {
+		
+		this.editService = editService;
+		
+	}
+
+}
diff --git a/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/model/Person.java b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/model/Person.java
new file mode 100644
index 0000000..392a8de
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/model/Person.java
@@ -0,0 +1,96 @@
+package org.apache.struts.edit.model;
+
+import java.util.Arrays;
+
+
+/**
+ * Models a Person who registers.
+ * @author bruce phillips
+ *
+ */
+public class Person
+{
+    private String firstName;
+    private String lastName;
+    private String sport;
+    private String gender;
+    private String residency;
+    private boolean over21;
+    private String [] carModels;
+ 
+
+    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 void setSport(String sport) {
+		this.sport = sport;
+	}
+
+	public void setGender(String gender) {
+		this.gender = gender;
+	}
+
+	public String getGender() {
+		return gender;
+	}
+
+	public String getSport() {
+		return sport;
+	}
+
+	public void setResidency(String residency) {
+		this.residency = residency;
+	}
+
+	public String getResidency() {
+		return residency;
+	}
+
+	public void setOver21(boolean over21) {
+		this.over21 = over21;
+	}
+
+	public boolean isOver21() {
+		return over21;
+	}
+
+	public void setCarModels(String [] carModels) {
+		this.carModels = carModels;
+	}
+
+	public String [] getCarModels() {
+		return carModels;
+	}
+
+	public String toString()
+    {
+        return "First Name: " + getFirstName() + " | " +
+        " Last Name:  " + getLastName() + " | " +
+        " Favorite Sport: " + getSport() + " | " +
+        " Gender: " + getGender() + " | " +  
+        " Residency: " + getResidency() + " | " +
+        " Over 21: " + isOver21()  + " | " +
+        " Car models: " + Arrays.asList( getCarModels() ) ;
+        
+    }
+}
diff --git a/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/model/State.java b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/model/State.java
new file mode 100644
index 0000000..bb927e1
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/model/State.java
@@ -0,0 +1,39 @@
+package org.apache.struts.edit.model;
+
+public class State {
+	
+	private String stateAbbr;
+	
+	private String stateName;
+	
+	public State (String stateAbbr, String stateName) {
+		
+		this.stateAbbr = stateAbbr;
+		this.stateName = stateName;
+		
+	}
+
+	public void setStateAbbr(String stateAbbr) {
+		this.stateAbbr = stateAbbr;
+	}
+
+	public String getStateAbbr() {
+		return stateAbbr;
+	}
+
+	public void setStateName(String stateName) {
+		this.stateName = stateName;
+	}
+
+	public String getStateName() {
+		return stateName;
+	}
+	
+	public String toString() {
+		
+		return getStateAbbr() ;
+		
+	}
+	
+
+}
diff --git a/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/service/EditService.java b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/service/EditService.java
new file mode 100644
index 0000000..f52e053
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/service/EditService.java
@@ -0,0 +1,12 @@
+package org.apache.struts.edit.service;

+

+import org.apache.struts.edit.model.Person;

+

+public interface EditService {

+	

+	

+	Person getPerson() ;

+

+	void savePerson(Person personBean);

+

+}

diff --git a/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/service/EditServiceInMemory.java b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/service/EditServiceInMemory.java
new file mode 100644
index 0000000..169b1d0
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/java/org/apache/struts/edit/service/EditServiceInMemory.java
@@ -0,0 +1,51 @@
+package org.apache.struts.edit.service;

+

+import org.apache.struts.edit.model.Person;

+

+/**

+ * Implement Services needed to edit and save

+ * a Person object's state.  In this implementation

+ * the Person object's state is stored in memory

+ * @author brucephillips

+ *

+ */

+public class EditServiceInMemory implements EditService {

+	

+	

+	private static Person person ;

+	private static String [] carModels = {"Ford","Nissan"};

+

+	

+	static {

+		

+		person = new Person();

+		person.setFirstName("Bruce");

+		person.setLastName("Phillips");

+		person.setSport("basketball");

+		person.setGender("not sure");

+		person.setResidency("KS");

+		person.setOver21(true);		

+		person.setCarModels( carModels);		

+

+	}

+

+	

+	public Person getPerson() {

+		

+		return EditServiceInMemory.person;

+	}

+

+

+	public void savePerson(Person personBean) {

+

+		EditServiceInMemory.person.setFirstName(personBean.getFirstName() );

+		EditServiceInMemory.person.setLastName(personBean.getLastName() );

+		EditServiceInMemory.person.setSport(personBean.getSport() );

+		EditServiceInMemory.person.setGender( personBean.getGender() );

+		EditServiceInMemory.person.setResidency( personBean.getResidency() );

+		EditServiceInMemory.person.setOver21( personBean.isOver21() );

+		EditServiceInMemory.person.setCarModels(personBean.getCarModels() );

+

+	}

+

+}

diff --git a/struts2examples/spring_struts/src/main/resources/log4j.dtd b/struts2examples/spring_struts/src/main/resources/log4j.dtd
new file mode 100644
index 0000000..1aabd96
--- /dev/null
+++ b/struts2examples/spring_struts/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/spring_struts/src/main/resources/log4j.xml b/struts2examples/spring_struts/src/main/resources/log4j.xml
new file mode 100644
index 0000000..2100cb2
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/resources/log4j.xml
@@ -0,0 +1,28 @@
+<?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.PatternLayout"> 
+          <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/> 
+       </layout> 
+    </appender>
+ 
+    <!-- specify the logging level for loggers from other libraries -->
+    <logger name="com.opensymphony">
+    	<level value="DEBUG" />
+    </logger>
+
+    <logger name="org.apache.struts2">
+    	 <level value="DEBUG" />
+    </logger>
+  
+   <!-- for all other loggers log only debug and above log messages -->
+     <root>
+        <priority value="INFO"/> 
+        <appender-ref ref="STDOUT" /> 
+     </root> 
+    
+</log4j:configuration> 
+
diff --git a/struts2examples/spring_struts/src/main/resources/org/apache/struts/edit/action/EditAction.properties b/struts2examples/spring_struts/src/main/resources/org/apache/struts/edit/action/EditAction.properties
new file mode 100644
index 0000000..82869db
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/resources/org/apache/struts/edit/action/EditAction.properties
@@ -0,0 +1,8 @@
+personBean.firstName=First name

+personBean.lastName=Last name

+personBean.sport=Favorite sport

+personBean.gender=Gender

+personBean.residency=State resident

+personBean.over21=21 or older

+personBean.carModels=Car models owned

+submit=Save Changes
\ No newline at end of file
diff --git a/struts2examples/spring_struts/src/main/resources/struts.xml b/struts2examples/spring_struts/src/main/resources/struts.xml
new file mode 100644
index 0000000..30c5e5d
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/resources/struts.xml
@@ -0,0 +1,29 @@
+<?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" />
+
+	<package name="basicstruts2" extends="struts-default">
+
+        <!-- If no class attribute is specified the framework will assume success and 
+        render the result index.jsp -->
+        <!-- If no name value for the result node is specified the success value is the default -->
+		<action name="index">
+			<result>/index.jsp</result>
+		</action>
+
+	    <action name="edit" class="org.apache.struts.edit.action.EditAction" method="input">
+	    	<result name="input">/edit.jsp</result>
+	    </action>
+	    
+	    <action name="save" class="org.apache.struts.edit.action.EditAction" method="execute">
+	    	<result name="success">/thankyou.jsp</result>
+	    </action>
+
+	</package>
+
+</struts>
\ No newline at end of file
diff --git a/struts2examples/spring_struts/src/main/webapp/META-INF/MANIFEST.MF b/struts2examples/spring_struts/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0

+Class-Path: 

+

diff --git a/struts2examples/spring_struts/src/main/webapp/WEB-INF/applicationContext.xml b/struts2examples/spring_struts/src/main/webapp/WEB-INF/applicationContext.xml
new file mode 100644
index 0000000..7f3f278
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/webapp/WEB-INF/applicationContext.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+            http://www.springframework.org/schema/beans
+            http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+<bean id="editService" class="org.apache.struts.edit.service.EditServiceInMemory" />
+
+</beans>
diff --git a/struts2examples/spring_struts/src/main/webapp/WEB-INF/web.xml b/struts2examples/spring_struts/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..e8cb9ce
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,25 @@
+<?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>Spring Struts 2</display-name>
+	
+	<welcome-file-list>
+		<welcome-file>index.jsp</welcome-file>
+	</welcome-file-list>
+	
+	<listener>
+		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+	</listener>
+
+	<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/spring_struts/src/main/webapp/edit.jsp b/struts2examples/spring_struts/src/main/webapp/edit.jsp
new file mode 100644
index 0000000..d4bb1d1
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/webapp/edit.jsp
@@ -0,0 +1,29 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+    pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="s" uri="/struts-tags" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<s:head />
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Struts 2 Form Tags - Edit Person</title>
+
+</head>
+<body>
+<h1>Update Information</h1>
+
+<p>Use the form below to edit your information.</p>
+
+<s:form action="save" method="post" theme="xhtml">
+<s:textfield key="personBean.firstName" /> 
+<s:textfield key="personBean.lastName" /> 
+<s:select key="personBean.sport" list="sports" />
+<s:radio key="personBean.gender" list="genders" />
+<s:select key="personBean.residency" list="states" listKey="stateAbbr" listValue="stateName" />
+<s:checkbox key="personBean.over21" />
+<s:checkboxlist key="personBean.carModels" list="carModelsAvailable"  />
+<s:submit key="submit" />
+</s:form>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/struts2examples/spring_struts/src/main/webapp/index.jsp b/struts2examples/spring_struts/src/main/webapp/index.jsp
new file mode 100644
index 0000000..88209d8
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/webapp/index.jsp
@@ -0,0 +1,16 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+    pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="s" uri="/struts-tags" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Struts 2 Form Tags - Welcome</title>
+</head>
+<body>
+<h1>Welcome To Struts 2!</h1>
+
+<p><a href='<s:url action="edit" />' >Edit your information</a></p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/struts2examples/spring_struts/src/main/webapp/template/KUTheme/checkboxlist.ftl b/struts2examples/spring_struts/src/main/webapp/template/KUTheme/checkboxlist.ftl
new file mode 100644
index 0000000..0ee118a
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/webapp/template/KUTheme/checkboxlist.ftl
@@ -0,0 +1,4 @@
+<#include "/${parameters.templateDir}/xhtml/controlheader.ftl" />
+
+<#include "/${parameters.templateDir}/KUTheme_simple/checkboxlist.ftl" />
+    <#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" /><#nt/>
\ No newline at end of file
diff --git a/struts2examples/spring_struts/src/main/webapp/template/KUTheme_simple/checkboxlist.ftl b/struts2examples/spring_struts/src/main/webapp/template/KUTheme_simple/checkboxlist.ftl
new file mode 100644
index 0000000..033f14c
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/webapp/template/KUTheme_simple/checkboxlist.ftl
@@ -0,0 +1,38 @@
+<#assign itemCount = 0/>
+<#if parameters.list??>
+    <@s.iterator value="parameters.list">
+        <#assign itemCount = itemCount + 1/>
+        <#if parameters.listKey??>
+            <#assign itemKey = stack.findValue(parameters.listKey)/>
+        <#else>
+            <#assign itemKey = stack.findValue('top')/>
+        </#if>
+        <#if parameters.listValue??>
+            <#assign itemValue = stack.findString(parameters.listValue)?default("")/>
+        <#else>
+            <#assign itemValue = stack.findString('top')/>
+        </#if>
+<#assign itemKeyStr=itemKey.toString() />
+<input type="checkbox" name="${parameters.name?html}" value="${itemKeyStr?html}" id="${parameters.name?html}-${itemCount}"<#rt/>
+        <#if tag.contains(parameters.nameValue, itemKey)>
+ checked="checked"<#rt/>
+        </#if>
+        <#if parameters.disabled?default(false)>
+ disabled="disabled"<#rt/>
+        </#if>
+        <#if parameters.title??>
+ title="${parameters.title?html}"<#rt/>
+        </#if>
+        <#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
+        <#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
+/>
+<label for="${parameters.name?html}-${itemCount}" style="color:red;font-weight:bold">${itemValue?html}</label> <br />
+    </@s.iterator>
+<#else>
+  &nbsp;
+</#if>
+<input type="hidden" id="__multiselect_${parameters.id?html}" name="__multiselect_${parameters.name?html}" value=""<#rt/>
+<#if parameters.disabled?default(false)>
+ disabled="disabled"<#rt/>
+</#if>
+ /> 
\ No newline at end of file
diff --git a/struts2examples/spring_struts/src/main/webapp/thankyou.jsp b/struts2examples/spring_struts/src/main/webapp/thankyou.jsp
new file mode 100644
index 0000000..5fa306f
--- /dev/null
+++ b/struts2examples/spring_struts/src/main/webapp/thankyou.jsp
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<%@ taglib prefix="s" uri="/struts-tags" %>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+    pageEncoding="ISO-8859-1"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Update Successful</title>
+</head>
+<body>
+
+<h1>Updated Information</h1>
+
+
+<p>Your information: <s:property value="personBean" /> </p>
+
+<p><a href="<s:url action='index' />" >Return to home page</a>.</p>
+
+</body>
+</html>
\ No newline at end of file