JSF 2.0(Javaについて™Server Faces 2.0)


一、資源
(1)JSFホームページ:
     
https://javaserverfaces.dev.java.net/
(2)ダウンロードアドレス:
     
https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList
二、新しい特性
(1)XML構成の削除
      JSF 1を使用する場合、placesアプリケーションで管理beanを宣言するXMLは次のようになります.

<managed-bean>
  <managed-bean-class>com.clarity.MapService</managed-bean-class>
  <managed-bean-name>mapService</managed-bean-name>
  <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

<managed-bean>
  <managed-bean-class>com.clarity.WeatherService</managed-bean-class>
  <managed-bean-name>weatherService</managed-bean-name>
  <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

<managed-bean>
  <managed-bean-class>com.clarity.Places</managed-bean-class>
  <managed-bean-name>places</managed-bean-name>
  <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<managed-bean>
  <managed-bean-class>com.clarity.Place</managed-bean-class>
  <managed-bean-name>place</managed-bean-name>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

      JSF 2ではXMLが消えています.クラスにコメントを使用します.

@ManagedBean(eager=true)
public class MapService {
  ...
}

@ManagedBean(eager=true)
public class WeatherService {
  ...
}

@ManagedBean()
@SessionScoped
public class Places {
  ...
}

@ManagedBean()
@RequestScoped
public class Place {
  ...
}

      約束に従って、管理beanの名前はクラス名と同じで、クラス名の最初のアルファベットは小文字に変換されます.管理beanを明示的に指定するには、ManagedBeanコメントのnameプロパティを使用します.たとえば、@ManagedBean(name="place").
      mapServiceおよびwebService管理beanに対してeagerプロパティを使用します.eagerプロパティがtrueの場合、JSFは起動時に管理beanを作成し、アプリケーションの範囲に入れます.
      @ManagedPropertyコメントを使用して、管理beanプロパティを設定することもできます.
   faces-config.xmlから管理bean宣言を削除するとXMLは大幅に減少するが、JSF 2では注釈や約束(例えばJSF 2の簡略化されたナビゲーション処理)を使用することで、ほとんどのXMLコンテンツを削除することができる.
(2)ナビゲーションの簡略化
      JSF 1では、ナビゲーションはXMLで指定されます.たとえば、login.xhtmlからplaces.xhtmlに移動するには、次の手順に従います.

<navigation-rule>
  <navigation-case>
    <from-view-id>/pages/login.xhtml</from-view-id>
    <outcome>places</outcome>
    <to-view-id>/pages/places.xhtml</to-view-id>
  </navigation-case>
</navigation-rule>

      JSF 2のナビゲーション規則を利用することができます:JSFは.xhtmlをボタン操作の最後に追加してファイルをロードします.これは、注釈やその他のコンテンツを使用する必要がなく、規則を使用するだけでナビゲーションルールの作成の必要性を完全に回避できることを意味します.

<h:commandButton id="loginButton"
  value="#{msgs.loginButtonText}"
  action="places"/>

      ボタンはplaces.xhtmlをロードしますが、このファイルとボタンがあるファイルが同じディレクトリにあることを前提とします.操作がスラッシュ(/)で開始されていない場合、JSFはこれが相対パスであると考えている.より明確にする必要がある場合は、絶対パスを指定します.

<h:commandButton id="loginButton"
  value="#{msgs.loginButtonText}"
  action="/pages/places"/>

      JSFは/pages/places.xhtmlファイルをロードします.
      デフォルトでは、JSFはあるXHTMLページから別のXHTMLページに移動しますが、faces-redirectパラメータを指定することでリダイレクトできます.

<h:commandButton id="loginButton"
  value="#{msgs.loginButtonText}"
  action="places?faces-redirect=true"/>

(3)Groovyの使用
      Javaテクノロジーの最大の利点はJava言語ではなく、Java仮想マシン(JVM)です.JVMでは、Scala、JRuby、Groovyなど、強力で斬新で革新的な言語が実行されています.これにより、コードの作成時により多くの選択肢が得られます.Groovyという名前は少しおかしいですが、Ruby、Smalltalk、Java言語が融合した機能が非常に強く、これらの言語の中で最も流行している言語です.
      Groovyを使う理由はいろいろあります.まず、Java言語よりも簡潔で機能的です.もう2つの理由は、セミコロンを使用せず、強制変換(casting)を必要としないからです.
      Groovyは、Javaコードを使用して作成されたJSFワークピース(コンポーネント、プレゼンテーション、ベリファイア、コンバータなど)に使用できます.実際、これはJSF 2にとって新鮮ではありません.GroovyソースファイルがJavaバイトコードにコンパイルされているため、javacによって生成されたようにGroovyで生成された.classファイルを使用するだけです.もちろん、Groovyが生成した.classファイルが正常に動作した後、Groovyソースコードをホットデプロイする方法を理解する必要があります.また、Eclipseユーザーの場合、答えは非常に簡単です.Groovy Eclipseプラグインをダウンロードしてインストールします.MojarraはSunのJSF実装で、バージョン1.2_から09以降はGroovyの明確なサポートが提供されている.
