You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by jo...@apache.org on 2015/05/28 20:15:19 UTC

[3/4] struts git commit: WW-4505 Add plugin to support bean validation

WW-4505 Add plugin to support bean validation

Add bean validation example to the showcase application


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/3219764e
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/3219764e
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/3219764e

Branch: refs/heads/master
Commit: 3219764efcbce65d703f829bc37d71ac4b270f3f
Parents: a7f03e3
Author: Johannes Geppert <jo...@gmail.com>
Authored: Thu May 28 20:12:53 2015 +0200
Committer: Johannes Geppert <jo...@gmail.com>
Committed: Thu May 28 20:12:53 2015 +0200

----------------------------------------------------------------------
 apps/showcase/pom.xml                           |  17 ++
 .../validation/BeanValidationExampleAction.java | 170 +++++++++++++++++++
 .../src/main/resources/struts-validation.xml    |   8 +
 apps/showcase/src/main/resources/struts.xml     |   2 +-
 .../WEB-INF/bean-validation/bean-validation.jsp |  57 +++++++
 .../src/main/webapp/WEB-INF/decorators/main.jsp |   3 +-
 .../src/main/webapp/WEB-INF/tags/ui/example.vm  |   2 -
 .../webapp/WEB-INF/tags/ui/exampleSubmited.vm   |   3 -
 .../validation/clientSideValidationExample.jsp  |   3 -
 .../validation/fieldValidatorsExample.jsp       |   2 -
 .../main/webapp/WEB-INF/validation/footer.jsp   |   8 -
 .../validation/nonFieldValidatorsExample.jsp    |   3 -
 .../webapp/WEB-INF/validation/quiz-basic.jsp    |   3 -
 .../WEB-INF/validation/quiz-client-css.jsp      |   3 -
 .../webapp/WEB-INF/validation/quiz-client.jsp   |   2 -
 .../webapp/WEB-INF/validation/quiz-success.jsp  |   2 -
 .../storeErrorsAcrossRequestCancel.jsp          |   2 -
 .../storeErrorsAcrossRequestExample.jsp         |   2 -
 .../validation/storeErrorsAcrossRequestOk.jsp   |   2 -
 .../successClientSideValidationExample.jsp      |   2 -
 .../successFieldValidatorsExample.jsp           |   2 -
 .../successNonFieldValidatorsExample.jsp        |  28 ++-
 .../successVisitorValidatorsExample.jsp         |  28 ++-
 .../validation/visitorValidatorsExample.jsp     |   2 -
 24 files changed, 281 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/pom.xml
----------------------------------------------------------------------
diff --git a/apps/showcase/pom.xml b/apps/showcase/pom.xml
index bf70001..e1c9b77 100644
--- a/apps/showcase/pom.xml
+++ b/apps/showcase/pom.xml
@@ -87,6 +87,11 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-bean-validation-plugin</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>
             <scope>provided</scope>
@@ -160,6 +165,18 @@
             </exclusions>
         </dependency>
 
