Spring (스프링) 이란?

스프링 프레임워크 소개

 


스프링이란 무엇인가?


:스프링(Spring)은 간단히 말하면 엔터프라이즈 어플리케이션에서 

필요로 하는 기능을 제공하는 프레임워크이다.

 스프링은 J2EE가 제공하는 다수의 기능을 지원하고 있기 때문에,

 J2EE를 대체하는 프레임워크로 자리 잡고 있다.

※ 엔터프라이즈 어플리케이션?( 난 모르겟다. 그래서 찾아봐따)

    - 회사에서는 모든 다른 시스템들, 예로 재무, 회계, 생산, 판매 등에서 추출된 정보를 통합하여 일을 처리하는 것이 관건

       이를 위해 여러 전사적 시스템이 개발 되었는데 그 대표적인 시스템들로 ERP, SCM, CRM, KMS 가 있다.

       이렇게 시스템들은 회사의 비지니스 프로세스를 조밀하게 해주어 비지니스를 더욱 더 유연하고 생산적으로 만들어준다.

       이게! 엔터프라이즈 어플리케이션! 쉽게 말해 조직을 강화시키기 위한 하나의 수단 및 프로그램이다.

       이 설명으로는....아 ! 이게 이런 느낌이 안온다... 좀더 찾아봐야지 


  


스프링 프레임워크 특징


- 스프링은 경량 컨테이너이다. 스프링은 자바 객체를 담고 있는 컨테이너이다. 

  스프링은 이들 자바 객체의 생성, 소멸과 같은 라이프 사이클을 관리하며,

  스프링으로부터 필요한 객체를 가져와 사용 할 수 있다.


- 스프링은 DI(Dependency Injection) 패턴을 지원한다. 

  스프링은 설정 파일을 통해서 객체 간의 의존 관계를 설정할 수 있도록 하고 있다.

  따라서 객체는 직접 의존하고 있는 객체를 생성하거나 검색할 필요가 없다.


-스프링은 AOP(Aspect Oriented Programming)를 지원한다. 

 스프링은 자체적으로 AOP를 지원하고 있기 때문에 트랜잭션이나 로깅,

 보안과 같이 여러 모듈에서 공통으로 필요로 하지만 

 실제 모듈의 핵심은 아닌 기능들을 분리해서 각 모듈에 적용할 수 있습니다.


-스프링은 POJO(Plain Old Java Object)를 지원한다. 

 스프링 컨테이너에 저장되는 자바 객체는 특정한 인터페이스를 구현하거나 

 클래스를 상속받지 않아도 된다. 

 따라서 기존에 작성한 코드를 수정할 필요 없이 스프링에서 사용할 수 있다.


-트랙젝션 처리를 위한 일관된 방법을 제공한다.

 JDBC를 사용하든, JTA를 사용하든, 또는 컨테이너가 제공하는 트랙잭션을 사용하든,

 설정 파일을 통해 트랜잭션 관련 정보를 입력하기 때문에 트랙잭션 구현에 상관없이

 동일한 코드를 여러 환경에서 사용 할 수 있다.


-영속성과 관련된 다양한 API를 지원한다. 스프링은 JDBC를 비롯하여 iBATIS, 

  하이버네이트,JPA,JDO등 데이터베이스 처리와 관련하여 널리 사용되는 

  라이브러리와의 연동을 지원하고 있다.


-다양한 API에 대한 연동을 지원한다. 스프링은 JMS, 메일, 스케줄링 등 엔터프라이즈 

  어플리케이션을 개발하는데 필요한 다양한 

  API를 설정 파일을 통해서 손쉽게 사용할 수 있도록 하고 있다


-스프링은 자체적으로 MVC 프레임워크를 제공한다. 따라서 스프링만 사용하더라도 MVC 기반의 웹 어플리케이션을

  어렵지 않게 개발할 수 있다. 또한 스트럿츠, WebWork, JSF 와 같은 프레임워크와의 연동을 지원하고 있기 때문에 이들

  프레임웨크에서 스프링이 제공하는 다향한 기능을 손 쉽게 사용할 수 있다.

