레이블이 다형성인 게시물을 표시합니다. 모든 게시물 표시
레이블이 다형성인 게시물을 표시합니다. 모든 게시물 표시

2013년 11월 5일 화요일

[닷넷4.0,ADO.NET강좌, .NET4.X, C#4.X]ADO.NET 개요, 소개, 특징 ADO.NET 개요, 소개

[닷넷4.0,ADO.NET강좌, .NET4.X, C#4.X]ADO.NET 개요, 소개, 특징   ADO.NET 개요, 소개  
 
ADO.NET 개요, 소개
 
ADO.NET은 .NET Framework 프로그래머에게 데이터 액세스 서비스를 제공하는 클래스 집합이다.  분산된 데이터 공유 응용 프로그램을 만들기 위한 다양한 구성 요소를 제공하고 또한 관계형, XML 및 응용 프로그램 데이터에 대한 액세스를 제공하는 .NET Framework의 핵심 부분이다.
 
ADO.Net은 Microsoft Accss와 SQL Server, Oracle 과 같은 관계 형 데이터베이스 뿐 아니라 비 관계형 데이터 원본도 조작이 가능한데 ADO.Net은 .Net Framework 안에 통합 되어 있으며 .NET 언어들(특히 C#)과 같이 쓰이도록 설계 되었다.
 
 기존의 ADO와 비교해 볼 때 ADO.Net은 확장성과 상호 운영성이 개선된 ADO 인데 ADO가 연결 지향형인데 반해 ADO.Net의 경우 비 연결성 데이터 집합을 처리 하도록 설계 되었습니다. 연결이 끊어진 레코드 집합은 응용 프로그램에만 도움이 되는데 이는 데이터를 로컬 상태에서 보다 빠르게 처리하고 전송 할 수 있기 때문이다. 또한 ADO.Net은 XML을 보편적인 데이터 전송 형식으로 사용하고 있다.
 
 ADO.Net은 System.Data.dll 어셈블리 안에 들어 있는데 ADO.Net의 모든 클래스들이 System.Data.dll  안에 들어 있으므로 결국 System.Data.dll 자체가 곧 ADO.Net 이라고 할 수 있다.
 
 그럼 왜 이름을 System.Data 라고 하지 않고 ADO.Net이라고 했을까?  ADO.Net이라는 이름은 ADO(ActiveX Data Object)로부터 따온 것이다. MS는 .NET 환경에서 권장 되는 데이터 액세스 인터페이스 임을 나타내기 위해 ADO.Net 이라고 명명 한 것이다.
 
.NET Framework에서의 클래스 라이브러리(Class Library)들을 굳이 다시 크게 나누어, Base Class Library와 그 외의 클래스 라이브러리(Class Library)로 구분하자면, Base Class Library(BCL)에는 Collections나 IO등과 같은 프로그래밍에 있어서의 좀 더 근원적인 알고리즘(Algorithm)과 자료구조 및  하드웨어(Hardware)에 보다 근접한 부분에 해당한다고 볼 수 있다. 그 외의 라이브러리들에는 Directory Service, XML Support등과 같은 보다 추상적이고 다양한 종류의 라이브러리를 접할 수 있고 그 중의 하나가 ADO.NET이라고 불리는 데이터(Data) 관련 클래스 라이브러리(Class Library) 이다. 

2013년 10월 23일 수요일

[닷넷4.0, ADO.NET]OleDB Oracle을 이용한 grid select, insert예제 OleDB 공급자를 이용하여 오라클 데이터베이스에 접속했으며 EMP 테이블의 데이터를 읽어 그리드에 채우는 간단한 예제다.

[닷넷4.0, ADO.NET]OleDB Oracle을 이용한 grid select, insert예제
 
OleDB 공급자를 이용하여 오라클 데이터베이스에 접속했으며 EMP 테이블의 데이터를 읽어 그리드에 채우는 간단한 예제다.
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        OleDbConnection conn = null;
        OleDbDataAdapter adapter = null;
        DataSet ds = null;
        
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                ds = new DataSet("emp");
//아래 onj는 $ORACLE_HOME/network/admin에 있는 tnsnames.ora 파일에 정의된 이름!
   string conStr = "Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger";
   conn = new OleDbConnection(conStr);
                conn.Open();
                adapter = new OleDbDataAdapter("select * from emp", conn);
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "emp Table Loading Error");
            }
            finally        {
                conn.Close();
            }
        }
    }
}
new라는 클래스 Constructor 키워드를 사용하여, .NET Framework에서 제공하는 클래스 중의 'OleDbConnection'의 인스턴스를 만들면서 string타입의 파라미터(Parameter)를 취다. 그 stirng(접속 문자열)은 바로 윗줄에서 선언 되고 값이 주어졌다. 마지막에는 인스턴스인 Connection의 원래클래스, 즉 OleDbConnection이 멤버로 포함하고 있는 메쏘드 중의 대표적인 Open()을 호출하여 DataBase와 연결을 설정하고 연결을 얻음. 그런다음 어댑터를 하나 만들어 "select" 명령을 실행 시킨 결과 DataSet으로 fill 시키고  DataGrid의 Datasource로 ds.Tables[0]을 지정했다.
 
 
[간단한 입력 예제, 오라클 scott계정의 EMP Table에 한건의 데이터를 간단히 입력]
 
