공부/JSF2014. 10. 7. 19:59

JSF 입력, 출력 예제

이번에는 이전 예제 보다 조금 더 복잡한 예제를 만들어 보겠습니다.

이번 예제는 이름을 입력하고 입력 받은 이름을 출력하는 예제이며 총 두개의 페이지가 필요합니다.

앞으로 만들게 될 모든 JSF 어플리케이션은 기본적으로 primefaces 구현체를 가지고 작업하게 되며 컴포넌트 태그의 앞에는 primefaces 를 의미하는 네임스페이스인 p: 를 붙여서 사용합니다.

이름 입력 페이지

페이지의 이름은 input.xhtml 로 만들겠습니다.

이 페이지에는 하나의 h:form 과 두개의 p:commandButton, 하나의 p:inputText JSF 컴포넌트를 사용하였습니다.

<!DOCTYPE html>
<html lang="ko" xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://xmlns.jcp.org/jsf/html"
	xmlns:p="http://primefaces.org/ui">
<h:head>
	<title>Facelets Hello Greeting</title>
</h:head>
<h:body>
	<p:messages id="messages" autoUpdate="true" />
	<h:form>
		<h2>Hello, my name is Hana. What's yours?</h2>
		<p:inputText id="username" title="My name is: "
			value="#{greeting.name}" required="true"
			requiredMessage="오류 : 이름을 입력해주세요." maxlength="25" />
		<p></p>
		<p:commandButton id="submit" value="Submit" action="response">
		</p:commandButton>
		<p:commandButton id="reset" value="Reset" type="reset">
		</p:commandButton>
	</h:form>
</h:body>
</html>

이 페이지에서 가장 복잡한 컴포넌트는 p:inputText 이며 여기에 사용된 속성에 대해 간단히 알아보겠습니다.

maxlength 속성은 입력필드에 최대로 입력 할 수 있는 값을 나타냅니다. required 속성은 입력필드에 빈값을 허용하지 않는다는것을 의미 합니다. requiredMessage 속성은 required 속성의 값이 true 일때 입력필드에 값이 채워지지 않은채 form 제출을 하였을 경우 보여줄 오류 메세지를 입력합니다. title 속성은 시각장애인을 위한 스크린리더를 위해 입력합니다. 마지막으로 value 속성은 표현식을 포함하고 있고 greeting 이라는 이름을 가진 bean 과 상호 작용을 하게 되며 greeting bean 의 구성요소(필드) 의 값을 바인딩 하게됩니다.

이 웹페이지는 Greeting managed bean 의 name 에 해당하는 구성요소(필드) 를 의미하는 #{greeting.nama} 이라는 표현언어(EL)를 통해 Greeting bean 의 name 구성요소(필드)와 연결이 됩니다. 참고로 표현식에서 사용한 greeting 은 Greeting 이라는 managed bean 의 이름 입니다. 이것은 @ManagedBean 어노테이션의 name 속성으로 임의로 다른 이름을 사용할 수도 있습니다. managed bean 의 @ManagedBean 에 name 속성이 지정되지 않을 경우 이 managed bean 은 항상 bean 의 첫번째 단어가 소문자인 이름으로 접근 할 수 있습니다.

Submit commandButton 컴포넌트의 action 속성에 지정된 값에 의해 버튼이 클릭 될때 response.xhtml 페이지를 표시 합니다.

이름 출력 페이지

페이지의 이름은 response.xhtml 로 만들겠습니다.

이 페이지의 결과는 첫 greeting.xhtml 페이지보다 훨씬 더 간단하며 표현식에 의해 Greeting managed bean 으로 부터 읽은 name 을 표시하고 이전 페이지로 돌아갈 수 있는 버튼이 있습니다.

<!DOCTYPE html>
<html lang="ko" xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://xmlns.jcp.org/jsf/html"
	xmlns:p="http://primefaces.org/ui">
<h:head>
	<title>Facelets Hello Response</title>
</h:head>
<h:body>
	<h:form>
		<h2>Hello, #{greeting.name}!</h2>
		<p></p>
		<p:commandButton id="back" value="Back" action="input" />
	</h:form>
</h:body>
</html>

managed bean

입력 받은 이름을 저장하고 response.xhtml 페이지에서 읽어 오기 위해 사용할 bean 을 하나 만들겠습니다.

이름은 Greeting 이며 이 클래스는 managed bean 클래스라고 부르며 표현식 #{greeting.name} 이 name 구성요소(필드)로 부터 값을 읽고 쓰는것을 지원하기 위해 getter 와 setter 메소드가 포함되어 있습니다. 위에서도 언급한것같이 기본적으로 표현식은 클래스의 첫문자를 소문자로된 이름을 참조 합니다.