- 리절트 타입 Dispatcher 와 Redirect 의 차이

   예) 기본 리절트 타입 설정(type="dispatcher") 기본타입이므로 생략 가능

         <action name="LoginAction" class="action.LoginAction">

                 <interceptor-ref name="params"/>

     <result name="success" type="dispatcher">/jsp/loginSuccess.jsp</result>

         </action>


   예) Redirect 리절트 타입 설정(type="redirect)

         <action name="LoginAction" class="action.LoginAction">

                 <interceptor-ref name="params"/>

     <result name="success" type="redirect">/jsp/loginSuccess.jsp</result>

         </action>



 - 두 리절트 타입의 차이점

    ①  redirect 리절트 타입

         - JSP 에서 response.sendRedirect(" "); 메서드를 호출한 것과 같은 효과를 낸다.

         - 같은 효과가 모냐고 물으신다면...

            redirect 리절트 타입은 리다이렉트할 URL 을 응답으로 웹 브라우저에 보낸다. 

            URL 로 새롭게 서버와 연결이 되므로 request 가 새롭게 생성되는 것을 의마한다.

            웹 브로우저에 나타나는 URL도 바뀐다.(마지막 redirect 로 설정한 URL 이 표시됨.)

     ② dispatcher 리절트 타입(기본타입 - 생략가능)

         - dispatcher 타입은 request 가 유지된다. 서버와 새롭게 연결이 되는것이 아니므로 처음 접속했던 request 정보를 가진다.

           그 뜻은, redirect 타입처럼 새로 request 를 생성하는 것이 아니라 요청처리를 다른 웹 리소스로 위임하는 것이다.

           따라서, 웹 브라우저 상의 요청 URL 이 바뀌지 않는다.

   


※ 이건 구지 테스트 할 필요가 없을 것 같다. 액션 처리 후 리절트 페이지에서 URL 이 바뀌냐 안바뀌냐의 차이일뿐이니깐

     dispatcher 이면 페이지에서 지정한 action 페이지 URL 이 보일것이고,(위의 예를 들자면 action.LoginAction)

     redirect 이면 actino 처리 후 result 에 지정한 경로가 보일 것이다.(/jsp/loginSuccess.jsp)

- 스트럿츠2 프레임워크의 아키텍쳐를 묘사한것 ( 참고서적 : 스트럿츠2 프로그래밍 입문 )


- 간단한 설명

  스트럿츠 2는 모든 요청을 필터인 FilterDispatcher 가 처리한다. ( 스트럿츠2 web.xml 설정을 보면 알수있다. )

  FilterDispatcher 은 요청이 들어오면 ActionProxy 인스턴스가 생성되고 액션 실행을 위임한다.

  ActionProxy 는 인터셉터와 리절트 등 액션 실행 구성을 읽어서 Action Invocation을 초기화 하고 실행한다.

  Action Invocation 은 실질적인 '인터셉터' 와 '액션 리절트' 의 실행을 담당한다.




- 각 항목(아키텍처) 별 기능 및 역할

  1. 스트럿츠 2 필터 디스패쳐(Filter Dispatcher) 의 역할

     - 웹 어플리케이션 단위로 설정되는 컨텍스트마다 애플리케이션 에 대한 모든 요청이 스츠럿츠2 서블릿 필터로 전달되며,

        필터에서 어떠한 처리가 될 것인지가 결정된다. (즉, 필터 디스패쳐는 요청에 대한 진입점)

        ※ 스트럿츠 2 프레임 워크는 어떠한 처리를 할 것인지가 웹 어플리케이션 Web.xml 에 의해 결정된다.

  

  2. 설정 관리자 / 액션 매퍼

     - 사용자 요청이 들어올 때, 어떠한 액션이 URL로 매핑될 것인지에 대한 결정을 하기 위해 설정 관리자(ConfigurationManager) 

        와 액션 매퍼(ActionMapper)를 사용한다.

        설정관리자(ConfigurationManager)는 struts.xml 파일을 사용하여 초기화 된다.

        필터 디스패쳐는 액션 요청 처리를 위해 액션 매펴의 도움을 받아서 보내진 요청이 스트럿츠2 액션을 위한 요청인지의 여부를

        판단한다. 액션 매퍼를 통해 액션 요청으로 판단되면 액션 프록시(ActionProxy)에게 제어를 위임한다. 

        만약, 요청된 이름과 일치되는 액션이 발견되지 않으면 오류를 반환한다.


  3. 액션 프록시 / 액션 인보케이션 / 액션 컨텍스트 

     - 액션 프록시는 액션 실행을 위해 제공되는 대행자이다.액션 프록시 팩토리 인스턴스를 사용하여 필터디스패쳐에 의해 생성되고

        struts.xml 파일을 사용하여 초기화되는 설정 관리자(ConfigurationManager) 를 참조한다.

        액션 프록시는 액션 인보케이션을 생성하고, 액션 인보케이션은 액션 실행에 앞서 인터셉터를 찾아서 호출한다.

        더 이상 호출할 인터셉터가 없다면 액션 인스턴스가 실행된다. 이에 대한 동작은 다시 설명하겠다.

        글로 길게 써봐야 나중에 보지도 않을 뿐더러, 손만 아프니 내가 보기 편하게 쉽게 설명할 것이야 !!!


        ① web.xml 에  스트럿츠 필터 클래스(org.apache.struts2.dispatcher.FilterDispatcher)등록 & 필터 맵핑 등록

        ② 등록 후 어플레케이션 내의 모든 요청은 FilterDispatcher 가 처리한다.

        ③ FilterDispatcher 는 요청이 들어오면 ActionProxy 인스턴스 생성하고 액션 실행을 위임한다.

        ④ ActionProxy 는 다시 ActionInvocation 생성하고, inoke() 메서드 호출한다.

        ⑤ ActionInvocatino 은 인터셉터 스택 중 실행할 다음 인터셉터 확인 후 존재시 인터셉터의 intercept() 메서드 호출(전처리)

        ⑥ 인터셉터의 intercept() 메서드는 파라미터로 넘어온 액션 인보케이션의 invoke() 메서드를 다시 호출하여 체인을 형성

        ⑦ 이와 같은 방법으로 순차적으로 마지막 인터셉터까지 반복한다. 끝나면 액션을 실행 후 Result 를 실행

        ⑧ Result 실행 후 인터셉터들이 역순으로 반환된다.(후처리)


        

  

- 보통 액션을 실행 한 후에는 리절트 페이지로 포워딩하도록 구성한다.

   예) struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

    

