2013. 7. 29. 16:04

.

하지만 자바 리플렉션도 같은 기능을 제공한다고 생각할 수도 있다. 결국 이 모든 정보에 대한 코드를 검사할 수 있다. 표면적으로 볼 때 그럴 듯 하지만 실제로 그렇지 않다. 

많은 경우 메소드는 인풋으로서 받아들이거나 아웃풋으로 리턴한다. 이는 메소드가 원하는 것이 아니다. 예를 들어, 매개변수 유형이 Object이지만 메소드는 Integer를 사용해서만 작동한다. 

 

이는 메소드가 겹쳐 쓰기된 곳에서 쉽게 발생할 수 있다. 그리고 슈퍼클래스가 메소드를 일반 매개변수로 선언하던가 많은 직렬화가 진행되는 시스템에서도 쉽게 발생한다. 두 경우 모두 메타데이터는 코드 분석 툴을 지정할 수 있다. 매개변수 유형이 Object이더라도 정말로 원하는 것은 Integer라는 것을 나타낼 수 있다. 이러한 종류의 분석은 상당히 유용하며 그 가치는 상당하다. 

 

보다 복잡한 경우 코드 분석 툴은 모든 종류의 추가 태스크들을 수행할 수 있다. 그 예 중 하나가 Enterprise JavaBean (EJB) 컴포넌트이다. 심지어 간단한 EJB 시스템으로의 의존성과 복잡함은 상당하다. 

로컬 인터페이스와 로컬 홈 인터페이스의 가능성과 함께 홈 인터페이스와 원격 인터페이스를 얻는다. 이 모든 클래스들을 연동시키는 것은 진정한 고통이다. 하지만 메타데이터는 이 문제에 대한 솔루션을 제공한다. 좋은 툴은(예를 들어, XDoclet)은 이 모든 의존성을 관리하면서 "코드-레벨" 연결이 없지만 "로컬-레벨" 관계를 가진 클래스들이 연동될 수 있도록 한다. 이것이 바로 메타 테이터의 진정한 가치이다. 

 

2. Annotation의 종류

 1) Mark Annotation

   변수가 없다. 이 어노테이션은 이름으로 구분되며 추가 데이터 없이 나타난다. 예를 들어, 

 

@MarkerAnnotation은 marker 어노테이션이다. 데이터가 없으며 단지 어노테이션 이름만 있을 뿐이다.

   예) @Stateless

 


2) Single-value Annotation

   marker와 비슷하지만 데이터를 제공한다. 싱글 비트 데이트를 제공하기 때문에 간단한 신택스를 사용할 수 있다. (단, 어노테이션 유형이 이 문법을 수용해야 함)

 

@SingleValueAnnotation("my data")이는 @표시만 제외하고는 일반적인 자바 메소드 호출과 비슷하다.

   예) @Resource("mappedName=PERSON")

 


 3) Full Annotation(Multi value Annotation)

   다중 데이터 멤버를 갖고 있다. 결과적으로 전체 신택스를 사용해야 한다. (그리고 어노테이션은 일반 자바 메소드와 더 이상 비슷하지 않다) 

 

@FullAnnotation(var1="data value 1", 

var2="data value 2", var3="data value 3") 

 


 4) 커스텀 annotation 구현 : 개발자가 직접 annotation을 구현


public @interface TODO {      // Single-Value Annotation
            String value();       // value가 아닌 다른 이름을 사용하면 사용시 메소드 이름을 써준다
    }
 
    // @TODO("Something todo")
 
    public @interface TODO{      // Single-Value Annotation
            String msg();        // value가아닌다른이름을사용한경우
    }
    // @TODO(msg="Something todo")



3. Annotation을 구분하는 또 다른 기준

 1) Simple Annotation

    메소드나 변수 위에 붙이는 일반적인 Annotation

 

 2) Meta Annotation

    Annotation의 Annotation(다른 Annotation 위에다가 설정)

 

 

4. Meta Annotation

 1) @Target annotation

    작성한 annotation이 어디에서 사용하게 될지를 결정


@Target(
{
                ElementType.TYPE,              // 클래스,인터페이스,enum
                ElementType.METHOD,            // 생성자를 제외한 모든 메소드
                ElementType.CONSTRUCTOR,       // 생성자
                ElementType.ANNOTATION_TYPE    // 메타 annotation
         }
)


