struts 2 - properties 파일

Published on: 2009. 7. 5. 16:22 by louis.dev

확장자가 properties로 끝나는 파일은 xml이 로딩될때 그에 대항하는 option값을 적용하는데 사용한다.

struts 2에 각각 xml에 대한 properties파일의 작명은

(xml파일이름)+.properties

형식으로 하게 된다.
예 ) xml파일이 upload.xml 이라고 한다면 properties 파일의 이름은 upload.properties 여야 한다.

그래야 was 가 실행이 될때 xml을 로딩하면서 이름이 같은 properties 파일의 이름을 찾아 함께 로딩하게 된다. 물론 xml과 properties 파일이 같은 패키지에 존재 해야 한다.

하지만 만약 properties 파일의 이름이 global.properties 혹은 package.properties라면 xml문서와 상관없이 어느 위치에 있던 상관없이 properties파일을 읽어 들일수 있다.

'Framework > STRUTS 2' 카테고리의 다른 글

struts 2 - Tiles Plug in  (6) 2009.07.08
struts 2 - Interceptor  (3) 2009.07.06
struts 2 - upload & download  (0) 2009.07.05
struts 2 - session 사용하기  (1) 2009.07.05
struts 2 - action을 선언한 xml에서 result property 들  (0) 2009.07.05

struts 2 - upload & download

Published on: 2009. 7. 5. 16:17 by louis.dev


작업순서
1. upload 하기 위한 library 파일을 추가한다.
www.apache.org --> commons --> io 와 FileUpload library를 다운받아 추가 한다.

2. FormBean class를 생성한다

--------------------------------------------------------------------------------------------------
package com.myhome.upload.beans;

import java.io.File;

 

public class UploadFormBean {

 //form property 설정
 private int      num;
 private String name;
 private String sex;
 private String tel;
 
 /*file upload property*/
 private File   file;
 private String fileFileName;
 private long   fileFileSize;
 private String fileContentType;

 
 
 public int getNum() {
  return num;
 }
 public void setNum(int num) {
  this.num = num;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
 public File getFile() {
  return file;
 }
 public void setFile(File file) {
  this.file = file;
 }
 public String getFileFileName() {
  return fileFileName;
 }
 public void setFileFileName(String fileFileName) {
  this.fileFileName = fileFileName;
 }
 public long getFileFileSize() {
  return fileFileSize;
 }
 public void setFileFileSize(long fileFileSize) {
  this.fileFileSize = fileFileSize;
 }
 public String getFileContentType() {
  return fileContentType;
 }
 public void setFileContentType(String fileContentType) {
  this.fileContentType = fileContentType;
 }
 
 
}
--------------------------------------------------------------------------------------------------
file 을 저장하는 property 부분을 오면
private File   file;
private String fileFileName;
private long   fileFileSize;
private String fileContentType;
다음과 같이 선언되어 있는데 fileName,fileSiz,ContentType의 이름은 private File file + property 이름을 하면 자동으로 파일에 대한 정보가 맵핑이 된다.
즉 file + FileName
         + FileSize
         + Contenttype
으로 선언해야 자동으로 파일에 대한 정보가 들어가게 된다.

3. DTO를 생성한다.

4. DB에 접근할 DAO를 생성한다.

5. SqlMap 파일 생성

[option]
6. properties 파일을 만든다.
# upload project message bundle
# file name ; package.properties

register.title=Struts2 File Upload (Register)
register.name=성 명
register.sex=성 별
register.tel=연락처
register.file=첨부

error.name=성명은 필수 입력항목입니다.
error.name.length=잘못 입력된 성명입니다.
error.tel=연락처를 입력하세요!!!
error.tel.length=사용할 수 없는 번호 입니다.

# native2ascii -encoding euc-kr package.properties package_ko.properties

다음과 같이 생성한 후에 jsp 페이지에서 <s:text name="register.name" /> 접근하면 properties파일에 생성된 register.name이란 키 값으로 텍스트를 출력한다.

properties파일은 xml 파일의 옵션을 설정함으로서 xml파일이름+.properties 란 이름으로 지정된다. 이렇게 되었을때 xml을 로딩할때 같은 패키지에 같은 이름의 properties파일이 있게 되면 이때 같이 로딩이된다.
여기서 properties 파일 이름을 global.properties나  package.properties 파일로 지정하게 면 was가 실행될때 자동으로 로딩되어 설정을 사용할 수 있게 된다.


7. upload.xml파일 생성 후 struts.xml에 추가

8. UploadUtil class 생성

package com.myhome.upload.util;

public final class UploadUtil {
 