<struts>

    <package name="ch04" namespace="" extends="struts-default">

        <action name="HelloWorld02" class="action.HelloWorld02">

            <interceptor-ref name="params"/>

            <result name="success">/helloWorld.jsp</result>

        </action>

    </package>

</struts>



- 그러나 경우에 따라서는 액션을 수행한 후에 다른 액션에서 이전 요청의 정보와 액션의 상태 값을 유지하여 계속해서 사용해야 

   할 경우가 생긴다. 이러한 경우에는 액션체인을 사용하여 다른 액션에게 상태 값을 유지하면서 호출 할수 있다.

   <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

    

<struts>

    <package name="struts2" namespace="" extends="struts-default">

        <action name="UserRegForm">

            <result>/jsp/userRegForm.jsp</result>

        </action>

    

        <action name="UserRegLoginAction" class="action.UserRegAction">

            <interceptor-ref name="params"/>

            <result name="success" type="chain">

                <param name="actionName">LoginAction</param>

                <param name="namespace">package_namespace</param>package 태그 속성 namaspace 했을시에만 참

            </result>

        </action>

        <action name="LoginAction" class="action.LoginAction">

            <interceptor-ref name="chain"/>

            <interceptor-ref name="params"/>

            <result name="success">/jsp/userRegSuccess.jsp</result>

        </action>

    </package>

</struts>

<%@ page contentType="application;" %>

