3. Building View Components
"What if I should fall right through the center of the earth... oh, and come out the other side, where people walk upside down."
3.1 Overview
프레임워크는 뷰 컴포넌트를 위해서 이프라스트럭처를 제공한다. 그러나 그것이 소유한 뷰컴포넌트의 실제적인 면은 제공하지 않는다. 몇몇 presentation technologies 을 가능하게 한다. Cocoon, JSP, Velocity Templates, XSLT와 같은것들을 포함되어 사용될 수 있다.
프레임워크에 의해서 제공되는 기능은 국제화 지원되는 텍스트와 이미지를 위해서 Message Resources를 뷰 컴포넌트에 포함할 수 있다는 것이고, FormBeans은 자동적으로 이들을 생성하고, 검증한다.
3.2 Internationalized Messages
몇넌젼 애플리케이션 개발자는 그들이 속한 국가의 언어만을 지원해 줄 수 밖에 없었다. 오직 단일한 언어만 지원했다. 언어를 지원하기 위해서 다양한 수의 데이터, 숫자, 화폐단위같은 것을 중복으로 가지고 있어야 했다. 그러나 웹 기술을 베이스로 한 애플리케이션의 개발이 폭발적으로 증가하고, 인터넷이나 다른 네트워크에서 광범위하게 접근하는 상황에서 애플리케이션 배포역시 증가 되었고, 많은 상황에서 국제적인 영역을 렌더링 해야했다. 이것은 국제화를 지원하기 위한 애플리케이션을 필요로 하고, 그러기 위해서 변경을 수행하기에 이르렀으며, 이러한 것을 "i18n"이라고 부르고 18이라는 단어는 i와 n사이에 들어가는 철자가 18자라는 의미이다.
프레임워크는 자바 플랫폼에서 국제화와 지역적인 애플리케이션을 지원할 수 있는 표준 클래스를 제공하였다. 핵심 개념은 다음과 같은 내용들이다.
- Locale - 기본적인 자바 클래스는 국제화를 지원하고 이를 Locale라고 한다. 각 Locale는 국가와 언어의 선택에 따라 다르게 표현되었고, 숫자나, 날자에 따라 형식이 지원되도록 구성되었다.
- ResourceBundle - java.util.ResourceBundle클래스는 복잡한 언어에 대해서 메시지 지원을 해줄 기본적인 툴을 제공하는 클래스이다. javadocs에서 ResourceBundle클래스를 살펴보면 클래스는 JDK 리리즈 번들의 문서에 internationalization의 부분 정보를 보면 더 많은 정보를 볼 수 있다.
- PropertyResourceBundle - Resource의 구현을 위한 표준적인 방법중의 하나는 동일한 형식인 "name=value"형식으로 리소스 자원을 정의하는 것이고, 이러한 형식은 각 지역에 대한 파일마다 동일하게 적용하는 방식이다. 이것은 웹 애플리케이션에서 이용하기 위해서 메시지를 리소스 번들로 이용할 수 있도록 준비하는 편리한 기능을 제공한다. 즉, 텍스트 기반으로 생성된 메시지이기 때문에 생성, 변경이 편리하다.
- MessageFormat - java.text.MessageFormat 클래스는 메시지 문구를 교체할 수 있도록 실행시간에 이러한 기능을 지원한다. 이것은 문장을 생성할때 유용하게 작용한다. 그러나 단어는 다른 언어에서 다른 순서로 생성된다. {0}로 정의된 메시지는 (placeholder) 첫번째 아규먼트로 {1}은 두번재 아규먼트로 교체될 내용이 들어간다.
- MessageResources - 프레임워크에서 org.apache.struts.util.MessageResources 클래스는 데이터베이스와 같은 리소스 번들을 다룬다. 그리고 특정 지역에 대해 특정 메시지 문자열을 요청할 수 있도록 한다.
국제화된 애플리케이션을 위해서 다음 애플리케이션에서는 각 언어데 대해서 메시지를 포함하는 프로퍼티를 만들라고 JDK문서에서 정의하고 있다. 예제는 다음에 보여줄 것이다.
소스 코드가 com.mycompany.mypackage라고 가정하면 이것은 이것은 com/mycompany/mypackage라는 디렉토리에 저장된다. 리소스 자원은 com.mycompany.mypackage.MyApplication이라는 리소스 번들을 생성한다. 그리고 이 파일을 com/mycompany/mypackage 디렉토리에 생성하면 된다.
- MyApplication.properties - 이것은 서버에서 제공하는 기본적인 언어를 포함한다. 만약 기본 언어가 English라면 prompt.hello=Hello라고 지정할 것이다.
- MyApplication_xx.properties - 동일한 메시지를 언어에 따라 지정하는 곳으로 ISO 언어코드인 XX를 지정하여 표시한다.(ResourceBundle Javadoc)를 참조하라. 프랑스언어 버젼을 위해서는 다음과 같이 쓸 것이다. prompt.hello=Bonjour로 정의한다. 필요한 언어에 따라 리소스 번들을 생성하면 될 것이다.
<message-resources parameter="com.mycompany.mypackage.MyApplication"/>
애플리케이션의 클래스 패스에 따라 리소스 번들을 찾는다는 것이 중요한 부분이다. 다른 접근은 MyResource.properties에 애플리케이션 클래스 폴더에 접근하는 것이다. 당신은 단순하게 "myResource"로 지정된 애플리케이션 값을 이용할 수 있다. 단지 주의해야할 것은 빌드 스크립트에서 cleanb 타켓에 클래스를 지정한 부분은 삭제하면 안된다는 것이다.
Ant작업을 애플리케이션 컴파일을 수행할때 컨텐츠 내용을 src/conf디렉토리를 classes 디렉토리로 복사하는 것을 보여준다.
<!-- Copy any configuration files --> <copy todir="classes"> <fileset dir="src/conf"/> </copy>
3.3 Forms and FormBean Interactions
노트 : JSP와 커스텀 캐그를 이용한 예제가 여기 있다. ActionForm과 다른 컨트롤러 컴포넌트는 뷰와 평등한 위치에 있다. 프레임워크는 Cocoon, Velocity Templates, XSLT그리고 다른 표현 기술을 이용할 수 있도록 되어 있고, 자바 서블릿에 렌더링 될 수 있다.
3.3.1 Automatic Form Population
대부분 웹 개발자는 HTML의 표준을 수용하기 위해서 폼을 작성한다. <input>태그가 그러한 경우이다. 사용자는 애플리케이션의 특정 행동과 연동할 수 있도록 그리고 에러 핸들링을 수행하도록 만든다. 만약 사용자가 에러를 만들었다면 애플리케이션은 무엇이 필요하고 바뀌어야 하는지에 대해서 수정할 수 있도록 한다. 즉, 현재 페이지에서 입력한 내용을 다시 입력하지 않아도 문제가 발생한 부분만 리셋 할 수 있도록 한다.
HTML과 JSP페이지에서 예외를 처리하는 작업은 매우 지루하고, 성가신 작업이다. 예를 들어 사용자 이름을 다음과 같이 작업했다고 하자.
<input type="text" name="username" value="<%= loginBean.getUsername() >"/>
타입 검사를 하는 작업은 매우 여렵다. HTML 개발자는 프로그래밍 개념에 대해서 잘 알지 못해서 혼란을 가져온다. 그리고 HTML 에디터에서 문제를 가져오게된다. 대신 스트러츠 태그는 폼을 작성하기 위해서 JSP 1.1커스텀 태그에 기반들 두는 태그를 제공하기 때문에 이해력 있는 기능을 제공한다. 이러한 이유로 Struts Tagllibs를 잉요하여 렌더링 하는것이 좋다.
<html:text property="username"/>;
초기화 값을 위해 JavaBean을 명식적으로 참조할 필요가 없다. 이것은 자동적으로 JSP태그에 의해서 자동적으로 프레임워크에서 제공되는 기능을 이용할 수있도록 해준다.
HTML폼은 가끔 파일을 업로드 하기 위해서 이용된다. 대부분의 브라우저는 <input type="file">을 이용하여 제공되며, 이것은 파일 브라우저 버튼을 생성한다. 그러나 이것은 개발자가 들어오는 파일을 관리해야 하는 문제가 있다. 프레임워크 핸들은 "multipart"폼으로 보통 폼과 다르다는 것을 나타낸다.
프레임워크를 이용하여 단순한 로그인 폼을 개발하는 예제를 보고 싶다면 Buiding an ActionForm Howto을 참조하라.
3.3.2 Automatic Form Validation
폼과 빈의 상호작용에 대해서 앞에서 살표본 내용에 더 추가하자면 프레임워크는 입력 필드를 받을때 추가적인 기능을 제공한다. 이러한 기능은 ActionForm 클래스에 다음 메소드를 오버라이드 하여 수행할 수 있다.
validate(ActionMapping mapping, HttpServletRequest request);
validate메소드는 컨트롤러 서블릿이라 불리우는 빈 프로퍼티를 이용한다. 그러나 액션 클래스의 execute메소드를 후출하여 이에 대해 응답하기 전에 validate메소드는 다음 옵션들이 있다.
- 적합한 벨리데이션을 수행하고 문제가 없다면 -- 널이나 0길이의 엑션 에러의 인스턴스가 반환되었다면 컨트롤러 서블릿은 execute메소드를 적합한 Action클래스에서 호출한다.
- 적합한 벨리데이션을 수행하고 문제가 발생했다면 --ActionMessage를 포함하는 ActionError 인스턴스를 반환한다. 이 클레스는 에러 메시지를 키 값에 의해서 디스플레이될 메시지를 리소스 번들로 부터 가지고 있다. 컨트롤러 서블릿은 <html:error>태그에 의해서 사용하기 적합한 리퀘스트 객체에 대한 배열을 저장하며, 입력 폼으로 컨트롤을 이동시킨다.
공통적인 접근중의 하나는 단순한 수행에 있다. ActionForm validate메소드를 이용하여 주요한 벨리데이션을 이용할 수 있다. 그리고 액션으로 부터 "bussiness logic"을 관리한다.
Struts Validator은 다음 섹션에서 다룬다. ActionForm의 벨리데이션을 쉽게 하는것이다.
3.3.3 The Struts Validator
Validator은 다음과 같이 쉽게 설정할 수 있다.
- ActionForm 빈은 ValidatorForm을 상속해야한다.
- form의 JSP는 <html:javascript>태그를 포함해야 클라이언트 사이드의 베릴데이션을 수행할 수 있다.
- xml 파일을 다음과 같이 작성해야 한다.
msg엘리먼트 포인트는 메시지 리소스 키를 이용하여 에러 메시지를 생성할 수 있다.<form-validation> <formset> <form name="logonForm"> <field property="username" depends="required"> <msg name="required" key="error.username"/> </field> </form> </formset> </form-validation>
- 마지막으로 ValidatorPlugin을 struts-config.xml파일에 다음과 같이 추가해야 한다.
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml"/> </plug-in>
Struts Validator에 대해서 더 많은 값을 알고 싶다면 Developers Guide. 을 보기 바란다.
3.3.4 Page Composition With Tiles
타일즈는 다양한 타일을 붙여서 뷰를 구성하기 위해서 제공되는 강력한 템플릿 라이브러리이다. 여기서는 간단하게 설정하는 가이드를 제공한다.
- /layout/layout.jsp파일은 애플리케이션에서 공통적으로 사용될 look and feel을 나타낸다.
<html> <body> <tiles:insert attribute="body"/> </body> </html>
- /index.jsp 홈페이지 파일을 생성한다.
<h1>This is my homepage</h1>
- /WEB-INF/tiles-defs.xml파일을 다음과 같이 작성한다.
<tiles-definitions> <definition name="layout" path="/layout/layout.jsp"> <put name="body" value=""/> </definition> <definition name="homepage" extends="layout"> <put name="body" value="/index.jsp"/> </definition> <tiles-definitions>
- TilesPlugin을 struts-config.xml에 설정한다.
<plug-in className="org.apache.struts.tiles.TilesPlugin"> <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/> </plug-in>
- struts-config.xml에 홈페이지 에 추가할 액션 매핑을 지정한다.
<action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="homepage"/>
Struts Tiles website 에서 좀더 깊은 예제를 볼 수 있다.
3.4 Presentation Frameworks
프레임 워크는 많은 표현 기술을 제공하도록 한다. 그리고 거기에는 뷰 컴포넌트를 쉽개 개발 할 수 있도록 하기 위해서 많은 확장을 지원한다. 표현 기술들은 당음과 같은 것을 주로 사용한다.
3.5 Other Presentation Techniques
비록 look and feel이 표현 라이브러리를 수용할 수 있도록 표준을 기반으로 완벽하게 구현될 수 있더라도 당신은 다른 기술을 직접적으로 사용할 수 있도록 렌더링 기술을 제공한다.3.5.1 Image Rendering Components
몇몇 애플리케이션은 동적으로 생성되는 이미지를 요구한다. 주식 리포팅 사이트에서 가격 차트와 같이 말이다. 이러한 요구사항을 만났을때 공통적으로 사용될 수 있도록 해주는 2가지 접근법을 제공한다.
- 서블릿 요청을 실행하기 위한 URL에 대한 하이퍼링크를 렌더링 한다. 서버는 그래픽 라이브러리를 이용하여 그래픽 이미지를 처리할 수 있고, image/gif와 같이 전용 콘텐츠를 설정하고, 이미지를 브라우저에 바이트 단위로 돌려 보내거나 수신된 정적 파일을 표현하기 위한 기능들을 제공해준다.
- HTML코드에서 자바 애플릿을 다운로드하고 요구된 그래프를 그리기 위해서 렌더링을 할 수 있다. 애플릿 랜더링 코드에 초기화 파라미터를 적당하게 설정하는 것으로 그래픽 설정을 할 수 있고, 이러한 파라미터를 수신한 서버에 애플릿이 접근할 수 있도록 할 수 있다.
3.5.2 Rendering Text
몇 애플리케이션은 동적으로 생성된 text나 markup을 요구할 수 있다. 만약 페이지가 렌더링 된경우 PrintWriter을 이용하여 이러한 내용을 처리할 수 있도록, Action에서 매우 쉽게 처리할 수 있다.response.setContentType("text/plain"); // or text/xml PrintWriter writer = response.getWriter(); // use writer to render text return(null);
'WEB_Programming > Struts' 카테고리의 다른 글
Struts 프레임워크 적용 구조 (0) | 2008.06.17 |
---|---|
6.2 Installation (0) | 2008.06.13 |
2. Building Model Components (0) | 2008.06.12 |
bean:cookie Tag 사용법 (0) | 2008.06.10 |
bean:define Tag 사용법 (0) | 2008.06.10 |