<div class="note"> http://java.sun.com/j2ee/javaserverfaces/jsfintro.html </div>

JavaServer Faces 에 대한 소개#

JavaServer Faces 에 대한 간략한 설명#

JavaServer Faces 기술에는 유용한 많은 특징이 있다.
  • 관리빈(Managed Bean)의 용이함
  • 유효성 체크의 용이함
  • 풍부하고 확장가능한 콤포넌트 라이브러리
  • 플러그인 가능한 표현킷(render kits)
  • 특정 유저 이벤트로의 응답의 처리(Navigation)
  • 요청에 교차되는 애플리케이션 상태의 유지
  • 모델 변환

이 글은 이런 JavaServer Faces 기술적인 특징의 소개와 몇몇 예제를 제공한다. JavaServer Faces 기술에 의해 제공되는 다른 특징에 대한 좀더 상세한 정보를 위해서는 J2EE tutorial 의 JavaServer Faces (Chapters 17-21)부분을 참조하라. JavaServer Faces 애플리케이션은 기본적으로 Java(TM) 2 Platform, Enterprise Edition (J2EE(TM) platform)과 호환되는 컨테이너에서 운영되는 서블릿및 JSP 애플리케이션이다. 이것은 Java Servlet 2.3 과 JSP 1.2 버전은 혹은 그 이상의 버전을 의미한다. JavaServer Faces 애플리케이션을 빌드하고 디플로이 하기 위해 가장 좋은 방법은 Java 2 Software Development Kit, Enterprise Edition (J2EE SDK) 1.4 또는 그이상의 버전은 다운로드 받는것이다. JavaServer Faces 기술은 애플리케이션내에 JSP 를 요구하지 않는다. 서블릿또는 다른 기술로 바로 요청을 보낼수 있다. 만약에 JSP 컨테이너와 함께 JSF 를 사용하겠다면 내장된 JavaServer Faces Core and HTML component libraries 로 부터 JSF 커스텀 컴포넌트 태그까지의 이익을 얻을수 있다. JSF 컴포넌트는 text fields, forms, buttons, tables, checkboxes 등등의 웹컨트롤을 표현한다. JSF 컴포넌트와 함께 JSP 를 생성할때 컴포넌트 트리는 서버내의 메모리에 저장된다. 각각의 컴포넌트 태그는 트리내 UIComponent 인스턴스에 연결된다. 이 컴포넌트 트리는 당신의 애플리케이션 요청을 조정하고 표현된 응답을 생성하기 위한 프레임워크에 의해 사용된다. 유저가 이벤트를 발생시킬때, 예를 들면 버튼을 클릭함으로써 JSF 라이프사이클은 이벤트를 발생시키고 적절한 응답을 생성한다. FacesServlet 는 JSF 프레임워크를 지칭한다. 이것은 요청처리 라이프 사이클과 앞선 컨트롤러처럼 작동한다. JSF 또한 중요한 요청 정보가 저장되는 context 의 개념을 가진다. 이 객체는 FacesContext 라 칭한다. 이것은 JSF 라이프사이클의 각각의 단계와 유효한 요청마다 변한다. JSF 프레임워크는 또한 값바인딩(Value Binding)과 메소드바인딩(Method Binding)표현법을 가진다. 만약에 당신이 JSP Standard Tag Library (JSTL) or JSP 2.0 같은 기술에 친숙하다면 당신은 벌써 표현언어(Expression Language)개념에 친숙한 것이다. JSF 바인딩표현(Binding Expressions)은 당신의 기초적인 데이터 모델과 함께 쉽게 상호작동하도록 한다. 이 Character Combat 데모는 값바인딩을 사용하여 당신의 데이터 모델로 부터 값을 가져오는 방법을 묘사한다.

간단한 JSF 애플리케이션#