<%@ page import="java.util.*,java.io.*,java.sql.*,java.text.*"%>

    <%

        String strFilename=java.net.URLDecoder.decode(request.getParameter("filePath")); // filePath : 파일의 풀경로명

        String strFilenameOutput=new String(strFilename.getBytes("UTF-8"),"8859_1");

        

        File file=new File(strFilename);

        byte b[]=new byte[(int)file.length()];

        

        response.setHeader("Content-Disposition","attachment;filename="+strFilenameOutput);

        response.setHeader("Content-Length",String.valueOf(file.length()));

        

        if(file.isFile()){

            BufferedInputStream fin=new BufferedInputStream(new FileInputStream(file));

            BufferedOutputStream outs=new BufferedOutputStream(response.getOutputStream());

            

            int read=0;

                

            while((read=fin.read(b))!=-1){outs.write(b,0,read);}

                    outs.close();

                    fin.close();

        }

    %> 

- 필요한 Jar 파일

commons-fileupload-1.2.2.jar

commons-io-2.4.jar



- 파일업로드 클래스(MultiPart.java)


package com.util;


import java.io.File;

import java.io.UnsupportedEncodingException;

import java.util.List;


import javax.servlet.http.HttpServletRequest;


import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileItemFactory;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;



public class MultiPart {

    List items; // 입력 데이타 항목들로 구성된


    /* 생성자 */

    public MultiPart(HttpServletRequest request) throws Exception {

        FileItemFactory factory = new DiskFileItemFactory();

        ServletFileUpload upload = new ServletFileUpload(factory);

        items = upload.parseRequest(request);

    }


    /* 주어진 이름에 해당하는 데이터 값을 리턴하는 메서드 */

    public String getParameter(String fieldName) throws UnsupportedEncodingException {

        for (int i = 0; i < items.size(); i++) {

            FileItem item = (FileItem) items.get(i);

            if (item.getFieldName().equals(fieldName))

                return item.getString("UTF-8");

        }

        return null;

    }


    /* 주어진 이름에 해당하는 업로드 파일의 경로명을 리턴하는 메서드 */

    public String getFilePath(String fieldName) {

        for (int i = 0; i < items.size(); i++) {

            FileItem item = (FileItem)items.get(i);

            if( item.getFieldName().equals(fieldName) )

                return item.getName();

        }

        return null;

    }


    /* 주어진 이름에 해당하는 업로드 파일의 이름을 리턴하는 메서드 */

    public String getFileName(String fieldName) {

        String path = getFilePath(fieldName);

        int index1 = path.lastIndexOf("/");

        int index2 = path.lastIndexOf("\\");

        int index = 0;

        if( index1 > index2 )

            index = index1;

        else

            index = index2;

        if( index < 0 )

            return path;

        else

            return path.substring(index + 1);

    }


    /* 주어진 이름으로 해당하는 업로드 파일을 저장하는 메서드 */

    public void saveFile(String fieldName, String path) throws Exception {

        for (int i = 0; i < items.size(); i++) {

            FileItem item = (FileItem)items.get(i);

                if( item.getFieldName().equals(fieldName) ) {

                    if( !item.isFormField() ) {

                        item.write(new File(path));

                        return;

                    }

                }

        }

    }

}// end - class



- 업로드 예제(FileUpLoad) - JSP 페이지라고 가정


        /* 파일업로드 기능 추가후 파미터 받기 */

        MultiPart multiPart = new MultiPart(request);

        String title = multiPart.getParameter("title");

        String writer = multiPart.getParameter("writer");

        String content = multiPart.getParameter("content");

        String fileName = multiPart.getFileName("file");


※ 입력 폼에서 파일업로드할시 method="post" enctype="multipart/form-data" 해주어야 함.

    이후에 Action.jsp 에서 String 받는거처럼 request.getParameter("ParameterName");

    로 받아서 찍어보면 전부 Null 값으로 나온다.

    위에 처럼 MultiPart 로 받아와야함.


             if( fileName !=null || fileName != "" ){

        /* 작성자 및 날짜로 파일명 중복 예방? */

        String filePath = firstDt + "_" + writer + "_" + fileName;

        newPath = application.getRealPath("/upload/" + filePath);

        /* 파일 업로드 저장 */

        multiPart.saveFile("file", newPath);

        }

        else{

            newPath = "Not File";

        }


