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 함












struts 2 - annotation설정

Published on: 2009. 7. 3. 01:19 by louis.dev


struts 2에서 제공하는 annotation을 설정함으로서 struts 2에서 기본형으로 제공되던 xml을 참조해 action을 수행할 필요가 없다. 즉 struts.xml파일을 작성하지 않고 사용할 수 있다.

기본개념

1. 기본형일 때는 jsp 페이지에서 properties 파일에서 설정한 대로 뒤에 접두사를 설정한데로 (3가지를 설정했으면 3가지 모두 ex) *.do *.action *.bit)
접근할 수 있지만 annotation을 사용하면 접두사는 무조건 .action을 사용해야 한다.

2. jsp페이지에서 register.acton 이라는 주소로 페이지를 요청했을때 수행 되어야 할 action Class의 이름은 무조건 RegisterAction 이어야 한다.
                                                         register.action  == > register + action  ==>RegiserAction
왜냐 하면 따로 Action Class를 맵핑 시켜주는 xml 문서가 존재 하지 않기 때문에 다음과 같은 이름설정으로 struts 2에서 자동적으로 맵핑이 되게 설정 되어 있다.


설정방법

1. web.xml 파일에서 filter Dispatcher 설정에서 init-param을 설정한다

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>
    org.apache.struts2.dispatcher.FilterDispatcher
   </filter-class>
   <init-param>
    <param-name>actionPackages</param-name>
    <param-value>com.myhome.anno</param-value>
   </init-param>

</filter>

- param-name 은 annotation을 사용하기 위한 예약어 이다. 꼭 저렇게 써야 한다.
- param-value 는 annotation을 통해 실행될 action이 모여있는 패키지를 설정한다.

2. annotation을 사용할 jsp 페이지의 확장자는 모두 .action 으로 수정한다.

3. jsp페이지의 .action에 대응하는 Action Class를 생성한다.

--------------------------------------------------------------------------------------
package com.myhome.anno;

import org.apache.struts2.config.Result;

import com.myhome.info.dao.InfoDAO;
import com.myhome.info.vo.InfoVO;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
@Result (name="success",value="/WEB-INF/anno/modify.jsp")
public class QueryAction extends ActionSupport{

 private InfoVO bean;
 @Override
 public String execute() throws Exception {
  
  bean = new InfoDAO().getQuery(bean);
  return SUCCESS;
 }
 public InfoVO getBean() {
  return bean;
 }
 public void setBean(InfoVO bean) {
  this.bean = bean;
 }
 
 
}
--------------------------------------------------------------------------------------
위에서 처럼 @result 를 통해 이동할 페이지를 선언해 주고 있다.
execute method에서 리턴 되는 값이 @result 의 name에 대응하고 반응 한다.
여기서 중요한 점은 execute method에서 "SUCCESS" 라는 대문자로 리턴 하더라도 name 에는 소문자로 "success" 라고 선언해 주어야 한다.

@results 라는 것을 통해서 @result를 복수로 설정할 수 있다.
@Results({
  @Result(name="success", value="/WEB-INF/anno/list.jsp"),
  @Result(name="input", value="/WEB-INF/anno/fail.jsp")
})

※ action을 설정한 xml 파일을 include 하고 있는 struts.xml이 존재하고 annotation을 수행할때

http://localhost:8989/struts2/00000/index.action

이라고 url이 들어왔을때 맨처음 struts.xml 파일에 include된 xml파일에서 다음과 같은 namespace가 있나 확인 한다.
만약 xml파일에 선언된 네임스페이스가 존재 하지 않을때 비로서 web.xml 파일에 설정한 init-param으로 이동하고 설정한 Action으로 이동하게 된다.

struts 2 - 스트럿츠 2의 defalte설정

Published on: 2009. 7. 3. 00:58 by louis.dev


1. web.xml 파일의 설정

사용자로부터 요청이 들어오게 되면 가장 먼저 실행되는 것이 Front Controller인 Filter Dispatcher이므로 filter 설정을 먼저 해주어야 한다.

<filter>
   <filter-name>struts2</filter-name>            
   <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
   </filter-class>
</filter>

물론 filter-name은 아무거나 설정해도 된다.

다음으로 filter-mpping부분이다.

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