public partial class Form1 : Form
    {
        OleDbConnection conn = null;
        OleDbDataAdapter adapter = null;
        DataSet ds = null;
        
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                ds = new DataSet("emp");
                //아래 onj는 $ORACLE_HOME/network/admin에 있는 tnsnames.ora 파일에 정의된 이름!
                string conStr = "Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger";
                conn = new OleDbConnection(conStr);
                conn.Open();
                OleDbCommand command = new OleDbCommand("insert into emp(empno, ename) values(777, '오라클자바')", conn);
                command.ExecuteNonQuery();
                adapter = new OleDbDataAdapter("select * from emp where ename='오라클자바'", conn);
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "emp Table Loading Error");
            }
            finally
            {
                conn.Close();
            }

        }
    }

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



[개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)




[해당 카테고리로 이동합니다]

2013년 10월 19일 토요일

오라클 SCN은 최근의 SCN 보다 크고 유일한 값

SCN 이란?
오라클은 특정한 시점의 데이타베이스 상태를 SCN으로 관리하는데 어떤 트랜잭션이 commit 되면, SCN은 최근의 SCN 보다 크고 유일한 값이 할당되며이 값은 그 트랜잭션이 변경시킨 블럭에 반영되고또한 데이타화일의 가장 최근의 SCN은 데이타화일의 헤더에 기록 됩니다.
아래에는 SCN이 이용되는 경우에 대해 몇 가지 적었습니다.
참고 하세요~

1. Oracle Startup 
내부적 과정

$ORACLE_HOME/dbs/init$ORACLE_SID.ora file
를 찾는다
.
$ORACLE_SID.ora file
내의 지정된 config file를 포함하여 parameter 내용을 참조하여 Oracle backgroud process startup 한다.
(nomount )

control_file
이라는 parameter에 지정된 control file를 읽는다.
(mount )

control file
내에 설정되어 있는 Datafile  redolog file를 읽은 후 SCN이 일치하는가를 check한 후에 만약 틀리면 redolog를 이용하여 Recover 한 후 startup한다.


2. Listing Status Information About Data Files

SQL> SELECT name,
2 rfile#,
3 status,
4 checkpoint_change# "CHECKPOINT"
5 FROM v$datafile;

NAME RFILE# STATUS CHECKPOINT
----------------------------------------------------------------
C:\ORACLE\ORADATA\WINK\SYSTEM01.DBF 1 SYSTEM 7041729

C:\ORACLE\ORADATA\WINK\UNDOTBS01.DBF 2 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\CWMLITE01.DBF 3 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\DRSYS01.DBF 4 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\EXAMPLE01.DBF 5 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\INDX01.DBF 6 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\ODM01.DBF 7 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\TOOLS01.DBF 8 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\USERS01.DBF 9 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\XDB01.DBF 10 ONLINE 7041729


10 
개의 행이 선택되었습니다.

RFILE#
은 각 데이타 화일의 화일 숫자로 리스트 하며 데이타베이스를 갖고 create 되었던,
SYSTEM tablespace
에 있는 첫번째 데이타 화일은 항상 화일 1 입니다.

STATUS
은 데이타 화일에 대해 다른 정보로 리스트 합니다만약 데이타 화일이 SYSTEM tablespace의 부분에 있다면상태는 SYSTEM 입니다.
(
만약 recovery를 요구 하지 않는다면)
만약 non-SYSTEM tablespace에 데이타 화일이 online으로 된다면상태는 ONLINE 이구요,
non-SYSTEM tablespace
에 데이타 화일이 offline으로 된다면상태는 OFFLINE이나 RECOVER 중 하나로 될 수 있습니다.
CHECKPOINT
는 데이타 화일의 가장 최근의 checkpoint에 기록된 마지막의 SCN을 리스트 합니다.


3. Oracle
 "fast commit" mechanism을 사용 하므로 사용자가 COMMIT문장을 사용하면 LGWRcommit record를 즉시 redo log buffer에 기록하지만 해당 data buffer의 변경들은 redo log buffer들을datafile들에 write하는 것을 더 효과적으로 할 때까지 지연 되는 것입니다.

User
 transaction commit 할 때, transaction System Change Number(SCN)를 할당 받고 Oracleredo log transaction redo log entry들과 함께 기록 합니다.

Activity
가 빈번하다면, LGWR group commit을 사용하여 online redo log file write할 수도 있습니다.