package hello;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Greeting {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

실행

웹 서버(Tomcat) 을 실행하고 http://localhost:8080/hello/input.xhtml 에 접속하면 이름을 입력 받는 화면이 나타나며 이름을 입력하고 submit 버튼을 누르면 response.xhtml 페이지가 나타나면서 입력한 이름을 표시 하는것을 볼 수 있습니다.

만약 이름을 입력하지 않고 submit 버튼을 누르게 되면 아래 그림에서 처럼 requiredMessage 에 입력한 내용이 화면에 표시되는 것을 볼 수 있습니다.




출처


Posted by #HanaLee
공부/JSF2014. 10. 6. 09:04

Managed Bean 스코프

일반적으로 Managed bean 은 아래와 같은 스코프를 가지고 있습니다. 각각의 스코프는 상황에 따라 맞춰서 사용하면 됩니다. 기본값은 request 스코프 입니다. 추후 다루게 될 스프링 프레임워크와 통합을 하게 되면 스프링의 스코프가 적용되며 그때에는 아래의 스코프는 사용되지 않습니다.

  • Application (javax.enterprise.context.ApplicationScoped)
  • Session (javax.enterprise.context.SessionScoped)
  • Flow (javax.faces.flows.FlowScoped)
  • Request (javax.enterprise.context.RequestScoped)
  • Dependent (javax.enterprise.context.Dependent)

어플리케이션 스코프 (ApplicationScoped)

어플리케이션 스코프는 웹 어플리케이션과 모든 사용자의 상호 작용을 통해 지속 됩니다.

세션 스코프 (SessionScoped)

세션 스코프는 웹 어플리케이션에서 여러 HTTP 요청에 의해 지속됩니다. 일반적인 웹의 세션이 지속되는 동안 유지 됩니다.

플로우 스코프 (FlowScoped)

플로우 스코프는 JSF 2.2 에서 새로 추가된 기능입니다. 플로우 스코프는 웹 어플리케이션의 특정 흐름(flow)과 함께 유저와 상호 작용(interaction)동안 지속됩니다. 플로우 스코프에 대해 더 알아보기

요청(리퀘스트) 스코프 (RequestScoped)

요청(리퀘스트) 스코프는 웹 어플리케이션에서 단일 HTTP 요청 동안 지속 됩니다.

의존 스코프 (Dependent)

의존 스코프는 빈(bean) 이 다른 빈에 의존한다는 것을 의미 합니다.

managed bean 이 다른 managed bean 을 참조 할때 @Dependent 를 사용 할 수 있습니다. 두번째 bean 은 그것이 생성되어 참조의 대상이 될 것으로 예상 될 때에는 스코프(@Dependent)에 있을 수 없습니다. 만약 @Dependent 로 빈이 정의 되면 그 빈은 참조 될때 마다 새로운 인스턴스가 생성되고 어떤 스코프에도 저장이 되지 않습니다.

managed bean 이 컴포넌트 태그의 결합(binding) 속성에 의해 참조 되면 그 빈은 요청 스코프(@RequestScoped) 로 정의 해야 합니다. 만약 빈을 세션 스코프나 어플리케이션 스코프에 배치할 경우 javax.faces.component.UIComponent 인스턴트들은 단일 스레드에 의존적으로 실행 되기 때문 스레드 세이프에 대해 주의 해야 합니다.

만약 빈을 구성 할때 뷰와 관계가 있는 속성(attribute)들이 있으면 뷰 스코프를 사용 할 수 있습니다. 뷰 스코프는 유저가 다음 뷰를 볼때까지 지속됩니다.




출처


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

JSF 간단 예제 두번째  (0) 2014.10.07
JSF 라이프 사이클 상세  (0) 2014.10.06
JSF 라이프 사이클 개요  (0) 2014.10.05
JSF 어플리케이션 Hello World 예제  (0) 2014.10.04
JavaServer Faces 어플리케이션 개발 준비  (0) 2014.10.04
Posted by #HanaLee
공부/JSF2014. 10. 6. 03:14

JSF 라이프 사이클의 상세 설명

이전 블로그 글에서 본 라이프 사이클 이미지를 보면서 각 단계(phase)에 대하여 상세 설명을 하도록 하겠습니다.

JSF 라이프 사이클

JSF 어플리케이션 라이프 사이클의 실행(execute) 단계는 다음의 하위 단계를 포함합니다.

  • 뷰 복원 단계 (Restore View Phase)
  • 요청 값 적용 단계 (Apply Request Values Phase)
  • 검증 처리 단계 (Process Validations Phase)
  • 모델 값 업데이트 단계 (Update Model Values Phase)
  • 어플리케이션 호출 단계 (Invoke Application Phase)
  • 응답 랜더링 단계 (Render Response Phase)

뷰 복원 단계 (Restore View Phase)

JSF 페이지에 대한 요청이 발생 할때 그리고 링크 또는 버튼 컴포넌트를 클릭하는 액션에 의해 JSF 구현은 뷰 복원 단계를 시작합니다.

이 단계에서 JSF 구현은 컴포넌트와 연결된 이벤트 처리기(handler)와 검증기(validator)가 포함된 뷰를 빌드 하여 FacesContext 인스턴스에 저장하는데 이 뷰에는 하나의 요청을 처리하는데 필요한 모든 정보가 포함 되어 있습니다. 모든 어플리케이션 컴포넌트의 이벤트 처리기, 변환기 그리고 검증기는 FacesContext 인스턴스에 접근할 수 있습니다.

만약 페이지 요청이 초기 요청(initial request)일 경우 JSF 구현은 이 단계에서 비어 있는 뷰(view)를 만들고 응답 랜더링 단계(Render Response Phase)로 진행 하는 동안 비어있는 뷰에는 페이지에 있는 태그를 참고 하여 컴포넌트들을 채우게 됩니다. 여기서 페이지는 개발자가 직접 태그를 이용하여 만든 xhtml 페이지 입니다.

만약 페이지에 대한 요청이 포스트백인 경우 이 페이지에 해당하는 뷰는 이미 FacesContext 인스턴스에 존재 합니다. 이때 JSF 구현은 클라이언트 또는 서버에 이미 저장되어 있는 상태 정보를 이용하여 뷰를 복원 합니다.

요청 값 적용 단계 (Apply Request Values Phase)

컴포넌트 트리가 포트스백 요청시 복원이 된 후에 트리의 각 컴포넌트는 디코드(processDocodes()) 메소드를 사용하여 요청 파라메터(request parameters)에서 새로운 값을 추출(extract) 합니다.

만약 디코드 메소드 또는 이벤트 리스너가 현재의 FacesContext 인스턴스에서 renderResponse 메소드를 호출하게 되면 JSF 구현은 응답 랜더링 단계로 건너 뜁니다.

이 단계에서 모든 이벤트가 대기(queued)중인 경우 JSF 구현은 관련 있는 이벤트 리스너에게 전달(broadcast) 합니다.

몇몇 컴포넌트들의 immediate 속성에 true 값이 설정되면 이 컴포넌트와 관련된 검증(validate), 변환(convet), 이벤트는 이 단계에서 처리됩니다. 만약 변환(conversion) 에 오류가 발생하면 해당 컴포넌트와 관련된 오류 메세지가 생성되고 FacesContext 에 대기(queue)합니다. 이 메세지는 검증 단계의 처리중 발생한 모든 검증 오류의 결과와 함께 응답 랜더링 단계(Render Response Phase)에서 표시됩니다.

이때 만약 어플리케이션이 다른 웹 어플리케이션 리소스로 리디렉션(redirect)이 필요하거나 JSF 컴포넌트를 포함하지 않는 응답을 생성할 경우 FacesContext.responseComplete 메소드를 호출 할 수 있습니다.

이 단계의 마지막에 컴포넌트는 새로운 값으로 설정되고 메세지와 이벤트가 대기(queue)하고 있습니다.

만약 현재 요청이 partial 요청으로 식별 될 경우 partial context 는 FacesContext 에서 검색되고 partial 처리 메소드가 적용 됩니다.

검증(유효성) 처리 단계 (Process Validation Phase)

이 단계에서 JSF 구현은 검증(processValidator) 메소드를 통해 뷰 트리의 컴포넌트에 등록된 모든 검증기(validator)를 처리 합니다. 그것은 컴포넌트의 속성들을 검사하는데 검증을 위한 규칙을 명확하게 하고 그 규칙은 컴포넌트에 저장된 로컬 값을 비교 합니다. JSF 구현은 또한 immediate 속성에 true 값이 설정 되지 않은 입력 컴포넌트의 변환(conversion)을 완료한다.

만약 로컬 값이 잘못되거나 모든 변환(conversion)이 실패하면 JSF 구현은 FacesContext 인스턴스에 오류 메세지를 추가하고 라이프 사이클은 응답 랜더링 단계로 곧장 이동하고 페이지는 오류 메세지를 다시 랜더링 합니다.

로컬값이 잘못되거나 변환(conversion)이 실패하면 JSF 구현은 FacesContext 에 오류 메세지를 추가하고 페이지가 오류 메세지를 다시 랜더링 할 수 있게 응답 랜더링 단계로 바로 이동합니다. 만약 변환 오류가 요청값 적용 단계(Apply Request Values Phase)에서 발생 할 경우 그 에러 메세지 또한 함께 표시됩니다.

만약 검증 메소드 또는 이벤트 리스너가 현재의 FacesContext 에서renderResponse 메소드를 호출하면 JSF 구현은 응답 랜더링 단계로 건너 뜁니다.

요청값 적용 단계에서 처럼 만약 어플리케이션이 다른 웹 어플리케이션 리소스로 리디렉션이 필요하거나 JSF 컴포넌트를 포함하지 않는 응답을 생성(generate) 할 경우 FacesContext.responseComplete 메소드를 호출 할 수 있습니다.

만약 이벤트가 이 단계동안 대기 하고 있으면 JSF 구현은 관련된 리스너로 전달 할 수 있습니다.

현재 요청이 partial 요청으로 식별 될 경우 partial context 는 FacesContext 에서 검색되고 partial 처리 메소드가 적용 됩니다.

모델 값 업데이트 단계 (Update Model Values Phase)

JSF 구현은 데이터가 유효한것으로 검증한 후 컴포넌트 트리에 있는 모든 컴포넌트의 로컬 값을 서버측(server-side) 객체의 구성요소에 설정합니다. JSF 구현은 오직 입력 컴포넌트의 속성(attribute) 값이 가리키는 빈(bean)의 구성요소(property)를 업데이트 합니다. 만약 로컬 데이터를 빈(bean) 구성요소에 의해 지정된 타입으로 변환(convert) 할 수 없는 경우에 라이프 사이클은 오류를 표시하는 페이지를 다시 랜더링 하기 위해 응답 랜더링 단계로 바로 진행합니다. 이것은 검증(validation) 오류가 발생하는 것과 동일합니다.

만약 updateModels 메소드 또는 리스너가 현재의 FacesContext 인스턴스의 renderResponse 메소드를 호출하면 JSF 구현은 응답 랜더링 단계로 건너 뜁니다.

이때 만약 어플리케이션이 다른 웹 어플리케이션 리소스로 리디렉션(redirect)이 필요하거나 JSF 컴포넌트를 포함하지 않는 응답을 생성할 경우 FacesContext.responseComplete 메소드를 호출 할 수 있습니다.

만약 이벤트가 이 단계동안 대기 하고 있으면 JSF 구현은 관련된 리스너로 전달 할 수 있습니다.

현재 요청이 partial 요청으로 식별 될 경우 partial context 는 FacesContext 에서 검색되고 partial 처리 메소드가 적용 됩니다.

어플리케이션 호출 단계 (Invoke Application Phase)

이 단계에서 JSF 구현은 폼 제출(submit a form) 또는 다른 페이지로 연결(linking)과 같은 어플리케이션 수준의 이벤트를 처리합니다.

이때 만약 어플리케이션이 다른 웹 어플리케이션 리소스로 리디렉션(redirect)이 필요하거나 JSF 컴포넌트를 포함하지 않는 응답을 생성할 경우 FacesContext.responseComplete 메소드를 호출 할 수 있습니다.

뷰(view)가 이전 요청의 상태 정보로 부터 재구성하는 처리를 하고 컴포넌트가 이벤트를 발생시키면 그 이벤트는 관련된 리스너로 전달이 됩니다.

마지막으로 JSF 구현은 응답 랜더링 단계로 제어를 전달합니다.

응답 랜더링 단계 (Render Response Phase)

이 단계에서 JSF는 뷰를 생성(build) 하고 페이지를 랜더링 하기 위해 적당한 리소스에 권한을 위임 합니다.

만약 초기 요청(initial request)이면 페이지페 표시될 컴포넌트를 컴포넌트 트리에 추가 합니다. 만약 초기 요청이 아니면 컴포넌트는 이미 트리에 추가 되어 있고 다시 추가될 필요는 없습니다.

만약 포스트백 요청이고 오류가 요청값 적용 단계, 검증 처리 단계, 모델 값 갱신 단계중 발생된 경우 오리지널 페이지는 이 단계에서 다시 랜더링 합니다. 만약 페이지에 h:message 또는 h:messages 태그가 있는 경우 대기중인 모든 오류 메세지가 페이지에 나타납니다.

뷰의 내용들이 랜더링되고 난 후 응답의 상태는 저장되는데 바로 다음 요청은 이 상태에 접근 할 수 있습니다. 저장된 상태는 뷰 복원 단계에서 사용 할 수 있습니다.

JSF 라이프 사이클의 개발자를 위한 요약

어느정도 JSF 개발에 익숙해진 개발자를 위해 간단하게 라이프 사이클을 코드를 이용하여 표현해 봤습니다.

  • fc = FacesContext
  • vh = ViewHandler
  • in = UIInput
  • rq = HttpServletRequest
  • id = in.getClientId(fc);

  1. 뷰 복원
  2. String viewId = rq.getServletPath();
    fc.setViewRoot(vh.createView(fc, viewId));
    
  3. 요청값 적용
  4. in.setSubmittedValue(rq.getParameter(id));
    
  5. 검증 처리
  6. Object value = in.getSubmittedValue();
    try {
       value = in.getConvertedValue(fc, value);
       for (Validator v : in.getValidators())
          v.validate(fc, in, value);
       }
       in.setSubmittedValue(null);
       in.setValue(value);
    } catch (ConverterException
       | ValidatorException e) {
       fc.addMessage(id, e.getFacesMessage());
       fc.validationFailed(); // Skips phases 4+5.
       in.setValid(false);
    }
    
  7. 모델 값 갱신
  8. bean.setProperty(in.getValue());
    
  9. 어플리케이션 호출(실행)
  10. bean.submit();
    
  11. 응답 랜더링
  12. vh.renderView(fc, fc.getViewRoot());
    



