JSF2.2入門 第19回CDIとManagedBeanのApplicationScoped(アプリケーションスコープ)

19title

CDIとManagedBeanのどちらにも共通するApplicationScopedについて解説します。ApplicationScopedはWebアプリケーションが有効な期間中で有効なビーンです。一番長い寿命を持つビーンです。

このビーンはアプリケーションがスタートしてからシャットダウンするまでの間生きていて、アプリケーションに所属するJSFページ、JSP、XHTMLからアクセスして情報共有できるのです。当然、アクセスするすべてのユーザーがこのビーンで情報共有できるのです。逆に言えば、すべてのユーザーが共有しても問題がない情報に限られるわけです。よく使われるのは今オンライン状態にあるユーザー数、訪問カウンター、ゲームの最高点、ゲーム結果ベスト10プレイヤーリスト、誰にでも見られて問題ないアンケートや投票、アプリケーションに付随した共通設定などです。
katatsumuri-e1463911702620CDIのApplicationScoped

今回のビーンはアメリカ大統領選挙をイメージした簡単な投票に使ってみます。トランプとクリントンのどちらに投票するか投票用に2つのボタンとその得票数を表示します。

最初にできあがりのイメージを見せたほうがわかりやすいでしょう。

20161111-init

leaf-e1463911721194CDIビーンの書き方

アノーテーションのところがキーポイントです。CDIですからまずは必須の@Namedを付けます。次に@ApplicatioScopedを書きます。それに対応してjavax.enterprise.context.ApplicationScopedをインポートします。ManagedBeanのアプリケーションスコープで使うjavax.faces.bean.ApplicationScopedとは違いますので注意して下さい。Serializableはインプリメントしなくても結構です。プロパティとしてトランプの得票数を保持するtrump、クリントンの得票数を保持するclintonを持っています。

2つのvoidのメソッドがあって、voteTrump()はトランプの得票数を1つ増やすもの、voteClinton()はクリントンの得票数を1つ増やすものです。これはJSFページの中の投票ボタンでコールするものです。

[VoteApplicationBean.java]

package com.myjsf;

import javax.inject.Named;
import javax.enterprise.context.ApplicationScoped;

@Named(value=”voteApplicationBean”)
@ApplicationScoped
public class VoteApplicationBean{
private int trump, clinton;
public VoteApplicationBean() {
}

public int getTrump() {
return trump;
}

public void setTrump(int trump) {
this.trump = trump;
}

public int getClinton() {
return clinton;
}

public void setClinton(int clinton) {
this.clinton = clinton;
}
public void voteTrump(){
this.trump++;
}

public void voteClinton(){
this.clinton++;
}
}

leaf-e1463911721194CDIの使い方

レイアウトを整えるためにpanelGridタグを使っています。きれいに2列に整列させるためです。panelGroupタグも使っていますが、これは1つのグループにまとめて1列分として扱いたいためです。ボタンの上にカーソルがきたら色を変えるとか少々複雑なことをスタイルシートでやっていますので、コード全体は「applicationScopeSample.xhtmlの完全なコード」を参照してください。

赤の部分はCDIビーンからそれぞれの得票数を表示している部分です。青のところはそれぞれに投票するためのボタンです。押されたらビーンの票数を1つ増やすメソッドをコールするようそのメソッドをactionListenerに登録しています。

[applicationScopeSample.xhtml]

<h:body>
<center>
<h:form>
<h:panelGrid columns=”2″ columnClasses=”center,center”>
<f:facet name=”caption”>
<h:outputText value=”Presidental Election” styleClass=”center”/>
</f:facet>
<h:panelGroup>
<div class=”t”>TRUMP</div><h:outputText value=”#{voteApplicationBean.trump}”/>
</h:panelGroup>
<h:panelGroup>
<div class=”c”>CLINTON</div><h:outputText value=”#{voteApplicationBean.clinton}”/>
</h:panelGroup>
<h:commandButton value=”Vote Trump” actionListener=”#{voteApplicationBean.voteTrump()}” styleClass=”button”/>
<h:commandButton value=”Vote Clinton” actionListener=”#{voteApplicationBean.voteClinton()}” styleClass=”button”/>
</h:panelGrid>
</h:form>
</center>
</h:body>

leaf-e1463911721194実行してみる

最初にお見せした画面が表示されますので、下のボタンを押すと票数が増えていきます。例えばとトランプの3票、クリントンに1票が投票されたとすると次のようになります。もちろん1人1票とか細かいことは考えていません。実際は必要でしょうけれど。

20161111-votetrump

また、このURLをブラウザーの別のウィンドウでアクセスした場合でも、同じ状態が表示されます。SessionScopedなどではできないことです。このように同じアプリケーションを実行している人なら誰でも同じ情報が共有できるのです。

20161111-others1

katatsumuri-e1463911702620ManagedBeanでのApplicationScoped

同じことをManagedBeanでやってみます。

leaf-e1463911721194ManagedBeanの書き方

まず@ManagedBeanアノーテーションを書きます。次にCDIと同じ@ApplicationScopedを書きますが、これはjavax.faces.bean.ApplicationScopedに定義されているものを意味します。ですのでこれをインポートします。CDIとはパッケージが違います。その他は同じです。

[VoteApplicationBeanMB.java]

package com.myjsf;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean
@ApplicationScoped
public class VoteApplicationBeanMB{
private int trump, clinton;
public VoteApplicationBeanMB() {
}

public int getTrump() {
return trump;
}

public void setTrump(int trump) {
this.trump = trump;
}

public int getClinton() {
return clinton;
}

public void setClinton(int clinton) {
this.clinton = clinton;
}
public void voteTrump(){
this.trump++;
}

public void voteClinton(){
this.clinton++;
}
}

leaf-e1463911721194ManagedBeanの使い方

これはCDIと同様です。一応次に書いておきます。実行結果は同じですから省略します。

[applicationScopeSampleMB.xhtml]

<h:body>
<h:form>
<h:panelGrid columns=”2″ columnClasses=”center,center”>
<f:facet name=”caption”>
<h:outputText value=”Presidental Election” styleClass=”center”/>
</f:facet>
<h:panelGroup>
<div class=”t”>TRUMP</div><h:outputText value=”#{voteApplicationBeanMB.trump}”/>
</h:panelGroup>
<h:panelGroup>
<div class=”c”>CLINTON</div><h:outputText value=”#{voteApplicationBeanMB.clinton}”/>
</h:panelGroup>
<h:commandButton value=”Vote Trump” actionListener=”#{voteApplicationBeanMB.voteTrump()}” styleClass=”button”/>
<h:commandButton value=”Vote Clinton” actionListener=”#{voteApplicationBeanMB.voteClinton()}” styleClass=”button”/>
</h:panelGrid>
</h:form>
</h:body>

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内

JSF2.2入門 第18回CDIとManagedBeanのViewScoped(ビュースコープ)


18title

ViewScopedはCDIとManagedBeanのどちらにも共通するものです。ViewScopedは同じViewの中でのみ有効なビーンです。ブラウザーのウィンドウやタブが違うと情報は共有できません。

katatsumuri-e1463911702620CDIのViewScoped