※ 파일이름 받아와서 Null 유뮤 체크하그 업로드


'공부 > JAVA_UTILL_CLASS' 카테고리의 다른 글

JSP_[util.CookieBox]  (0) 2012.07.24

- 오류현상

   DB 가 불안정하여 shutdown 후 재기동 startup 을 하자 오류발생

ORA-16038: log 2 sequence# 51 cannot be archived

ORA-19809: limit exceeded for recovery files

ORA-00312: online log 2 thread 1:

'/home/oracle/app/oracle/oradata/[SID]/redo02.log'


복구파일 보존공간이 꽉 찼다는 오류 메시지라는데... 잘모르겟다


- 해결방안


[oracle@cent ~]sqlplus / as sysdba

SQL> recover database until cancel;

media recovery completed (대략 저런 메세지)


SQL> alter database open resetlogs;

database altered


SQL> shutdown;


SQL> startup;


'공부 > ORACLE_ERROR' 카테고리의 다른 글

ORACLE_[ ORA-12519 해결방법 ]  (0) 2014.11.06

<script>
//screen.width  : 현재 운영체제의 너비
//screen.height : 현재 운영체제의 높이
w = 640;    //팝업창의 너비
h = 510;    //팝업창의 높이

//중앙위치 구해오기
LeftPosition=(screen.width-w)/2;
TopPosition=(screen.height-h)/2;

//팝업 호출
function popup_open() {  
    window.open(
        팝업url,
        "팝업창이름",
        "width="+w+",height="+h+",top="+TopPosition+",left="+LeftPosition+", scrollbars=no");
}
</script>



- 부록

window.open()의 모든 옵션들에 대한 이해

  • name = window.open( "창에 보여줄 파일/홈페이지의 이름/주소", "창의 이름", "옵션" )

window.open() 메소드에 전달할 수 있는 파라미터 중 첫 번째는 보여줄 내용이고, 두 번째는 target으로서의 창 이름이며 세 번째가 창의 위치와 크기 및 모양을 지정할 수 있는 옵션 그룹이다. 그리고 window.open() 메소드가 되돌리는 값을 name에 담았다면 그 name은 그 창(자식 창)을 연 opener(부모 창)에서 자식 창을 컨트롤할 수 있는 이름이 된다.

다음과 같이 창을 열어보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, toolbar=no, location=yes, directories=no, status=no, menubar=no, scrollbars=yes, copyhistory=yes, resizable=no')">

<INPUT>

참고로 가끔 보면 옵션들 사이에 빈칸이 있으면 안 된다고 말하는데, 이것은 넷스케이프에 관한 설명인 듯하다. 익스플로러에서도 줄바꿈(리턴)이 있으면 안 된다. 하드 리턴(문단 바꿈, <p>)은 물론이고 소프르 리턴(줄만 바꿈, <br>)도 끼어들면 결코 안 될 것이다.

창 열기 옵션은 상당히 많은데, 알아 두면 좋지만 다 외우기는 쉽지 않다. 모든 옵션을 한 번 보되, 나름대로 그룹화하여 소개한다. 이 내용은 1차적으로 http://pl.changwon.ac.kr/~chowing/js/win_open.html을 참고한 것이다. 넷스케이프 전용인지 익스플로러 전용인지 등을 확인하는 데 도움이 될 참고 사이트는 http://www.kbtech777.co.kr/lecture/webprog/jscript/javalibrary.htm(Javascript 속성 라이브러리) 등.

위치

screenX / left(ie전용) : 왼쪽 좌표, screenY / top(ie전용) : 위쪽 좌표

크기

width : 너비, height : 높이

resizable(크기변경 허용 여부)

innerWidth, innerHeight, outerWd\idth, outerHeight(넷스케이프 전용?)

다른 창과의 관계

dependent(opener가 닫히면 함께 닫힘)

alwaysLowered(항상 깔림), alwaysRaised(항상 드러남)

z-lock(yes로 설정하면, 활성화되어도/포커스가 주어져도 다른 창 위로 떠오르지는 못하게 막는다)

기타 옵션들