출처


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

JSF 간단 예제 두번째  (0) 2014.10.07
Managed bean 스코프에 대하여  (0) 2014.10.06
JSF 라이프 사이클 개요  (0) 2014.10.05
JSF 어플리케이션 Hello World 예제  (0) 2014.10.04
JavaServer Faces 어플리케이션 개발 준비  (0) 2014.10.04
Posted by #HanaLee
공부/JSF2014. 10. 5. 04:32

JavaServer Faces 라이프 사이클

JavaServer Faces(JSF) 라이프 사이클은 꽤나 긴 내용이기 때문에 라이프 사이클 각 단계(phase)별로 나눠서 작성 하도록 하겠습니다.

어플리케이션의 라이프 사이클은 해당하는 어플리케이션 처리의 여러 단계이며 시작과 끝을 의미한다. 모든 어플리케이션은 라이프 사이클이 있습니다. 어플리케이션의 라이프 사이클 동안 일반적인 작업은 다음의 내용을 포함하여 실행 됩니다.

  • 들어오는 요청을 처리
  • 파라메터의 디코딩
  • 상태를 수정 및 저장
  • 웹 브라우저에 웹 페이지를 랜더링

JSF 웹 어플리케이션 프레임워크는 간단한 어플리케이션을 위해 라이프 사이클의 각 단계를 자동으로 관리 하거나 필요에 따라 복잡한 어플리케이션에 대해서는 수동으로 관리 할 수 있습니다.

