레이블이 소멸자인 게시물을 표시합니다. 모든 게시물 표시
레이블이 소멸자인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 27일 일요일

[자바배열정열]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)

[자바배열정열]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)
 
예제를 보시면 이해가 되리라 생각 합니다.
참고하시구요, 열공 하세요.
 
//
//  @Java Tip
//  @author 오라클자바커뮤니티, 오엔제이프로그래밍
//  @Desc : java.util.Arrays 클래스의 sort메소드를 이용한 정렬
// 
package onj;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

public class ArraySortExam {
 public static void main(String[] args) {
  String[] myArray = { "c", "a", "b" };
  // 일단 그냥 출력 해보자. c, a, b 순으로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // Ascending Sort, 오름차순 정렬
  Arrays.sort(myArray);
  // a, b, c로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // 이번에는 내림차순(Descending) 졍렬
  Arrays.sort(myArray, Collections.reverseOrder());
  // c, b, a로 출력
  for (String s : myArray) {
   System.out.println(s);
  } 
 }
}

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일 월요일

JAVA Struts Model

Struts의 Model 


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


스트럿츠에서 모델은 Business Logic을 처리하는 부분과 처리된 결과를 저장 하기 위한 부분으로 나누어 볼 수 있는데 처리된 결과를 저장 하는 빈은 Value Object 또는 DTO라고 부르고 있습니다.

Value Object로 볼 수 있는 DTO(Data Transfer Object)는 대부분 비즈니스 객체를 원격지 뷰에 제공 하는데 사용 합니다.

DTO는 원격 객체의 비즈니스 로직을 표현하지만 비즈니스 로직 안에 있을 필요는 없습니다. 앞의 로그인 예제에서 UserInfoVO.java가 DTO의 역할을 한다고 할 수 있습니다.

DTO를 이용하는 것은 분산 환경에선 거의 필수 이며 네트웍 부하를 줄일 수 있으며 스트럿츠에서 DTO를 사용하는 것은 비즈니스 객체와 프리젠테이션을 분리하며 유지 보수를 용이 하게 합니다.

이전의 로그인 예제를 다시 돌아가 보면 LoginAction에서는 실제 로그인을 처리하는 과정은 포함되어 있지 않습니다. Action 클래스는 Controller의 일부라고 이전에 이야기 했습니다.

Action 클래스에서는 인증 처리를 LoginDAO.java에 위임을 했는데 이렇게 분리 하는 경우 인증 모듈에 변경이 가해 지더라도 Action 클래스에는 영향을 끼치지 않는 것 입니다.

아래 소스 코드를 보도록 하죠…( LoginAction.java)

package login2;

import org.apache.struts.action.Action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;

import login2.LoginForm;
import login2.Constants;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionServlet;

/**
 * @author 이종철
 */
public class LoginAction extends Action {
               
        public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
                String id = ((LoginForm)form).getId();
                String pwd = ((LoginForm)form).getPwd();
               
                //Model을 이용하기 이용하여 인증부분의 처리를 합니다.
                LoginDAO loginDAO = new LoginDAO();
                UserInfoVO userinfo = loginDAO.authUser(id, pwd);
               
                //에러 내용을 담을 ActionErrors 객체를 생성
                ActionErrors errors = new ActionErrors();
               
                if (userinfo==null) {
                        //인증 실패                       
                        errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.login.invalid"));                       
                }
                else {
                        //사용자 아이디와 비밀번호가 틀릴경우 비밀번호가 틀리다는 에러 메세지 출력
                        if ( !id.equals(userinfo.getPwd()) ) {
                              errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error.login.invalid"));
                        }
                }
               
                //로그인 과정에서 에러가 있을 경우 Action클래스의 saveErrors 메소드를 이용해  에러를 저장하고
                //이전의 로그인 페이지로 돌려 보내면 login.jsp의 <html:errors/> 태그에 의해 오류가 출력 돔
                //mapping의 getInputForward()에서 반환하게 되는 정보는 struts-config.xml의 action태그의
                //input 속성에  정의된 페이지로 이동하게 됩니다.
                if (!errors.isEmpty()) {
                    saveErrors(request, errors);
                  return (mapping.getInputForward());
                }       
                               
                //인증 성공한 경우 세션에 LoginInfoVO(로그인한 사용자 정보를 담은 객체)저장
                HttpSession session = request.getSession();
                session.setAttribute(Constants.USER_KEY, userinfo);
               
