레이블이 스트럿츠 액션인 게시물을 표시합니다. 모든 게시물 표시
레이블이 스트럿츠 액션인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 13일 일요일

[자바교육]자바 싱글톤, 쓰레드 예제

자바 싱글톤, 쓰레드 예제

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {
        System.out.println("Sington Class의 인스턴스 생성!");                    
    }
    public static Singleton getInstance() {        
        return singleton;
    }                                         
}
 
public class Main extends Thread {
    public static void main(String[] args) {
        System.out.println("Start.");        
        Singleton obj1 = Singleton.getInstance();
  Singleton obj2 = Singleton.getInstance();
        if (obj1 == obj2){
   System.out.println("obj1 == obj2");
        }
  else {
   System.out.println("obj1 != obj2");
  }
    }
}
 
=======================================
 
 
public class Singleton {
    private static Singleton singleton = null;
    private Singleton() {
        System.out.println("인스턴스 생성...");
        slowdown();                             
    }
    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
    private void slowdown() {                   
        try {                                   
            Thread.sleep(10);                 
        } catch (InterruptedException e) {      
        }                                       
    }                                           
}
 
 
public class Main extends Thread {
    public static void main(String[] args) {
        System.out.println("Start.");
        new Main("A").start();
        new Main("B").start();
        new Main("C").start();
        System.out.println("End.");
    }
    public void run() {
        Singleton obj = Singleton.getInstance();
        System.out.println(getName() + ": obj = " + obj);
    }
    public Main(String name) {
        super(name);
    }
}
 
 

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  



2013년 8월 8일 목요일

[오라클자바커뮤니티]Struts Validation Rule 강좌, oraclejavanew.kr

Struts Validation Rule 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




Validator Framework에는 두개의 설정 파일(validation.xml, validator-rules.xml)이 있습니다. 

===================================================
1.        validation-rules.xml
===================================================

애플리케이션에서 사용하는 전체적인 검증 규칙을 포함, 애플리케이션에 독립적이므로 다른 스트럿츠 애플리케이션에서 사용 가능 합니다.

기본적인 규칙을 수정하거나 확장하는 경우에만 이 파일을 수정 합니다.

파일의 구성을 살펴보면 ROOT ELEMENT인 <form-validation>은 한 개 이상의 global 요소를 필요로 합니다.

<!ELEMENT form-validation (global+)>
<!ELEMENT global (validator+) >

각각의 validator는 유일한 한가지의 검증 규칙을 나타냅니다. 다음은 required 규칙에 대한 선언 부분 입니다. 또한 validator 요소는 자바스크립트를 지원합니다.

<validator name="required"
        classname="org.apache.struts.validator.FieldChecks"
        method="validateRequired"
        methodParams="java.lang.Object,
                      org.apache.commons.validator.ValidatorAction,
                      org.apache.commons.validator.Field,
                      org.apache.struts.action.ActionMessages,
                      javax.servlet.http.HttpServletRequest"
        msg="errors.required"/>

    name : 규칙의 논리적인 이름
    classname : 검증 로직을 포함하는 클래스
    method : 검증 로직을 포함하는 메소드
    methodParams : 메소드의 매개 변수
    msg : 리소스 번들의 키값
depends : 명시된 규칙 이전에 호출 해야 하는 검증 규칙
jsFunctionName : 자바스크립트 함수를 명시,
기본적으로 Validator의 실제 이름을 주로 사용 합니다.


<intRange>규칙을 보면 depends 부분이 기술 되어 있는데 참고 바랍니다. 즉 정수 값의 범위를 체크하기 이전에 정수형인지 체크가 이루어져야 한다는 것 입니다.

<validator name="intRange"
            classname="org.apache.struts.validator.FieldChecks"
            method="validateIntRange"
            methodParams="java.lang.Object,
                      org.apache.commons.validator.ValidatorAction,
                        org.apache.commons.validator.Field,
                      org.apache.struts.action.ActionMessages,
                      javax.servlet.http.HttpServletRequest"
            depends="integer"
            msg="errors.range"/>

다음은 Validator Framework의 기본적인 리소스 번들의 키 입니다.