고급 기능을 사용하는 JSF 어플리케이션은 특정 단계에서 라이프 사이클과의 상호 작용이 필요합니다.

예를 들어 Ajax 어플리케이션은 라이프 사이클의 부분 처리 기능을 사용합니다. (참조 : Partial Processing and Partial Rendering)

라이프 사이클의 명확한 이해는 잘 디자인된 컴포넌트를 만드는 핵심이 됩니다.

기본적으로 JSF 웹 어플리케이션은 실행 단계와 랜더링 단계 두 가지 주요 단계로 구성 됩니다. 이번 글에서는 JSF 어플리케이션의 라이프 사이클에 대하여 더 자세히 알아보겠습니다.

JSF 라이프 사이클의 개요

JSF 어플리케이션의 라이프 사이클은 클라이언트의 요청(request)으로 시작하여 서버가 응답(response) 페이지를 HTML 로 변환 하면서 종료 됩니다.

라이프 사이클은 실행(execute)과 랜더(render) 의 두가지 주요 단계로 나눌 수 있습니다. 실행 단계에서는 더 정교한 컴포넌트 트리를 지원하는 하위단계로 나누어집니다. 이러한 구조는 컴포넌트 데이터의 변환(convert)과 검증(validate), 컴포넌트 이벤트의 처리, 그리고 컴포넌트 데이터가 규칙적으로 빈(bean) 들에 전달 될 것을 요구 합니다.

JSF 페이지는 컴포넌트들의 트리로 나타나며 뷰(view) 라고 합니다. 라이프 사이클 동안 JSF 구현체는 뷰를 만들때 페이지를 제출 하기 이전에 상태(state)를 저장할지 고려 해야 합니다. 클라이언트가 페이지를 요청할때 JSF 구현체는 뷰의 컴포넌트에 입력된 데이터의 검증과 입력 데이터를 서버측(server side)에 지정된 특정 타입으로 변환 작업등을 수행해야 한다.

JSF 구현체는 JSF 요청에서 응답까지 라이프 사이클의 모든 단계의 작업을 수행해야 합니다. 다음 그림은 라이프 사이클의 단계를 보여줍니다.

<JSF 요청에서 응답까지 표준 라이프 사이클>

요청-응답 라이프 사이클은 두가지 종류의 요청이 있습니다. 최초 요청과 포스트백. 최초 요청(initial request) 는 사용자가 처음으로 페이지를 요청하면 발생합니다. 포스트백 요청은 최초 요청에 의해 실행 된 결과가 브라우저에 이미 로드가 된 페이지의 폼을 사용자가 제출(submit)을 하면 발생 합니다.

