struts 2에서는 validation을 구현하는 방법은 3가지가 있다.
① Developer logic에 의한 검증방식
② Annotation방식으로 검증하는 방법
③ xml방식으로 검증하는 방법
Developer Logic에 의한 방식은 개발자가 직접 검증 로직을 개발하는 부분으로서 인증되지 않은 검증 로직을 실행하기 때문에 안전하지 않고 아래 두가지의 방법(Annotation,xml)방식을 많이 사용한다.
모든 validation message는 jsp 페이지에서 </fielderror>태그를 통해 출력할 수 있다.
1. Developer Logic에 의한 검증 방식
Action Class에러 에러가 발생하게 되면 ActionError 나 FieldError에 에러메시지를 쌓고 client에게 보내준다.
1. jsp 페이지 설정
태그 라이브 러리를 추가 하고 <s:actionerror> 태그나 <s:fielderror>태그로 에러메시지를 출력한다.
-----------------------------------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=euc-kr"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<body>
<center><br><br>
<h3><b>Struts2 Validator (register)</b></h3>
<!--
액션이름을 다음과 같이 설정한다.
개발자 검증 : developer.action
어노테이션 검증 : annotation.action
XML 검증 : xml.action
-->
<form method="post" name="regform" action="developer.action">
<table border=0 cellpadding=0 cellspacing=1 bgcolor="#000000">
<tr height=30 bgcolor="#ffffff">
<td align="left" colspan=2>
<span style="font-size:10pt; color:red">
<s:fielderror/>
</span>
</td>
</tr>
<tr height=30 bgcolor="#ffffff">
<td width=100 align="right"><b>성명</b> </td>
<td width=300 align="left">
<input type="text" name="name" value="${name}">
<!-- <s:fielderror name="name" />-->
</td>
</tr>
<tr height=30 bgcolor="#ffffff">
<td width=100 align="right"><b>나이</b> </td>
<td width=300 align="left">
<input type="text" name="age" value="${age}">
</td>
</tr>
<tr height=30 bgcolor="#ffffff">
<td width=100 align="right"><b>이메일</b> </td>
<td width=300 align="left">
<input type="text" name="email" value="${email}" size=35>
</td>
</tr>
<tr height=30 bgcolor="#ffffff">
<td align="center" colspan=2>
<input type="submit" value="등록...">
<input type="button" value="새로고침" onclick="javascript:location.href='index.action'">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
-----------------------------------------------------------------------------------------------------------
<s:fielderror>태그를 사용하면 쌓인 에러 메시지가 한번에 출력되는 반면
<s:fielderror name="name"> 이렇게 설정하면 action class에서 name으로 설정된 property 에러만 출력하게 된다.
2. Validator Logic을 수행할 ActionClass 생성
-----------------------------------------------------------------------------------------------------------
/**
* 개발자가 직접 로직에 의해 폼 검증을 수행하는 방식
* 수행방법)
* 1) 각 프로퍼티를 이용한 유효한 값인지 로직을 구현한다.
* 2) 유효하지 않는 프로퍼티가 존재하면 다음과 같이 메소드를 호출한다.
* this.addFieldError("필드명", "전달할 메시지")
* 3) execute() 메소드에서 다음과 같이 result 값을 리턴한다.
* - success : 성공시
* - input & error : 실패시
*
*/
package com.myhome.validator.actions;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class DeveloperRegisterAction extends ActionSupport{
/*JSP에서 데이터를 받기위한 property*/
private String name;
private int age;
private String email;
@Override
public String execute() throws Exception {
if(!this.isValidators()) return ERROR;
return SUCCESS;
}
protected boolean isValidators(){
boolean flag = true;
if(!this.isNameInvalid()){
this.addFieldError("name", "이름은 2글자 이상입니다.");
flag = false;
}
if(!this.isEmailInvalid()){
this.addFieldError("email", "이메일 형식에 맞지 않습니다.");
flag = false;
}
if(!this.isAgeInvalid()){
this.addFieldError("age", "등록할 수 없는 나이입니다.");
flag = false;
}
return flag;
}
//이름 검증 부분
//2자 이상인지 검증한다.
protected boolean isNameInvalid(){
if(name == null) return false;
if(name.length() < 2) return false;
return true;
}
//나이 검증 부분
//20세부터 80세 까지만 허용한다
protected boolean isAgeInvalid(){
if(age < 20 || age < 80) return false;
return true;
}
//이메일을 검증한다.
protected boolean isEmailInvalid(){
if(email == null) return false;
int idx = email.indexOf('@');
if(idx == -1) return false;
return true;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
-----------------------------------------------------------------------------------------------------------
3. validator.xml 파일을 생성한후 package와 action을 설정한다.
-----------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- name 이 중복되면 안된다. -->
<package name="validator" namespace="/validator" extends="struts-default">
<action name="index">
<result>/WEB-INF/validator/register.jsp</result>
</action>
<action name="register"
class="com.myhome.validator.actions.DeveloperRegisterAction"
method="execute"><!-- 메소드가 execute가 아니면 무조건 써야된다.? -->
<result name="success">/WEB-INF/validator/result.jsp</result><!-- name 이 있어야 한다. 반드시 세개가 와야한다.-->
<result name="input">/WEB-INF/validator/register.jsp</result>
<result name="error">/WEB-INF/validator/register.jsp</result>
</action>
</package>
</struts>
-----------------------------------------------------------------------------------------------------------
- package name은 다른 xml파일과 이름이 중복 되면 안된다.
- method 는 class에서 선언한 class의 execute라는 메소드를 실행시키겠다는 뜻
- result name은 위에 처러 3가지가 모두 선언되어 있어야 한다.
4. struts.xml 파일에 위의 xml파일 추가
2.Annotation을 통한 validation 방법
-----------------------------------------------------------------------------------------------------------
ActionSupport class를 상속한 Action Class의 getter method 상단에 @(annotation) 과 같은 형태로 미리 선언된 validation logic을 실행 할 수 있도록한다.
1) ActionSupport class를 상속한 Action class 생성
/*
* 어노테이션 방식으로 폼 겅증 방식
* 사용방법)
* 1) 현재 액션 클래스에서 어노테이션을 수행한다고 주석달기를 선언한다.
* @Validation
* public class ....{}
*
* 2) 검증할 getter 메소드 위에서 해당된 어노테이션을 설정한다.
* @requiredFieldValidator(message="메시지")
* public String getName(){..."
*
* */
package com.myhome.validator.actions;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.EmailValidator;
import com.opensymphony.xwork2.validator.annotations.IntRangeFieldValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;
import com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator;
import com.opensymphony.xwork2.validator.annotations.Validation;
import com.opensymphony.xwork2.validator.annotations.ValidatorType;
@SuppressWarnings("serial")
@Validation
public class AnnotationRegisterAction extends ActionSupport{
private String name;
private int age;
private String email;
@Override
public String execute() throws Exception {
return SUCCESS;
}
@RequiredFieldValidator( message="이름은 필수 항목 입니다.", type=ValidatorType.FIELD) //사용자에게 보내질 메시지
@StringLengthFieldValidator( message="존재하지 않는 이름입니다.",trim=true, minLength="2")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@IntRangeFieldValidator( message="등록할 수 없는 나이 입니다.",
min="20",
max="80")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@EmailValidator(message="메일 형식이 맞지 않습니다.")
@RequiredFieldValidator(message="메일을 입력하세요!!")//아무것도 들어오지 않는 것을 확인한다.
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
-----------------------------------------------------------------------------------------------------------
여러가지 기능들을 하는 validation이 많기 때문에 더 확인 하려면 API의
com.opensymphony.xwork2.validator.annotations
패키지로 찾아 들어가 확인해야 한다.
2) validator.xml 파일에 action 생성
<action name="annotation"
class="com.myhome.validator.actions.AnnotationRegisterAction"
method="execute"><!-- 메소드가 execute가 아니면 무조건 써야된다.? -->
<result name="success">/WEB-INF/validator/result.jsp</result><!-- name 이 있어야 한다. 반드시 세개가 와야한다.-->
<result name="input">/WEB-INF/validator/register.jsp</result>
<result name="error">/WEB-INF/validator/register.jsp</result>
</action>
3)struts.xml파일에 xml파일 추가
3. xml을 통한 validation방식
만약 ActionSupport Class를 상속한 Action class 이름이 RegisterAction 일때 이 Action class의 validation을 수행하는 xml 파일의 이름은 반드시
(ActionClass Name)-validation.xml 이어야 한다.
즉
RegisterAction-validation.xml 파일이어야지 자동적으로 validation을 수행할 xml 파일이 로딩된다. 또한 xml 파일은 ActionClass와 같은 패키지 안에 존재해야 로딩이 된다.
1) (ActionClass Name)-validation.xml 파일 생성하기
-----------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="EUC-KR"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="name">
<!--문자가 널일 경우만 처리한다.-->
<field-validator type="requiredstring"> <!-- 미리정해진 타입인 requiredstring으로 처리한다(null을 걸러냄) -->
<param name="trim">true</param> <!-- trim은 white space를 모두 제거 한다. -->
<message>이름 입력오류!!!</message> <!-- 다음과 같은 오류가 발생하였을때 보여줄 메시지 -->
</field-validator>
<field-validator type="stringlength"> <!-- 문자 길이를 제어하는 validation -->
<param name="minLength">2</param>
<param name="trim">true</param>
<message>이름은 최소 2자 이상 입력해야 합니다.</message>
</field-validator>
</field>
<field name="age">
<!--정수를 체크할 때 사용된다.-->
<field-validator type="int">
<param name="min">20</param>
<param name="max">80</param>
<message>금지된 나이오류!!!</message>
</field-validator>
</field>
<field name="email">
<!--메일형식에 맞지 않을 때 체크한다.-->
<field-validator type="email">
<message>메일형식에 맞지 않습니다.!!!</message>
</field-validator>
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>메일을 입력하세요!</message>
</field-validator>
</field>
</validators>
-----------------------------------------------------------------------------------------------------------
field-name 은 ActionClass의 property명과 같아야 한다.
위에서 정의한 룰을 더 보고 싶다면
http://struts.apache.org/2.0.14/docs/validation.html 중에 defining Validatio Rules 참조 하면 된다.
2) 일반적인 ActionSupport class를 상속받은 Action Class 생성
3) validation.xml파일에서 action 설정(위와 같이 하면 됨)
4) struts.xml파일에 include 함