+        <!-- BeanValidation Example -->
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>5.1.3.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish</groupId>
+            <artifactId>javax.el</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/java/org/apache/struts2/showcase/validation/BeanValidationExampleAction.java
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/java/org/apache/struts2/showcase/validation/BeanValidationExampleAction.java b/apps/showcase/src/main/java/org/apache/struts2/showcase/validation/BeanValidationExampleAction.java
new file mode 100644
index 0000000..b9f2b35
--- /dev/null
+++ b/apps/showcase/src/main/java/org/apache/struts2/showcase/validation/BeanValidationExampleAction.java
@@ -0,0 +1,170 @@
+/*
+ * $Id$
+ *
+ * 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.
+ */
+package org.apache.struts2.showcase.validation;
+
+import com.opensymphony.xwork2.ActionSupport;
+import org.apache.struts.beanvalidation.constraints.FieldMatch;
+import org.apache.struts2.convention.annotation.Action;
+import org.apache.struts2.convention.annotation.Namespace;
+import org.apache.struts2.convention.annotation.ParentPackage;
+import org.apache.struts2.convention.annotation.Result;
+import org.apache.struts2.interceptor.validation.SkipValidation;
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.NotBlank;
+import org.hibernate.validator.constraints.ScriptAssert;
+import org.hibernate.validator.constraints.URL;
+
+import javax.validation.constraints.*;
+import java.sql.Date;
+
+/**
+ * <!-- START SNIPPET: beanValidatationExample -->
+ */
+@Namespace("/bean-validation")
+@ParentPackage("bean-validation")
+@Action(results = {
+        @Result(name = "input", location = "bean-validation.jsp"),
+        @Result(name = "success", location = "/WEB-INF/validation/successFieldValidatorsExample.jsp")
+})
+@FieldMatch(first = "fieldExpressionValidatorField", second = "requiredValidatorField", message = "requiredValidatorField and fieldExpressionValidatorField are not matching")
+@ScriptAssert(lang = "javascript", script = "_this.dateValidatorField != null && _this.dateValidatorField.before(new java.util.Date())", message = "Date need to before now")
+public class BeanValidationExampleAction extends ActionSupport {
+
+    @NotNull
+    private String requiredValidatorField = null;
+
+    @NotBlank
+    private String requiredStringValidatorField = null;
+
+    @NotNull
+    @Min(1)
+    @Max(10)
+    private Integer integerValidatorField = null;
+
+    @NotNull
+    private Date dateValidatorField = null;
+
+    @NotNull
+    @Size(min = 4, max = 64)
+    @Email
+    private String emailValidatorField = null;
+
+    @NotNull
+    @Size(min = 4, max = 64)
+    @URL
+    private String urlValidatorField = null;
+
+    @NotNull
+    @Size(min = 2, max = 4)
+    private String stringLengthValidatorField = null;
+
+    @Pattern(regexp = "[^<>]+")
+    private String regexValidatorField = null;
+
+    private String fieldExpressionValidatorField = null;
+
+    @Action(value = "bean-validation", results = {
+            @Result(name = "success", location = "bean-validation.jsp")
+    })
+    @SkipValidation
+    public String beanValidation(){
+        return SUCCESS;
+    }
+
+    public Date getDateValidatorField() {
+        return dateValidatorField;
+    }
+
+    public void setDateValidatorField(Date dateValidatorField) {
+        this.dateValidatorField = dateValidatorField;
+    }
+
+    public String getEmailValidatorField() {
+        return emailValidatorField;
+    }
+
+    public void setEmailValidatorField(String emailValidatorField) {
+        this.emailValidatorField = emailValidatorField;
+    }
+
+    public Integer getIntegerValidatorField() {
+        return integerValidatorField;
+    }
+
+    public void setIntegerValidatorField(Integer integerValidatorField) {
+        this.integerValidatorField = integerValidatorField;
+    }
+
+    public String getRegexValidatorField() {
+        return regexValidatorField;
+    }
+
+    public void setRegexValidatorField(String regexValidatorField) {
+        this.regexValidatorField = regexValidatorField;
+    }
+
+    public String getRequiredStringValidatorField() {
+        return requiredStringValidatorField;
+    }
+
+    public void setRequiredStringValidatorField(String requiredStringValidatorField) {
+        this.requiredStringValidatorField = requiredStringValidatorField;
+    }
+
+    public String getRequiredValidatorField() {
+        return requiredValidatorField;
+    }
+
+    public void setRequiredValidatorField(String requiredValidatorField) {
+        this.requiredValidatorField = requiredValidatorField;
+    }
+
+    public String getStringLengthValidatorField() {
+        return stringLengthValidatorField;
+    }
+
+    public void setStringLengthValidatorField(String stringLengthValidatorField) {
+        this.stringLengthValidatorField = stringLengthValidatorField;
+    }
+
+    public String getFieldExpressionValidatorField() {
+        return fieldExpressionValidatorField;
+    }
+
+    public void setFieldExpressionValidatorField(
+            String fieldExpressionValidatorField) {
+        this.fieldExpressionValidatorField = fieldExpressionValidatorField;
+    }
+
+    public String getUrlValidatorField() {
+        return urlValidatorField;
+    }
+
+    public void setUrlValidatorField(String urlValidatorField) {
+        this.urlValidatorField = urlValidatorField;
+    }
+}
+
+/**
+ * <!-- END SNIPPET: beanValidatationExample -->
+ */
+
+

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/resources/struts-validation.xml
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/resources/struts-validation.xml b/apps/showcase/src/main/resources/struts-validation.xml
index ee40dc9..bab906e 100755
--- a/apps/showcase/src/main/resources/struts-validation.xml
+++ b/apps/showcase/src/main/resources/struts-validation.xml
@@ -4,6 +4,14 @@
 	"http://struts.apache.org/dtds/struts-2.3.dtd">
 	
 <struts>