라이프 사이클이 최초 요청을 처리 할때는 오직 뷰 복원과 응답을 랜더링하는 단계가 실행됩니다. 왜냐하면 최초 요청에는 유저의 입력이나 액션 처리가 없기 때문입니다. 라이프 사이클이 포스트백을 처리 할 때에는 반대로 모든 단계가 실행 됩니다.

보통은 클라이언트의 첫번째 JSF 페이지 요청은 JSF 페이지의 링크나 버튼 컴포넌트를 클릭한 결과입니다. 이것은 또 다른 JSF 페이지를 랜더링 하여 응답하는것이며 이 어플리케이션은 들어오는 요청과 응답을 생성하여 처리하는것과 관계가 있는 javax.faces.context.FacesContext 인스턴스 내부에 새로운 뷰를 만들고 저장합니다. 그런 뒤 어플리케이션은 뷰가 필요로 하는 객체의 레퍼런스를 취득하고 FacesContext.renderResponse 메소드를 호출하여 즉시 라이프 사이클의 랜더 응답 단계로 건너띄어 뷰를 강제로 랜더링 하며 위 그림에서 화살표로 표시 되어 있습니다.

가끔 어플리케이션은 웹서비스와 같은 다른 웹 어플리케이션 리소스로 리디렉션(redirect) 또는 JSF 컴포넌트를 포함하지 않는 응답을 랜더링 해야 할 수도 있습니다. 이러한 상황에서 개발자는 FacesContext.responseComplete 메소드를 호출 하여 응답을 랜더링하는 단계를 생략 하면 됩니다. 이 상황은 또한 위 그림에서 Response Complete 의 화살표를 나타냅니다.

가장 일반적인 상황은 JSF 컴포넌트가 다른 JSF 페이지에 대한 요청을 서밋 하는 것입니다. 이 경우에는 JSF 구현체가 요청을 처리하고 라이프 사이클 내부의 단계를 통해 모든 필요한 변환들, 검증들 그리고 모델을 업데이트 하고 응답을 생성하는 작업을 수행합니다.

여기서 설명한 라이프 사이클에 대한 한가지 예외가 있습니다. 컴포넌트의 immediate 속성 값이 true 로 설정 되었을때 이러한 컴포넌트와 관련된 검증, 변환, 이벤트가 요청값 적용 단계 (Apply Request Values Phase) 보다 이후 단계에서 처리 됩니다.

개발자를 위한 검증, 변환, 이벤트를 일반적으로 처리 하는 방법과 변화를 어떻게 언제 처리하는지 라이프 사이클에 대한 더 자세한 설명을 다음 블로그에서 작성 하도록 하겠습니다.




출처


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

Managed bean 스코프에 대하여  (0) 2014.10.06
JSF 라이프 사이클 상세  (0) 2014.10.06
JSF 어플리케이션 Hello World 예제  (0) 2014.10.04
JavaServer Faces 어플리케이션 개발 준비  (0) 2014.10.04
Facelets 란 무엇인가?  (0) 2014.10.02
Posted by #HanaLee
공부/JSF2014. 10. 4. 02:53

JavaServer Faces 는 쉽고, 유저 친화적인(user-friendly) 방법으로 웹 어플리케이션 만들기를 지원합니다. JavaServer Faces 개발에는 일반적으로 다음의 절차가 꼭 필요하며 예제를 통해 살펴 보겠습니다.

  • 컴포넌트 태그를 이용하여 웹 페이지 만들기
  • 관리되는빈(managed beans) 개발하기
  • FacesServlet 매핑하기

HelloWorld!! 출력하기

모든 언어의 기본 출발점… HelloWorld!! 를 브라우저에 출력 해보겠습니다.

이클립스에서 웹서버를 신규로 등록합니다.

Dynamic Web Project를 hello 라는 이름으로 새로 만드세요.

프로젝트의 카테고리를 펼쳐 WebContent/WEB-INF/lib 폴더에 JSF 라이브러리 및 JSTL 라이브러리 파일을 복사해 넣어주세요.

web.xml 에 아래의 내용을 추가 해 주세요.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>
</web-app>

JavaBean 클래스를 Hello 라는 이름으로 새로 만들고 아래의 내용을 입력해주세요.

package hello;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Hello {

	private final String world = "Hello World!!";

	public String getWorld() {
		return world;
	}
}

WebContent 아래에 hello.xhtml 이라는 이름으로 view page 하나 만들고 내용을 아래와 같이 입력해주세요.

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html">
<h:head>
	<title>Hello World Example</title>
</h:head>
<h:body>
	#{hello.world}
</h:body>
</html>

모든 준비가 완료 되었습니다. 이제 이클립스에서 Tomcat 웹서버를 실행하고 브라우저에서 아래의 주소를 입력하여 HelloWorld!! 가 출력되는지 확인 해보세요.

http://localhost:8080/hello/hello.xhtml

동작 설명

JavaServer Faces 어플리케이션 뿐만 아니라 대부분의 웹 어플리케이션은 라이프사이클이 존재 합니다. 먼저 이번 예제가 실행될때 JavaServer Faces 컨테이너에서 일어나는 일에 대해 간단히 정리 하겠습니다.

  • 클라이언트로부터 서버로 요청이 시작됩니다.
  • JavaServer Faces 어플리케이션의 뷰가 생성되거나 복원을 합니다.
  • 요청 파라메터 값을 반영 합니다.
  • 컴포넌트 값에 대한 변환(conversion) 과 검증(validation) 이 수행됩니다.
  • 컴포넌트의 값을 가지고 Managed beans 가 업데이트 됩니다.
  • 어플리케이션의 로직이 호출 됩니다.

클라이언트로 부터 요청이 처음일 경우에는 뷰가 생성이 되며, 이후 부터는 동일한 요청에 대해서는 뷰를 복원하게 됩니다. 위와 같이 몇가지 작업이 일어난 후 최종적으로는 클라이언트가 해석 할 수 있는 HTML 이 만들어지게 됩니다.