hotkeys( no로 지정하면 menubar 없이는 (security 및 quit) 핫키를 제외한 어떤 핫키도 사용할 수 없게 된다 )

directories(디렉터리 버튼들)

location(로케이션 엔트리)

menubar(File, Edit, View, 기타의 메뉴바)

scrollbars(필요할 때 나타날 스크롤바)

status(아래쪽 상태바)

titlebar(위쪽 타이틀바)

toolbar(Back, Forward, 기타의 툴바)

IE4(이상)에서만 사용 가능한 옵션들

channelmode(채널바가 있는 창)

fullscreen(전체 화면 차지)

left(screenX), top(screenY)

위와 같은 방식으로 정리하면 저절로 외워지게 하는 데 도움이 되지 않을까 생각한다. 정리한 직후에 남는 궁금증은 z-lock과 alwaysLowered는 동일한 옵션인가? 하는 점이다. 실습이 최상의 선택이라고 믿으므로 차근히 테스트해 보자.

먼저, 아무 옵션도  주지 말고 창을 열어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','')">

 

타이틀바, 메뉴바, 툴바, 로케이션 엔트리, 스크롤바, 상태바 등 아무튼 얼른 보아서 모든 옵션들이 다 yes로 설정되어 나타나는 것 같다. 이번에는 크기와 위치만을 지정하여 창을 열어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300')">

 

이번에는 타이틀바만 나타나고, 다른 모든 것이 no로 설정된 모양이다(최대화 버튼이 죽어 있다). resizable로 no인 것이 분명하다. 옵션 중에 하나라도 설정하면 타이틀바와 hotkeys만 yes로 되고 나머지는 모든 no로 디폴트 설정되는 것이라고 이해하면 될 것 같다.

다음으로, resizable, resizable=yes 또는 resizable=1을 크기, 위치 지정과 함께 주어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable=1')">

 

최대화 버튼이 살아나고, 가장자리에 마우스를 대면 리사이즈 화살표 모양으로 변한다. 이번에는 디렉터리 버튼들을 나타내어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories')">

 

타이틀바 아래에 '연결, 링크 사용자 정의, 인터넷 시작' 등 줄이 나타나고 그 줄 오른쪽의 >> 표시를 클릭하면 채널 가이든 등 리스트가 드롭다운된다. 이번에는 로케이션 엔트리를 나타내어 보자.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location')">

 

이번에는 디렉터리 버튼들이 오른쪽으로 밀려 나가고, 같은 줄 왼쪽에 '주소'라는 표시와 로케이션 드롭다운이 심어져 있다.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location, menubar')">

 

타이틀바와 로케이션/디렉터리 중간에 메뉴바 줄이 삽입된다.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location, menubar, scrollbars')">

 

스크롤바를 지정하면, 스크롤할 필요가 없는 경우에도 오른쪽의 스크롤바는 여전히 나타난다.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location, menubar, scrollbars, toolbar')">

 

타이틀바, 메뉴바 아래에 뒤로/앞으로/중지/새로고침 등의 툴바가 삽입된다.

<input type=button value="창" onClick= "window.open( 'small.htm','new','left=300, top=300, width=400, height=300, resizable, directories, location, menubar, scrollbars, toolbar, status')">

 

아래쪽 상태바까지 모든 것이 다 나타난다.


- 날짜포멧 API

Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800

그리고 아래의 간단한 예제는 API문서에서..
Date and Time Pattern Result
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700


이정도면 어느정도 이해는 하고 사용은 할수 있겠다.


- 사용예제

        Date now = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

  String firstDt = format.format(now);


'공부 > JAVA' 카테고리의 다른 글

JAVA_[ OS 정보 확인 ]  (0) 2013.09.30
JAVA_[ Int & Integer 차이 ]  (0) 2013.03.22
JAVA_[Vector]  (0) 2012.07.31
JAVA_[Thread]  (0) 2012.06.23
JAVA_[객체_직렬화]  (0) 2012.06.23

- 우선, STRUTS 에서 구성하는 방법 세가지

1. POJO(Plain Old Java Object)

2. implements Action

3. extends ActionSupport    (유효성 체크 가능 : validate() )