# Struts Validator Error Messages
  errors.required={0} is required.
  errors.minlength={0} can not be less than {1} characters.
  errors.maxlength={0} can not be greater than {1} characters.
  errors.invalid={0} is invalid.

  errors.byte={0} must be a byte.
  errors.short={0} must be a short.
  errors.integer={0} must be an integer.
  errors.long={0} must be a long.
  errors.float={0} must be a float.
  errors.double={0} must be a double.

  errors.date={0} is not a date.
  errors.range={0} is not in the range {1} through {2}.
  errors.creditcard={0} is an invalid credit card number.
  errors.email={0} is an invalid e-mail address.

-----------------------------------------
다음은 GenericValidator의 기본 검증 규칙 입니다.
-----------------------------------------

Table 4.1: Common Validator Rules
Rule Name(s)                        Description                                 
required            The field is required. It must be present for the  form to be valid.     
minlength          The field must have at least the number of characters as the
specified minimum length.
maxlength          The field must have no more characters than the specified
maximum length.
intrange, floatrange,
doublerange        The field must equal a numeric value between the min and max variables.
byte, short, integer, 
long, float, double  The field must parse to one of these standard  Java types (rules names
equate to the expected Java type).
mask              The field must match the specified regular expression (Perl 5 style).
date                The field must parse to a date. The optional variable datePattern
specifies the date pattern
(see java.text.SimpleDateFormat in the Java-Docs to learn how to
create the date patterns).
You can also pass a strict variable equal to
creditCard          The field must be a valid credit card number. None


==============================================
2.        validation.xml
==============================================


이 파일은 애플리케이션에 종속적이며 특정한 ActionForm에서 사용하는 validation-rules.xml 파일의 검증 규칙을 나타냅니다. 그러므로 ActionForm 안에서는 검증을 위한 별다른 소스의 변경이 필요 없다는 이야기가 되며 validation.xml 파일에서 검증 로직은 ActionForm 한 개 이상과 연동 됩니다.

XML 형식은 다음과 같습니다.

<!ELEMENT form-validation (global*, formset+) >
<!ELEMENT global (constsnts*) >
<!ELEMENT formset (constant*, form+) >

Constants 요소는 자바 프로그래밍에서 상수를 선언하는 것과 매우 유사 합니다.

<global>
<constant>
<constant-name>phone</constant-name>
<constant-value>^\(?(\d{3})\)?[-| ]?(\d{3})[-
| ]?(\d{4})$</constant-value>
</constant>
<constant>
<constant-name>zip</constant-name>
<constant-value>^\d{5}(-\d{4})?$</constant-value>
</constant>
</global>

다음은 간단한 validation..xml 파일 입니다.

<form-validation>
<global>
<constant>
<constant-name>phone</constant-name>
<constant-value>^\(?(\d{3})\)?[-| ]?(\d{3})[-
| ]?(\d{4})$</constant-value>
</constant>
</global>
<formset>
<form name="checkoutForm">
<field
property="phone"
depends="required,mask">
<arg0 key="registrationForm.firstname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${phone}</var-value>
</var>
</field>
</form>
</formset>
</form-validation>


<!ELEMENT formset (constant*, form+) >

한편 <formset> 이라는 요소는 <constant>와  <form> 이라는 두개의 요소를 포함 할 수 있는데 <constant> 요소는 <global> 섹션의 <constant>와 유사하여 생략도 가능 하지만 form 요소는 한번 이상 나타나야 합니다. (<formset> 요소는 국제화를 위한 language와 country를 지원 합니다.)

<form>요소는 하나 이상의 <field>를 포함할 수 있으며 XML 형식은 다음과 같습니다.

<!ELEMENT form (field+)>

<field> 요소는 검증을 해야 할 자바빈의 특정 프로퍼티와 일치해야 하며 스트럿츠 애플리케이션에서의 자바 빈은 결국 ActionForm을 의미 합니다.

다음은 field의 속성 입니다.