이상으로 초간단 JavaServer Faces 어플리케이션을 만들어 보았습니다. 다음 블로그 글에서는 JavaServer Faces 에서 아주 중요하고 꼭 이해해야만 하는 라이프 사이클에 대해 알아 보겠습니다.

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

JSF 라이프 사이클 상세  (0) 2014.10.06
JSF 라이프 사이클 개요  (0) 2014.10.05
JavaServer Faces 어플리케이션 개발 준비  (0) 2014.10.04
Facelets 란 무엇인가?  (0) 2014.10.02
JavaServer Faces 버전 히스토리  (0) 2014.10.02
Posted by #HanaLee
공부/JSF2014. 10. 4. 02:33


본격적인 JavaServer Faces 어플리케이션 예제를 해보기에 앞서 아래와 같은 기본적인 준비가 필요합니다. JavaServer Faces 는 API 와 Implementation 이 별도로 존재 하며 Implementation 은 몇가지 서드 파티 라이브러리가 존재 합니다. 그중 앞으로 진행될 예제에서는 서드파티 구현체 이며 대부분 익숙하실지도 모를 jQuery UI 를 이용한 Primefaces 라이브러리를 이용할 예정입니다. 그럼 본격적으로 준비 사항을 체크 해보겠습니다.

준비사항

가장 먼저 아래의 파일들을 내려받아 주세요.

모든 파일들을 내려 받았으면 다음 설명에 따라 설치 및 압축 해제를 해주세요

  • 시스템에 Java SDK 버전 6 이상을 Oracle 홈페이지에서 내려받아 설치 합니다.
    • JAVA_HOME 설정은 구지 할 필요는 없으나 필요하면 시스템 환경설정에서 JAVA_HOME 을 설정하세요.
  • 이클립스를 홈페이지에서 내려받은 후 적당한 곳에 압축을 풀고 실행 시켜 주세요.
    • 이클립스의 버전은 Tomcat 6 및 Java 6 만 지원한다면 어떤 버전이든 상관없습니다.
  • Tomcat 웹서버를 홈페이지에서 내려받은 후 적당한 곳에 압축만 풀어주세요.
    • Tomcat 버전은 6 이상으로 내려 받아 주세요 (5 이하 버전은 JSF 2.2 지원을 하지 않습니다)
  • JSF 2.2 API 를 위 다운로드 링크를 통해 내려 받습니다.
    • 여러 목록 중 javax.faces-api-2.2.jar 이름으로 되어있는것을 내려 받으시면 됩니다.
  • JSF 2.2 Impl 을 위 다운로드 링크를 통해 내려 받습니다.
    • 여러 목록 중 javax.faces-2.2.8.jar 을 내려 받으면 됩니다.
    • 나중에 다른 서드파티의 구현체로 바꾸려면 Impl 라이브러리만 교체 하면 됩니다.
    • Primefaces, Richfaces, MyFaces, IceFaces, OmniFaces 등등
  • JSTL 1.2 API 를 위 다운로드 링크를 통해 내려 받습니다.
    • JSF 태그를 사용하기 위해 필요합니다.
    • 여러 목록 중 javax.servlet.jsp.jstl-api-1.2.1.jar 을 내려 받습니다.
  • JSTL 1.2 Impl 을 위 다운로드 링크를 통해 내려 받습니다.
    • 여러 목록 중 javax.servlet.jsp.jstl-1.2.1.jar 을 내려 받습니다.
  • Primefaces 5.0 을 위 다운로드 링크를 통해 내려 받습니다.
    • 다운로드 사이트에 가면 여러가지 버전이 있는데 그중에 Community Downloads 에서 5.0 을 선택해서 내려 받습니다.

이렇게해서 기본적인 JavaServer Faces 어플리케이션을 개발하기 위한 준비가 끝났습니다. 다음 블로그 글에서 초간단 JavaServer Faces 어플리케이션 Hello World 예제를 해보겠습니다.

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

JSF 라이프 사이클 개요  (0) 2014.10.05
JSF 어플리케이션 Hello World 예제  (0) 2014.10.04
Facelets 란 무엇인가?  (0) 2014.10.02
JavaServer Faces 버전 히스토리  (0) 2014.10.02
Facelets 소개  (0) 2014.10.02
Posted by #HanaLee
공부/JSF2014. 10. 2. 08:50

Facelets 란 무엇인가?

Facelets 은 강력하지만 가벼운 페이지 선언 언어(page declaration language) 이며 HTML 스타일의 템플릿을 이용하여 JavaServer Faces 뷰들과 컴포넌트 트리들을 구축하는데 사용됩니다.
Facelets 의 기능들은 다음을 포함하고 있습니다.

  • 웹 페이지들을 만들기 위해 XHTML 을 사용합니다.
  • JavaServer Faces 에 Facelets 태그 라이브러리와 추가로 JSTL 태그 라이브러리를 지원 합니다.
  • EL 표현식을 지원합니다.
  • 페이지들과 컴포넌트를 위한 템플릿을 지원합니다.

규모가 큰 프로젝트를 개발할때 Facelets 을 사용하면 다음과 같은 장점이 있습니다.

  • 템플릿을 이용한 코드 재사용, 복합 컴포넌트(composite components)의 지원
  • 사용자 정의를 통해 다른 컴포넌트와 서버측(server-side) 객체의 기능 확장
  • 높은 생산성
  • 컴파일 타임에 EL 표현식의 검증(validation)
  • 성능이 좋은 랜더링