2) @Retention annotation([속성값])

   작성한 annotation의 지속성을 설정

 

   - RetentionPolicy.SOURCE : 컴파일러가 컴파일시 삭제하여 클래스 파일에 저장되지 않는다

   - RetentionPolicy.CLASS : 클래스 파일에 저장되지만 JVM은 무시

   - RetentionPolicy.RUNTIME : 클래스 파일에 저장하고 JVM

 

 

5. 내장 Annotation

 1) @Override

   슈퍼클래스의 메소드를 오버라이드


public class OverrideTester {
    public OverrideTester() { }
 
    @Override
    public String toString() {
      return super.toString() + " [Override Tester Implementation]";
    }
 
    @Override
    public int hasCode() {
      return toString().hashCode();
    }
  }
 


 2) @Deprecated

    Override와 마찬가지로 Deprecated는 marker 어노테이션이다. Deprecated를 사용하여 더 이상 사용되지 말아야 하는 메소드에 주석을 단다. Override와 다른 점은, Deprecated는 더 이상 사용되지 말아야 하는(depreciated) 메소드와 같은 라인상에 놓여져야 한다.


public class DeprecatedClass {
    @Deprecated public void doSomething() {
      // some code
    }
 
    public void doSomethingElse() {
      // This method presumably does what doSomething() does, but better
    }
  }


 3) @SuppressWarnings

   번거로운 경고를 제거한다.

   Override와 Deprecated와는 다르게 SupressWarnings는 변수를 갖고 있다. 따라서 이를 작동하게 하려면 싱글-어노테이션 유형을 사용한다. 값 어레이로서 변수를 제공할 수 있다. 각각 삭제할(Suppress) 특정 유형의 경고를 나타낸다.


@SuppressWarnings(value={"unchecked"})
  public void nonGenericsMethod() {
    List wordList = new ArrayList();
    wordList.add("foo");
  }



'Framework > Spring' 카테고리의 다른 글

Spring Framework/ DI / IOC 컨테이너 / POJO  (0) 2013.07.30
Annotation_Spring_MVC_2  (0) 2013.07.29
Annotation_Spring_MVC_1  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 15:50

AbstractController을 이용한 스프링 컨트롤러 작성

설명


MultiActionController을 이용한 스프링 컨트롤러 작성

예제

설명


'JSP > JspServlet' 카테고리의 다른 글

tag : core  (0) 2013.08.16
서버 도메인 확인  (0) 2013.08.16
MVC 관련 핸들러 매핑 및 컨트롤러  (0) 2013.07.29
액션 태그와 커스텀 태그  (0) 2013.07.29
파입업로드/다운로드  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 15:40




■ Spring MVC의 주요 구성 요소

 

 

- DispatcherServlet

클라이언트의 요청을 전달받는다. Controller에게 클라이언트의 요청을 전달하고, Controller가 리턴 한 결과 값을 View에 전달하여 알맞은 응답을 생성하도록 한다.

 

- HandlerMapping

클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정한다.

 

- Controller

클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다. 스트럿츠의 Action과 동일한 역할을 수행한다.

 

- ViewResolver

Commander의 처리 결과를 보여줄 View를 결정한다.

 

- View

Commander의 처리 결과를 보여줄 응답을 생성한다.

 

 

 

■ HandlerMapping

클라이언트의 요청을 Spring의 DispatcherServlet이 처리하도록 설정했다면, 다음으로 해야 할 작업은 어떤 HandlerMapping을 사용할지의 여부를 지정하는 것이다. HandlerMapping은 클라이언트의 요청을 어떤 Controller가 수행할 지의 여부를 결정해주는데, 구현 클래스는 다음과 같다.

 

- BeanNameUrlHandlerMapping : 요청 URI와 동일한 이름을 가진 Controller 빈을 매핑 한다.

- SimpleUrlHandlerMapping : 패턴과 컨트롤러의 이름을 비교 URI가 패턴에 매칭될 때 지정한 컨트롤러를 사용 한다.

- ControllerClassNameHandlerMapping : URI와 매칭 되는 클래스 이름을 갖는 빈을 컨트롤러로 사용 //잘 쓰지 않음

- DefaultAnnotationHandlerMapping : @RequestMapping 어노테이션을 이용하여 요청을 처리할 컨트롤러를 구한다. //annotation을 사용할 경우 핵심

 

ο  BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping은 요청 URI와 동일한 이름을 갖는 Controller 빈으로 하여금 클라이언트의 요청을 처리하도록 한다. 예를 들어,http://host/hello.action 과 같은 요청 URL에 대해 "/hello.action" 라는 이름을 가진 Controller 빈이 해당 요청을 처리하도록 한다.

 