이 글은 중요한 JSF 개념의 일부분을 표사하는 간단한 JSF 애플리케이션을 포함한다. 애플리케이션을 이해하기 위해서 당신은 JSPs, 서블릿, 그리고 태그 라이브러리를 포함하는 기본적인 J2EE 웹 기술에 친숙해야만 한다.

Character Combat 은 다음의 요소들이 구성된다.:

  • UI 를 표현하는 JSF 컴포넌트를 가지는 JSP 페이지들
  • 모델 데이터를 유지하는 Backing 빈
  • 다음을 정의하는 애플리케이션 설정파일:
    • JavaServer Faces Controller Servlet
    • Managed Beans
    • Navigation Handling

1.jpg

위 다이어그램은 Character Combat 데모 애플리케이션을 통하는 페이지 단계를 보여준다.:

  • 첫 페이지에서 유저는 다음 사항을 할수 있다:
    • 등장인물 추가
    • 다음 페이지로 바로 이동
  • 두번째 페이지에서 유저는 다음 사항을 할수 있다.:
    • 첫 페이지로 돌아가서 등장인물 추가
    • 전투에서 첫 참여 선택
    • 세번째 페이지로 이동
  • 세번째 페이지에서 유저는 다음 사항을 할수 있다:
    • 두번째 페이지로 이동
    • 전투에서 두번째 참여를 선택
    • 마지막 페이지로 이동
  • 마지막 페이지에서 유저는 다음 사항을 할수 있다:
    • 전투의 결과 보기
    • 세번째 페이지로 이동
    • 데모의 시작으로 애플리케이션 재시작

당신은 이 워크플로우가 "wizard" UI 디자인 패턴에 적합하다는 것에 주목할것이다. 우리는 당신의 애플리케이션을 위한 간단한 재사용가능한 빈으로 부터 wizard 기능을 뽑아냈다. 더 많은 wizard 빈의 정보를 위해서는 다음 섹션 Example Wizard Component을 참조하라.

애플리케이션 실행하기#

가장 최근의 JSF1.0 프레임워크와 실행시 의존적인 모든것들은 벌써 Sun Java System Application Server Platform Edtion 8 와 통합이 되었다.(주:현재 JSF 의 가장 최신 버전은 1.2이다). 애플리케이션 서버내에서 당신은 JSF 웹 애플리케이션을 셋업하기 위한 어떤 추가적인 설정 단계도 필요로 하지 않는다. 만약 당신이 자신의 JSF 웹 애플리케이션을 쓰기 위해서 JSF1.0 프레임워크를 사용하기 위해 애플리케이션 서버내에서 해야 할 한가지는 FacesServlet 인스턴스를 정의하고 당신의 웹 애플리케이션의 배치서술자(deployment descriptor)에 맵핑을 시키는 것이다. 의존적인 모든것은 이미 컨테이너의 부분이고, 당신의 추가적인 어떤 JAR 파일도 묶을 필요가 없다. 이 글에서 논의되는 샘플 애플리케이션을 실행하기 위해서 제공되는 war파일을 애플리케이션 서버에 배치시킨다. 이 애플리케이션은 "jsf-characterCombat"라는 context 이름을 가진다. 데모소스또한 war 파일내에 있다. 소스파일과 함께 제공되는 README 파일내에서 배치와 빌드 방법을 찾을수 있을것이다. 당신은 java.net 의 새로운 JSF 프로젝트를 위한 FAQ 내의 지시에 따라 소스코드에 접근할수 있다.

https://javaserverfaces.dev.java.net/faq.html#Code_checkout.

그런 지시에 따른다면 당신은 소스코드를 펼쳐볼수 있다.

for this article at:

https://javaserverfaces-sources.dev.java.net/source/browse/javaserverfaces-sources/jsf-demo/characterCombat/

Demo Application Building Blocks#

h3. 배치서술자(Deployment Descriptor) 당신이 JSF 프레임워크를 사용하기 위해 FacesServlet 과 배치서술자내의 code>FacesServlet 맵핑을 정의할 필요가 있다.