출처 : 오라클자바커뮤니티(http://www.oraclejavanew.kr)

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





2013년 10월 6일 일요일

[JAVA객체지향]자바,다형성,오버로딩,오버라이딩, 캡슐화, Late binding 1. 다형성(Polymorphism) 상속을 ...

[JAVA객체지향]자바,다형성,오버로딩,오버라이딩, 캡슐화, Late binding에 대해 알아봅니다.
1. 다형성(Polymorphism)
상속을 받은 것을 그대로 사용하지 않고 입맛에 맞게 바꾸어 줄 수 있도록 하는 것
다형성을 위해 자바에서는 메소드 overriding 과 메소드 overloading을 제공 한다.
상속계층 상에서 어떤 객체의 어느 메소드를 호출할 것인지를 결정하는 객체의 능력을 다형성 이라 한다.
사인곡선을 그리는 함수가 있다고 할 때 사용자는 파라미터로 radian이나 degree값을 넣게 되지만 둘 다 처리할 수 있다. 이것은 sine(int degrees)나 sine(float Radians)와 같이 동일 이름의 함수가 다른 파라미터로 두 번 선언되었기 때문이다.
오버로딩 or 오버라이딩을 통해 구현
2. 오버로딩(Overloading)
동일한 함수의 이름 사용 가능, 같은 클래스 내에 같은 이름의 생성자나 메소드를 사용하는 행위,매개변수의 개수와 타입이 달라야 한다

3. 오버라이딩
상위 클래스에서 정의된 함수를 하위 클래스에서 재 정의, 기존 클래스의 메소드 구현 부분만 약간 변화시켜 새로운 클래스를 생성할 수 있다. 매개변수의 개수와 타입이 같아야 한다.
상위 클래스로부터 메소드를 상속받을 때, 서브클래스 내에 같은 이름의 메소드가 있는 경우에?Signature가 다르면 중복(overloading)이 되고 Signature가 같으면 재정의(overriding)가 된다

4. Template : 타입을 인자로 하여 새로운 타입을 생성
5. 캡슐화(encapsulation)
객체는 자신이 수행하는 모든 행동과 속성을 다른 객체와 외부 세계에는 보이지 않는다
객체 자신의 Operation을 수행하고 결과를 내놓지만 그 Operation의 동작 원리는 숨기는 것이다.
높은 모듈성과 정보은닉을 제공
참고로 Late binding이란?
Virtual Method Invocation
 변수의 타입이 아닌 실제 메모리 영역을  차지하고 있는 변수가 참조하는 객체를  찾아 그메소드를 호출하는 것, 물론 변수의 경우 해당 사항 없다.(shadow variable, 가리기)

오라클자바커뮤니티에서 설립한 개발자교육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); 

2013년 8월 1일 목요일

(Java PolyMorphism)자바 다형성

주어진 유형의 변수 하나로 여러 유형의 객체를 참조하고 , 변수가 참조하는 객체 유형에 맞는 메소드를 자동으로 호출할 수 있는것
 즉 다형성을 이용하면 메소드 호출 하나가 호출이 적용되는 객체의 유형에 따라 서로 다르게 작동하도록 할 수 있다.
  다형성이 구현되기 위한 조건
    - 서브클래스의 객체의 메소드 호출은 수퍼클래스 유형의 변수를 통해서
        Book selectedBook;
  Random select = new Random();

for(int i=0;i<10;i++) {
selectedBook = theBooks[select.nextInt(theBooks.length)];
System.out.println("\n ***** 선택한 책 ***** \n" + selectedBook);
selectedBook.display();
}         
 호출된 메소드는 수퍼클래스의 메소드
 수퍼클래스와 서브클래스에서 메소드 유형및 리턴값이 같아야 한다.
 메소드 접근제한은 서브클래스가 수퍼클래스 보다 덜 제한적이어야 한다.

import java.util.Random;
class Book {
public Book(String aType) { type = new String(aType); }
public String toString() { return "이것은 " + type; }
public void display() { }
private String type;
}

class EngBook extends Book {
public EngBook(String aName) {
super("영어책...");
name = aName;
}
public void display() { System.out.println("이 책은 영어를 공부하는데 쓰입니다...");}
public String toString() { return "책 제목은 : " + name ; }
private String name;
}


class JavaBook extends Book {
public JavaBook(String aName) {
super("자바책...");
name = aName;
}
public void display() {
System.out.println("이 책은 자바언어를 공부하는데 쓰입니다...");
}
public String toString() {
return "책 제목은 : " + name ;
}
private String name;
}

public class MyPolymorphism {
public static void main(String[] args) {


Book[] theBooks = {
              new EngBook("English Alive..."),
              new JavaBook("자바정복하기..."),
new JavaBook("자바30일완성..."),
new EngBook("영어박살내기...")
};
Book selectedBook;
Random select = new Random();

for(int i=0;i<10;i++) {
selectedBook = theBooks[select.nextInt(theBooks.length)];
System.out.println("\n ***** 선택한 책 ***** \n" + selectedBook);
selectedBook.display();
}
        }
}