mirror of
https://github.com/apache/struts.git
synced 2026-08-06 07:06:58 +00:00
WW-4505 Add plugin to support bean validation
Add bean validation example to the showcase application
This commit is contained in:
@@ -86,6 +86,11 @@
|
||||
<artifactId>struts2-spring-plugin</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-bean-validation-plugin</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>servlet-api</artifactId>
|
||||
@@ -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>
|
||||
|
||||
+170
@@ -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 -->
|
||||
*/
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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.* -->
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -51,9 +51,6 @@
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
#surl ("id=url" "value=index.jsp")
|
||||
#sa("href=${url}")Back to index.jsp#end
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -54,9 +54,6 @@
|
||||
</s:form>
|
||||
|
||||
<!-- END SNIPPET: fieldValidatorsExample -->
|
||||
|
||||
|
||||
<s:include value="footer.jsp"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -54,8 +54,6 @@
|
||||
</s:form>
|
||||
|
||||
<!-- END SNIPPET: fieldValidatorsExample -->
|
||||
|
||||
<s:include value="footer.jsp"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -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>
|
||||
@@ -35,9 +35,6 @@
|
||||
|
||||
|
||||
<!-- END SNIPPET: nonFieldValidatorsExample -->
|
||||
|
||||
|
||||
<s:include value="footer.jsp"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -45,8 +45,6 @@
|
||||
Because of the redirect,
|
||||
the input values are not retained.
|
||||
</p>
|
||||
|
||||
<s:include value="footer.jsp"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -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>
|
||||
|
||||
-2
@@ -55,8 +55,6 @@
|
||||
<td>Field Expression Validator Field: <s:property value="fieldExpressionValidatorField" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<s:include value="footer.jsp" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -52,8 +52,6 @@
|
||||
<td>Field Expression Validator Field: <s:property value="fieldExpressionValidatorField" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<s:include value="footer.jsp" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+13
-15
@@ -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>
|
||||
|
||||
+13
-15
@@ -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>
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
</s:form>
|
||||
|
||||
<!-- END SNIPPET: visitorValidatorsExample -->
|
||||
|
||||
<s:include value="footer.jsp"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user