property :    자바빈(혹은 ActionForm)에서 검증해야 할 프로퍼티 이름
depends :    field 요소에 적용 할 검증 규칙의 목록, 각 검증 규칙은 여러 개가 올 수 있으며 이럴경우 콤마로 구분, 검증이 이루어 지기 위해서는 모든 규칙을 만족 시켜야 합니다.
page :      자바빈이 대응 할 페이지, 자바빈은 page 속성이 속해 있는 form과 대응
indexedListProperty : 리스트를 읽어 가면서 필드를 검증 하는 경우에 이용


field 요소는 다음과 같이 여러 가지 요소를 포함 합니다.

<!ELEMENT field (msg?, arg0?, arg1?, arg2?, arg3?, var*)>

<msg> 요소는 리소스 번들의 키 값이며 이 값을 기본 메시지 대신 이용 할 수 있습니다. 즉 검증이 잘못된 경우 이 메시지의 값이 출력 됩니다. msg를 사용하지 않으면 기본적으로 등록된 메시지가 출력 됩니다.  아래와 같은 메시지…

errors.required={0} is required.
  errors.minlength={0} can not be less than {1} characters.
  errors.maxlength={0} can not be greater than {1} characters.
  errors.invalid={0} is invalid.

또한 msg는 3개의 속성이 있는데…다음과 같습니다.

name : msg요소가 사용할 검증 규칙, 반드시 validation-rules.xml 파일이나 global 섹션에 명시한 규칙 이어야 합니다.

key : 검증 실패 시 ActionError에 추가 할 수 있는 리소스 번들의 키값, resource 속성을 false로 할 경우 리소스 번들을 사용하지 않고 key 속성에 문자열을 직접 넣을 수 있습니다.

아래의 예를 참고 하세요~

<field property="phone" depends="required,mask">
<msg name="mask" key="phone.invalidformat"/>
<arg0 key="registrationForm.firstname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${phone}</var-value>
</var>
</field>


------------------------
Validator 플러그 인
------------------------

Validator Framework을 사용하기 위해서는 struts-config.xml에서 PlugIn 설정을 해야 합니다.

<plug-in>
className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEBINF/
validator.xml"/>
</plug-in>

스트럿츠 애플리케이션이 구동 할 때 ValidatorPlugIn 클래스의 init() 메소드가 호출되며 이 메소드가 실행 하면서 XML 파일의 Validator 리소스 들을 메모리에 적재 합니다. 

2013년 8월 5일 월요일

[자바프레임워크,자바교육,오라클자바교육]Struts ActionForm(스트럿츠 액션폼), 오엔제이프로그래밍

Struts에서 ActionForm 처리 



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 
 www.onjprogramming.co.kr 


ActionForm 객체는 클라이언트에서 입력한 데이터를 비즈니스 계층으로 전달하는 역할을 합니다. Struts Framework에서는 사용자의 입력 화면에서 입력한 데이터를 자동으로 모아 ActionForm 인스턴스의 setter를 이용해 설정하며 이를 통해 비즈니스 계층으로 데이터를 전달 할 수 있습니다.

여기서 한가지 주의 할 점은 ActionForm을 비즈니스 계층으로 직접 전달 하기 보다는 적절한 DTO(Data Transfer Object)를 생성하는 것이 훨씬 효율적 입니다.

스트럿츠에서는 다음과 같이 ActionForm 을 처리 합니다.

1.        Action의 매핑 정보를 확인 하고 Action이 설정 되어 있는지 확인 합니다. Action 매핑의 name 속성에 해당 하는 <form-bean > 매핑이 있는지 확인 하는 겁니다.

<!-- ========== Form Bean Definitions ================================ -->
    <form-beans>
        <form-bean name="loginForm" type="login2.LoginForm">                 
            <form-property name="pwd" type="java.lang.String" />
            <form-property name="id" type="java.lang.String" />           
        </form-bean>           
    </form-beans>



<!-- ========== Action Mapping Definitions ============================ -->
    <!--valiedate를 true라고 함으로써 LoginForm의 validate가 호출됩니다.      -->
    <action-mappings>
            <!-- loginAction에 대한 정의 -->
        <action         
                path="/LoginSubmit"
                type="login2.LoginAction"
            name="loginForm"                       
            validate="true"
            input="/login.jsp"
        />
       
        <!-- logoffAction에 대한 정의 -->
        <action         
                path="/logoff"
                type="login2.LogoffAction"
            name="logoffForm"                       
            validate="false"         
        />                     
    </action-mappings>


