Java는 최근 몇 년 동안 점차 뜨거워지고 있으며 Java SE 5 및 Java SE 6의 출시로 Java의 미래는 더욱 밝아졌습니다. 그러나 Java 기반 JSP는 Java SE 5 출시 이전에 고개를 들지 못했습니다. 가장 중요한 이유는 JSP가 매우 강력하지만 가장 큰 장점이기도 하고 가장 큰 단점도 있다는 것입니다. 프런트엔드 인터페이스를 디자인하기 위한 시각적 도구는 많지 않으며 충분히 강력하지도 않습니다. 따라서 JSP 페이지를 디자인하는 것은 매우 복잡하고 성가신 일이 됩니다...
Java는 최근 몇 년 동안 점차 뜨거워지고 있으며 Java SE 5 및 Java SE 6의 출시로 Java의 미래는 더욱 밝아졌습니다. 그러나 Java 기반 JSP는 Java SE 5 출시 이전에 고개를 들지 못했습니다. 가장 중요한 이유는 JSP가 매우 강력하지만 가장 큰 장점이기도 하고 가장 큰 단점도 있다는 것입니다. 프런트엔드 인터페이스를 디자인하기 위한 시각적 도구는 많지 않으며 충분히 강력하지도 않습니다. 따라서 JSP 페이지를 디자인하는 것은 매우 복잡하고 성가신 일이 됩니다. 그러나 Java SE 5 출시와 동시에 Sun은 JSP 개발을 단순화하기 위해 새로운 JavaServer Faces(줄여서 JSF) 사양을 출시했습니다. 이는 JSP를 밝은 길로 인도합니다.
1. JSF란 무엇입니까?
JSF와 JSP는 새로운 쌍입니다. JSP는 백그라운드 로직 처리에 사용되는 기술인 반면, JSF는 그 반대입니다. 개발자가 Java 기반 웹 애플리케이션을 빠르게 개발할 수 있도록 하는 기술입니다. 현재 JSF1.2가 Java EE 5에 공식적으로 표준으로 추가되었습니다.
고도로 구성요소화된 기술로서 개발자는 일부 개발 도구의 지원을 통해 드래그 앤 드롭 편집 작업을 구현할 수 있습니다. 사용자는 JSF 구성 요소를 페이지로 드래그하기만 하면 쉽게 웹 개발을 수행할 수 있습니다. 이것이 컴포넌트화 기술의 가장 큰 장점입니다. 우리가 사용할 수 있는 컴포넌트는 상대적으로 단순한 입력 상자뿐만 아니라 Tree 컴포넌트와 같은 테이블 컴포넌트와 같은 더 복잡한 컴포넌트이기도 합니다.
표준 기술로서 JSF는 상당수의 도구 제공업체에서도 지원됩니다. 동시에 우리는 좋은 무료 개발 도구도 많이 갖게 될 것입니다. 얼마 전 JSF를 지원하는 무료 개발 도구로 Sun Java Studio Creator 2와 Oracle JDeveloper 10g가 출시되어 JSF에 많은 활력을 불어넣었습니다. 또한 BEA Workshop(이전의 M7 NitroX), Exadel 및 MyEclipse와 같은 Eclipse 기반 플러그인 개발 도구는 현재 IBM의 대다수 사용자에게 큰 편의를 제공합니다. Rational Application Developer와 Borland의 JBuilder도 JSF 시각적 개발을 지원하는 매우 훌륭한 상용 개발 도구입니다.
JSF는 기존 웹 기술과 근본적으로 다릅니다. 기존 웹 기술에서는 사용자가 브라우저 요청을 캡처하고, 클라이언트 상태를 저장하고, 페이지 리디렉션 등을 수동으로 제어해야 합니다. JSF의 출현은 의심할 여지 없이 우리에게 큰 편리함을 가져다주었습니다. JSF는 애플리케이션 개발자가 애플리케이션의 페이지 흐름을 설계할 수 있도록 하는 이벤트 중심 페이지 탐색 모델을 제공합니다. Struts 접근 방식과 유사하게 모든 페이지 흐름 정보는 애플리케이션에 하드 코딩되지 않고 JSF 구성 XML 파일(faces-config.xml)에 정의됩니다. 이는 개발자의 개발 어려움을 크게 단순화하고 애플리케이션 개발을 단순화합니다.
동시에 JSF는 MVC(Model-View-Controller) 패턴을 따르는 프레임워크이기도 합니다. 뷰 코드(View)와 애플리케이션 로직(모델)을 완전히 분리하여 JSF 기술을 사용하는 애플리케이션이 페이지와 코드를 효과적으로 분리할 수 있도록 합니다. JSF 페이지에 대한 모든 요청은 프런트 엔드 컨트롤러(FacesServlet)를 통해 처리됩니다. 시스템은 자동으로 사용자의 요청을 처리하고 결과를 사용자에게 반환합니다. 이는 기존 MVC 프레임워크와 크게 다르지 않습니다.
JSF는 POJO 기술뿐만 아니라 Spring과 같은 IoC(Inversion of Control)(또는 종속성 주입-DI) 기술도 사용합니다. JSF의 Backing Bean에서는 뷰에 필요한 데이터와 작업을 Backing Bean에 넣을 수 있습니다. . 동시에 JSF에서 사용하는 DI 기술 덕분에 구성 파일에서 Managed Bean을 초기화하는 동시에 유사한 기술을 사용하는 Spring과 쉽게 통합할 수도 있습니다.
2. JSP에서 JSF를 활용하는 방법
JSF는 JSP와 결합해야만 그 효과를 충분히 발휘할 수 있다. JSF는 태그 라이브러리와 JSP를 통해 통합됩니다. 태그 라이브러리는 ASP.NET의 서버측 구성 요소와 동일합니다. JSF는 HTML, WML, XML, JavaScript 등 다양한 클라이언트 모델을 생성할 수 있는 매우 풍부한 태그 라이브러리를 제공합니다. 이러한 태그를 통해 대규모 클라이언트 모델을 쉽게 구축하고 이러한 태그를 통해 클라이언트 요청을 자동으로 처리할 수 있습니다.
다음으로 JSF와 JSP를 함께 작동시키는 방법에 대한 예를 살펴보겠습니다. JSF에는 두 개의 라이브러리가 있습니다. 첫 번째는 커널 라이브러리라고 하는데, 여기에는 구성 요소 구성, 이벤트 관리, 입력 정보 유효성 검사 등과 같은 다양한 주요 태그가 포함되어 있습니다. 두 번째 라이브러리의 주요 기능은 HTML, JSF의 다양한 태그에 대응하는 것이다. 각 JSF 태그는 HTML 구성 요소에 해당합니다. 예를 들어 UIInput 태그는 HTML의 텍스트 상자 또는 비밀번호 상자에 해당합니다.
JSF 태그의 텍스트 입력 상자는 inputText라고 하며, 비밀번호 입력 라이브러리는 inputSecret이라고 합니다. 다음은 JSF와 JSP를 결합한 간단한 사용자 인터페이스 프로그램이다.
<%@ taglib uri=" http://java.sun.com/jsf/html " prefix="h" %>
<%@ taglib uri=" http://java.sun.com/jsf/core " 접두사 ="f" %>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312">
<title>첫 번째 JSF 프로그램
<//title> </head >
<body>
<f:view>
<h:form id="simpleForm">
<h:outputText id="favoriteLabel" value="숫자를 입력하세요:"/>
<h:inputText id="favoriteValue" value= " #{simple.longValue}">
<f:validateLongrange maximum="30" maximum="0"/>
</h:inputText>
<p/>
<h:commandButton id="submit" value="Submit" action = "#{simple.simpleActionMethod}"/>
</h:form>
</f:view>
</body>
<//html>
위의 코드를 보면 JSF와 JSP가 어떻게 통합되는지 이해할 수 있습니다. 먼저 커널 레이블인 view를 볼 수 있습니다. 그런 다음 여러 JSF 구성 요소가 있습니다. form,outputText,inputText,commandButton 등이 있습니다. 이러한 구성 요소는 양식에 배치되어 양식의 일부가 됩니다. 프로그램 시작 시 가져오기를 사용하여 두 개의 태그 라이브러리를 가져와야 합니다. 코드는 다음과 같습니다.
<%@ taglib uri=" http://java.sun.com/jsf/html " prefix="h" %>
<%@ taglib uri=" http://java.sun.com/jsf/core " 접두사 ="f" %>
위의 두 줄의 코드는 JSP에서 사용할 JSF 태그 라이브러리를 선언합니다. 커널 라이브러리는 접두사 f로 선언되고, HTML 라이브러리는 접두사 h로 선언됩니다. 이 두 접두사는 필수는 아니지만 단지 제안일 뿐입니다. 프로그램에서는 뷰가 모든 JSF 페이지에서 사용되어야 하므로 커널 라이브러리를 사용해야 합니다. HTML 태그는 런타임 시 JSF 태그를 HTML 구성 요소로 변환합니다. 이 h 접두사는 필요하지 않지만 JSF 사양에서는 이러한 방식으로 JSF 프로그램을 더 읽기 쉽게 만듭니다.
선언 뒤에는 여러 줄의 표준 HTML 문이 있는데, 이 문서에서는 이에 대해 자세히 설명하지 않습니다. <f:view>부터 시작하면 JSF 문입니다. 이 코드는 다음과 같습니다:
<f:view>
<h:form id="simpleForm">
<h:outputText id="favoriteLabel" value="숫자를 입력하세요:"/>
<h:inputText id="favoriteValue " value="#{simple.longValue}">
<f:validateLongrange maximum="30" maximum="0"/>
</h:inputText>
<p/>
<h:commandButton id="submit" value=" 제출 "
action="#{simple.simpleActionMethod}"/>
</h:form>
</f:view>
</f:view> 태그는 JSF의 시작을 알리고, 다음 태그 양식은 HTML 양식을 생성합니다. outputText 태그는 HTML의 label 구성 요소와 동일합니다. inputText 태그는 HTML의 textField 구성 요소와 동일합니다. commandButton 태그는 HTML의 제출 버튼과 동일합니다. 이 JSP 프로그램을 실행하면 그림 1과 같은 효과를 얻을 수 있습니다.
3. JSP는 JSF 요청에 어떻게 응답합니까?
위의 예를 통해 JSP에서 JSF를 사용하는 방법을 이미 알고 있습니다. 이번 부분에서는 JSF에서 요청이 어떻게 처리되는지 살펴보겠습니다.
먼저 화씨를 섭씨로 변환하는 예를 살펴보겠습니다. 사용자가 제출 버튼을 클릭하면 프로그램이 전환됩니다.
<%@ taglib uri=" http://java.sun.com/jsf/html " prefix="h" %>
<%@ taglib uri=" http://java.sun.com/jsf/core " 접두사 ="f" %>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312">
<title>온도 변환 프로그램</title>
</head>
< body>
<f:view>
<h:form>
<div>
<h:outputText id="fahrenheitLabel" value="화씨 온도를 입력하세요:"/>
<span>
<h:inputText id="온도" value= " #{tc.fahrenheitTemp}">
<f:validateDoublerange maximum="-100.0" maximum="100.0"/>
<f:valuechangeListener type="tempconv.page.TCChangedListener"/>
</h:inputText>
</span >
</div>
<div>
<h:outputText id="celsiusLabel" value="섭씨 온도:"/>
<span>
<h:outputText id="celsiusValue" value="#{tc.celsiusTemp}">
< f :convertNumber maxFractionDigits="3" type="number"/>
</h:outputText>
</span>
</div>
<div>
<h:commandButton value="Convert" action="#{tc.convert} " >
</h:commandButton>
</div>
</h:form>
</f:view>
</body>
<//html>
프로그램의 처음 두 줄에서는 JSF 코어 라이브러리와 HTML 라이브러리를 가져옵니다. 이 내용은 이전에 논의되었으므로 여기서는 자세히 논의하지 않습니다.
JSF 태그가 백엔드와 상호 작용하는 방식을 살펴보겠습니다. JSP에서 JSF를 사용하기 때문에 이 JSP와 일반 JSP 사이에는 차이가 없습니다. JSP가 처음 실행될 때 JSP 컴파일러는 .JSP 파일을 Servlet으로 컴파일한 다음 이를 호출합니다. 그런 다음 서블릿은 클라이언트로부터 데이터 스트림을 받습니다. 그러나 일반 JSP 프로그램과 달리 JSF 태그는 JSF API에 의해 호출됩니다(이로 인해 논리 계층과 프리젠테이션 계층이 분리됩니다). 그 외에는 일반 JSP 태그와 다르지 않습니다.
UIComponent 태그가 doStartTag 메소드를 수신하면 JSF는 이러한 속성을 사용하여 태그 값을 설정합니다. 예를 들어, 이 예의 inputText 태그는 해당 속성 값에 따라 설정됩니다. 아래는 JSF의 코드 조각입니다.
<h:inputText id="온도" value="#{tc.fahrenheitTemp}">
<f:validateDoublerange maximum="-100.0" maximum="100.0"/>
<f:valuechangeListener type="tempconv.page.TCChangedListener" />
</h:inputText>
inputText 태그는 해당 값에 따라 id 및 value 속성을 설정합니다. JSF에서는 각 속성값을 setAttribute(String name, Object value)를 통해 설정합니다. 그러나 우리가 주목해야 할 것은 JSF 태그가 해당 기본값을 지정할 수 있다는 것입니다. 이는 Java의 시스템 속성과 다소 유사합니다. 속성 이름을 지정하면 시스템에서 해당 속성의 값을 반환합니다. 속성이 존재하지 않으면 기본값이 반환됩니다.
다음으로 위 프로그램에서 가장 중요한 부분인 UIInput 컴포넌트의 이벤트 처리를 살펴보겠습니다.
<f:valuechangeListener type="tempconv.page.TCChangedListener"/>
JSF에서는 valuechangeListener 태그에 의해 이벤트 처리가 완료됩니다. 이 레이블이 나타내는 이벤트는 텍스트 상자의 값이 변경될 때 이벤트를 트리거합니다. 하지만 흥미로운 점은 이 이벤트가 즉시 제출되지 않는다는 것입니다. 대신 사용자가 "제출" 버튼을 클릭할 때까지 이벤트와 해당 데이터가 백엔드에 제출되지 않습니다. 따라서 이 이벤트 요청을 사전 커밋이라고도 합니다. 마지막으로 UICommand의 코드 구현을 살펴보겠습니다.
<div>
<h:commandButton value="Conversion" action="#{tc.convert}">
</h:commandButton>
</div>
위 코드는 Convert() 메서드와 UICommand를 연결하는 코드, 즉, "제출" 버튼을 클릭하면 변환() 메소드가 실행됩니다. 뷰 태그를 만난 후 JSF 프로그램 결과가 나오고 JSFAPI는 마침내 doEnd 메서드를 호출하여 JSF 프로그램을 종료합니다. 이 프로그램을 구문 분석한 후 JSF 엔진은 해당 JSF 태그를 HTML 구성 요소로 변환합니다.
마지막으로 JSP가 JSF 이벤트에 어떻게 응답하는지 살펴보겠습니다. 다음은 JSF 이벤트에 응답하는 Java 코드입니다.
public class TCChangedListener Implements ValueChangeListener
{
publicTCChangedListener
()
{
super();
}
// 이벤트 처리
public void processValueChange(ValueChangeEvent event)
throws AbortProcessingException
{
UIComponent comp = event.getNewValue(
);
null != value)
{
float curVal = ((Number) value).floatValue();
맵 값 = comp.getAttributes()
if (curVal < 0)
{
value.put("styleClass", "red") ;
}
else
{
value.put("styleClass", "black");
}
}
}
JSF 이벤트에 응답하려면 JSF 라이브러리에서 ValueChangeListener 인터페이스를 구현해야 합니다. 위 프로그램에서 주목해야 할 점은 입력값에 따라 최종적으로 해당 색상이 설정된다는 점이다. 이 값은 JSP에 종속되지 않습니다. 물론 이를 null로 설정하고 JSP 태그가 색상을 설정하도록 할 수도 있습니다.