 public static final String SAVE = "D://JAVA/Java Web2/edu/uploadTest/";
 
 public static final long SIZE = 1024 * 1024 *20;
}


9.uploadAction class 생성
--------------------------------------------------------------------------------------------------
package com.myhome.upload.actions;

import java.io.File;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import com.myhome.upload.beans.UploadFormBean;
import com.myhome.upload.dao.UploadDAO;
import com.myhome.upload.dto.UploadDTO;
import com.myhome.upload.util.UploadUtil;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class UploadMultiAction extends ActionSupport{

 public static final Log log = LogFactory.getLog(UploadMultiAction.class);
 
 private UploadFormBean bean;
 private UploadDTO dto;
 /*
  * 등록부분
  * */
 public String register() throws Exception{

//jsp페이지로 들어온 정보는 bean에 저장된다.

  dto = new UploadDTO();
  BeanUtils.copyProperties(dto, bean);      //bean의 정보를 dto에 저장한다.
  if(bean.getFile() != null){
   upload();
  }else{
   dto.setFileName("");
   dto.setFileSize(0L);
  }
  new UploadDAO().insert(dto);
  return SUCCESS;
 }

 protected void upload() throws Exception{
/*bean이 참조하고 있는 파일을 실제 파일로 얻어온다.*/
  File file = new File(UploadUtil.SAVE + bean.getFileFileName());       
/*templete에는 파일을 실제파일로 복사여 폴더에 저장한다.*/
  FileUtils.copyFile(bean.getFile(), file);
   /*templete에 있는 파일을 삭제한다.*/
FileUtils.forceDelete(bean.getFile());
 
/*DB에 저장하기 위해 빈으로 부터 파일과 크기를 받는다.*/
  dto.setFileName(file.getName());
  dto.setFileSize(file.length());
 }
 
 public UploadFormBean getBean() {
  return bean;
 }

 public void setBean(UploadFormBean bean) {
  this.bean = bean;
 }

 public UploadDTO getDto() {
  return dto;
 }
 
 
}
--------------------------------------------------------------------------------------------------


2. File Download

File Download 는 일반 html 처럼 <a>태그로 파일의 주소를 링크걸어 사용하는 것이 아니라 FileInputStream을 이용하여 사용자에게 직접 Stream을 쏴주는 방법을 채택하고 있다.

1) jsp 페이지에서 download Action 요청
jsp페이지로부터 Download Action을 요청하면 xml의 ActionMapping을 통하여 ActionClass가 실행된다.

2) ActionMpping을 수행할 xml문서를 생성한다.

<action name="download"
       class="com.myhome.upload.actions.DownloadAction"
       method = "execute">
     
      <!-- type : stream으로 설정하면 Action class의 InputStream을 받아온다  --> 
      <result name="success" type="stream">
          <param name="contentType">application/octet-stream</param> <!-- 이렇게 하지 않으면 다운로드 안된다 -->
          <param name="contentLength">${contentLength}</param>
          <param name="contentDisposition">${contentDisposition}</param>
          <param name="bufferSize">4096</param>  <!-- 버퍼사이즈 적용 -->
      </result>
     </action>
 
param-name의 이름으로 다음과 같은 값을을 jsp페이지로 리턴하게 된다. 위의 값은 Action class에서 정의한 property들이다.