filter-name은 위에 선언했던 것이고 url-pattern은 무엇이라도 url로 들어오면 filter를 실행 시키겠다는 뜻으로 struts 나 spring 처럼 /*.do 이런식으로 확장자까지 선택해 주면 에러가 발생함으로 쓰지 않도록 한다.
뒤의 확장자는 뒤에 properties파일에서 선언하게 된다.

2. struts.properties 파일을 생성한다.



eclipse의 navigator 탭으로 이동후 src 폴더로 생성한 properties 파일을 옮기면 자동적으로 build의 classes 폴더로 이동하게 되는것을 그림과 같이 확인 할 수 있다.

설정 파일인 struts.xml 과 properties파일은 classes 폴더에서 찾기 때문에 위와 같이 해주어야 한다.

struts.properties
--------------------------------------------------------------------------------------------------
struts.enable.DynamicMethodInvocation=true
struts.i18n.reload=true                                                                       #프로그램을 수정후 서버를 restart 할 필요가 없다.
struts.devMode=true
struts.configuration.xml.reload=true         
struts.custom.i18n.resources=globalMessages
struts.url.http.port=8989                                                                       # was의 port 번호
struts.serve.static=true
struts.serve.static.browserCache=false
struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml   # 다음에서 설정된 파일 이름으로 설정 파일을 로딩하겠다.
struts.action.extension=do,action,bit                                                    # url이 .do .action .bit 로 끝나는 것들을 접근을 허용하겠다.
struts.i18n.encoding=euc-kr                                                                # encoding type은 euc-kr이다
--------------------------------------------------------------------------------------------------

3. 위에 설정한 대로 struts.xml 파일을 생성한다.
struts.xml 파일은 다른 action이 설정되어 있는 xml파일을 include하는 형식으로 되어있다.
--------------------------------------------------------------------------------------------------
<?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>
<!--    include files -->
   <include file="info.xml"/>
   <include file="validator.xml"/>
</struts>
--------------------------------------------------------------------------------------------------

4. library파일을 추가 한다.

struts 2의 API를 다운로드 받게 되면
struts-2.0.14 -> apps 폴더의 struts2-blank-2.0.14.war 라는 파일을 압축을 푼다.
struts2-blank-2.0.14.war 파일은 기본적으로 벤더 회사가 제공하는 예제 파일이라고 보면 된다. 이 압축된 폴더에 보면 lib폴더 안에 struts 2를 구동하기 위한 가장 기초적인 libarary파일이 존재하는데 그 파일을 복사해서 붙여넣기 하는 방법을 쓴다.

5. struts.xml 파일에서 include하는 xml파일을 생성한다.

include 하는 파일에는 실질적인 action 부분이 들어있다.
--------------------------------------------------------------------------------------------------
<?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>
   <package name="info" namespace="/info" extends="struts-default">
    <action name="index">
     <result>/WEB-INF/info/register.jsp</result>
    </action>
    <action name="register"
      class="com.myhome.info.actions.InfoRegisterAction"
      method="execute">
     <result>/WEB-INF/info/result.jsp</result>
    </action>
    <action name="list"
      class="com.myhome.info.actions.InfoListAction">
     <result name="success">/WEB-INF/info/list.jsp</result>
    </action>
    <action name="query"
      class="com.myhome.info.actions.InfoQueryAction"
      method="execute">
     <result name="success">/WEB-INF/info/modify.jsp</result>
    </action>
    <action name="update"
      class="com.myhome.info.actions.InfoUpdateAction"
      method="execute">
     <result name="success">/WEB-INF/info/template.jsp</result>
    </action>
    <action name="delete"
      class="com.myhome.info.actions.InfoDeleteAction"
      method="execute">
     <result name="success">/WEB-INF/info/template.jsp</result>
    </action>
   </package>
</struts>
--------------------------------------------------------------------------------------------------
- package : name -> package이름을 설정한다
                  namespac -> url로 맵핑되는 namespace를 선언한다. 만약 http:localhost:8989/struts2/ 가 기본적인 주소라면 namespace는 이 부분 뒤에 들어오는 값이 된다. 즉 http:localhost:8989/strtus2/info  에서 info가 namespace가 되며 저런 url pattern이 들어오면 다음의 패키지를 참조하고 뒤에 http:localhost:8989/struts2/info/index.do 에서 index와 각각의 action name과 비교 하며 같은것을 실행 하게 된다.

- action : name -> url pattern이 이런 이름으로 들어오면 다음을 실행한다.
              class -> 실행할 action class를 선언한다.
              method -> execte메소드를 실행시키겠단 뜻으로 쓰던 안쓰던 defalte가 method="execute" 로 잡혀 있어 상관없다.
-result : name -> 각각의 action Class는 그 결과를 return값으로 설정해 주며 각각은 이미 정해진 문자열이다.(SUCCESS,INPUT,ERROR ect...)
                          각각의 Action Class에서 return 값으로 다음과 같은 전달값들을 전달해 줄때 리턴해 준 문자열과 name과 똑같으면 다음의 페이지로 이동시키게 된다.
여기서 가장 중요한 것은 Action Class에서 전달값이 "SUCCESS" 와 같은 대문자 더라도 XML 문서의 result에서는 "success" 와 같이 소문자로 받아야 된다는 점이다.

6. 실질적인 Businuss Logic을 수행하는 Action Class를 생성한다.
이 클래스는 ActionSupport Class를 상속하고 ActionSupport Class의 execute method를 override 한다.
--------------------------------------------------------------------------------------------------
package com.myhome.info.actions;

import com.opensymphony.xwork2.ActionSupport;
import com.myhome.info.dao.InfoDAO;
import com.myhome.info.vo.InfoVO;

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

 /*form property fields*/
 
 private InfoVO bean;
 
 @Override
 public String execute() throws Exception {
  // TODO Auto-generated method stub
  bean.setWdate(this.getToday());
  new InfoDAO().register(bean);
  return SUCCESS;
 }

 protected String getToday(){
  return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
 }

 public InfoVO getBean() {
  return bean;
 }

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