+
+    <constant name="struts.beanValidation.providerClass" value="org.hibernate.validator.HibernateValidator"/>
+    <constant name="struts.beanValidation.ignoreXMLConfiguration" value="true"/>
+
+    <package name="bean-validation" extends="struts-bean-validation" namespace="/bean-validation">
+		<!-- Actions are configured via annotations -->
+	</package>
+
 	<package name="validation" extends="json-default" namespace="/validation">
         <action name="index">
             <result>/WEB-INF/validation/index.jsp</result>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/resources/struts.xml
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/resources/struts.xml b/apps/showcase/src/main/resources/struts.xml
index 4761eb3..5a12a9e 100644
--- a/apps/showcase/src/main/resources/struts.xml
+++ b/apps/showcase/src/main/resources/struts.xml
@@ -15,7 +15,7 @@
     <constant name="struts.custom.i18n.resources" value="globalMessages" />
     <constant name="struts.action.extension" value="action,," />
 
-    <constant name="struts.convention.package.locators.basePackage" value="org.apache.struts2.showcase.person" />
+    <constant name="struts.convention.package.locators.basePackage" value="org.apache.struts2.showcase" />
     <constant name="struts.convention.result.path" value="/WEB-INF" />
 
     <!-- Necessary for Showcase because default includes org.apache.struts2.* -->

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/bean-validation/bean-validation.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/bean-validation/bean-validation.jsp b/apps/showcase/src/main/webapp/WEB-INF/bean-validation/bean-validation.jsp
new file mode 100644
index 0000000..101ef23
--- /dev/null
+++ b/apps/showcase/src/main/webapp/WEB-INF/bean-validation/bean-validation.jsp
@@ -0,0 +1,57 @@
+<%@taglib prefix="s" uri="/struts-tags" %>
+<html>
+<head>
+    <title>Struts2 Showcase - Validation - Bean Validation Example</title>
+    <s:head theme="xhtml"/>
+</head>
+<body>
+
+<div class="page-header">
+    <h1>Field Validation Examples</h1>
+</div>
+
+<div class="container-fluid">
+    <div class="row-fluid">
+        <div class="span12">
+
+            <!-- START SNIPPET: beanValidatationExample -->
+
+            <h3>All Action Errors Will Appear Here</h3>
+            <s:actionerror/>
+            <hr/>
+
+            <h3>All Field Errors Will Appear Here</h3>
+            <s:fielderror/>
+            <hr/>
+
+            <h3>Field Error due to 'Required String Validator Field' Will Appear Here</h3>
+            <s:fielderror>
+                <s:param value="%{'requiredStringValidatorField'}"/>
+            </s:fielderror>
+            <hr/>
+
+            <h3>Field Error due to 'String Length Validator Field' Will Appear Here</h3>
+            <s:fielderror>
+                <s:param>stringLengthValidatorField</s:param>
+            </s:fielderror>
+            <hr/>
+
+            <s:form action="bean-validation-example" namespace="/bean-validation" method="POST" theme="xhtml">
+                <s:textfield label="Required Validator Field" name="requiredValidatorField"/>
+                <s:textfield label="Required String Validator Field" name="requiredStringValidatorField"/>
+                <s:textfield label="Integer Validator Field" name="integerValidatorField"/>
+                <s:textfield label="Date Validator Field" name="dateValidatorField"/>
+                <s:textfield label="Email Validator Field" name="emailValidatorField"/>
+                <s:textfield label="URL Validator Field" name="urlValidatorField"/>
+                <s:textfield label="String Length Validator Field" name="stringLengthValidatorField"/>
+                <s:textfield label="Regex Validator Field" name="regexValidatorField"/>
+                <s:textfield label="Field Expression Validator Field" name="fieldExpressionValidatorField"/>
+                <s:submit label="Submit" cssClass="btn btn-primary"/>
+            </s:form>
+
+            <!-- END SNIPPET: beanValidatationExample -->
+        </div>
+    </div>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp b/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp
index 0c296b1..b84cbee 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp
@@ -36,7 +36,6 @@
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
     <meta name="description" content="Struts2 Showcase for Apache Struts Project">
     <meta name="author" content="The Apache Software Foundation">
 
@@ -207,6 +206,8 @@
                                     <s:url var="visitorValidatorUrl" action="showVisitorValidatorsExamples" namespace="/validation"/>
                                     <s:url var="clientSideValidationUrl" action="clientSideValidationExample" namespace="/validation"/>
                                     <s:url var="storeMessageAcrossRequestExample" namespace="/validation" action="storeErrorsAcrossRequestExample"/>