2.        메모리에 ActionForm 인스턴스가 있는지 확인하여 이미 만들어진 타입이 같고 scope가 적당 한 것이 있으면 재사용하고 없으면 새로 인스턴스를 생성 합니다. 새 인스턴스를 만드는 경우엔 scope 속성이 있다면 속성에 따른 scope에 저장 합니다.

3.        ActionForm의 reset 메소드를 호출 합니다.
       
        public void reset(ActionMapping mapping, HttpServletRequest request) {
                pwd = "";
                id = "";
        }

4.        ActionForm의 setter를 통해 요청 파라미터 값을 ActionForm에 입력 합니다.

public void setId(String id) {
                this.id = id;
        }
       
        public void setPwd(String pwd) {
                this.pwd = pwd;
        }

5.        validate속성이 “true”로 설정 되어 있으면 validate() 메소드를 실행 하고 에러가 있다면 에러를 반환 합니다.

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
                ActionErrors errors = new ActionErrors();
               
                if((id == null) || (id.length()<1)) {
                        errors.add("error.id.required", new ActionError("error.id.required"));
                }
               
                if((pwd == null) || (pwd.length()<1)) {
                        errors.add("error.pwd.required", new ActionError("error.pwd.required"));
                }
               
                return errors;                       
        }


폼 데이터를 전송 하는 모든 HTML 페이지에서 ActionForm 사용해야 하는데 HTML의 폼필드의 이름과 ActionForm의 속성의 이름이 일치한다면 ActionForm을 여러 페이지에서 사용 가능 합니다.

중요한 메소드는 reset(), validate() 메소드 인데 하나씩 보도록 하죠~

reset() 메소드의 원형은 다음과 같습니다.

public void reset(ActionMapping mapping, HttpServletRequest request);

스트럿츠의 ActionForm 클래스의 위 두메소드는 기본적으로 아무 기능도 수행 하지 않으므로 ActionForm을 상속한 하위 클래스에서 필요하다면 재정의(Override) 해야 합니다.

Controller는 요청 파라미터에 있는 ActionForm의 인스턴스에 입력 하기전에 reset() 메소드를 수행 합니다. 결국 reset이라는 것은 초기화의 의미이며 폼빈의 인스턴스를 공유하는 경우엔 중요한 부분 입니다.

Controller는 요청값들이 ActionForm의 setter에 의해 설정 되면 validate가 “true”로 설정 된 경우에는 valiedate() 메소드를 호출 하는데 이 메소드에서는 사용자의 입력 값에 대한 validation check를 수행 합니다. 오류가 있다면 ActionError 객체에 담아서 리턴 합니다. ActionForm에서의 validate()는 비즈니스 로직 이라기 보다는 입력 값의 단순한 검사 정도로 보시면 되며 실제 들어온 값에 대한 논리적인 타탕성등 여러가지 검사를 하기 위해서는 별도의 비즈니스 로직을 만들어 처리해야 합니다.

validate() 메소드의 원형은 다음과 같습니다.

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request); 

Struts Action 클래스

Struts Action 클래스 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 
 www.onjprogramming.co.kr 

org.apache.struts.action.Action 클래스는 컨트롤러 컴포넌트의 연장으로 보시면 되며 클라이언트의 요청과 비즈니스 로직을 연결해 주는 역할을 합니다. Action 클래스에서는 비지니스 로직을 처리하기 전의 인증이나 세션 검증 등의 작업을 수행 합니다.

Action에 대해서는 Model이냐 Controller이냐를 고민 하는 경우가 있는데 아마도 Controller 영역으로 보시는 것이 맞을 것 같습니다, 그 이유 중 하나는 Model 영역은 컨트롤러 영역을 알면 안되지만 Action 클래스는 ActionServlet에 접근 하므로 컨트롤러의 모든 자원에 접근이 가능 하기 때문에 이를 Controller 쪽으로 보는 것 입니다.