7. jsp 페이지 생성
jsp 페이지에서는 struts2에서 제공하는 테그라이브러리를 통해 bean을 생성하고 bean에 jsp에서 발생한 데이터를 저장하고 Business Logic Controller로 bean 객체를 전달하게 한다.
--------------------------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=euc-kr"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:bean id="bean" name="com.myhome.info.vo.InfoVO"/>

<html>
  <head>
    <style type="text/css">
       a:active  {font-size: 11pt; text-decoration: none; color: #000000}
  a:link    {font-size: 11pt; text-decoration: none; color: #000000}
  a:visited {font-size: 11pt; text-decoration: none; color: #000000}
  a:hover   {font-size: 11pt; text-decoration: none; color: #000000}
  td        {font-size: 11pt; text-decoration: none; color: #000000}
    </style>
  </head>
  <body>
    <center><br><br>
    <h3><b>Struts2 Action (register)</b></h3>
    <form method="post" action="register.do">
     <table border=0 cellpadding=1 cellspacing=1 bgcolor="#000000">
       <tr height=30 bgcolor="#ffffff">
         <td width=100 align="right"><b>성명</b>&nbsp;
         </td>
         <td width=300 align="left">&nbsp;
            <input type="text" name="bean.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="radio" name="bean.sex" value="남" checked>남
            <input type="radio" name="bean.sex" value="여">여
   </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="bean.tel">
   </td>
    </tr>
    <tr height=30 bgcolor="#ffffff">
    <td align="center" colspan=2>
   <input type="submit" value="전송하기">
            <input type="button" value="리스트"
              onClick="javascript:location.href='list.do'">
    </td>
   </tr>
    </table>
  </form>
 </center>
 </body>
</html> 
--------------------------------------------------------------------------------------------------
- 맨처음 태그를 선언하고 <s:bean>태그로 bean을 설정한다.
- 각각 데이터 입력이 일어나는 form태그의 name을 위에서 선언한 bean의 id를 써주고 그 빈객체에 대응하는 property이름을 넣어주면 자동적으로 발생하는 데이터 들이 bean으로 들어가게 된다.


bean.name -> 이렇게 하면 bean이라고 설정한 InfoVO에 name 이라는 property에 데이터가 입력 된다.

이렇게 되면 이 정보는 ActionSupport를 상속한 class로 이동하게 된다.
그 클래스 에서는
private InfoVO bean; 을 선언하고
InfoVO의 setter method를 통해 데이터가 저장되고 로직을 수행한 후에 getter를 통해 jsp페이지로 다시 정보가 이동하게 된다.

여기서 가장 중요한 점은 jsp 페이지에서 선언한 bean의 id 이름과 ActionClass의 데이터를 받을 오브젝트 이름이 같아야 한다는 점이다.
예)
jsp:
      <s:bean id="valueObject" name="com.myhome.vo.InfoVO">
                          ||
ActionClass         ||
 private InfoVO valueObject;

Action Class를 통과한 데이터가 result.jsp페이지로 이동한다면 result.jsp페이지의
<s:bean id="valueObject" name="com.myhome.vo.InfoVO">
이어야 한다.

register.jsp  --------------------------> Action Class --------------------------->result.jsp
                setter method 로 데이터 전달                       getter method로 데이터 전달



※ struts 2의 태그
① <s:iterator value="list">
list 형태로 데이터가 넘어 왔을때 foreach문 대신 사용한다.

② <s:property value="num">
property 이름으로 바로 접근 할 수 있다.

8. DB 접근을 위한 iBatis 설정

9. Value Objec Class생성

10. DB에 접근하기 위한 DAO 생성

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

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 - annotation설정  (0) 2009.07.03
struts 2 - 기본 작동 순서  (0) 2009.07.02