+                                    <s:url var="beanValidationUrl" action="bean-validation" namespace="/bean-validation"/>
+                                    <li><s:a href="%{beanValidationUrl}">Bean Validation</s:a></li>
                                     <li><s:a href="%{fieldValidatorUrl}">Field Validators</s:a></li>
                                     <li><s:a href="%{clientSideValidationUrl}">Field Validators with client-side JavaScript</s:a></li>
                                     <li><s:a href="%{nonFieldValidatorUrl}">Non Field Validator</s:a></li>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/tags/ui/example.vm
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/ui/example.vm b/apps/showcase/src/main/webapp/WEB-INF/tags/ui/example.vm
index 64d6431..399c3cf 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/tags/ui/example.vm
+++ b/apps/showcase/src/main/webapp/WEB-INF/tags/ui/example.vm
@@ -27,8 +27,6 @@
 			    #sreset("cssClass=btn btn-danger")
 			#end
 
-			#surl ("id=url" "value=index.jsp")
-			<a href="${url}" class="btn btn-info"><i class="icon icon-arrow-left"></i> Back to index.jsp</a>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/tags/ui/exampleSubmited.vm
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/ui/exampleSubmited.vm b/apps/showcase/src/main/webapp/WEB-INF/tags/ui/exampleSubmited.vm
index 9646a4f..fc6d9f3 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/tags/ui/exampleSubmited.vm
+++ b/apps/showcase/src/main/webapp/WEB-INF/tags/ui/exampleSubmited.vm
@@ -51,9 +51,6 @@
 					</td>
 				</tr>
 			</table>
-
-			#surl ("id=url" "value=index.jsp")
-			#sa("href=${url}")Back to index.jsp#end
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/clientSideValidationExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/clientSideValidationExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/clientSideValidationExample.jsp
index f199c31..42103e8 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/clientSideValidationExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/clientSideValidationExample.jsp
@@ -54,9 +54,6 @@
 			</s:form>
 
 			<!-- END SNIPPET: fieldValidatorsExample -->
-
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/fieldValidatorsExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/fieldValidatorsExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/fieldValidatorsExample.jsp
index 13a29f0..f9332eb 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/fieldValidatorsExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/fieldValidatorsExample.jsp
@@ -54,8 +54,6 @@
             </s:form>
 
             <!-- END SNIPPET: fieldValidatorsExample -->
-
-            <s:include value="footer.jsp"/>
         </div>
     </div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/footer.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/footer.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/footer.jsp
deleted file mode 100644
index 20fa2ad..0000000
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/footer.jsp
+++ /dev/null
@@ -1,8 +0,0 @@
- <%@taglib prefix="s" uri="/struts-tags" %>
-
-<hr/>
-
-<s:url var="backToValidationExamples" action="list" namespace="/validation" />
-<s:url var="backToShowCase" action="showcase" namespace="/" />
-        
-<s:a href="%{backToValidationExamples}" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back To Validation Examples</s:a>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/nonFieldValidatorsExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/nonFieldValidatorsExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/nonFieldValidatorsExample.jsp
index 27c8f8b..7860b66 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/nonFieldValidatorsExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/nonFieldValidatorsExample.jsp
@@ -35,9 +35,6 @@
 
 
 			<!--  END SNIPPET: nonFieldValidatorsExample -->
-
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-basic.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-basic.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-basic.jsp
index e7cb1f9..5ec5aaa 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-basic.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-basic.jsp
@@ -29,9 +29,6 @@
 				<s:textfield label="Favorite color" name="answer"/>
 				<s:submit cssClass="btn btn-primary"/>
 			</s:form>
-
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client-css.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client-css.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client-css.jsp
index c675893..04d104c 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client-css.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client-css.jsp
@@ -24,9 +24,6 @@
 				<s:textfield label="Favorite color" name="answer"/>
 				<s:submit cssClass="btn btn-primary"/>
 			</s:form>
-
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client.jsp
index 27268b8..ceec697 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-client.jsp
@@ -25,8 +25,6 @@
 				<s:textfield label="Favorite color" name="answer"/>
 				<s:submit cssClass="btn btn-primary"/>
 			</s:form>
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-success.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-success.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-success.jsp
index 58180bb..6f3672d 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-success.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/quiz-success.jsp
@@ -18,8 +18,6 @@
 			Thank you, <b><s:property value="name"/></b>. Your answer has been submitted as:
 
 			<b><s:property value="answer"/></b>
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestCancel.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestCancel.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestCancel.jsp
index fd9fb55..23565a8 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestCancel.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestCancel.jsp
@@ -21,8 +21,6 @@
 
 			<s:url var="url" value="/validation/storeErrorsAcrossRequestExample.jsp" />
 			<s:a href="%{#url}">Try Again</s:a>
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestExample.jsp
index 939e0ac..7d2e7b4 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestExample.jsp
@@ -45,8 +45,6 @@
 				Because of the redirect,
 				the input values are not retained.
 			</p>
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestOk.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestOk.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestOk.jsp
index 6c5ddb1..27d4331 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestOk.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/storeErrorsAcrossRequestOk.jsp
@@ -21,8 +21,6 @@
 
 			<s:url var="url" value="/validation/storeErrorsAcrossRequestExample.jsp" />
 			<s:a href="%{#id}">Try Again</s:a>
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/successClientSideValidationExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/successClientSideValidationExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/successClientSideValidationExample.jsp
index cb56e9c..103785e 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/successClientSideValidationExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/successClientSideValidationExample.jsp
@@ -55,8 +55,6 @@
                 <td>Field Expression Validator Field: <s:property value="fieldExpressionValidatorField" /></td>
             </tr>
         </table>