만약 Action 클래스 내에 비즈니스 로직을 넣어 둔다면 스트럿츠 프레임워크를 다른 프레임워크로 바꾸는 경우가 발생 한다면 다른 클래스로 대체해야 할지도 모릅니다. 결국 비즈니스 로직을 Action 클래스 안에 두는 것은 다른 타입의 클라이언트에서 재사용하지 못하는 결과를 초래 할 수도 있습니다.

 

Action 클래스는 여러 메소드를 포함하지만 가장 중요한 메소드는 execute() 입니다.

원형을 살펴보면 다음과 같습니다.

public ActionForward execute(ActionMapping mapping,
                              ActionForm form,
                              HtpServletRequest request,
                              HttpServletResponse response) throws Exception;

클라이언트의 요청을 받으면 execute() 메소드가 호출 됩니다.Controller는 Action 클래스의 인스턴스가 존재하지 않으면 생성하며 있으면 재활용 합니다. 스트럿츠에서는 각 Action 클래스에 대해 하나의 인스턴스만 생성하여 자원을 공유 합니다.

Action 클래스의 execute() 메소드의 기본적인 구현은 null을 return 하므로 새로운 Action 클래스를 작성하여 execute() 메소드를 오버라이드 해야 합니다.

스트럿츠에서 폼액션을 처리하기 위해 여러 개의 Action 클래스를 만들 수 있는데 각 클래스가 org.apache.struts.action.Action 클래스를 상속 받은 후 execute() 메소드를 오버라이드 한다는 이야기 입니다.

그런데 다음처럼 모든 Action 클래스들이 상속 받아서 구현할 추상 클래스를 만들어 둘 수 있는데 … Action클래스들의 공통 기능이 있는 경우 이를 추상클래스에서 처리하고 나머지는 이 추상클래스에서 상속 받은 하위 클래스에서 정의하도록 추상 클래스를 만들어 둘 수 있습니다.

앞의 로그인 예제를 생각 한다면 LoginAction과 LogoffAction이 공통적으로 하는 일은 세션을 확인 하는 일인데 이러한 부분을 추상클래스를 두어 처리가 가능 하다는 이야기 입니다.

Action 클래스를 만들 때 주의할 부분은 execute() 메소드 안에 try/catch 블록이 없다는 것입니다. 아래를 참고 하세요…

<global-exceptions>
  <exception
        key=”global.error.invalidlogin”
        path=”/login.jsp”
        scope=”request”
        type=”login2.exception.InvalidLoginException”
</global-exceptions>

위와 같이 설정을 해 둔다면 프레임워크에서 어떤 동작으로 인해 InvalidLoginExceptiondl 발생 했을 경우 요청을 login.jsp로 포워드하고 global.error.invalidLogin 이라는 key를 통해 에러 메시지를 구축 하도록 설정을 하는 것 입니다.

Controller가 어떤 요청을 받았을 때 어떤 Action 클래스의 인스턴스를 수행 할지를 어떻게 알 것인가? …… 컨트롤러는 Action 매핑을 조사 함으로서 Action 인스턴스를 결정 하는데 웹 애플리케이션이 시작 될 때 web.xml 파일에 있는 스트럿츠 설정 부분에 struts-config.xml 파일의 위치를 설정 합니다. 이 정보를 바탕으로 이 내용을 메모리에 올려 객체화 해서 웹 애플리케이션에서 보관을 하고 있는데 이 정보 중 Action 매핑 정보를 참고 한다고 생각 하시면 됩니다. (물론 스트럿츠 설정 파일의 이름이 struts-config.xml 일 필요는 없습니다.)

struts-config.xml 파일에 있는 Action과 관련된 매핑 정보는 org.apache.struts.action.ActionMapping 클래스의 인스턴스로 표현  되는데 ActionMapping 객체는 URI와 매칭되는 path 속성을 포함하고 있습니다.

아래는 struts-config.xml 파일에서의 Action 매핑 예 입니다.(로그인 예제의 경우)