<!-- Faces Servlet -->
<servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>
<!-- Faces Servlet Mapping -->
<servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
</servlet-mapping>

FacesServlet 인스턴스는 JSF 프레임워크로 들어가는 컨트롤러 처럼 작동한다. 이것은 JSF 관련 모든 요청을 처리한다. 위 예제에서 확장맵핑이 사용되었다. 확장 맵핑과 함께 웹 컨테이너는 "*.faces"로 끝나는 확장자를 가진 모든 페이지를 위한 Faces Servlet 에 요청을 넘길것이다. 당신은 접두사 맵핑을 사용한 FacesServlet 인스턴스를 사용할수도 있다. 예를 들면 FacesServlet 인스턴스를 통해 "/faces/*"에 의한 접두사를 가진 웹페이지를 가질수 있다.

h3. 애플리케이션 설정 모든 JSF 는 faces-config.xml 라는 설정 애플리케이션 설정파일에 설정정보를 정의한다. 아 설정파일에는 Managed Beans, Navigation Rules, Converts, Validators 등등을 정의할수 있다.(주: 여기서 스트러츠와 비교해서 Managed Beans 은 ActionForm, Action 을 섞어놓은것과 비슷하고, Naviagtion rules 는 ActionForward 와 비슷하다고 보면된다.)

<faces-config>
        <managed-bean>
                <managed-bean-name>modelBean</managed-bean-name>
                <managed-bean-class>        characterCombat.ModelBean</managed-bean-class>
                <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>
</faces-config>

이 부분은 빈 이름과 클래스명 사이의 맵핑을 생성한다. 이 맵핑은 Managed Bean 에 의해서 사용된다. 처음의 "modelBean"은 설정파일내에서 계속 참조된다. 모델 객체는 적합한 범위내에서 생성되고 저장된다. 모델빈은 이 글에서 나중에 다시 논의된다. 더 많은 설정 옵션이 있다. 당신은 JavaServer Faces Technology 1.0 Specification 에서 대부분의 옵션을 확인할수 있다.

Character Combat 데모의 구조#

h3. Managed Beans managed bean 은 public 하고 인자없는 생성자를 가지는 간단한 자바 클래스이다. Faces 애플리케이션은 managed bean 을 어떻게 인식할까.? managed bean 은 WEB-INF/faces-config.xml 에 설정된다. 당신은 그 설정파일에 많은 수의 <managedbean>선언(하나의 이름에 하나의 클래스 그리고 유효범위)을 할수 있습니다. 당신의 웹 애플리케이션은 JSF 표현언어(Expression Language)로 정의된 빈이름을 참조한다. 이것을 참조하는 첫 시점에 적당한 범위로 생성되고 위치하게 될것입니다. Managed Beans 은 매우 유연성이 있고, 정의된 특성(Java Arrays, Maps, Lists, 다른 Managed Beans)에 의해 당신의 빈을 수정할 수 있습니다. Character Combat 예제는 ModelBean 이라는 이름의 내부빈(backing bean)을 가집니다. WEB-INF/faces-config.xml 에 ModelBean 은 정의되어 있습니다.(주 - backing bean 은 Struts 의 ActionForm 과 Action 을 섞어놓은것과 비슷한데 backing 을 마땅히 번역을 어떻게 해야 할지 애매해서 내부빈으로 번역합니다.) :

<managed-bean>
        <managed-bean-name>modelBean</managed-bean-name>
        <managed-bean-class>characterCombat.ModelBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

이 빈은 웹 애플리케이션의 JSP 페이지 내에서 참조된다. 여기 빈이 사용된 예제가 있다.:

<h:inputText value="#{modelBean.customName}" />