-
-        <s:include value="footer.jsp" />
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/successFieldValidatorsExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/successFieldValidatorsExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/successFieldValidatorsExample.jsp
index f795bcc..2847d29 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/successFieldValidatorsExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/successFieldValidatorsExample.jsp
@@ -52,8 +52,6 @@
                 <td>Field Expression Validator Field: <s:property value="fieldExpressionValidatorField" /></td>
             </tr>
         </table>
-        
-        <s:include value="footer.jsp" />
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/successNonFieldValidatorsExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/successNonFieldValidatorsExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/successNonFieldValidatorsExample.jsp
index 4033300..95024f1 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/successNonFieldValidatorsExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/successNonFieldValidatorsExample.jsp
@@ -23,21 +23,19 @@
 		<div class="span12">
 
 			<table class="table table-striped table-bordered table-hover table-condensed">
-            <tr>
-                <td>Some Text: </td>
-                <td><s:property value="someText" /></td>
-            </tr>
-            <tr>
-                <td>Some Text Retyped: </td>
-                <td><s:property value="someTextRetype" /></td>
-            </tr>
-            <tr>
-                <td>Some Text Retyped Again: </td>
-                <td><s:property value="someTextRetypeAgain" /></td>
-            </tr>
-        </table>
-        
-        <s:include value="footer.jsp" />
+                <tr>
+                    <td>Some Text: </td>
+                    <td><s:property value="someText" /></td>
+                </tr>
+                <tr>
+                    <td>Some Text Retyped: </td>
+                    <td><s:property value="someTextRetype" /></td>
+                </tr>
+                <tr>
+                    <td>Some Text Retyped Again: </td>
+                    <td><s:property value="someTextRetypeAgain" /></td>
+                </tr>
+            </table>
 		</div>
 	</div>
 </div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/successVisitorValidatorsExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/successVisitorValidatorsExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/successVisitorValidatorsExample.jsp
index 6eecc62..1e8ad50 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/successVisitorValidatorsExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/successVisitorValidatorsExample.jsp
@@ -23,21 +23,19 @@
 		<div class="span12">
 
 			<table class="table table-striped table-bordered table-hover table-condensed">
-            <tr>
-                <td>User Name:</td>
-                <td><s:property value="user.name" /></td>
-            </tr>
-            <tr>
-                <td>User Age:</td>          
-                <td><s:property value="user.age" /></td>
-            </tr>
-            <tr>
-                <td>User Birthday:</td>
-                <td><s:property value="user.birthday" /></td>
-            </tr>
-        </table>
-        
-        <s:include value="footer.jsp" />
+                <tr>
+                    <td>User Name:</td>
+                    <td><s:property value="user.name" /></td>
+                </tr>
+                <tr>
+                    <td>User Age:</td>
+                    <td><s:property value="user.age" /></td>
+                </tr>
+                <tr>
+                    <td>User Birthday:</td>
+                    <td><s:property value="user.birthday" /></td>
+                </tr>
+            </table>
 
 		</div>
 	</div>

http://git-wip-us.apache.org/repos/asf/struts/blob/3219764e/apps/showcase/src/main/webapp/WEB-INF/validation/visitorValidatorsExample.jsp
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/webapp/WEB-INF/validation/visitorValidatorsExample.jsp b/apps/showcase/src/main/webapp/WEB-INF/validation/visitorValidatorsExample.jsp
index 06ee70e..c9db5fd 100644
--- a/apps/showcase/src/main/webapp/WEB-INF/validation/visitorValidatorsExample.jsp
+++ b/apps/showcase/src/main/webapp/WEB-INF/validation/visitorValidatorsExample.jsp
@@ -34,8 +34,6 @@
 			</s:form>
 
 			<!--  END SNIPPET: visitorValidatorsExample -->
-
-			<s:include value="footer.jsp"/>
 		</div>
 	</div>
 </div>