3) Actios Class 생성

File을 InputStream으로 쏴줄 Class 파일이다.
이중에서 다음과 같은 프로퍼티와 getter 와 setter는 반드시 설정되어 있어야 한다.
private InputStream inputStream;
private int              contentLength;
private String          contentDisposition;

다음과 같은 프로퍼티와 getter와 setter가 있어야 Action의 다음단계인 Result로 데이터를 쏴줄수가 있게 된다.

--------------------------------------------------------------------------------------------------
package com.myhome.upload.actions;

import com.opensymphony.xwork2.ActionSupport;

import com.myhome.upload.util.UploadUtil;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;

public class DownloadAction extends ActionSupport {
 
 private static final long serialVersionUID = 1L;
 
 /*form property fields*/
 private String filename;
 
 /*result property fields*/
 private InputStream inputStream;
 private int   contentLength;
 private String   contentDisposition;

 
 @Override
 public String execute()throws Exception {
  if(filename != null){
   download();
  }
  return SUCCESS;
 }

 public void download()throws Exception {
     /*form param으로 설정된 파일을 받는다.*/
    String encFile = filename;
   
    /*encFile를 실제 파일로 객체를 생성한다.*/
    File file = new File(UploadUtil.SAVE+encFile);
   
    /*contentLength를 설정한다.
     * 설정하지 않으면  다운로드 되지 않는다.
     * */

    setContentLength((int)file.length());
   
    /*어떤 파일이든지 다운로드가 되도록 어터치한다.*/
    setContentDisposition("attachment;filename=" + toEng(file.getName())+";");
   
    /*실제 다운로드를 받기 위해 스트림한다.*/
    setInputStream(new FileInputStream(UploadUtil.SAVE+file.getName()));
 }
 
 public String getFilename() {
  return filename;
 }

 public void setFilename(String filename) {
  this.filename = filename;
 }

 public InputStream getInputStream() {
  return inputStream;
 }

 public void setInputStream(InputStream inputStream) {
  this.inputStream = inputStream;
 }

 public int getContentLength() {
  return contentLength;
 }

 public void setContentLength(int contentLength) {
  this.contentLength = contentLength;
 }

 public String getContentDisposition() {
  return contentDisposition;
 }

 public void setContentDisposition(String contentDisposition) {
  this.contentDisposition = contentDisposition;
 }
 /*decoding 처리 해줌(MS949 -> ISO 8859_1)*/
 protected String toEng(String data){
  try{
   data = new String(data.getBytes("MS949"),"ISO8859_1");
  }catch(Exception e){
   
  }
  return data;
 }
}

--------------------------------------------------------------------------------------------------

'Framework > STRUTS 2' 카테고리의 다른 글

struts 2 - Interceptor  (3) 2009.07.06
struts 2 - properties 파일  (1) 2009.07.05
struts 2 - session 사용하기  (1) 2009.07.05
struts 2 - action을 선언한 xml에서 result property 들  (0) 2009.07.05
struts 2 - validator  (0) 2009.07.03

struts 2 - session 사용하기

Published on: 2009. 7. 5. 14:32 by louis.dev


일반적인 JSP 나 strusts1, Spring에서 Controller 에서 session을 처리하는 방법은 servlet 기반의 HttpServletRequest를 통해 session을 생성해서 써야 했다.

하지만 servlet기반이 아닌 struts 2는 ActionContext 라는 class를 사용해서 session을 생성하고 사용한다..

Action 에서 ActionContext를 통해 Map형식의 Session을 생성한후 Intercepter로 이동하여 session 객체에 담기게 된다.


1)ActionContext를 사용하여 session을 생성한 Action class 예제