<h:inputText/>는 form 내의 text 필드 컴포넌트이다. 폼이 submit 되면 text field 의 값은 customName 라는 속성값(Property)으로 저장이 된다. "#{" 와 "\}" 는 값바인딩(Value Binding)표현이 사용되었음을 표시한다. (주 - 이는 modelBean 인 characterCombat.ModelBean 의 getCustomName()의 값이 표시된다고 보면 됩니다.). 프레임워크의 Managed Bean 은 WEBINF/faces-config.xml 설정파일의 내용을 참조한다. 빈 이름을 클래스에 맵핑 시키고 만약에 존재하지 않는다면 빈을 인스턴스화.

h3. Object Model Character Combat 예제는 ModelBean 객체를 생성한다. ModelBean 은 다른 자바빈 컴포넌트 처럼 접근 메소드의 집합으로 구성된다. ModelBean 은 Managed Bean 생성법을 사용함으로써 생성되고 view 내의 정의된 JSF 컴포넌트의 이름(주 - faces-config.xml 파일내의 해당 Managed Bean 의 태그내의 값)에 의해 참조된다. ModelBean 은 빈이 컴포넌트의 값을 저장하는 방법을 묘사한다.

h3. JSP Pages JSP 페이지는 웹 애플리케이션을 위해 UI 를 제공한다. JSF 는 두가지 JSP 태그 라이브러리를 제공한다. 기본적인 컴포넌트 render themselves as basic HTML 4.01 는 모든 웹브라우저에서 기대되는 화면을 보여준다. 내장된 JSF 태그 라이브러리를 사용하기 위해서는 JSP 페이지의 다음 tag 지시자를 포함시킬 필요가 있다:

<%taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

JSF 페이지는 컴포넌트 트리를 생성하는 <f:view>...</f:view>태그 사이에 모든 JSF 태그를 위치시켜야 한다. 각각의 HTML 컴포넌트는 스타일시트를 사용해서 수정가능하다. 당신은 일반적인 styleClass 또는 컴포넌트를 위한 스타일 속성값을 정할수 있다. 위의 개념을 묘사한 Character Combat 애플리케이션의 예제가 다음과 같다:

h3. DataTable DataTable UIComponent 는 java.util.List and java.sql.ResultSet 등을 포함하는 데이터모델의 여러가지 다른 타입을 다룬다.이것을 데이터를 가지고 수정된 테이블형태를 만든다. 이 컴포넌트는 스타일시트를 사용해서 수정될수 있다. Character Combat 데모에서 리스트는 기초가 되는 데이터 모델처럼 사용된다.:

<h:dataTable columnClasses="list-column-center,list-column-center,list-column-center,list-column-center"
        headerClass="list-header" styleClass="list-background"
        value="#{modelBean.dataList}" var="character">
 <f:facet name="header">
               <h:outputText value="List of Available Characters" />
 </f:facet>
    <h:column>
            <f:facet name="header">
                       <h:outputText value="Name" />
         </f:facet>
            <h:outputText value="#{character.name}" />
    </h:column>
   <h:column>
            <f:facet name="header">
                       <h:outputText value="Species" />
              </f:facet>
            <h:outputText value="#{character.species.type}" />
    </h:column>
   ...
</h:dataTable>

당신은 #\{modelBean.dataList}에서 <h:dataTable/>태그내에 정의된 "character"이라는 변수에 저장된 character 의 리스트를 구할수 있는 예제를 볼수 있다. 리스트내의 각각의 character 는 <h:column/>태그에 의해 새로운 row 로 생성되고 표시된다. <f:facet/>태그는 facet 와 상위태그 사이의 특별한 관계를 생성한다. 이 특별한 관계는 컴포넌트를 헤더(header)또는 풋터(footer)로 정의하는것을 가능케한다. 예제에서 우리는 facet 를 칼럼의 header 로 생성하는데 사용한다. <h:dataTable/>는 HTML 컴포넌트 이기 때문에 이것의 스타일은 스타일시트를 사용해서 수정할수 있다. 예제에서 우리는 많은 수의 서로다른 <h:dataTable/>스타일 속성을 사용할수 있다. 우리는 "stylesheet.css"라는 이름의 스타일시트를 임포트한다:

