JSF 게시판 만들기

2009/07/21 11:26
크리에이티브 커먼즈 라이선스
Creative Commons License
에고 얼마만의 포스트인지 모르겠다. 사실 JSF의 <h:dataTable> 와 <h:panelgroup>을 먼저 다루고 해야 하지만 .. 귀찮은 관계로 --; 두가지는 그냥 이 예제를 통해 보도록 하자 --; 간단하게 설명하자면 ..

dataTable
우리가 생각하는 table이다. 단. 좀 더 정형화(?)되어 있다고 보면 될 것이다. 단. table에서 사용하던 rowspan이나 colspan은 사용할 수 없다. 이럴때 JSTL과 혼합하여 <table>를 사용하면 될 것이다.

panelgroup
awt나 swing, swt에서 사용하는 방식의 패널이다. 컴포넌트들의 묶음이라고 생각하면 된다. 경우에 따라 html에 보여지는 메뉴가 바뀌어야 한다면 panelgroup의 보여주는 여부(rendered)의 옵션을 이용하면 그룹으로 통합된 관리가 가능 하다.

faces-config.xml

Board.java

BoardBean.java

DataList.java

board.jsp

read.jsp

write.jsp


faces-config.xml에선 각 페이지에서의 네비게이션을 설정 하였다. 좀 지저분해 보이는데 .. 아마도 좀 더 쉬운 방법이 찾아보면 있을지도 모르겠다.

사실 db를 사용했으면 편리 했겠지만 간단한 예제를 위해 db사용까지 하는건 오버하는거같아 List를 이용했다.

삭제 기능은 .. 인덱스를 일일이 찾아야 하므로 .. 중간에 삭제되었을때 앞 번호로 밀리는 문제 때문에 구현하지 않았다.

jsf는 asp.net를 대항하기 위해 탄생한걸로 알고 있는데 .. 그래서 이리저리 asp.net를 찾아보니 .. 정말 흡사해 보인다. 꼭 asp.net를 막기 위해 만들어 졌다곤 하지만 .. 그래도 jsf의 철학은 .. 은근히 맘에 들기도 하다.

우리나라에선 잘 사용하지 않지만 awt,swing등의 기존에 application을 개발하던 개발자들이 웹으로 쉽게 넘어올 수도 있을것 같고 잘쓰면(오히려 못쓰면 심각한 독이 될지도 ..) 유지보수나 컴포넌트 재사용 등에 유리할 것이다.

저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF 게시판 만들기  (1) 2009/07/21
JSF Component <UIComponentBase> 2 (SelectComponents)  (0) 2009/06/12
JSF Component <UIComponentBase> 1  (0) 2009/06/12
JSF Component <UICommand>  (0) 2009/06/12
JSF의 Converter  (0) 2009/06/09
JSF의 Validation  (0) 2009/06/08

Pupustory Dev/JSF

  1. Blog Icon

    비밀댓글입니다

JSF Component <UIComponentBase> 2 (SelectComponents)

2009/06/12 15:57
크리에이티브 커먼즈 라이선스
Creative Commons License
이번엔 다소 복잡해 보이는 컴포넌트를 다뤄보자. 지금까지 다뤘던 컴포넌트들은 html코드로도 단순했다.(뭐 select가 어려운건 아니지만..)

타이틀대로 select관련 컴포넌트들은 정말 쉽게 설계되어 있다. 기본적인 html에 사용되는 option, checkbox, select 등은 각각의 사용법이 틀리지만 JSF에서는 모두 같은 방식으로 사용한다.( 뭐 내부적으로 같은 인터페이스를 구현했겠지..?)

실제 소스코드를 보면 다음과 같다.

select_comp.jsp

컴포넌트 이름 자체가 직관적이라 별도의 설명은 피하도록 하겠다. 즉. 속에 들어가는 내용들은 모두 <f:selectItem>으로 통합되어 사용 된다. 해당 아이템을 감싸고 있는 테그가 무엇이냐에 따라 컴포넌트가 달라지게 되는 것이다.