요컨대, Facelets 을 사용하면 개발 및 배포에 걸리는 시간과 노력을 줄여 줍니다.
Facelets 뷰들은 일반적으로 XHTML 페이지로 작성 됩니다. JavaServer Faces 구현은 http://www.w3.org/TR/xhtml1/#a_dtd_XHTML-1.0-Transitional 리스트에 있는 XHTML Transitional 문서 타입 정의 (DTD) 를 지원하는 XHTML 페이지를 만드는것을 지원합니다. 규약에 따라 XHTML 로 만들어지는 웹 페이지는 .xhtml 확장자를 가집니다.
JavaServer Faces 기술은 웹 페이지에 컴포넌트를 추가 하기 위해 각종 태그 라이브러리들을 지원합니다. Facelets 은 JavaServer Faces 태그 라이브러리 매커니즘을 지원하기 위해 XML 네임스페이스 선언을 사용합니다. 아래는 Facelets 가 지원하는 태그 라이브러리들의 목록입니다.

Tag Library URI Prefix Example Contents
JavaServer Faces Facelets Tag Library http://java.sun.com/jsf/facelets ui: ui:example
ui:insert
템플릿 태그
JavaServer Faces HTML Tag Library http://java.sun.com/jsf/html h: h:head
h:body
h:outputText
h:inputText
모든 UIComponent 객체를 위한 JavaServer Faces component 태그들
JavaServer Faces Core Tag Library http://java.sun.com/jsf/core f: f:actionListener
f:attribute
JavaServer Faces 의 커스텀 액션 태그는 특정 랜더킷과 무관합니다
JSTL Core Tag Library http://java.sun.com/jsp/jstl/core c: c:forEach
c:catch
JSTL 핵심 태그
JSTL Functions Tag Library http://java.sun.com/jsp/jstl/functions fn: fn:toUpperCase
fn:toLowerCase
JSTL 기능 태그

추가로 Facelets 는 복합 컴포넌트(composite components) 태그를 지원하며 커스텀하게 태그의 prefix 를 정의 할 수 있습니다. 복합 컴포넌트(composite components) 에 대해 더 알고 싶으면 다음 링크를 통해 확인 할 수 있습니다. composite components
JavaServer Faces 의 EL 표현식을 지원을 기반으로 Facelets 의 속성들과 관리되는 빈(managed beans)의 메소드를 참조 할 수 있는 EL 표현식을 사용합니다. EL 표현식은 컴포넌트 객체, 메소드의 값, 관리되는 빈의 속성을 바인딩 할 수 있습니다. EL 표현식에 대한 더 많은 내용은 다음 링크를 통해 확인 할 수 있습니다. Using the EL to Reference Managed Beans




출처

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

JSF 어플리케이션 Hello World 예제  (0) 2014.10.04
JavaServer Faces 어플리케이션 개발 준비  (0) 2014.10.04
JavaServer Faces 버전 히스토리  (0) 2014.10.02
Facelets 소개  (0) 2014.10.02
JSF 기술의 이점  (0) 2014.10.02
Posted by #HanaLee
공부/JSF2014. 10. 2. 03:35

JavaServer Faces 버전 히스토리

먼저 Java EE 플랫폼에 포함된 JavaServer Faces 의 버전별 히스토리를 살펴 보겠습니다. 대체로 Java EE 에 포함된 API 들은 Java 의 버전과는 별개로 각각의 API 들과 그 구현체만 있으면 사용 할 수 있습니다.

J2EE 1.4 (2003년)

J2EE 1.4 에 처음으로 JavaServer Faces 1.1 이 포함 되었습니다.

Java EE 5 (2006년)

Java EE 5 에서는 약간의 기능이 개선 된 JavaServer Faces 1.2 가 포함 되었습니다.

Java EE 6 (2009년)

Java EE 6 에서 기능이 대폭 추가 된 JavaServer Faces 2.0 이 포함 되었습니다.

Java EE 7 (2013년)

Java EE 7 에서는 JavaServer Faces 2.2 가 포함 되었습니다.

JavaServer Faces 버전별 주요 기능

  • JSF 1.0 - JavaServer Faces 초기 스펙 발표.
  • JSF 1.1 - 일부의 버그들을 해결하여 발표. 스펙의 변화는 없음.
  • JSF 1.2 - JavaServer Faces 의 핵심 부분과 API들의 많은 개선이 이루어짐. Java EE 5 에 포함됨. Java 엔터프라이즈 에디션으로 채택.
  • JSF 2.0 - 사용의 편리성이 더해지고 향상된 기능과 성능이 개선됨. ajax 기능이 포함됨. Java EE 6 에 포함.
  • JSF 2.1 - JavaServer Faces 2.0 에 대한 유지 보수 2 발표(maintenance release 2). 매우 적은 스펙의 변화들이 생김.
  • JSF 2.2 - 상태를 저장하지 않는 뷰들(stateless views), 페이지 흐름(page flow) 그리고 변경이 가능한 자원(resource) 을 생성 할 수 있는 기능등 새로운 개념을 소개함.

JavaServer Faces 버전별 최소 요구사항

  • JSF1.0 과 1.1 : Servlet 2.4, JSP 2.0 그리고 Java 1.4 필요.
  • JSF1.2 : Servlet 2.4 에서 동작은 하지만 JSP/EL 2.1 을 필요로 하기 때문에 Servlet 2.5 권장. 만약 Facelets 1.x 버전의 뷰 기술을 사용할 경우에는 Servlet 2.4 를 사용가능 합니다. Java 1.5 필요.
  • JSF2.0 : JSF2.0 에서는 Facelets 2.x 를 기본으로 사용하기 때문에 EL 2.1 이 필요하고 이것은 Servlet 2.5 를 필요로 합니다. 만약 EL 2.1 의 API 와 구현을 모두 별도로 사용 할 수 있다면 이론적으로 Servlet 2.4 에서도 동작 할 수 있고 이는 Java 1.5 를 필요로 합니다. 권장은 Servlet 2.5 에 Java 1.5, EL 2.1
  • JSF2.1 : JSF2.1 은 Servlet 3.0 의 일부 특정 기능을 사용합니다. 하지만 Servlet 2.5 와의 호환성을 유지 합니다. Servlet 3.0 은 선택적으로 사용 가능합니다.
  • JSF2.2 : Servlet 3.0 을 필요로 합니다. 왜냐하면 새로운 File Upload 컴포넌트가 서드파티 라이브러리들을 이용하지 않고 표준 Servlet 3.0 의 기능을 이용하기 때문입니다. Java 1.6 이상이 필요합니다.