다음과 같이 alwaysUseFullPath를 true로 설정 하고 다음과 같이 빈을 설정 한 경우


 
         
     
 
     
     

 이 경우 요청 URL을 처리하는 컨트롤 빈은 다음과 같이 매핑 된다.

 

     - /content/**/*.action 빈

       /content/1/test.action

       /content/top/exam.action

 

    -  /hello/hello.action 빈

       /hello/hello.action

 

     - Ant 경로 패턴

       Ant는 자바 기반의 빌드 도구로서 『?』, 『*』, 『**』를 이용하여 경로 패턴을 명시하고 있으며, BeanNameUrlHandlerMapping과 SimpleUrlHandlerMapping은 Ant의 경로 패턴을 이용하여 요청 URL과 컨트롤의 매핑을 처리 한다.

 

       ? : 1개의 문자와 매칭

       * : 0개 이상의 문자와 매칭

       ** : 0개 이상의 디렉토리와 매칭

 

 

ο  SimpleUrlHandlerMapping

SimpleUrlHandlerMapping은 가장 많이 사용되는 HandlerMapping으로 패턴 매칭을 이용해서 다양한 URL 경로를 컨트롤러에 매핑 시켜준다.

 

SimpleUrlHandlerMapping은 다음 처럼 mappings 프로퍼티를 이용하여 패턴과 컨트롤러 사이의 매핑을 지정한다.


 
          
             contentController
             helloController
         
     
 
     
     

SimpleUrlHandlerMapping의 mappings 프로퍼티는 java.util.Properties 타입이다. mappings 프로퍼티의 값에 전달되는 <prop>의 key는 요청 URL과 매칭 될 Ant 경로 패턴을 입력하며 <prop>의 값에는 매핑될 컨트롤러의 이름을 입력 한다.

 

 

■ MVC 관련 컨트롤러

   ο  Controller 종류

     - Controller (interface)

     - AbstractController

     - MultiActionController

 

 

   ο Controller 인터페이스

Controller를 구현하는 가장 간단한 방법은 Controller 인터페이스를 implements 하는 것이지만, Controller 인터페이스를 직접적 implements 하기 보다는, Controller 인터페이스를 implements 하고 몇 가지 추가적인 기능을 구현하고 있는 클래스들을 상속받아 Controller를 구현하는 것이 일반적이다.

 

org.springframework.web.servlet.mvc.Controller 인터페이스는 다음과 같이 정의되어 있다.


public interface Controller {
           ModelAndView handleRequest(HttpServletRequest request,   HttpServletResponse response)    throws Exception
      }

ο AbstractController 추상 클래스

      Controller 인터페이스를 구현한 추상 클래스로 단순히 클라이언트의 요청을 처리한 뒤 ModelAndView 를 리턴할 경우에 AbstractController 클래스를 상속 받아 컨트롤러를 구현 한다.

 

      AbstractController 클래스는 다음과 같이 handleRequestInternal() 추상 메소드를 선언하고 있으며 AbstractController 클래스를 상속받는 컨트롤러 클래스는 이 메소드를 구현해야 한다.


protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception  

ο MultiActionController

     1) 하나의 Controller에서 여러 개의 요청 처리 지원

         - 연관 된 request를 하나의 controller로 묶을 경우 사용

 

     2) 작성

        - MultiActionController 상속

       - client의 요청을 처리할 메소드 구현

    public[ModelAndView|Map|void] 메소드이름(HttpServletRequest req, HttpServletResponse res[HttpSession|Command])[throws Exception]{

  

    }

 

       - return type : ModelAndView, Map, void 중 하나

       - argument : 

        1번 - HttpServletRequest

        2번 - HttpServletResponse

        3번 - 선택적이며  HttpSession 또는 Command 또는 3번 HttpSession

        4번 - Command

 

    3) MethodNameResolver 등록

       - 역할 : 어떤 메소드가 클라이언트의 요청을 처리할 것인지 결정

       - Spring 설정파일에 <bean>으로 등록

       - controller에서는 property로 주입 받는다.

       - 종류 

         - parameterMethodNameResolver : parameter로 메소드 이름 전송

         - InternalPathMethodNameResolver : url 마지막 경로 메소드 이름으로 사용

         - PropertiesMethodNameResolver : URL과 메소드 이름 mapping을 property로 설정