요건 알고 시작해야지!

- 2번째 implements Action 에서 도메인 오브젝트(모델영역 : ex - User.java)

모델영역의 도메인 오프젝트를 독립적으로 분리시킴으로써, 어떤 프레임워크 상에서 어떤 뷰를 사용해서 어떻게 구현하였는지

에 대한 영향을 받지 않도록 하기위함.


MVC 패턴지향의 예(교재 : 스트럿츠2 프로그래밍 입문)

1. Model

2. Action

3. Dao

- 모델(Model : Bean.java) 생성(Getter * Setter) 후 struts.xml 에  <action name="" class=""></action> 등록하고

  package model;

public class User {

    private String userId;
    private String userPw;
    private String userName;

    /* Getter & Setter */
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUserPw() {
        return userPw;
    }
    public void setUserPw(String userPw) {
        this.userPw = userPw;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /* toString */
    @Override
    public String toString() {
        String result;
        result =  "User [userId=" + userId + ", userPw=" + userPw + ", userName="
                + userName + "]";
        return result;
    }// end - toString Method

}// end - UserClass


- <action></action> 밑에 <interceptor-ref name="params"/> 등록해서 입력 폼에서 요청 파리미터와 같은 이름을 가진

   액션 프로퍼티에 값을 저장, 액션 수행 execute() 후 실행할 result 페이지 등록

<struts.xml>

        <!-- 도메인 오브젝트 테스트 -->
        <action name="UserRegForm2">
            <result>/jsp/userRegForm2.jsp</result>
        </action>
        <action name="UserRegAction2" class="action.UserRegAction2">
            <interceptor-ref name="params"/>
            <result name="success">/jsp/userRegSuccess.jsp</result>
        </action>


- action 페이지에서 도메인 오프젝트(Model : Bean) 생성, get, set 생성 후

execute() 메서드에서 Dao 호출하여 DB 작업

<UserRegAction2.java>

  package action;

import model.User;

import com.opensymphony.xwork2.Action;

import dao.UserDao;

public class UserRegAction2 implements Action {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user){
        this.user = user;
    }

    @Override
    public String execute() throws Exception {
        /* Dao Instance Create */
        UserDao userDao = new UserDao();
        userDao.create(user);
        return SUCCESS;
    }// end - execute Method

}// end - UserRegAction2 class


- action 에서 Model 객체 Dao 넘김 -> Dao 에서 데이타베이트 처리(현 예제는 간단히 Model 객체 출력으로 대처)

<UserDao>

package dao;

import model.User;

public class UserDao {

    public void create(User user) {
        System.out.println("사용자를 추가하였습니다.");
        System.out.println("추가된 사용자의 정보");
        System.out.println(user);
    }// end - create Method

}// end - UserDao class


이런 방식인데. 현 주제의 implements Action 도메인 오브젝트 를 사용하면 입력 폼이 있는 JSP 페이지에서

<form action="action Name"> 으로 넘겨줄때 Parameter 이 액션객체로 넘어갈때. 액션에 생성된 Model 인스턴스명 + 변수명 을

같이 지정해 주어야 한다.

(※ 책에서 그냥 도메인오브젝트명이래서 긴가민가 하다 액션에서 Model 인스턴스명 변경하고 테스트하니 오류 발생)

<input type="text" name="액션에서생성한Model 인스턴스명.변수명"> -> <input type="text" name="user.userId">  이렇게!!!

또. action execute() SUCCESS 이후 struts.xml 에 등록한 <result name="success"></result> 에 등록한 페이지에서 보여줄때도

같은방식으로 보여줘야 한다. 예를 들면 아이디 : ${user.userId} 이렇게!!!!


와~ 신기하다!! 근데 조금만 쓰면 입력 폼이 존재하는 JSP 와 결과를 보여줄 JSP 모든 뷰에서 action 에서 생성한 인스턴스명을 꼭

붙여주여야 해서 어간 불편한게 아닐수 아닐수 아닐수 없을수 없다.

그래서. 사용하는것이 "ModelDriven" 와 "Preparable" 두개이다. 이건 다음장에서 설명









+ Recent posts