Servlet 버전별 웹서버 호환

  • Servlet 2.4 : Tomcat 5.5.x, JBoss AS 4.x, Sun Java application server
  • Servlet 2.5 : Tomcat 6.0.x, JBoss AS 5.x, Glassfish 2.x
  • Servlet 3.0 : Tomcat 7.0.x, JBoss AS 6.x, 7.x, Glassfish 3.x
  • Servlet 3.1 : Tomcat 8.0.x, WildFly 8.x, Glassfish 4.x



출처


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

JavaServer Faces 어플리케이션 개발 준비  (0) 2014.10.04
Facelets 란 무엇인가?  (0) 2014.10.02
Facelets 소개  (0) 2014.10.02
JSF 기술의 이점  (0) 2014.10.02
JSF 어플리케이션이란 무엇일까요?  (0) 2014.10.01
Posted by #HanaLee
공부/JSF2014. 10. 2. 02:33

Facelets 소개

Facelets 라는 용어는 JavaServer Faces 기술에 대한 view 선언 언어를 의미한다. 이전에는 JavaServer Faces 의 표현을 귀한 기술로 JavaServer Pages 를 사용하였으나 Java EE 6 플랫폼에서 JavaServer Faces 에 새롭게 추가된 모든 기능을 지원하지 않았습니다. 참고로 Java EE 6 에 포함된 JavaServer Faces 는 버전이 2.0 입니다. JSP 기술은 JavaServer Faces 2.0 에서 더이상 표현을 위해 사용되지 않는 것으로 생각하면 됩니다. Facelets 는 JavaServer Faces 스펙의 일부 이며 JavaServer Faces 기반 어플리케이션에서 선호하는 표현(presentation) 기술입니다.



출처

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

Facelets 란 무엇인가?  (0) 2014.10.02
JavaServer Faces 버전 히스토리  (0) 2014.10.02
JSF 기술의 이점  (0) 2014.10.02
JSF 어플리케이션이란 무엇일까요?  (0) 2014.10.01
JSF, JSP, Servlet 다른점  (0) 2014.09.22
Posted by #HanaLee
공부/JSF2014. 10. 2. 02:02

JSF 기술의 가장 큰 장점 중 하나는 웹 어플리케이션의 동작(behavior)과 표현(presentation) 사이의 구분이 명확하다는 것입니다. 그리고 JSF 어플리케이션은 컴포넌트별 이벤트 처리를 HTTP 요청(request) 에 매핑하고 서버의 stateful object 로 구성요소를 관리 할 수 있습니다. JSF 기술은 동작(behavior) 과 표현(presentation) 의 세밀한 분리에 의해 웹 어플리케이션을 구현할 수 있게 하는데 이는 JSF 전통적으로 클라이언트측(client-side) UI 아키텍처를 제공하기 때문입니다.

프레젠테이션 로직의 분리는 또한 웹 개발팀 각각의 팀원이 개발 프로세스의 한 부분에 집중 할 수 있으며 각 부분을 연결하는 간단한 프로그래밍 모델을 제공한다. 예를 들어서 프로그래밍에 전문적인 지식이 없는 페이지 제작자는 어떠한 스크립트를 사용하지 않고도 JavaServer Faces 의 태그를 웹페이지에 사용하는 것으로 서버측 객체들과 연결을 시킬 수 있다.

JavaServer Faces 기술의 또 다른 중요한 목표는 특정 스크립팅이나 마크업 언어에 제약을 두지 않고 익숙한 구성 요소와 웹 티어 개념을 활용 할 수 있는 것입니다. JavaServer Faces 기술은 아래의 그림에서 보는것 같이 Servlet API 보다 상위 계층에 있습니다.

<자바 웹 어플리케이션 기술들>


이 API 레이어들은 몇가지 중요한 어플리케이션 사용 사례로 서로 다른 표현 기술들을 사용하고, 컴포넌트 클래스로 부터 직접 자신만의 커스텀 컴포넌트를 만들수 있고 다양한 클라이언트 장치들을 위한 출력을 생성하는것을 할 수 있게 한다.

JavaServer Faces 2.0 의 일부로 사용할 수 있는 Facelets 기술은 JSF 기반 웹 어플리케이션을 만들기 위한 기본 표현 기술 입니다.

Facelets 의 기능에 대해 더 알고 싶으면 다음의 주소에서 확인 할 수 있습니다. http://docs.oracle.com/javaee/6/tutorial/doc/giepx.html

Facelets 기술은 여러가지 장점을 제공합니다.

  • 코드 재상이 가능하며, 템플릿 및 복잡한 컴포넌트(composite component) 기능 구성을 통해 컴포넌트를 확장 할 수 있습니다.

  • JavaServer Faces 의 어노테이션 기능을 사용하면 자동으로 JavaServer Faces 어플리케이션에서 사용할 수 있는 리소스로 managed beans 을 등록하여 사용 할 수 있습니다. 추가로 JavaServer Faces 에서 제공하는 암시적인 네비게이션 룰은 개발자가 빠르게 페이지를 탐색 할 수 있게 해줍니다. 이러한 기능들은 어플리케이션에 수동으로 등록하는 설정을 줄여 줍니다.

  • JavaServer Faces 의 가장 중요한 기능은 컴포넌트들의 상태 관리, 컴포넌트의 데이터 처리, 사용자 입력의 검증 그리고 이벤트 처리를 위한 다양한 구조를 제공 한다는 것입니다.




출처

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

JavaServer Faces 버전 히스토리  (0) 2014.10.02
Facelets 소개  (0) 2014.10.02
JSF 어플리케이션이란 무엇일까요?  (0) 2014.10.01
JSF, JSP, Servlet 다른점  (0) 2014.09.22
JSF 에 대하여  (1) 2014.09.19
Posted by #HanaLee