<!-- valiedate를 true라고 함으로써 LoginForm의 validate가 호출 됩니다.            -->
    <action-mappings>
            <!-- loginAction에 대한 정의 -->
        <action         
                path="/LoginSubmit"
                type="login2.LoginAction"
            name="loginForm"                       
            validate="true"
            input="/login.jsp"
        />
       
        <!-- logoffAction에 대한 정의 -->
        <action         
                path="/logoff"
                type="login2.LogoffAction"
            name="logoffForm"                       
            validate="false"         
        />                     
    </action-mappings>

로그인과 관련된 액션 매핑을 보면 /LoginSubmit 패스와 login2.LoginAction를 매핑 하고 있는 것을 알 수 있습니다. Controller가 “/LoginSubmit” 문자열이 포함된 요청을 받으면 LoginAction 인스턴스의 execute() 메소드를 실행 하게 되는 것 입니다. 물론 스트럿츠에서는 매핑 정보를 Action 인스턴스의 execute()가 종료 한 후 포워드 할 곳을 인식하는데도 사용 합니다. 

Struts의 ActionServlet

Struts의 ActionServlet


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



Struts의 ActionServlet은 javax.servlet.http.HttpServlet 클래스를 상속 받았으며 HTTP 요청을 스트럿츠의 적절한 핸들러에게 보내는 역할을 수행 합니다.

스트럿츠에서 클라이언트의 요청을 처리하는 초기 진입은 ActionServlet이 담당하고 있습니다. 모델 2에서는 UserServlet이나 또 다른 서블릿을 필요할 때마다 새로 작성할 필요가 있지만 스트럿츠에서는 ActionServlet 하나만을 이용하여 모든 요청을 처리하는 하는 것이 가능 합니다.

Struts1.1 이전 버전에서는 ActionServlet이 요청을 받아 핸들러를 호출하는 유일한 클래스 였지만 1.1 버전 이후 부터는 ora.apache.struts.action.RequestProcessor 라는 클래스가 추가되어 클라이언트의 요청을 처리 할 수 있게 되었습니다.

ActionServlet은 클라이언트의 요청을 받게 되면 URI를 사용하여 어떤 Action이 주어진 요청을 처리할 것인지를 결정 하는데 이때 struts-config.xml 파일에 설정된 Action 태그에 설정된 내용을 확인 합니다. URI는 Action 설정의 path 속성과 일치해야 합니다.

아래 struts-config.xml 파일의 내용을 참고 하세요~

<action         
            path="/LoginSubmit"
            type="login2.LoginAction"
            name="loginForm"                       
            validate="true"
            input="/login.jsp"
        />

만약 login.jsp에서 HTML의 <form> tag에 action=/LoginSubmit 이라고 한 후 submit 버튼을 누르게 되면 톰캣은 struts-config.xml의 action의 path와 일치함을 알고 login2.LoginAction 클래스를 실행시킴으로써 Action을 처리하게 되는 것 입니다.


ActionServlet은 주어진 입력 값 들을 한꺼번에 자바 빈즈로 묶을 수 있는데 이 자바 빈은 스트럿츠 ActionForm 클래스의 서브클래스로 구성 됩니다. 이를 폼빈(FormBean) 이라고 하며 struts-config.xml 파일에서 <form-bean> 이라는 태그에서 설정을 하게 됩니다.

아래는 struts-config.xmml 파일에서 설정 예 입니다.

<form-beans>
        <form-bean name="loginForm" type="login2.LoginForm">                 
            <form-property name="pwd" type="java.lang.String" />
            <form-property name="id" type="java.lang.String" />           
        </form-bean>           
    </form-beans>

이때 <action> 태그의 name과 <form-bean>의 name이 일치함을 잘 보시기 바랍니다.


다른 자바 서블릿과 마찬가지로 Struts의 ActionServlet 역시 웹 애플리케이션의 배치 스크립트(web.xml)에 정의를 해야 하는데 그 내용은 아래와 같습니다.

<!-- ActionServlet Congif ================================-->
        <servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>
       
       
        <!-- ActionServlet Mapping ====================================-->
        <servlet-mapping>
                <servlet-name>action</servlet-name>
                <url-pattern>*.do</url-pattern>
        </servlet-mapping>

확장자가 .do 로 넘어오는 요청은 ActionServlet으로 서비스 함을 의미합니다.