'JSP > JspServlet' 카테고리의 다른 글

서버 도메인 확인  (0) 2013.08.16
None Annotation 스프링 MVC 예제 (abstract, multiaction)  (0) 2013.07.29
액션 태그와 커스텀 태그  (0) 2013.07.29
파입업로드/다운로드  (0) 2013.07.29
포워딩과 리다이렉트  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 15:21

액션 태그와 커스텀 태그


액션 태그

:  JSP  액션  태그는 클라이언트  혹은  서버에게  어떠한 동작을  행하도록  명령을  내리는  태그로 JSP  페

이지  안에서  자바  빈즈를  사용할  수  있도록  하는  액션  태그와  페이지를  활용할  수  있도록  하는  액션  

태그로 나눌 수  있다.



■  형식

 <jsp:액션태그 속성="값">태그에 들어  있는  내용</jsp:액션태그>

또는

<jsp:액션태그 속성="값" />

JSP  액션  태그는 JSP  태그  형식을  따르지  않고 XML형식을  따른다.  그러므로  시작  태그가

있으면 반드시 끝나는 태그가 있어야 한다. 그리고 액션 태그는 접두어 "jsp:"이  붙어서  "<jsp:"으로  시작해야 한다.


액션  태그에 속성  값만  지정하고  내용이  없을  경우에는, XML규칙에  의해  끝나는  태그를  따로

하지  않고 시작  태그의 마지막 부분을  "/>"으로  마무리 한다.



 //useBean : 객체생성
 //setProperty : 생성된 객체의 property 할당

//DemoVO vo = new DemoVO();
//int num1 = Integer.parseInt(request.getParameter("num1"));
//vo.setNum1(num1);

이름 : <%=vo.getName()%>
내용 : <%=vo.getContent()%>



<jsp:include page="포함시킬 문서 경로" /> //특정 문서를 현재 위치에 포함 시킨다.



커스텀 태그

: 개발자가 직접 개발. 중복되는 것들을 모듈화하며, 복잡한 소스를 간편화 시켜준다.

Posted by 1+1은?
2013. 7. 29. 15:19


test1.jsp
제목:
//req.getParameter(“subject”) = null 파일:
//form 객체에 enctype 속성을 주면 기존처럼 request객체의 getParameter로 받는것은 불가능하다. //해당 속성이 없으면 전송한 파일의 제목만 가져올뿐 파일의 내용은 알 수 없다. test1_ok.jsp out.print("request로 넘어온 데이터
"); DataInputStream dis = new DataInputStream(request.getInputStream()); String str; while((str=dis.readLine())!= null) { out.print(new String(str.getBytes("ISO-8859-1"), "euc-kr") + "
"); }//form에서 전송된 파일을 출력

test2.jsp
이름:
제목:
파일:
test2_ok.jsp <% String root = session.getServletContext().getRealPath("/");//서블릿에서 루트경로 구하기 → D:\web\work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\study\ String pathname = root + File.separator + "saveFile"; File f = new File(pathname); if(! f.exists()) //폴더가 존재하지 않으면 폴더 작성 f.mkdirs(); String encType = "UTF-8"; int maxFilesize = 5*1024*1024; //MultipartRequest(request, 파일을 저장할 경로, 문자셋, 동일한 파일명 보호(덮어쓰기방지)) MultipartRequest mr = new MultipartRequest(request, pathname, maxFilesize, encType, new DefaultFileRenamePolicy()); //사실상 이부분에서 업로드가 완료됨 String name = mr.getParameter("name"); String subject = mr.getParameter("subject"); String saveFilename = mr.getFilesystemName("upload"); //서버에저장된파일명 String originalFilename = mr.getOriginalFileName("upload"); //클라이언트가업로드한파일명 long fileSize = mr.getFile("upload").length(); //File.length() 파일의 길이, return long %> 이름:<%=name %>
제목:<%=subject %>
클라이언트가업로드한파일명:<%=originalFilename %>
서버에저장된파일명:<%=saveFilename %>
파일의크기:<%=fileSize %>Bytes.


'JSP > JspServlet' 카테고리의 다른 글

MVC 관련 핸들러 매핑 및 컨트롤러  (0) 2013.07.29
액션 태그와 커스텀 태그  (0) 2013.07.29
포워딩과 리다이렉트  (0) 2013.07.29
JSP 페이지기본설정  (0) 2013.07.29
JSTL  (0) 2013.07.29
Posted by 1+1은?