<link rel="stylesheet" type="text/css" href='<%= request.getContextPath() "/stylesheet.css" %>'>

이것은 표현된(rendered) HTML DataTable 이 보이는 방법이다.:

2.jpg

h3. PanelGrid 간단한 테이블을 위해 당신은 <h:panelGrid/>컴포넌트를 사용할수 있다. DataTable 컴포넌트와는 달리 PanelGrid 는 참조된 데이터 모델을 가지지 않는다.. 이것은 두개의 칼럼테이블의 예제이다. 해더(header)는 첫번째 row 로 정의된다. 두번째 row 는 첫번째 칼럼에 InputText 필드를 포함하고 두번째 칼럼에 <select>같은 item 의 리스르를 포함한다.:

<h:panelGrid columnClasses="list-column-center,list-column-center"
        headerClass="list-header" styleClass="inputList-background"
        columns="2">
     <f:facet name="header">
                <h:outputText value="Customize Character:" />
        </f:facet>
        <h:inputText value="#{modelBean.customName}" />
        <h:selectOneListbox value="#{modelBean.customSpecies}"        required="true" size="1">
                <f:selectItems value="#{modelBean.speciesOptions}" />
        </h:selectOneListbox>
</h:panelGrid>

h3. InputText InputText 컴포넌트는 유저에 의해 서브밑(submit)된 정보를 얻을수 있는 유일한 방법이다. 예제에서 우리는 다음과 같이 value 속 성을 정의된 모델의 텍스트필드값을 사용한다.:

<h:inputText value="#{modelBean.customName}" />

InputText 컴포넌트는 form 내부에 포함된다. form 이 서브밑(submit)되었을때 Field 내의 value 값은 우리의 모델에 반영된다.(주 - Struts 에서 submit 되면 ActionForm 에 각각의 값이 set 되어 넘어가듯 JSF 에도 submit 되면 Managed Bean 에 해당되는 클래스 내의 변수에 set 이 되서 넘어갑니다.) 다음 이미지에서 당신은 CommandButton 과 ListBox 의 집합과 함께 PanelGrid 내의 InputText 의 결합을 볼수 있다:

3.jpg

h3. OutputText OutputText 컴포넌트는 다양한 방법으로 정보를 표시한다. 예를 들면 escape HTML 마크업으로 설정하거나 모든 괄호(<>)를 적합한 <으로 변경을 하거나 문법등은 변하지 않는다. 당신은 이 콤포넌트에 여러가지 스타일시트를 적용할수 있다. OutputText 는 모델로 부터 데이터를 표시하기 위해 같은 애플리케이션 전체에 사용된다. 이 예제에서 우리는 character 의 이름을 표시하고 있다:

<h:outputText value="#{character.name}"/>

h3. SelectOneRadio 당신은 radio selections 의 집합을 표시하기 위해 SelectOneRadio 를 사용할수 있다. 내포된 item 그룹처럼 좋은 radio select item 의 집합을 포함한다. 여기서 SelectOneRadio 가 사용되는 방법을 보여준다:

<h:selectOneRadio layout="pageDirection" required="true" value="#{modelBean.firstSelection}">
        <f:selectItems value="#{modelBean.allCharactersToSelect}" />
</h:selectOneRadio>

이 레이아웃 속성은 수직적인 레이아웃의<h:selectOneRadio/>콤포넌트가 기본적으로 수평적인 레이아웃에 대조적으로 보인다. 우리의 ModelBean 의 haractersToSelect 메소드는 SelectOneRadio 가 표시할 SelectItems 의 리스트를 반환한다. 이 radio컴포넌트는 form 에 내포된다. form 이 서브밑(submit)되었을때 선택된 radio item 은 모델내 currentSelection 의 속성으로 저장이 될것이다.