(4)リソースハンドラの利用
      JSF 2は、リソースを定義およびアクセスするための標準的なメカニズムを提供する.自分のリソースをresourcesというトップディレクトリの下に配置し、いくつかのJSF 2タグを使用してビューにアクセスします.
      リソースに対する唯一の要件は、resourcesディレクトリまたはresourcesディレクトリのサブディレクトリに存在する必要があります.resourcesディレクトリのサブディレクトリは任意に名前を付けることができます.
      ビューコードでは、の2つのJSF 2タグを使用してリソースにアクセスできます.これらのタグは、JSF 2用のおよびタグと組み合わせることができる.

<h:body>
    <h:outputStylesheet library="css" name="styles.css" target="body"/>
    <h:outputScript library="javascript" name="util.js" target="head"/>
    ...
</h:body>

      タグには、スクリプトまたはスタイルシート:libraryとnameの2つのプロパティが指定されています.library名はresourcesディレクトリの下のサブディレクトリに対応し、リソースを保存する場所です.たとえば、resources/css/enディレクトリにスタイルシートがある場合、libraryはcss/enになります.nameプロパティは、リソース自体の名前です.
      場合によっては、JSF式言語(EL)を使用してリソースにアクセスする必要があります.たとえば、を使用して画像にアクセスします.

<h:graphicImage value="#{resource['images:cloudy.gif']}"/>

      EL式でリソースにアクセスする構文はresource['LIBRARY:NAME']です.  LIBRARY   および  NAME   およびタグに対応するlibraryおよびnameプロパティ.次のように使用できます.

<h:graphicImage library="images" name="cloudy.gif"/>

三、HelloWorldの例
(1)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <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>/faces/*</url-pattern>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>hello.xhtml</welcome-file>
    </welcome-file-list>
  
</web-app>

     JAvax.faces.アプリケーション.ProjectStageでは、Production、Development、UnitTest、SystemTest、Extensionのオプションを提供しています.Application.getProjectStage()を呼び出して、Applicationオブジェクトをクエリーして構成された値を取得します.デフォルトはProjectStage.Productionです.
(2)ページファイル
(a)hello.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:h="http://java.sun.com/jsf/html"  
      xmlns:f="http://java.sun.com/jsf/core"  
      xmlns:ui="http://java.sun.com/jsf/facelets">  
	 <f:view contentType="text/html"/>
     <h:head>  
         <title>Hello  World</title> 
         <h:outputStylesheet name="css/public.css"/> 
     </h:head>  
     <body>  
        <h:form id="helloForm" >
            <h:graphicImage id="waveImg" url="#{resource['images/wave.med.gif']}" />
            <h:inputText id="name" class="oneInput" value="#{hello.name}"/>
            &nbsp;&nbsp;&nbsp;&nbsp;
            <h:commandButton id="submit" class="NormalButton" action="response" value="    "/>
        </h:form>  
     </body>  
</html>

(b)response.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"      
      xmlns:h="http://java.sun.com/jsf/html">
<f:view contentType="text/html; charset=utf-8"/>
<head>
	<title>Response</title>
	<link type="text/css" rel="stylesheet" href="#{resource['css:public.css']}"/>
</head>
<body>
    <h:form id="responseform">
    	<img src="#{resource['images:wave.med.gif']}" alt="Hello!"/>
    	<font color="green">Hi, #{hello.name}</font>
    	&nbsp;&nbsp;&nbsp;&nbsp;
    	<h:commandButton id="back" class="NormalButton" value="    " action="hello?faces-redirect=true"/>
    </h:form>
</body>
</html>

(3)Beanファイル

package com.logcd.jsfsun;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name="hello")
@SessionScoped
public class HelloWorld implements java.io.Serializable{

	private static final long serialVersionUID = 1684235501594231588L;

	private  String  name = "World";

	public String getName() {
		return name;
	}

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

     jsf-api.jarとjsf-impl.jarを導入して実行できます!