leaf-e1463911721194CDIビーンの書き方

第16、17回RequestScopedやSessionScopedのところで作ったものと同じ趣味を保持するビーンをViewScopedで作ります。

アノーテーションのところがキーポイントです。@NamedはRequestScopedやSessionScopedと同じです。次に@ViewScopedを書きます。それに対応してjavax.faces.view.ViewScopedをインポートします。もともとViewScopedはCDIでは定義されておらずjavax.enterprise.contextパッケージにはありません。JSFがその代わりに作ったものなのです。CDIのSessionScopedと同じく完全修飾子でアノーテーションを書く必要はありません。セッション期間中にビーンは生きていなければいけないのでSessionScopedと同様にSerializableをインプリメントしなければなりません。

[HobbyViewBean.java]

package com.myjsf;
import javax.inject.Named;
import java.io.Serializable;
import javax.faces.view.ViewScoped;

@Named(value=”hobbyViewBean”)
@ViewScoped
public class HobbyViewBean implements Serializable{
private String hobby;
public HobbyViewBean() {
}

public String getHobby() {
return hobby;
}

public void setHobby(String hobby) {
this.hobby = hobby;
}

}

leaf-e1463911721194CDIの使い方

RequestScopedやSessionScopedの時と同じJSFページを用意します。これで動作を確認してみます。

[viewScopeSample.xhtml]

<?xml version=’1.0′ encoding=’UTF-8′ ?>
<!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:h=”http://xmlns.jcp.org/jsf/html”>
<h:head>
<title>ViewScope sample</title>
</h:head>
<h:body>
<h2>ViewScopeの例</h2>
<h:form>
あなたの趣味は何ですか:<h:inputText value=”#{hobbyViewBean.hobby}”/><p/>
<h:commandButton value=”このページで表示” /><p/>
<h:commandButton value=”Forwardして表示” action=”viewScopeCheckNextPage.xhtml”/><p/>
<h:commandButton value=”Redirectして表示” action=”viewScopeCheckNextPage.xhtml?faces-redirect=true;”/>
</h:form>
<br/>
あなたが入力した趣味:
<h:outputText value=”#{hobbyViewBean.hobby}”/>
</h:body>
</html>

commandButtonが3つあります。注意して見てほしいのですが、1番目のボタンにはactionプロパティがありませんね。これはつまり同じViewのままでサーバーと通信を行っているわけです。ViewScopedビーンが有効な範囲内という典型の例です。

2番目のボタンはactionプロパティがあって、クリックされるとviewScopeCheckNextPage.xhtmlにForwardされます。そうすると同じViewではなくなりますからViewScopedビーンは無効になって何も情報を参照できません。

3番目のボタンにもactionプロパティがあって、しかもリダイレクトが有効になっています。これも同じViewではありませんからこのビーンは無効になってしまいます。

では順に確認してみましょう。

<入力画面> 何か入力しましょう。

20161108-input

<同じViewつまり同じページ> ちゃんとビーンの内容が表示されます。

20161108-sameview

<Forwardした場合> ビーンの内容は表示されません。

20161108-forward

<Redirectした場合> これもビーンの内容は表示されません。

20161108-redirect

katatsumuri-e1463911702620ManagedBeanのViewScoped

leaf-e1463911721194ManagedBeanの書き方

@ManagedBeanをつけている点はいつものお約束ですが、CDIと一番違うところは同じ「@ViewScoped」でも定義されいるパッケージが違います。javax.faces.bean.ViewScopedを使いますので、間違えないようにしましょう。実行結果はさきほどのCDIとまったく同じなので省略します。

[HobbyViewBeanMB .java]

package com.myjsf;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class HobbyViewBeanMB implements Serializable{
private String hobby;
public HobbyViewBeanMB() {
}

public String getHobby() {
return hobby;
}

public void setHobby(String hobby) {
this.hobby = hobby;
}

}

katatsumuri-e1463911702620どんなときにViewScopedはいいのか

このスコープはAjaxを使って同じページにとどまったままでページ遷移を伴わず、コンテンツをスムーズに操作するアプリケーションに向きます。なおビーンの中で@PostConstructアノーテーションを指定したメソッドはビーンがインスタンス化されるときに1回だけコールされ後は呼ばれません。そこで初期化されたものを同じView内で使い回します。

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内

JSF2.2入門 第17回CDIとManagedBeanのSessionScoped(セッションスコープ)

17title

CDIとManagedBeanのどちらにも共通するSessionScopedについて解説します。SessionScopedはセッションが有効な期間内に限り有効なビーンです。

katatsumuri-e1463911702620CDIのSessionScoped

leaf-e1463911721194CDIのJavaBeansの書き方

第16回RequestScopedのところで作ったものと同じ趣味を保持するビーンをSessionScopedで作ります。アノーテーションのところがキーポイントです。@NamedはRequestScopedと同じですね。次に@SessionScopedを書きます。それに対応してjavax.enterprise.context.SessionScopedをインポートします。前回RequestScopedのところでは完全修飾子で書いて、その代わりインポート無しとしたわけですが、SessionScopedの場合には、後で説明するようにManagedBeanと同じく@SessionScopedだけで問題なく動きます。やはりCDIにおける@RequestScopedの挙動がちょっとおかしいと思います。執筆時点では。

セッション期間中にビーンは生きていなければいけないので持続可能なように、つまりシリアライズにして保存可能にしなければならないのでSerializableをインプリメントしなければなりません。

[HobbySessionBean.java]

package com.myjsf;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;

@Named(value=”hobbySessionBean”)
@SessionScoped
public class HobbySessionBean implements Serializable{
private String hobby;
public HobbySessionBean() {
}

public String getHobby() {
return hobby;
}

public void setHobby(String hobby) {
this.hobby = hobby;
}

}

leaf-e1463911721194CDIの使い方

前回16回のRequestScopedの時と使い方は同じです。

次のようにJSFページを作ります。趣味を尋ねるh:inputTextタグを1つと様々な動作をチェックするためのh:commandButtonタグを3つ、hobbyプロパティを表示するためのh:outputTextタグが1つあります。

[sessionScopeSample.xhtml]

<?xml version=’1.0′ encoding=’UTF-8′ ?>
<!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:h=”http://xmlns.jcp.org/jsf/html”>
<h:head>
<title>SessionScope sample</title>
</h:head>
<h:body>
<h2>SessionScopeの例</h2>
<h:form>
あなたの趣味は何ですか:<h:inputText value=”#{hobbySessionBean.hobby}”/><p/>
<h:commandButton value=”このページで表示” /><p/>
<h:commandButton value=”Forwardして表示” action=”sessionScopeCheckNextPage.xhtml”/><p/>
<h:commandButton value=”Redirectして表示” action=”sessionScopeCheckNextPage.xhtml?faces-redirect=true;”/>
</h:form>
<br/>
あなたが入力した趣味:
<h:outputText value=”#{hobbySessionBean.hobby}”/>
</h:body>
</html>

leaf-e1463911721194実行してみる