h3. CommandButton CommandButton 은 Action 이벤트를 생성할수 있는 input 컴포넌트이다. 당신은 JSF 웹 애플리케이션을 통해서 응답경로를 찾을 수 있는 특정 action 이벤트를 찾기 위한 ActionListeners 를 생성할수 있다. 당신은 컴포넌트가 선택되었을때 호출되는 애플리케이션 action 를 바인딩 하는 action 메소드를 제공할수 있다.

<h:commandButton actionListener="#{modelBean.addCustomName}" value="Add Name"/>

우리는 navigation 핸들링이 매우 중요하기 때문에 다음 섹션에서 이 action 에 대해 논의할것이다. 이것은 CommandButton 마법사가 화면에 표시되는것과 유사한 RadioButtons 의 집합을 사용하는 방법이다.

4.jpg

Navigation: 예제 마법사 컴포넌트#

애플리케이션내에서 navigation 을 다루는 마법사 컴포넌트의 찾아보자. 이 컴포넌트는 다이어그램내의 검은색 도형처럼 세가지 파트로 이루어진다.

5.jpg

유저는 이 컴포넌트를 사용하기 위해 두가지를 꼭 해야 한다.: 1. 웹 애플리케이션의 UI 내에 컴포넌트를 포함시킨다. 2. 적당한 navigation 룰을 생성한다. 우리는 이런 단계를 아래에서 상세하게 다룰것이다. WizardButtons managed bean 의 상세사항은 이 글의 범위를 벗어난다. 하지만 이것은 기본적으로 마법사 페이지 플로어내에서 유저의 현재 위치에 기반을 둔 다음이나 이전 버튼를 실행가능하게 하거나 실행 불가능하게 하는 메소드를 가진다.

h3. UI 내에 버튼 포함시키기 이 컴포넌트는 <jsp:include>를 통해 웹 애플리케이션의 UI 내에 포함된다. 예제 애플리케이션내의 각각의 페이지를 위해 당신은 밑의 다음과 같은 라인을 볼수 있다:

<jsp:include page="wizard-buttons.jsp"/>

이 페이지를 봐라. 우리는 다음과 같은 마크업을 볼수 있다.:

<%page contentType="text/html" language="java" %>
<%taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<f:subview    id="wizard-buttons">
        <h:panelGrid columns="2">
                <h:commandButton value=" <Back" action="back" disabled="#{wizardButtons.hasBack} " />
                <h:commandButton value="#{wizardButtons.nextLabel}"   action="next" disabled="#{wizardButtons.hasNext}" />
        </h:panelGrid>
</f:subview>

포함된 페이지내에 상주하는 어떠한 JSF 컴포넌트도 <f:subview>태그의 내에 포함되어야 한다. 상위 페이지는 <f:view>태그내에 포함되어야 한다. 또한 이 예제를 이것을 보여주지는 않는다. 하지만 subview 내의 포함되기를 원하는 어떤 탬플릿 마크업 텍스트 <f:verbatim>태그내에 있어야 한다. 당신은 두개의 버튼으로 구성되는 Panel Grid 를 가지는 이 페이지를 볼수 있다. 이 버튼을 위한 속성은 엄격하게 메소드에 연결되고 속성들은 WizardButton 빈을 노출시킨다. 이 버튼들과 빈은 함께 작동하도록 디자인되었나.? 이전 버튼은 자신의 값을 가지고 action hard-coded 되었나.? 다음 버튼은 WizardButton 으로 부터 자신의 값을 가지고 action 은 hard-coded 되었다.

h3. The Navigation Rules Navigation 룰은 마법사 컴포넌트의 심장에 위치한다. 이런 룰들은 애플리케이션의 faces-config.xml 에 포함되어야 한다. 이것은 데모 애플리케이션을 위한 룰의 부분집합이다. 당신은 당신의 애플리케이션내에서 마법사 컴포넌트 도입하기 위한 시작지점처럼 이런 룰을 사용할 수 있다..