좀 논외의 얘기일지 모르지만.. 필자는 브라우저를 왠만해서 구글 크롬을 이용한다. 그래서 이번 페이지도 .. 구글 크롬을 이용해 테스트 했다. 헌데 위 소스의 '다중 메뉴'부분이 좀 이상했다. '다중 리스트'와 전혀 틀린게 없기 때문이다. size를 정한것도 아닌데 .. 혹시나 해서 파이어폭스로보니 .. 브라우저의 표현에 차이가 있었다.

크롬,파폭


이 이상의 설명은 거의 html설명이 될테니 넘어가겠다. 그럼 이번엔 <f:selectItems />를 이용하는 방법을 살펴보겠다. 우리가 일반적으로 개발을 할때 각각의 아이템들을 표현할때 어떻게 했는가? JSTL을 사용했다면 객체를 foreach를 이용해 돌렸을 것이고, 가장 전통적인 방법으로 스크립틀릿을 이용했다면 <%for (int i=0; i<list.size();i++) {out.print("....);}%>를 이용했을 것이다.

그렇다면 이제 JSF에서 어떻게 사용하는지 살펴보자.
faces-config.xml


select_comp_bind.jsp


SelectBean.java


group로 묶은것을 arrayList에 다시 넣었다. 그렇게 되면 화면엔 각각의 값이 들어가게 된다. 위에 group부분을 여러개 만들어서 List에 넣어도 상관 없다. 그렇게 되면 주루룩 들어가게 되는데 .. '타이틀!'을 통해 하나의 컴포넌트에 주루룩 달리게 할수도 있다. 같은 배열을 2개 그룹으로 별도로 만들고 목록을 추가하면 다음과 같다.


이번엔 직접 컴포넌트를 만들고, 바인딩해 보도록 하겠다. 물론 아이템도 추가해 보겠다.
--
    <h:selectManyListbox binding="#{createSelect.selectMany}" />
    <h:selectOneListbox binding="#{createSelect.selectOne}" />
--


Many와 One는 서로 다른 클레스를 상속받았다. 그리고 UISelectMany, UISelectOne의 경우 Listbox나 checkbox등등의 컴포넌트가 공통적으로 상속받았으므로 다양하게 사용할 수 있다.

저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF 게시판 만들기  (1) 2009/07/21
JSF Component <UIComponentBase> 2 (SelectComponents)  (0) 2009/06/12
JSF Component <UIComponentBase> 1  (0) 2009/06/12
JSF Component <UICommand>  (0) 2009/06/12
JSF의 Converter  (0) 2009/06/09
JSF의 Validation  (0) 2009/06/08

Pupustory Dev/JSF

JSF Component <UIComponentBase> 1

2009/06/12 14:21
크리에이티브 커먼즈 라이선스
Creative Commons License

시작부터 코드가 주루룩 나왔다. 이번에 다뤄볼 컴포넌트는 어렵지 않은 부분들이라 .. 그냥 위 코드로 대신 한다.
혹시나 <h:outputText />와 <h:outputLabel />의 차이를 모르는 분을 위해 간단히 설명 하자면 전자는 단순하게 html에 출력하는 부분이고, 후자는 '컴포넌트의 이름'을 의미한다.

예를들어 ID를 입력하는 <h:inputText id="id"/>가 있다고 하자. 일반적으로 <h:outputText />를 쓰게 되면 엄밀히 따져서 ID입력 필드를 설명하는것인지 .. 그냥 출력되는 것인지 알 수 없다. 그래서 사용되는 테그인데 <label>과 같은 역할이다.

label로 되어있고, for=""는 반드시 들어가야 하는 속성인데, label을 클릭하면 for=""로 되어있는 필드로 포커스가 이동되기도 한다.

이번에 처음 다뤄본 내용인데 ..메시지 번들이다. 프로퍼티를 이용해 국제화를 적용할때 자주 사용되는 부분인데 .. 이번엔 파라미터를 이용했다.

프로퍼티를 읽고, 메시지에 파라미터로 문자열을 보내 출력하는 내용인데 .. 반드시 프로퍼티를 사용하지 않아도 무관하다. (직접 작성해도 되니까 ..)


저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF 게시판 만들기  (1) 2009/07/21
JSF Component <UIComponentBase> 2 (SelectComponents)  (0) 2009/06/12
JSF Component <UIComponentBase> 1  (0) 2009/06/12
JSF Component <UICommand>  (0) 2009/06/12
JSF의 Converter  (0) 2009/06/09
JSF의 Validation  (0) 2009/06/08

Pupustory Dev/JSF

JSF Component <UICommand>

2009/06/12 11:34
크리에이티브 커먼즈 라이선스
Creative Commons License
Html과 Faces에서 사용하는 컴포넌트는 합쳐서 .. 수십가지가 되는데 .. 일일이 레퍼런스를 작성하는건 노가다가 좀 심하기도 하고 .. 어차피 eclipse같은 IDE에선 코드 어시스트를 훌륭하게(!) 제공해 주기 때문에 ..

아주 아주 간단한 예제만 작성하기로 했다 -0-b

먼저 지금까지 사용한 <h:commandButton />은 <input type="button" />과 대응된다는 사실은 시작할때부터 다뤄왔던 부분이다. 이렇듯. 액션이 있는(submit 등) JSF의 컴포넌트는 UICommand를 상속받아 구현되어 있다.

이렇게 구현된 컴포넌트는 2가지가 있는데, 그중 하나가 바로 commandButton과 commandLink이다. commandLink는 <a href="">하이퍼링크</a>와 대응되는 컴포넌트이다.

자세한 속성은 생략하고, 기본골격만 다룬 예제를 살펴보자.
action_comp.jsp


구현 코드는 간단하다. commandButton과 commandLink를 이용한 것인데, 뭐 주요 사용하는 속성은 action, type 등이 있을 수 있겠다. html페이지에서 중요한부분중 하나인 CSS부분의 경우엔 HTML그대로 style로 직접 구현해 주거나 styleClass로 구현된 CSS를 불러와 사용해도 무관하다.

commandLink중 흥미로운 부분은 파라미터 부분이다. 해당 링크에 파라미터를 추가해 submit하게 되면, 스크립틀릿 부분에서 파라미터 값이 null이 아닐 경우 콘솔로 출력한다.

이것은 submit할때 JSF가 자바스크립트 코드를 생성해 함께 파라미터로 넘겨주는 코드를 작성한다.
생성된 코드

(hidden필드를 생성하고 submit할때 값을 설정해서 파라미터를 넘겨준다.)






저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF Component <UIComponentBase> 2 (SelectComponents)  (0) 2009/06/12
JSF Component <UIComponentBase> 1  (0) 2009/06/12
JSF Component <UICommand>  (0) 2009/06/12
JSF의 Converter  (0) 2009/06/09
JSF의 Validation  (0) 2009/06/08
JSF의 라이프사이클(LifeCycle)  (0) 2009/06/07

Pupustory Dev/JSF

JSF의 Converter

2009/06/09 17:16
크리에이티브 커먼즈 라이선스
Creative Commons License
이전 포스트에서 다뤄본 validate는 값을 검증하기 위해 사용해 보았다. 이번에 살펴볼 converter는 말 그대로 컨버팅이 되는지 안되는지를 검증 하거나 중간에 임의변환(예를들어 문자열 추가, 삭제, 변경 등)을 수행 한다.

validator에선 시스템에서 요구하는 값이 제대로 들어 왔는지를 검증 한다. 하지만 converter에선 사용자의 입력 값을 보다 편리하게 사용하기 위해 중간에 값을 전환시켜주는 작업을 한다.

따라서 전환이 될때 발생할 수 있는 여러 문제에 대해 예외를 던질 수 있다.

그럼 converter엔 어떤 종류가 있는지 알아보자.

BigDecimalConverter
BigIntegerConverter
ConverterDateTimeConverter
BooleanConverter
ByteConverterCharacter
DoubleConverter
FloatConverter
IntegerConverter
LongConverter
NumberConverter
ShortConverter
converter

기본적으로 제공하는 converter는 오토박싱에 대해 알고 있다면 큰 어려움이 없을듯 하다. 흔히 사용하는 bean에 int타입이라면 IntegerConverter에 의해 변환이 되는데 만약 변환에 문제가 생길 경우(문자열, 혹은 소수점이 있는 경우) ConverterException을 발생 시킨다.

맨 위에 3가지 이텔릭체로 된것은 자동으로 케스팅 하지 않기 때문에 어떠한 형식을 적용 시켜줘야 한다. 예제를 통해 어떤방식으로 사용하는지 알아보자.

ConvertBean.java

faces-config.xml
JSF_Convert.jsp

JSF_Convert_success.jsp


사용법은 validator랑 크게 다를바 없다. 먼저 나이 입력부분에 컨버터를 Integer을 이용했다.(패키지 경로를 보면 알겠지만 결코 java.lang.Integer에 있는 타입이 아니다!) 그리고 뒤에 message는 문제가 발생했을 경우(정확히 컨버팅이 안될때) 발생하는 메시지 이다. validator에서도 같은 방식으로 사용할 수 있다. (프로퍼티를 이용하는 방법은 나중에 자세히 설명 하겠다.)

위에서 설명한대로 날짜형식의 경우엔 자동으로 컨버팅 하지 않는다. 즉. 형식을 우리가 지정해 주어야 한다. 입력할때 입력 타입패턴을 <f:convertDateTime pattern="yyyy/MM/dd"  /> 와같이 지정했으므로 이렇게 입력해야만 한다.

그럼 OK버튼을 눌렀을때 어떤 결과가 나오는지 살펴보자.

ok버튼을 누르게 되면..

만약 형식에 맞지 않다면 우리가 지정한 메시지를 볼 수 있다.

그럼 이제 다른방법으로 converter를 사용하는 방법을 살펴보자. 마찬가지로 인터페이스를 구현해 사용하면 된다. converter는 처음 소개한대로 값을 임의로 변경 가능하다고 했다.

그렇다면 이번엔 사용자의 입력값을 개발자가 원하는데로 맞게 고쳐 사용해 보도록 하겠다.

faces-config.xml

JSF_MyConvert.jsp

JSF_MyConvert_success.jsp

Convert.java

ConvertBean.java


bean에는 Integer타입을 하나 추가했다. 아쉽게도 프리미티브 타입은 지원하지 않는듯 하다. 그도 그럴것이 메소드 구현 자체가 Object를 반환하기 때문에 랩핑을 필요로 하는게 아닌가 싶다.

빈 규약에 어긋날지 모르지만 .. setter에서 래핑타입으로 받아서 값을 설정해주는 방식으로 구현하는것도 좋은 방법이 되지 않을까 싶다.

결과는 다음과 같다.



문자열을 입력할 경우 컨버터에서 문제가 발생한다. (convertor 오타는 너그럽게 넘갑시다 --)
저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF Component <UIComponentBase> 1  (0) 2009/06/12
JSF Component <UICommand>  (0) 2009/06/12
JSF의 Converter  (0) 2009/06/09
JSF의 Validation  (0) 2009/06/08
JSF의 라이프사이클(LifeCycle)  (0) 2009/06/07
JSF의 네비게이터 이용하기  (0) 2009/06/07

Pupustory Dev/JSF

JSF의 Validation

2009/06/08 16:59
크리에이티브 커먼즈 라이선스
Creative Commons License
이번엔 JSF의 Validation을 사용해 보자. 이전에 살펴본 이벤트 리스너와 마찬가지로 2가지 방법을 이용할 수 있다. 

한가지 방법은 직접 화면에서 validation을 적용하는 방이고, 다른 방법은 Validator 인터페이스를 구현하는 것이다. 

먼저 JSF에서 제공하는 3가지 validation에 대해 살펴보고 적용한 예제를 다뤄보기로 하겠다.

- DoubleRangeValidator
- LongRangeValidator
- LengthValidator

총 3가지를 제공 하는데  DoubleRange, LongRange는 수치의 범위를 나타낸다. 두개가 별도로 되어있는 별다른 설명이 필요 없을듯 하다. 그냥 단순하게 '최소값'과 '최대값'을 구분하는 법을 말한다.

LengthValidator는 문자열의 길이를 뜻한다. 그럼 예제를 살펴보자.

JSF_Validation.jsp

지금까지 에러메시지를 출력하기 위해선 for=""를 이용해 타겟을 정해주었지만 이번엔 messages를 통해 모든 메시지를 출력하도록 작성 하였다. 나중에 다루겠지만 messages에 출력하는 방식은 다양하다. 이를 통해 손쉽게 에러를 찾아낼 수도 있다.

이름의 경우 길이가 2~4이므로 에러가 발생 한다. 다른 필드 역시 지정한 최소,최대값에 만족해야만 문제가 발생하지 않는다.

이번엔 직접 validate 클레스를 작성해 보도록 하겠다. 먼저 위 코드에 다음의 내용을 추가하자.


이제 실제 validate interface를 구현한 코드를 작성해 보자. 바인딩과 마찬가지로 implements하지 않아도 되지만 그래도 규약에 맞춰 implements해 구현하도록 하겠다.

Validator.java
faces-config.xml

클레스를 작성하고 faces-config.xml에 등록까지 완료 했다.  위와 같은 형식으로 코드를 작성해 주면 된다. 값의 검증이 정상적으로 이루어 지지 않았을 경우 throw 하면 된다. 문제가 없다면 아무것도 하지 않으면 된다.

위 validate를 TLD로 구현하는 방법은 추후 살펴보도록 하겠다.

저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF Component <UICommand>  (0) 2009/06/12
JSF의 Converter  (0) 2009/06/09
JSF의 Validation  (0) 2009/06/08
JSF의 라이프사이클(LifeCycle)  (0) 2009/06/07
JSF의 네비게이터 이용하기  (0) 2009/06/07
JSF에서 BEAN초기값 설정  (0) 2009/05/29

Pupustory Dev/JSF

JSF의 라이프사이클(LifeCycle)

2009/06/07 16:38
크리에이티브 커먼즈 라이선스
Creative Commons License
'JSF 라이프사이클' 이라고 구글링을 통해 검색하면 엄청나게 많으 자료를 찾아볼 수 있다. 특히 그림으로 나타낸 흐름을 주루룩 따라가다 보면 손쉽게 이해할 수 있다.

먼저 IBM에서 찾아본 기본적인 JSF 라이프 사이클은 다음과 같다.

뭔가 복잡하기만 하다. 처음부터 살펴보자.

0. request
기본적으로 사용자가 액션을 취한 상태다. 뭐 이건 별도의 설명이 필요 없을 듯 하다.

1. restore view
모든 JSF 호출은 FacesServlet을 통해 호출 한다. 이때 request를 분석해 컴포넌트 트리를 구성 한다. 여기서 말하는 컴포넌트 트리란 화면의 컴포넌트(input 등등)을 말하며, 만약 새로운 컴포넌트라면 여기서 validation, conversion등을 연결 하고 생성한다.

2. Apply request values 
각 컴포넌트의 현재 상태를 검색하도록 한다. 이 부분은 필자도 잘 이해하지 못하는 부분인데 .. 아마도 사용자가 값을 변경하고 요청(request)를 했다면 이 상태에선 기존의 값을 그대로 보존하고 있는 상태인듯 하다.

3. Process validations
만약 컴포넌트에 지정한 validation이 있다면 여기서 validation을 수행 한다. 만약 실패하면 validation 에러가 발생하게 되고 4단계를 거치지 않고 6단계로 넘어 간다. valueChangeListener가 정의되어 있다면 validation 이후에 수행 한다.

4. Update model valus
드디어 서버측 모델의 실제 값을 수정 한다. (2단계에선 아직 수정하지 않은 단계이다.) 이 과정엔 3단계가 무사히 통과 되었으므로 기존의 값을 없에고 새로운 값(사용자가 요청한 값)으로 갱신 한다.

만약 이 과정에서 conversion과정을 거치게 되는데 이때도 역시 conversion에러가 발생할 수도 있다.
conversion error ? bean의 속성타입이 int인데 String값이 들어와 케스팅 되지 않는경우

5. Invoke application
드디어 액션에 맞는 비지니스 로직을 수행 한다. 

6. render response
요청이 완료된 후 서버에서 사용자에게 보여질 페이지를 렌더링 한다.

지금까지 별 생각 없이 작성해온 간단한 JSF의 라이프사이클을 살펴 보았다. 우리가 편리하게 사용하는 이유는 내부적으로 다소 복잡한 과정을 JSF가 알아서 처리해 주기 때문일 것이다.

이제 좀 더 심화학습을 하기위해 immediate속성에 대해 알아보자. immediate속성은 입력(input,selectbox 등)과 액션(button 등)에 사용하게 된다. 기본적으로 immediate속성은 false인데 여기서 이 속성값을 바꾸게 되면 어떠한 변화가 일어나는지 살펴보도록 하자.

조건1. 액션버튼의 immediate가 true인 경우
흐름 순서
  0. request
-> 1. restore view
 -> 2. Apply request values
 -> [Action Event]
-> 6. render response

기본적인 JSF의 흐름과 약간 틀리다. 바로 Apply request values 이후에 3,4,5 를 거르고 Action Event를 거친다는 특징이 있다.  즉. 기본적인 validation, conversion을 거치지 않고 바로 사용자에게 html 렌더링을 해주게 되는 것이다.

조건2. 입력 컴포넌트의 immediate가 true인 경우

흐름 순서
  0. request
-> 1. restore view
 -> 2. Apply request values
 -> [Value Change Event]
-> [Action Event]
-> 3. Process validations
-> 4. Update model valus
-> 5. Invoke application
-> 6. render response

입력 컴포넌트의 경우엔 모든 과정은 동일 하지만 ValueChangeEvent와 ActionEvent가 3단계 이전에 들어와 있다. 일반적인 JSF액션과 틀린 점은  validation을 거친 후 발생하는 ValueChangeEvent가 먼저 발생한다는 것이다. 

이것은 개발자에게 이벤트 처리 흐름을 유연하게 사용할 수 있도록 하는 일종의 편의가 아닌가 싶다.

그럼 이제 예제를 살펴보도록 하자. 예제는 조건1, 조건2 로 나눌경우 1개의 true false로 글이 길어지므로 하나로만 작성하도록 하고 출력되는 결과물만 확인하도록 하겠다.

faces-config.xml
JSF_Lifecycle.jsp
JSF_Lifecycle_success.jsp


이제 각 조건의 출력 결과를 보도록 하자.

조건1 결과

ok버튼을 누를경우 ..
아무것도 출력되지 않는다. 값을 실제로 수정하는 4단계를 거치지 않고 바로 html 렌더링을 했으므로 당연하다. inputText에 입력한 파라미터 값 역시 출력되지 않는다. 그냥 네비게이터로 지정된 페이지로 이동을 했기 때문이다.

조건2 결과
radio버튼을 누를경우 자기 자신에게 submit하게 되는데 .. 여기서 inputText에 required="true" 옵션이 있으므로 필수 입력 사항이다. 하지만 액션버튼의 immediate=true 속성으로 인해 submit 할때 아무것도 검사하지 않고 바로 view페이지로 이동한다.

이름필드가 비어있을 경우 에러가 발생한다. 필수입력이기 때문이다. 
이름필드가 비어있지 않은 경우 정상 처리되어 자기 자신의 페이지에 submit()하게 된다. 

사실 조건2의 결과는 우리가 정확한 의도를 확인할 수 없었다. 바로 validation과 conversion과정 이전에 이벤트가 먼저 발생한다는 것을 살펴봐야 했지만 위 코드로는 부족하기 떄문이다. 

결과적으로 처리 흐름은 기본적인 JSF와 같지만 내부적으론 이벤트 리스너가 먼저 반응했다는 점을 알아야 할 것이다.

저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF의 Converter  (0) 2009/06/09
JSF의 Validation  (0) 2009/06/08
JSF의 라이프사이클(LifeCycle)  (0) 2009/06/07
JSF의 네비게이터 이용하기  (0) 2009/06/07
JSF에서 BEAN초기값 설정  (0) 2009/05/29
JSF의 컴포넌트 바인딩과 이벤트 리스너  (0) 2009/05/25

Pupustory Dev/JSF

JSF의 네비게이터 이용하기

2009/06/07 14:42
크리에이티브 커먼즈 라이선스
Creative Commons License
Struts와 같은 프레임워크는 MVC패턴을 사용하는데 이번에 알아볼 네비게이터는 액션의 이름에 따라 페이지를 이동하는 방법을 뜻한다. 

먼저 JSF로 작성된 3개의 페이지 코드는 다음과 같다.

chp04_navigationJSF.jsp
chp04_navigationJSF_fail.jsp
chp04_navigationJSF_success.jsp

위 코드에서 <h:commandButton action="" /> 이 부분이 액션을 분기하는 부분이다. action의 분기가 success인지 fail인지에 따라 페이지 이동을 정의하는 것 이다. 

chp04_navigationJSF_success.jsp 페이지의 경우엔 처음 페이지에서 inputText에서 받은 값을 그대로 출력하게 되어 있다. 파라미터로 값을 넘길 경우 저런식으로 bean에 값을 맵핑 후 forward하고, 네비게이터로 이동한 페이지에서 똑같이 작성해 주면 된다.

이제 faces-config.xml에 구문을 추가해 페이지의 흐름을 정의해 보자

<form-view-id>는 액션을 이르킬 페이지를 의미한다. <from-outcome>에서 정의한 문자를 확인하고 <to-view-id>로 페이지를 이동한다.

이때 페이지 이동은 기본적으로 forward로 이동하게 된다. 만약 redirect로 이동하도록 하기 위해선 다음의 코드를 작성 하면 된다.
저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF의 Validation  (0) 2009/06/08
JSF의 라이프사이클(LifeCycle)  (0) 2009/06/07
JSF의 네비게이터 이용하기  (0) 2009/06/07
JSF에서 BEAN초기값 설정  (0) 2009/05/29
JSF의 컴포넌트 바인딩과 이벤트 리스너  (0) 2009/05/25
JSF 처음 시작하기  (0) 2009/05/22

Pupustory Dev/JSF

JSF에서 BEAN초기값 설정

2009/05/29 15:21
크리에이티브 커먼즈 라이선스
Creative Commons License
일반적으로 bean에 기본값이 있다면, 그것은 bean에 직접 작성하는 경우가 대부분일듯 하다. JSF에선 친절하게 bean을 내버려 두고 faces-config.xml에서 bean의 초기값을 설정할 수 있는 기능을 제공 한다.

우리가 그냥 사용해 왔던 faces-config.xml의 <managed-bean>을 기억해 보자. 단순히 bean mapping를 적용 하고 컴포넌트에 바인딩 하여 사용해 왔다. 이번엔 bean에 초기값을 설정하는 방법을 구현해 보자. 예제에 사용될 bean은 다음과 같다.

InitBean.java

faces-config.xml

chp03_initneanJSF.jsp


faces-config.xml에 bean을 설정할때 기본 값을 설정하도록 한다. 따라서 페이지에서 bean을 생성 후 사용하기 전에 지정한 값으로 설정 한다. 다행히(?) java.util.Map와 java.util.List타입을 별도로 관리 가능 하기 때문에 구현에 큰 어려움이 없다.

덤으로 JSTL를 사용했다. 우리가 지정한 InitBean은 request scope로 지정했으므로 JSTL에서 접근할떄 ${requestScope..} 방식으로 접근하는 것으로 착각할 수 있지만 다행스럽게도 그냥 JSF사용하듯 사용하면 된다. 여기서 JSTL구문은 이전에 포스트한 내용이 있으므로  넘어가도록 하겠다.



저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF의 Validation  (0) 2009/06/08
JSF의 라이프사이클(LifeCycle)  (0) 2009/06/07
JSF의 네비게이터 이용하기  (0) 2009/06/07
JSF에서 BEAN초기값 설정  (0) 2009/05/29
JSF의 컴포넌트 바인딩과 이벤트 리스너  (0) 2009/05/25
JSF 처음 시작하기  (0) 2009/05/22

Pupustory Dev/JSF

JSF의 컴포넌트 바인딩과 이벤트 리스너

2009/05/25 14:39
크리에이티브 커먼즈 라이선스
Creative Commons License
이전 시간에 살펴본 JSF에 따르면 기본적으로 '컴포넌트 화 하여 서버에서 클라이언트를 제어할 수 있도록'했다고 했다. 그렇다면 이제 기본적으로 컴포넌트를 바인딩 하는 방법과 이벤트 리스너를 반영하는 방법을 살펴 보도록 하자.

이전에 faces-config.xml을 수정해 bean과 html에서 사용하는 테그와 '바인딩'시킨바 있다. 이번엔 직접 html의 text 컴포넌트를 빈에 작성하고 페이지에 바인딩 하는 방법을 살펴 보겠다.
BindingBean.java

chp02_bindingJSF.jsp


faces-config.xml은 이전의 내용과 동일하므로 생략 한다. <h:outputText /> 의 경우 binding를 사용하지 않고 그냥 value를 지정했으므로 hashCode값이 출력된다. 최초 bean을 생성할때 컴포넌트 객체를 생성함과 동시에 값을 'bind'로 설정했으므로 당연히 화면에 보여지는 값은 'bind'로 출력 될 것이다.

이렇듯. 컴포넌트를 이용해 html에 바인딩 함으로 얻어지는 이점음 여럿 있겠지만, 일단 서버에서 작성한 코드로 클라이언트를 제어하는 기능을 한다는 대에 의미가 있지 않나 싶다.

그럼 이번엔 html테그의 이벤트를 작성해 보자. 일반적으로 사용하는 이벤트는 ValueChangedEvent,ActionEvent가 있는데 ActionEvent는 버튼이나 링크를 눌렀을때 이용되고, ValueChangedEvent는 select, option, checkbox 등의 컴포넌트의 값이 변경 되었을때 발생 한다.

이벤트 리스너를 구현하는 방법은 두가지 방법이 있다.

첫째. JSF로 작성한 페이지에 컴포넌트에 직접 이벤트 리스너를 바인딩.
첫번째 방법은 JSF에 작성하는 테그에 직접actionListener에 이벤트 메소드를 바인딩 하는 방법이다. 이때 작성하는 메소드명은 사용자가 임의로 정의할 수 있다.
ActionBean.java

chp02_eventJSF.jsp


둘째. javax.faces.event.*; 패키지를 implements하여 이벤트 클레스 작성.
java.faces.event.*에 이벤트 인터페이스가 있다. 이 이벤트를 이용해 직접 이벤트 관련 메소드를 구현해 사용할 수도 있다.
chp02_eventJSF.jsp

ActionBean.java


ValueChangedEvent
값이 변경 되었을때 발생하는 이벤트 이다. 일단 이 이벤트의 경우 서버에 submit할때 발생하므로 위 소스를 약간 수정해 값의 변경내용을 확인해 보도록 하겠다. 다시한번 말하지만 이것은 '클라이언트'에서 발생하는 이벤트가 아니다. 따라서 서버에서 보낼때 값이 '기존 값'이고 값을 변경하고 submit할때 발생한 값이 '새로운 값'이 된다.

ActionBean.java

chp02_eventJSF.jsp


기존의 bean에 defalut! 값이 있으므로 기존의 값을 서버에서 알 수 있게 된다. 후에 값을 변경 하고 submit하게 되면 값이 변경되었으므로 리스너의 메소드(processValueChange(ValueChangeEvent arg0))을 호출하게 되고, ValueChangeEvent에서 발생한 컴포넌트를 캐스팅 후 값을 변경 하게 된다.

ActionEvent
ValueChangeEvent와 같은 방식으로 적용 한다.  따라서 별도의 설명 없이 넘어 가겠다. 당연히 ActionEvent는 액션이 이러날 수 있는 것(링크나 버튼 submit등..)에 적용 가능하고 ValueChangeEvent는 값의 변경(input, option checkbox등..)에서 발생 한다.

저작자 표시 비영리 변경 금지

'Dev > JSF' 카테고리의 다른 글

JSF의 Validation  (0) 2009/06/08
JSF의 라이프사이클(LifeCycle)  (0) 2009/06/07
JSF의 네비게이터 이용하기  (0) 2009/06/07
JSF에서 BEAN초기값 설정  (0) 2009/05/29
JSF의 컴포넌트 바인딩과 이벤트 리스너  (0) 2009/05/25
JSF 처음 시작하기  (0) 2009/05/22

Pupustory Dev/JSF