まず実行すると次のような画面になりますので、何か入力してみましょう。そして「このページで表示」のボタンを押すとh:outputTextのところにちゃんと表示されます。アドレス欄のところをちょっと見ていただくとわかりますがjsessionid=…….とセッションIDが付与されていますが、これをコピーしてブラウザーの別ウィンドウでペーストしてアクセスするとビーンはそのまま参照できてしまいます。このセッションが有効である限りビーンは生きていて、このセッションIDに結び付けられています。

20161105-2

次のボタン「Forwardして表示」を押しても問題なくビーンは生きていて表示できます。

20161105-3

「さらに次のページへ」ボタンを押して別ページに行っても次のように問題なくビーンは生きています。

20161105-4

入力画面で「Redirectして表示」をやってみても問題なくビーンの内容を表示できます。Redirect先はForward先と同じページを使っています。

20161105-5

セッションのデフォルトの有効期間はアプリケーションのweb.xmlに次のような形で書かれており、この場合30分となっています。

<session-config>
<session-timeout>
30
</session-timeout>
</session-config>

またサーブレットなどプログラム上で次のようにするとセッションを終了することができます。よくあるケースはログアウトしたときにセッション終了するような場合ですね。

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) externalContext.getSession(false);
session.invalidate();

または短縮して次のように記述してもいいでしょう。

FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

katatsumuri-e1463911702620ManagedBeanのSessionScoped

今度はManagedBeanの場合について解説します。ビーンのアノーテーションなど定義のしかたが違うだけで使い方はCDIと全く同じです。使い方の説明は省略します。

leaf-e1463911721194ManagedBeanのSessionScopedの書き方

CDIの場合と違う点は赤い文字のところです。@SessionScopedは同じなんですが、それが定義されているパッケージが違って javax.faces.bean.SessionScopedです。それをインポートします。

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class HobbySessionBeanMB implements Serializable{
private String hobby;
public HobbySessionBeanMB() {
}

public String getHobby() {
return hobby;
}

public void setHobby(String hobby) {
this.hobby = hobby;
}
}

動作確認を1つだけ掲載しておきます。

20161105mb-1

 

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内

JSF2.2入門 第16回CDIとManagedBeanのRequestScoped(リクエストスコープ)


16title

CDIとManagedBeanの両方に共通するRequestScopedについて説明します。私の環境はNetBeansIDE8.1, JavaEE7, JSF2.2, GlassFish4.1.1, jdk1.8.0, jre1.8.0, 2016.10.5時点での情報です。NetBeansで新規プロジェクトを作成するときにフレームワークとしてJSF2.2(サーバー・ライブラリ)を指定しています。これが違うと挙動が異なる可能性がありますのでご注意ください。

katatsumuri-e1463911702620CDIのRequestScoped

leaf-e1463911721194CDIのJavaBeansの書き方

次のHobbyRequestBeanはユーザーに趣味を聞いてそれを格納するための単純なJavaBeansです。プロパティはたったひとつhobby(趣味)です。Namedアノーテーションはビーンを参照するためのもので、valueプロパティは指定した場合にはその値で参照することができます。省略した場合にはクラス名の先頭の文字を小文字にしたもので参照できます。これはルールです。

肝心のRequestScopeですが、次のように@javax.enterprise.context.RequestScopedと完全修飾子で指定します。その代わりjavax.enterprise.context.RequestScopedをインポート指定する必要はありません。これを単純に@RequestScopedとしてしまうとエラーになることがあります(上記の私の環境では必ずエラーになります)。

package com.myjsf;
import javax.inject.Named;
@Named(value=”hobbyRequestBean”)
@javax.enterprise.context.RequestScoped
public class HobbyRequestBean {
private String hobby;
public HobbyRequestBean() {
}

public String getHobby() {
return hobby;
}

public void setHobby(String hobby) {
this.hobby = hobby;
}
}

完全修飾子ではなく単純に@RequestScopedを使いたい場合には次のようにjavax.enterprise.context.RequestScopedをインポートして@RequestScopedを指定すればOKなはずですが、実際にはこれがうまくいかない場合があります。

たぶん、ManagedBeanでも@RequestScopedは同じアノーテーション名で使われますので、それとの区別がうまくいかないのだと思います。NetBeans, GlassFishのある種のバグではないかと思います。ManagedBeanのRequestScopedはjavax.faces.bean.RequestScopedで定義されていますのでパッケージが全く違うのです。

[CDIでうまくいかない例]
package com.myjsf;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named(value=”incorrectHobbyRequestBean”)
@RequestScoped
public class IncorrectHobbyRequestBean {....

のエラーは次のとおりで、「リクエストスコープのJavaBeansを使うためのコンテキストがアクティブになっていない」というエラーです。WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped

20161104-1

leaf-e1463911721194CDIのJavaBeansの使い方

使い方について説明します。使い方はCDIでもManagedBeansでも同じです。このJSFページは趣味を入力してもらい、コマンドボタンを押すと入力値を表示するものです。ちょっと変わっているのはコマンドボタンが3つあることです。1つ目のボタンを押すと同じページ内で結果が表示されるものです。2つ目のボタンはscopeCheckNextPage.xhtmlという別のページにforwardして表示する例です。3つ目は同じscopeCheckNextPage.xhtmlで表示するものの、redirectを使って転送するものです。

[入力画面requestScopeSample.xhtml]

<?xml version=’1.0′ encoding=’UTF-8′ ?>
<!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:h=”http://xmlns.jcp.org/jsf/html”>
<h:head>
<title>RequestScope sample</title>
</h:head>
<h:body>
<h2>RequestScopeの例</h2>
<h:form>
あなたの趣味は何ですか:<h:inputText value=”#{hobbyRequestBean.hobby}”/><p/>
<h:commandButton value=”このページで表示” /><p/>
<h:commandButton value=”Forwardして表示” action=”scopeCheckNextPage.xhtml”/><p/>
<h:commandButton value=”Redirectして表示” action=”scopeCheckNextPage.xhtml?faces-redirect=true;“/>
</h:form>
<br/>
あなたが入力した趣味:
<h:outputText value=”#{hobbyRequestBean.hobby}”/>
</h:body>
</html>

leaf-e1463911721194実行してみる

まず入力画面に「旅行」と入れる。

20161104-2

これら3つのボタンを押した結果は次のようになります。

[同じページで表示]・・・OK。 JavaBeansの情報が保持され読み出すことができる。

20161104-3

[Forwardで表示]・・・OK。これもJavaBeansが有効に機能している。

20161104-4

[Redirectで表示]・・・NG。JavaBeansが無効でhobbyプロパティが見つからない、つまりJavaBeansがスコープ外になっている。

20161104-5

leaf-e1463911721194有効範囲のまとめ

まとめると、CDIでRequestScopedにした場合、JavaBeansの有効無効は次のようになります。Forwardで別のページに転送された場合でも、転送元と転送先は1つのHTTPリクエスト・レスポンスの範囲内とみなされているからです。それに対してRedirectは2回のリクエストとみなされます。これはManagedBeanでRequestScopedにした場合でも同じです。

同じページで表示
Forwardで表示
Redirectで表示 ×

katatsumuri-e1463911702620ManagedBeanのRequestScoped

leaf-e1463911721194ManagedBeanでのRequestScopeの指定のしかた

さきほどと全く同じ機能のJavaBeansをManagedBeanで作ります。CDIと違うところは赤文字のところです。インポートするパッケージが違います。また@RequestScopedは完全修飾子で指定しなくても、ごく普通に書けば問題なく動きます。クラス名はさきほどと変えています。

package com.myjsf;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class HobbyRequestManagedBean {
private String hobby;
public HobbyRequestManagedBean() {
}

public String getHobby() {
return hobby;
}

public void setHobby(String hobby) {
this.hobby = hobby;
}
}

leaf-e1463911721194ManagedBeanの使い方

JSFページにおける使い方はさきほどのCDIとまったく同じです。

[requestScopeSampleMB.xhtml]

<?xml version=’1.0′ encoding=’UTF-8′ ?>
<!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:h=”http://xmlns.jcp.org/jsf/html”>
<h:head>
<title>RequestScope sample</title>
</h:head>
<h:body>
<h2>RequestScopeの例</h2>
<h:form>
あなたの趣味は何ですか:<h:inputText value=”#{hobbyRequestManagedBean.hobby}”/><p/>
<h:commandButton value=”このページで表示” /><p/>
<h:commandButton value=”Forwardして表示” action=”scopeCheckNextPageMG.xhtml”/><p/>
<h:commandButton value=”Redirectして表示” action=”scopeCheckNextPageMG.xhtml?faces-redirect=true;”/>
</h:form>
<br/>
あなたが入力した趣味:
<h:outputText value=”#{hobbyRequestManagedBean.hobby}”/>
</h:body>
</html>

leaf-e1463911721194実行結果

結果はCDIの場合と同じで、同一ページ内での表示はOK、ForwardはOK、RedirectはNGです。

[同一ページでの表示結果]・・・OK

20161104-7

[Forwardで表示]・・・OK

20161104-8

[Redirectで表示]・・・NG

20161104-9

以上です。

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内

JSF2.2入門 第15回JavaBeansのスコープ一覧


kanban15

JavaBeansを使うときにどのスコープに設定すべきか迷うことがありませんか?Requestスコープか、Sessionスコープか。とにかく何でもSessionにしてしまう人も多いのではないでしょうか。ここではスコープの使い分けについて解説します。

katatsumuri-e1463911702620ManagedBeanとCDIの違い

その前にJabaBeansにはManagedBeanとCDIビーンズについて整理しておきます。それらによってスコープも違うからです。