<navigation-rule>
        <from-view-id>/main.jsp</from-view-id>
        <navigation-case>
                <description>If the action returns "next"goto firstSelection.jsp</description>
                <from-outcome>next</from-outcome>
                <to-view-id>/firstSelection.jsp</to-view-id>
        </navigation-case>
</navigation-rule>
<navigation-rule>
        <from-view-id>/firstSelection.jsp</from-view-id>
        <navigation-case>
                <description>       If the action returns "next"goto secondSelection.jsp</description>
                <from-outcome>next</from-outcome>
                <to-view-id>/secondSelection.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
                <description>       If the action returns "back"goto main.jsp</description>
                <from-outcome>back</from-outcome>
                <to-view-id>/main.jsp</to-view-id>
        </navigation-case>
</navigation-rule>

이 Navigation 룰은 다음처럼 action 이 호출된 곳을 기준으로 actions 를 다루는 방법을 서술한다:

  • 만약 "main.jsp"페이지로부터 호출된 action 은 "next"라는 값을 반환한다. 그 다음 Navigation 핸들러는 "firstSelection.jsp"페이지를 표시한다.
  • 만약 "firstSelection.jsp"페이지로 부터 action 이 호출되었다면 "back"라는 값을 반환하고 이는 main페이지로 되돌아 가는것을 뜻한다.
  • 만약 호출된 action 이 "next"값을 반환한다면 우리는 "secondSelection.jsp"페이지로 이동할 것이다.

h3. Actions "main.jsp" 페이지에서 당신은 버튼 선언을 볼수 있다.:

<h:commandButton actionListener="#{modelBean.addCustomName}" value="Add Name"/>

실제 Action 핸들러 수행은 ModelBean.java 파일에 있다. "addCustomName"메소드는 테이블에 이름을 추가한다.

public void addCustomName(ActionEvent eventthrows AbortProcessingException {
                if ((customName != null&& (!customName.trim().equals(""))) {
                      customName = customName.trim();
                     // check to see if name already exists in list
                      Iterator iter = dataList.iterator();
                        while (iter.hasNext()) {
                            CharacterBean item = (CharacterBeaniter.next();
                           if (item.getName().equals(customName)) {
                                    reset();
                                    return;
                             }
                   }
                   // create new entry
                 CharacterBean item = new CharacterBean();
                   item.setName(customName);
                   item.setSpecies((SpeciesBeanspeciesPropertyMap.get(customSpecies));
                       dataList.add(item);
         }
   }

ActionListener 와 함께 CommandButton 이 호출될때 Action 핸들러가 호출된다. "addCustomName"메소드는 존재하는 character를 통해 작동하고 만약 이것이 리스트내에서 새로운 이름을 찾지 못한다면 이것은 새로운 Character 를 생성한다. 만약에 Action 핸들러가 반환값(return value)을 가진다면 action 의 성공을 판단하기 위한 Navagation 핸들러에 의해서 사용될 수 있고 navigation 은 반환값에 기초하여 작동한다. 이 특별한 예제에서 같은 페이지가 다시 표시되기 때문에 반환된 어떤값도 없다. Action 핸들러와 Navigation 핸들러는 쉽게 상호작동하도록 디자인되었다.

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
jpg
1.jpg 12.1 kB 1 02-Dec-2005 10:17 이동국
jpg
2.jpg 24.3 kB 1 02-Dec-2005 10:17 이동국
jpg
3.jpg 11.2 kB 1 02-Dec-2005 10:17 이동국
jpg
4.jpg 24.5 kB 1 02-Dec-2005 10:17 이동국
jpg
5.jpg 23.1 kB 1 02-Dec-2005 10:17 이동국
« This page (revision-5) was last changed on 06-Apr-2006 09:45 by 이동국