---------------------------------------------------------------------------------------------------------
package com.myhome.login.actions;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class LoginMultiAction extends ActionSupport{
 
 private String id;
 private String passwd;
 
 
 /**
  * index 부분
  *
  */
 public String index() throws Exception{
  
  //session 값을 얻어 와서 id가 있으면 결과 페이지로 없으면 로그인 페이지로 이동
  if(ActionContext.getContext().getSession().get("id") == null)   //session에 id라는 이름의 value가 없으면 
   return LOGIN;
  
  return SUCCESS;
 }
 /**
  * login 부분
  *
  */
 
 @SuppressWarnings("unchecked")
 public String login() throws Exception{
  //session 생성을 위해서 ActionContext 사용
  ActionContext context = ActionContext.getContext();          //getContext() 메소드를 통해 ActionContext instance를 생성할 수 있다.
  //struts2에서 session type이 map형식이기 때문에 getSession을 통해 리턴 받는다.
  Map<String, String> session = context.getSession();
  //아래와 같이 HashMap을 통해서 session을 생성해도 된다.
  //Map<String, String> session = new HashMap<String, String>();

  
  session.put("id", id);
  session.put("passwd",passwd);
  context.setSession(session);
  
  return SUCCESS;
 }
 /**
  * logout 부분
  */
 @SuppressWarnings("unchecked")
 public String logout() throws Exception{
  ActionContext context = ActionContext.getContext();
  Map<String, String> session = (Map<String, String>)context.getSession();
  if(session.get("id") != null){
   session.remove("id");
   session.remove("passwd");
  }
  context.setSession(session);
  return SUCCESS;
 }
 
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getPasswd() {
  return passwd;
 }
 public void setPasswd(String passwd) {
  this.passwd = passwd;
 }
 
 
}
---------------------------------------------------------------------------------------------------------

'Framework > STRUTS 2' 카테고리의 다른 글

struts 2 - properties 파일  (1) 2009.07.05
struts 2 - upload & download  (0) 2009.07.05
struts 2 - action을 선언한 xml에서 result property 들  (0) 2009.07.05
struts 2 - validator  (0) 2009.07.03
struts 2 - annotation설정  (0) 2009.07.03

struts 2 - action을 선언한 xml에서 result property 들

Published on: 2009. 7. 5. 14:04 by louis.dev

일반적으로
1)<result name="success" type="dispatcher">/WEB-INF/login/login.jsp</result>
dispatcher는 type의 defalte값이다. jsp의 풀경로를 써준다.

2)<result name="success" type="redirect">list.action</result>
redirect는 update나 delete를 수행한후 주소가 바뀌지 않고 유지 되는데 template.jsp 파일을 생성후 redirec로 페이지를 이동시킬수 있으나 struts 2에서 지원하는 방법중의 하나이다. 아래의 chain로 주소를 바꾸어 주는 역할을 하지만 redirect 인경우 사용자로 부터 전달된 데이터가 계속 전달 되지 않고 페이지가 이동하는 것이 특징이다.

3)<result name="success" type="chain">list</result>
위와 같이 페이지 요청 주소를 변경하고 데이터를 redirect와는 다르게 계속 다른 페이지로 데이터를 보내줄 수 있다.

'Framework > STRUTS 2' 카테고리의 다른 글

struts 2 - upload & download  (0) 2009.07.05
struts 2 - session 사용하기  (1) 2009.07.05
struts 2 - validator  (0) 2009.07.03
struts 2 - annotation설정  (0) 2009.07.03
struts 2 - 스트럿츠 2의 defalte설정  (0) 2009.07.03

struts 2 - validator

Published on: 2009. 7. 3. 13:33 by louis.dev

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>&nbsp;</td>
         <td width=300 align="left">&nbsp;
            <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>&nbsp;</td>
   <td width=300 align="left">&nbsp;
   <input type="text" name="age" value="${age}">
   </td>
    </tr>     
    <tr height=30 bgcolor="#ffffff">
      <td width=100 align="right"><b>이메일</b>&nbsp;</td>
   <td width=300 align="left">&nbsp;
   <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 함