 leaf-e1463911721194それぞれの定義

  • ManagedBeanとは: JSFで規定されたもので一般のJavaBeansをJSFが管理するもの。アノーテーション@ManagedBeanで識別します。@ManagedBeanとそのスコープはjavax.faces.beanパッケージに定義されています。
  • CDI(Contexts and Dependency Injection)とは: Java EE6から追加された仕様で通常のJavaBeansをDI、つまり依存性注入で管理するというものJava EEの中ではEJB(Enterprise JavaBeans)に追加されたBeansです。アノーテーション@Nanedで識別します。@Nanedやそのスコープはjavax.injectとjavax.enterprise.contextに定義されています。

JavaEE7からはCDIがデフォルトになっており、そのためNetBeansIDE8.xでは「ManagedBeanは次のJSFバージョンで無くなる予定だ」というメッセージが出ます。しかし今はJSF2.2ではどちらも問題なく使えます。全体的な流れはCDIにあるようで、今後はそれを使った方が良いというのが大多数です。注意すべきは、それらに定義の仕方やスコープに少し違いがあることです。

@ManagedBean(name=”custom”)
@RequestScoped
public class MyBean {……
}
@Named(value=”custom”)
@RequestScoped
public class MyBean {……
}

leaf-e1463911721194それぞれのスコープ

CDIのほうが種類が多くなっています。共通するものも多いです。

 

ManagedBean CDI 意味
RequestScoped RequestScoped  HTTPリクエストとレスポンスの中で有効
ViewScoped ViewScoped(javax.faces.view)  ブラウザーのウィンドウ/タブの同一JSFビューの中で有効
SessionScoped SessionScoped  複数回のHTTPリクエストとレスポンスの中で有効。
ApplicationScoped ApplicationScoped  Webアプリケーションが生きている間は有効
ConversationScoped  開発者がスコープを独自に設定できるもの。SessionScopeを自由に延長するようなもの。
FlowScoped(javax.faces.flow)  開発者が複数のページにわたりビーンの有効範囲を設定できる。
Dependent  CDIではデフォルトのスコープ
CustomScoped  開発者がスコープを独自に設定できるもの
NoneScoped  他のBeansにサービスするための補助的な用途に使用される

次回から詳しく解説します。

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内

JSF2.2入門書


JSFtitle

katatsumuriJSF2.2入門書とは

私はこれまで秀和システム等の出版社から合計20冊以上の本を書いてきましたが、最近の電子出版技術の発展により自分自身で最新情報を随時出版して行こうと思い、これを第一弾として出版します。

PrimeFacesについても出版しました。こちらの記事もどうぞ。

katatsumuri概要

本書はamazonのkindle版での提供です。紙の本ではありません。440ページあまりのボリュームで、最新のJava Server Faces 2.2に準拠した内容で書かれています。JSF2.2のタグを一通りカバーしていて、JSFの入門者からベテランまで参考にしていただける内容になっています。

これは中身の一部です。

20160605jsfbook

いっしょに本書のサンプルプログラムもNetBeansのプロジェクトzipファイルで無料提供します。ご自分で動かして確かめることができます。

本書で使っている開発環境は、以下のとおりです。この環境でサンプルプログラムが動作することを確認しています。

【動作確認環境】
・OS: Windows8.1 Pro
・JSF: NetBeans8.0.2組み込みのMojarra 2.2(JSF2.2対応)
・JDK: JDK1.8.0_45 64ビットバージョン
・サーブレットコンテナ: GlassFish4.1
・ブラウザー: Google Chromeバージョン 43

leafサンプル

こちらから目次と本文の一部のPDFをダウンロードできます。(1.3MB)

leafご購入

amazon kindle版です。こちらからどうぞ。

KindleUnlimited会員の方なら無料で読めます。

leaf目次

目次はつぎのとおりで、基本的なことからカスタムコンポーネントの作成まで幅広くカバーしています。

内容 page
1.JavaServer Facesとは何か 9
1-1JavaServer Facesの概要 10
1-2JavaServer Facesの役割、メリット 13
1-3JSF開発の背景と実装製品 14
2.JSFの開発・実行環境 16
2-1JDKのインストール 17
2-2NetBeans IDEのインストール 22
2-3NetBeans IDEの動作確認 30
3.はじめてのJSFアプリケーション 37
3-1基本的な開発ステップ 38
3-1-1開発のステップ 39
3-2マネージドビーンの利用と簡単な計算 40
3-2-1仕組み 41
3-2-2マネージドビーン作成 42
3-2-3ページ作成 48
3-2-4実行 52
3-3入力値のチェック 54
3-3-1仕組み 55
3-3-2ページにバリデーションタグを追加 56
3-4ページの移動 62
3-4-1仕組み 63
3-4-2マネージドビーン作成 66
3-4-3ページ作成 68
3-4-4実行 71
3-5表示フォーマットの指定 72
3-5-1仕組み 73
3-5-2マネージドビーン作成 74
3-5-3ページ作成 76
3-5-4実行 78
3-6データ変換 80
3-6-1ページ作成 81
3-6-2実行 82
3-7送信ボタンをリンクに変える 84
3-7-1ページ作成 85
3-7-2実行 86
4.JSTのタグ・リファレンス 87
4-1概要 88
4-1-1JSFタグの基本的な使い方 93
4-2form 94
4-3commandButton 96
4-3-1ボタンでデータ送信 98
4-3-2画像のボタン 100
4-3-3ボタンで単純なページナビゲーション 102
4-3-4ボタン毎に違うページに移動 104
4-3-5入力内容のチェック後に移動先を決定 109
4-3-6ボタンの国際化対応 115
4-3-7ボタンにスタイルシート適用 122
4-4commandLink 124
4-4-1コマンドボタンのようにフォームを送信 125
4-4-2文字リンク 127
4-4-3パラメータ付文字リンク 129
4-5message 136
4-6messages 140
4-7inputText/outputText 142
4-7-1日付入力 143
4-7-2時刻入力 145
4-7-3日付と時刻の入力 147
4-7-4文字・数字・金額の入力 149
4-8inputTextarea 152
4-9inputSecret 154
4-10inputHidden 156
4-11outputLabel 157
4-12outputFormat 161
4-12-1スタイルシート適用 162
4-12-2パラメーターを使った出力 164
4-13graphicImage 165
4-13-1画像表示 166
4-14selectItem 167
4-15selectItems 168
4-16selectOneRadio 169
4-16-1selectItemを使う場合 171
4-16-2selectItemsを使う場合 174
4-17selectOneMenu 177
4-17-1selectItemを使う場合 178
4-17-2selectItemsを使う場合 180
4-18selectOneListbox 181
4-18-1selectItemを使う場合 182
4-18-2selectItemsを使う場合 183
4-18-3スクロールのメニュー 184
4-19selectBooleanCheckbox 185
4-20selectManyCheckbox 187
4-20-1selectItemを使う場合 189
4-20-2selectItemsを使う場合 191
4-21selectManyMenu 192
4-21-1selectItemを使う場合 193
4-21-2selectItemsを使う場合 194
4-22selectManyListbox 195
4-22-1selectItemを使う場合 196
4-22-2selectItemsを使う場合 198
4-23panelGrid 199
4-24panelGroup/facet 201
4-25dataTable/column 203
4-26view 207
4-27actionListener 208
4-28attribute 211
4-29convertDateTime 212
4-30convertNumber 214
4-30-1通貨 215
4-30-2書式指定 216
4-31converter 217
4-32facet 218
4-33loadBundle 219
4-34param 220
4-35subview 221
4-36validateDoubleRange 223
4-37validateLength 225
4-38validateLongRange 227
4-39validator 229
4-40valueChangeListener 230
4-41verbatim 234
5.JSFページのライフサイクル 235
5-1標準的なリクエスト処理ライフサイクル 236
5-1-1ビュー復元フェーズ(Restore view phase) 238
5-1-2リクエスト値の適用フェーズ(Apply Request Values phase) 241
5-1-3バリデーション実行フェーズ(Process Validation phase) 242
5-1-4モデル値の更新フェーズ(Update Model Values phase) 243
5-1-5アプリケーション起動フェーズ(Invoke Application phase) 244
5-1-6レスポンス出力フェーズ(Render Response phase) 245
6.マネージドビーン 246
6-1マネージドビーンという仕組み 247
6-1-1マネージドビーンの登録 249
6-1-2JSFコンポーネントとマネージドビーンのバインディング 253
6-2マネージドビーンのプロパティの書き方 254
6-2-1基本 255
6-2-2UIInput/UIOutput/UISelectItem/UISelectOne用のプロパティ 257
6-2-3UIData用プロパティ 259
6-2-4UISelectBoolean用プロパティ 265
6-2-5UISelectMany用プロパティ 266
6-2-6UISelectItemsプロパティ 268
6-3データベースとの連携 270
6-3-1データベース作成とテーブル作成 271
6-3-2サンプルデータの登録 276
6-3-3データベースの検索結果をプロパティにセットする 280
6-4プロパティの初期化 286
6-4-1managed-property要素を使ったプロパティの初期化 287
6-4-2初期パラメータの参照 290
6-4-3Map型プロパティの初期化 293
6-4-4マネージドビーンのプロパティの初期化 297
6-4-5UIコンポーネント自体をビーンのプロパティにバインディング 299
7.バインディング 302
7-1プロパティへのバインディング 303
7-2暗黙オブジェクトへのバインディング 304
7-2-1初期値を読み込む initParam 305
7-2-2applicationスコープへの情報保存 applicationScope 307
7-2-3sessionスコープへの情報保存 sessionScope 310
7-2-4requestスコープへの情報保存 requestScope 311
7-2-5ヘッダー情報を取得 header 312
7-2-6リクエストのパラメータ取得 param 314
7-3ページナビゲーションのためのバインディング 316
8.イベントハンドリング 320
8-1送信ボタンが押されたら(UICommand用イベントリスナー) 321
8-1-1commandButtonタグのactionListenerプロパティの利用 322
8-2フォームの入力値が変わったら(UIInput用イベントリスナー) 331
8-2-1commandButtonタグのvalueChangeListenerプロパティの利用 332
8-2-2valueChangeListenerタグの利用 336
9.バリデーション 340
9-1入力の有無のバリデーション 341
9-2浮動小数点のバリデーション 343
9-3整数のバリデーション 345
9-4文字数のチェック 347
9-5カスタムバリデータ 349
9-5-1inputTextタグなどのvalidatorプロパティ利用 350
9-5-2validatorタグの利用 355
9-5-3カスタムタグの利用 356
10.コンバータ 362
10-1標準コンバータ 363
10-1-1コンポーネントの値の型とマネージドビーンのプロパティの型を一致させる方法 364
10-1-2コンポーネントのconverterプロパティの利用、converterタグの利用 366
10-1-3DateTimeConverterの利用 368
10-1-4convertNumberの利用 369
10-1-5カスタムコンバータの作成と利用 370
11.ページナビゲーション 375
11-1単純なページナビゲーション 376
11-1-1ナビゲーションのしくみ 377
11-1-2サンプル 378
11-2条件判断によるナビゲーション 380
11-2-1マネージドビーンのメソッド利用 381
11-3ハイパーリンクによるナビゲーション 384
12.メッセージ 386
12-1JSFページでのメッセージ 387
12-2マネージドビーンでのメッセージ 391
13.カスタムコンポーネント 395
13-1カスタムコンポーネントの基礎知識 396
13-1-1javax.faces.componentパッケージ 397
13-1-2パッケージ概要 398
13-2レンダラー 400
13-3カスタムレンダラーの開発ステップ 401
13-4会員番号入力コンポーネント(自己レンダリング) 402
13-4-1マネージドビーン 403
13-4-2カスタムコンポーネント 404
13-4-3タグライブラリディスクリプタ(TLD) 409
13-4-4web.xmlの編集 411
13-4-5JSFページ 412
13-5会員番号入力コンポーネント(外部レンダリング利用) 414
13-5-1タグハンドラー 415
13-5-2タグライブラリディスクリプタ(TLD) 416
13-5-3カスタムコンポーネント 418
13-5-4外部レンダラー 420
13-5-5web.xmlの編集 423
13-5-6JSFページ 424

著者について


profile

私がこれまで書いてきた著書を紹介します。これまでは秀和システムさんなど出版社の依頼によって執筆してきましたが今後は電子書籍出版に切り替えていきますのでよろしくお願いいたします。

サーブレット&JSPコンプリートマスター

秀和システム
ISBN-13:
ページ
3,800円
2012/9/28
川崎
本書はサーブレットを少し勉強し始めた初中級から上級者の方まで幅広い読者を想定しています。内容はJava Webアプリケーションの中心となるサーブレット、JSP(JavaServer Pages)、JSF(JavaServer Faces)、struts2の4大技術について取り上げ、動作原理からサンプルを交えて詳しく解説しています。
サーブレットは最新版のバージョン3.0、JSFも最新のバージョン2.0です。JSFについては各種の標準ユーザーインターフェースのタグはもとより最新のコンポジット・コンポーネントやカスタム・コンポーネントも解説しています。またPDFを作るiTextなど各種のライブラリについても触れています。
本書が採用している開発環境は最近評判のよいOracleのNetBeans IDE 7.1, GlassFish3.1.2です。またポイントとなるところではTomcatサーバーの場合の設定も併記しています。
サーブレット&JSP逆引大全500の極意エッセンシャル

秀和システム
ISBN-13: 978-4798032832
861ページ
3,045円
2012/3
川崎
サーブレットとJSP逆引き大全650の極意の改定後継版です。サーブレットでこんなことはできないかなかと思ったときにすぐに調べられる便利さはそのまま継承しています。今回の改訂では最新サーブレット仕様である3.0に対応している点です。Tomcat7サーバーに対応します。JSF2.0、Struts2なども掲載しています。本書は企業アプリケーションから趣味で勉強する方まで様々な方に適しています。
これからはじめるすぐにわかるサーブレット&JSP入門

秀和システム
ISBN-13: 978-4798029993
398ページ
2,100円
2011/7
川崎
サーブレットとJSPの技術・文法・実践を必要十分な範囲できちんと解説。基本と基礎をしっかり固めます。わかったつもりで終わらないプレミアムコンパクトな入門書。まずは本書で入門しましょう。
最新図解 Web/ネット技術の基本と常識

秀和システム
ISBN-13: 978-4798026930
323ページ
1,680円
2010/7
川崎
(amazonのjamesさんのカスタマーレビューを引用)
IT関連の契約書を職務上検討することがあるが、「その技術はどういうしくみなんだろうか」を知ることがリスク判断のキーになることも多い。
教科書にもないその契約特有の新しい部分は技術担当に聞くしかないが、教科書レベルの用語説明に彼らの時間を使わせたくない。
「それは要するにどういうしくみ?」という疑問にすばやく答えてくれる書籍やサイトは案外少ない。
個別の技術を検討していたら金も時間も足りない。
IT用語集などでは定義はなされているものの、「しくみ」と「どういうふうに役に立つのか」のところがよくわからない。
本書はそういう状況に陥った技術隣接スタッフ(技術者ではないがある程度の技術の理解を求められる人)の救いになるだろう。
1600円という価格にしてこの内容も良心的といえる。
1 見開き2ページで1テーマの説明になっており、辞書的に使える(どこから読み始めても良い)
2 説明は簡潔だが、(i)要するにその技術がどの部分で用いられ、(ii)大略どういうしくみで、(iii)どういうメリットをもたらすのかが説明されている。
3 イラストにより、説明されている技術が外界とどう繋がっているのかがわかるようになっている(個別の技術説明だとそれがわかりにくい)。
勿論、個々の技術を深堀するには他書による必要があるが、本の帯にも書いてある通り、IT関係の職場で日常良く耳にする言葉をざっくり短時間で把握するには非常に良いものだと思う。
JavaScriptの基本と常識(第2版)

秀和システム
ISBN-13: 978-4798023472
287ページ
1,890円
2009/8
川崎
「本格的な入門書では重い」「リファレンスでは物足りない」というわがままな方にぴったり。基本的な文法から最新事情まで「短時間」で「しっかりマスター」できます。ソフトウェア開発者だけでなくWebクリエータやWeb担当者、あるいは新入社員にも読んでいただきたい一冊です。著者は1996年にJavaScriptがはじめて発表された当時からJavaScript本を書いており、初心者が抑えるべきツボを知っています。
サーブレット&JSP逆引き大全650の極意 改訂第3版

秀和システム
ISBN-13: 978-4798018324
1103ページ
3,360円
2007/12
川崎
Webアプリケーション開発ならお持ちいただきたい1冊です。サーブレットとJSPのすべてが書いてあります。今回はHibernateなど新しい話題も入れています。目的別に引いたり、順番に学習することができます。開発環境は、Windows Vista、Tomcat6、JDK1.6、IE7、Eclipse3.2など最新のものです。
ゼロから始めるAjax

毎日コミュニケーションズ
ISBN4-8399-2076-1
363ページ
2,625円
2007/3
川崎
【Ajaxの入門書】
Ajaxが生まれた背景、Webアプリケーションの変遷、Ajaxの基本的な技術内容、各技術の詳細な解説、サンプルを掲載しています。また、JavaScriptをまったく知らない人でも学べるようにJavaScript自体も解説しています。本書の特徴は、説明を優しく詳しく行っていることです。ぜひ書店、amazonでお求めください。
Google Web ToolkitによるAjaxアプリケーション開発

(株)秀和システム
ISBN4-7980-1503-2
286ページ
2,310円
2006/12
川崎
Ajaxを本格採用したリーダーであるGoogleが開発したAjax開発ツール「Google Web Toolkit」の解説本。JavaScriptを使わずJavaですべてを開発する画期的なツール。Eclipseを使います。
サーブレット&JSP逆引き大全600の極意

(株)秀和システム
ISBN4-7980-1205-X
943ページ
3,150円
2005/12
川崎
【サーブレット&JSPの集大成】 座右に一冊どうぞ!
これ以上書くことは無い程の内容をカバーした”サーブレット&JSPの集大成”です。前作500の極意の増補改訂版です。目的別に逆引きできるTipsを600個用意しました。厚みは英和辞典ほどありますが、きっとご満足いただける無いようだと確信いたします。
すぐにイメージをつかめるように実行画面も数多く掲載しています。JakartaプロジェクトからTaglib、JSF(Jakarta MyFaces)、jakarta-ORO、jakarta-POI、最新TOMCAT5などカバーしています。データベースはMySQLです。
Javaスパイダーツール サンプル&クックブック

(株)秀和システム
ISBN4-7980-1061-8
377ページ
2,730円
2005/5
川崎
ホームページにある情報を自由自在に自動でゲットするスパイダープログラムの入門&サンプル集です。たとえば音楽のダウンロード、割引チケットが自動で収集できます。こんなことができたら面白いというものがギッシリ。
JSF(JavaServer Faces)によるWebアプリケーション開発

(株)秀和システム
ISBN4-7980-0830-3
446ページ
2,730円
2004/7/7
川崎
JSFのパーフェクトリファレンス! 従来の古いバージョンではなく、最新版JSF1.1に準拠して書かれた本邦初の本です。例題とタグリファレンスの両方を充実させて、初めての学習にも、開発時のリファレンスとしても使える充実の1冊。JSFコードをGUIで自動生成する最新ソフトSun Java Studio Creatorについても解説しています。
サーブレット&JSP逆引き大全500の極意


(株)秀和システム
ISBN4-7980-0615-7
752ページ
2,800円+税
2003/10/10
川崎
【サーブレット&JSPの集大成】 これ1冊で、類書数冊分に匹敵する内容!
これ以上書くことは無い程の内容をカバーした”サーブレット&JSPの集大成”です。目的別に逆引きできるTipsを500個用意しました。すぐにイメージをつかめるように実行画面も数多く掲載しています。JakartaプロジェクトからTaglib、Struts、jakarta-ORO、jakarta-POI、最新TOMCAT5などカバーしています。データベースはMySQLです。
JavaScriptサンプルブック


(株)ソーテック社
ISBN4-88166-338-0
190ページ
2180円
2003/4/30
川崎
ネタ不足を解消するサンプルがいっぱいです。本書ではDOM、XML、ActiveX、SVG、ビヘイビアなど新しい技術とJavaScriptを組み合わせたサンプルも紹介しています。基本的でやさしいサンプルからちょっとトリッキーなサンプルまであります。
Webですぐに使えるJSP&サーブレット実用サンプル集


(株)ソーテック社
ISBN4-88166-290-2
399ページ
2780円
2002/7/31
川崎
JavaServerPages(JSP)を基礎から実利用まで導く手引き書。Javaの基本まで盛り込んで全くの初心者でも安心。データベース連携、JavaMail連携、pdfファイル書き出しなど多くのテクニックを満載。サンプルとして、見積書作成、スケジュール管理、会議室予約、セミナー参加、行き先表示板、図書資料情報管理、アンケート自動受付、グラフづくり、などオフィスの中でよく使われそうなアプリケーションをご紹介します。
JavaScript実用サンプル集


(株)ソーテック社
ISBN4-88166-200-7
255ページ
2600円
2001/5/10
川崎
コピーしてすぐに使えるJavaScriptサンプルを満載。こんなことができるのかという驚きがいっぱいです。
人に見られたくないファイルを守る本


(株)ソーテック社
ISBN4-88166-147-7
247ページ
1600円
2000/7/31
川崎
子供が勝手にいじってパソコンが起動しなくなった、見られたくないファイルが見られた、自分の電子メールが見られた、会社で離席中に勝手にパソコンを使われた、ブラウザーの履歴を見られた、といったことを防ぐための方法やユーティリティソフトを紹介している。中にはちょっと危険な設定もあるので利用上の注意を良く読んでください。
必携!カラー版HTML辞典


(株)ソーテック社
ISBN4-88166-100-0
295ページ
1380円
2000/4/15
Web&HP研究会
初級のホームページ作成者を対象としてフォント、画像など項目別にフルカラーでわかりやすく解説した。HTMLバージョン4.0に準拠している。ExplorerとNetscapeのバージョン別の動作確認あり。(執筆協力)
Cascading Style Sheetマスターバイブル


(株)ソーテック社
ISBN4-88166-059-4
295ページ
2400円
1999/4/30
川崎
マスターバイブルシリーズ第2弾。スタイルシートをこれから学ぼうとする人を対象として、スタイルシートのメリット、わかりやすい文法解説、例題豊富なリファレンスを提供するもの。また特徴として、JavaScriptからスタイルを操作する場合のプロパティについても併記してあるので、ダイナミックHTML利用者にも役立つ。
Internet Client SDK Dynamic HTML

(株)アスキー
ISBN4-7561-1832-1
927ページ
12000円
1998/7/1
川田 敦
米国マイクロソフト社の英文Webドキュメントの翻訳版。ダイナミックHTMLの完璧な解説書。(翻訳協力)
Windows98お好みデスクトップ


(株)ソーテック社
ISBN4-88166-033-0
191ページ
1800円
1998/4/10
川崎
新機能を多く盛り込んだWindows98の解説書。特にアクティブ・デスクトップなどを使ってデスクトップをいかにかっこよく便利にカスタマイズするかのヒントを与える。
ホームページ面白大百科

(株)みずき
ISBN4-89621-167-7
331ページ
2472円
1997/3/25
安田 登
人気のあるホームページの条件、それは何でしょう。楽しさ、役に立つ、お得、これらをホームページ初級者の方でも手に入れられるようにと作ったのが本書です。JavaScript、CGIなどを使ってホームページに輝きを与えます。(執筆協力)
JavaScriptマスターバイブル


(株)SPIKE(旧みずき)
ISBN4-89621-161-8
508ページ
3800円
1996/12/25
川崎
Netscape3.0、InternetExplorer3.0に対応したJavaScriptの解説書の元祖。今では書店で見かけることはないが、当時はパーフェクトなコマンドリファレンスとわかりやすい例題で好評をいただいた。

JSF2.2入門 第14回パラメータ受け渡し


kanban14

katatsumuriパラメータ受け渡し その2

JSFのf:paramを使うとパラメータを受け渡すことができます。これはh:commandButtonタグやh:commandLinkタグの内側で使うことができます。

leaf渡す側のJSF

この例は、メートル単位で長さ数字を入力するinputTextをひとつ用意し、それを単位換算するためのボタンを2つ用意します。1つはインチ換算、もうひとつはフィート換算です。

それぞれのボタンの中にはf:pramタグが含まれていてinchボタンが押されたのか、feetボタンが押されたのかをパラメータで送るようにします。どちらのボタンが押されてもparam1Beanビーンのaction()メソッドが実行されます。

<h:form>
<h2>単位換算</h2>
長さ
<h:inputText value=”#{param1Bean.inputvalue}” styleClass=”in”/>メートル
<h:commandButton value=”inch” action=”#{param1Bean.action()}”>
<f:param name=”unit” value=”inch”/>
</h:commandButton>
<h:commandButton value=”feet” action=”#{param1Bean.action()}”>
<f:param name=”unit” value=”feet”/>
</h:commandButton>
</h:form>

leafマネージドビーン

param1Beanのaction()メソッドはどうなっているのでしょうか。赤い文字の部分でf:paramタグの値を読み取るようにしています。前の回でinitParamを扱ったときと同様にFacesContextを取得してgetRequestParameterMap()でリクエストパラメータを全部取得して、そこからunitという名前のパラメータを取り出します。

そのあと、それがinchかfeetなのかで換算する数値を変えています。換算後の結果はconvertedValueにセットするようにsetConvertedValue()メソッドをコールします。

public class Param1Bean {
double inputvalue;
double convertedValue;

public Param1Bean() {
}
public String action(){
FacesContext fc=FacesContext.getCurrentInstance();
Map<String,String> params=fc.getExternalContext().getRequestParameterMap();
String unit=params.get(“unit”);
if(unit.equals(“inch”)){
setConvertedValue(inputvalue*39.37d);
}else if(unit.equals(“feet”)){
setConvertedValue(inputvalue*3.2808d);
}
return “converted”;
}
・・・・・

leaf受け取る側のJSF

入力値、換算値、単位の3つを表示しています。最初の2つの値はマネージドビーンから取得していますが、3つ目の単位は暗黙オブジェクトのparamを使っています。paramの中のunitという名前のパラメータを取得します。

<h:body>
#{param1Bean.inputvalue}メートルは#{param1Bean.convertedValue}#{param.unit}です。
</h:body>

実行すると入力画面はこんな感じです。

param1

インチ換算だとつぎのようになります。

param2

フィート換算ボタンを押すと

param3

きちんと表示できます。

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内

JSF2.2入門 第13回パラメータ受け渡し コンテキストパラメータ


kanban13

katatsumuriパラメータの受け渡し方法 その1

JSFでは入力用、結果の表示用など複数のページでアプリケーションが構成されることが普通です。こういったページを移動するときに、どうやって情報を受け渡しするか、これはJSFのキーポイントです。まず1回目は「コンテキストパラメータ」です。

leafコンテキストパラメータ

コンテキストパラメータはサーブレットコンテキストという中に置くことができる情報保存場所のことです。

コンテキストは分かりにくいのですが文脈とか周辺環境という感じで、Webアプリケーション1つに対して1つのコンテキストが存在します。実行中のサーブレットから「ほら、あそこにあるあれに」といえばあうんの呼吸で「コンテキスト」を意味するような感じです。複数のサーブレットやJSFで使うことができる共用の場所みたいな。具体的にはServletContextクラスです。

そこに置くことができるパラメータをコンテキストパラメータといいます。

leafコンテキストパラメータを設定する

コンテキストパラメータは設定のみで書き込みはできません。設定するにはweb.xmlにパラメータ名と値を書きます。web.xlmはWebアプリケーションのプロジェクトで1つです。そのためここに書かれるコンテキストパラメーターはプロジェクト内のどのプログラムからもアクセス可能です。これが適する用途は「アプリケーションの初期値」「共通してよく使われる固定情報」です。

次はweb.xmlの例です。ここではパラメータが2つ設定してあります。1つ目は最初からNetBeansが書き込んだもの。2番目は私が今回追加したものです。<context-param>タグはパラメータ1個ごとに必要です。<param-name>はパラメータ名、<param-value>はパラメータ値です。

[web.xml]
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app....
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>companyname</param-name>
<param-value>株式会社五井物産</param-value>
</context-param>
<servlet>
・・・・

leafコンテキストパラメータを読み出す

コンテキストパラメータの読み出し方法です。つぎのサンプルでは4つの方法を示しています。どれも結果は同じです。

[ 方法1 ]

<h:outputText value=”#{initParam.companyname}”/>
これはJSFの暗黙オブジェクトinitParamを使っています。「暗黙オブジェクト.パラメータ名」というパターン。これが一番シンプルです。

[ 方法2 ]

<h:outputText value=”#{initParam[‘companyname’]}”/>
これもさっきと同じですがパラメータ名の指定がシングルクオーテーションになっています。あまり得なことはないかも。

[ 方法3 ]

<h:outputText value=”#{facesContext.externalContext.initParameterMap.companyname}”/>

これは暗黙オブジェクトを使わない場合の例。これもやる価値はないけど、一応こうもできるということです。

[ 方法4 ]
<h:outputText value=”#{facesContext.externalContext.initParameterMap[‘companyname’]}”/>

これも暗黙オブジェクトを使わず、シングルクオーテーションを使ったアクセス。これもメリットないが。

leafビーンからコンテキストパラメータ読み出し

次のようにマネージドビーンを作って、プロパティ mycompanynameにコンテキストパラメータを読み込むようにします。ビーンからコンテキストパラメータを読むのは太字の部分。FacesContext、ExternalContextとたどってからgetInitParameter(“companyname”)で取得できます。
@Named(value=”contextParamBean”)
@RequestScoped
public class ContextParamBean {
String mycompanyname;
public ContextParamBean() {
}
public String getMycompanyname() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext exContext = context.getExternalContext();
mycompanyname=exContext.getInitParameter(“companyname”);
return mycompanyname;
}
}

JSFページ側はつぎのようにします。これは単にビーンのcompanynameを読んでいるだけです。2つの方法とも同じ結果になります。

<h:outputText value=”#{contextParamBean.mycompanyname}“/>
<h:outputText value=”#{contextParamBean[‘mycompanyname’]}“/>

これまでの方法全部の実行画面です。どれもOKですね。

inipara

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内

JSF2.2入門 第12回ELで演算式


kanban12

katatsumuriELは演算もできる

ELでは四則演算や比較ができます。これを利用したサンプルを紹介します。

leaf条件によって表示の色を変更

たとえばマネージドビーンから人物の名前と年令を複数取得できるとします。こんなような感じです。

public class PersonsBean implements Serializable{
String[][] persons={{“宮沢 賢治”,”18″},{“樋口 一葉”,”20″},{“夏目 漱石”,”23″},{“太宰 治”,”30″},{“紀 貫之”,”18″},{“鴨 長明”,”17″},{“芥川 龍之介”,”25″}};
public PersonsBean() {
}
public String[][] getPersons() {
return persons;
}
・・・

JSFページでは次のようにc:forEachで一覧表示しますが、ここで20歳以上は赤い文字で表示することにしました。2つとも同じことをやっていますが上は名前、下は年令を表示しています。年令のデータはStringですがELでは数字として問題なく処理できています。

<h:panelGrid columns=”2″>
<c:forEach var=”item” items=”#{personsBean.persons}”>
<h:outputText value=”#{item[0]}” styleClass=”#{item[1] >=20 ? ‘red’ : ‘black’}”/>
<h:outputText value=”#{item[1]}” styleClass=”#{item[1] >=20 ? ‘red’ : ‘black’}”/>
</c:forEach>
</h:panelGrid>

これに対応したスタイルシートも用意しておかないといけません。次のように。

<style>
.red{
color: #ff0000;
}
.black{
color: #000000;
}
td{
padding: 10px;
background-color: #eeeeee;
}
</style>

実行すると次のようになります。

el2-1

leafELで表示非表示を切り替える

前の例と同じようにc:forEachで全部のデータを読み込むのですが、20歳以上の人だけを表示するようにしてみます。

renderedプロパティの中でELで条件式を作っておいて、その結果がtrueになったときだけ表示するようにします。renderedはtrueかfalseで表示と非表示を切り替えられます。

<c:forEach var=”item” items=”#{personsBean.persons}”>
<h:outputText value=”#{item[0]}” rendered=”#{item[1] >=20}”/>
<h:outputText value=”#{item[1]}” rendered=”#{item[1] >=20}”/>
</c:forEach>

実行すると20歳以上だけ表示されます。前の表示と比べてみてください。

el2-2

 

previousnext

JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内