                //로그를 남기자.
                StringBuffer buf = new StringBuffer("LoginAction : User --> ");
                buf.append(id + "logged in session");
                servlet.log(buf.toString());
                               
                return (mapping.findForward(Constants.SUCCESS));                       
               
        }

       
}

LoginDAO loginDAO = new LoginDAO();
UserInfoVO userinfo = loginDAO.authUser(id, pwd);
이 부분을 보면 LoginDAO의 authUser라는 메소드가 인증을 수행 함을 알 수 있는데…
실행 후 결과를 리턴 하는 부분을 보면 USerInfoVO라는 DTO(Data Transfer Object)를 리턴함을 알 수 있습니다.

LoginDAO는 비즈니스 로직을 수행하는데(인증처리), 이 처리가 정상적으로 된 경우 사용자 정보(UserInfoVO)를 어디엔가 저장 해 두고 (ID와 PWD이외의 정보가 DB에서 읽혀져서 포함 될 수 있습니다.) 나중에 VIEW에서도 꺼내 볼 수 있는데 이때 UserInfoVO 빈이 DTO or Value Object가 됨을 알 수 있습니다.

이 USerInfoVO는 LoginAction에서 인증 결과가 성공 이었음을 확인 후 session에 setAttribute로 저장 됩니다.

//인증이 성공한 경우 세션에 UserInfoVO(로그인한 사용자 정보를 담은 객체)저장
HttpSession session = request.getSession();
session.setAttribute(Constants.USER_KEY, userinfo);



아래는 LoginDAO.java 파일의 내용 입니다.

package login2;

public class LoginDAO {
       
        public UserInfoVO authUser(String id, String pwd) {
                /**
                * 이부분은 실제 DB에서 ID와 PASWORD로 인증을 해야 하는 부분 입니다.
                * 예제를 간략히 하기 위해 이부분의 처리는 생략 했으며 ID가 "jclee", Password가 "jclee" 인 경우엔
                * 인증을 허용 합니다.
                */
               
                if ( id.equals("jclee")&& pwd.equals("jclee")) {
                        //ID:jclee, PASSWORD:jclee인 경우 인증이 성공, 사용자의 정보(아이디, 패스워드)를 저장 합니다.
                        return new UserInfoVO(id, pwd);
                } else {
                        return null;
                }               
        }
}


아래는 DTO인 UserInfoVO.java 입니다.

package login2;
/**
 * 로그인이 정상적으로 이루어진 경우 사용자의 정보 등을 저장 하는 빈
 * 본 예제에서는 ID와 PASSWORD를 저장 합니다.
 */
public class UserInfoVO {
        private String id = null;
        private String pwd = null;
       
        //LoginDAO에서 인증이 성공인 경우 아래의 생성자를 불러 값을 setting 합니다.
        public UserInfoVO(String id, String pwd){
                this.id = id;
                this.pwd = pwd;
        }
       
        public  String getId() {
                return id;
        }

        public  String getPwd() {
                return pwd;
        }
}


다음은 VIEW쪽에서 세션에 저장 되어 있는 UserInfoVO 빈을 이용하는 예 입니다.
<body>               
            <h3>반갑습니다.<bean:write name="user" property="id"/>님!</h3>       
                <ul>                       
                        <li>                           
                                <html:link forward="logoff">로그아웃</html:link>
                        </li>                       
                </ul>
        <body> 

2013년 8월 1일 목요일

JAVA Finalize() 메소드 , java destroy

클래스 정의에 포함가능, 객체가 소멸되어 메모리에서 차지하던 공간을 해제하기 직전에 자동으로 호출된다.
 쿨래스 객체가 소멸될때 특별한 작업을 필요로 하는 자원을 사용한느 경우에 용이
  (대부분 이러한 환경은 자바환경에 들어 있지 않으며 자동으로 해제가 되지 않는다. 글꼴이나 그리기등의 그래픽자원, 하드디스크등의 외부파일… 디스크의 파일등을 열면서도 종결이 보장되지 않는다면 객체가 소멸될때 파일을 닫았는지 확인 해야한다.)
 객체가 소멸된 사실을 기록하는것(예를들어 객체의 개수를 세는 count 변수등이 있다면 이 메소드에 변수의 값을 –하면 될것이다…)