ManagedBean?とは? (@ManagedBean?) †
- JSFのサーバ側処理と画面とのIOを行う POJO (Plain Old Java Object)
- @ManagedBean? アノテーションをつけるだけ
package com.example.jsfexam.web;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped()
public class CommentController {
private String pComment;
public String getComment() {
return pComment;
}
public void setComment(final String comment) {
this.pComment = comment;
}
public String doPublish() {
return "simpleResult.xhtml";
}
}
- ブラウザからは doPublish() が呼び出される。返値の String が次の画面。
- HTTP Request は setComment(comment) 経由で値が設定される
- xhtml からは getComment() 経由で値が参照される
- この ManagedBean? の参照名はクラス名になる
<h:commandButton value="投稿" action="#{commentController.doPublish}"/>
ManagedBean?の参照名を指定する †
package com.example.jsfexam.web;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "myCommentController")
@RequestScoped
public class CommentController {
〜略〜
}
ManagedBean?のスコープ †
@ApplicationScoped? †
@SessionScoped? †
@ViewScoped? †
- 次の画面が呼び出されるまで有効
- ajax とかで使う
@RequestScoped? †
- HTTP Request 〜 HTTP Response
- 省略時のスコープ
@NoneScoped? †
- 直接画面と結びつかない ManagedBean?
- 他の ManagedBean? のフィールドに設定する Bean につける
- ManagedBean?でスコープを省略すると @RequestScoped? になるので、明示的に直接画面と対応しない事を示すために @NoneScoped? を設定する
- UserController?.java
@ManagedBean(name = "user")
@SessionScoped
public class UserController implements Serializable {
@ManagedProperty(value="#{address}")
private AddressBean address;
public AddressBean getAddress() {
return address;
}
public void setAddress(AddressBean address) {
this.address = address;
}
private String name;
....
}
- AddressBean?.java
@ManagedBean(name = "address")
@NoneScoped
public class AddressBean implements Serializable {
private String city;
....
}
- xhtml
<h:inputText value="#{user.address.city}"/>
<h:inputText value="#{user.name}"/>
- 注意事項
- UserController?#getAddress(), UserController?#setAddress() は必要。インスタンスは setAddress() を通じて格納されるので、無いとエラーになる
- AddressBean? は Serializable である必要がある。(コンテナのログに警告が出る)
- たとえば、AddressBean? が、UserController?.java と MapController?.java のフィールド変数として Injection されたとすると、それらは別インスタンスになる。
FlashScoped? †
- Rails の Flash の JSF 版
- 画面に表示するちょっとしたデータを Session 領域にあるテーブル(key:value)に格納する
- 一度 xhtml の EL 式から読み込まれたら消える
- OAuth認証など、何らかの理由で redirect を挟んでデータを保持したいが、Session領域を使うほどではないときに使う。
- あと、F5 で 再POST させたくないときに、リダイレクトを挟む
- flashController.java
package com.example.jsfexam.web;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
@ManagedBean
@RequestScoped
public class FlashController {
public String doRedirect() {
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("userId", "01234");
return "flashResult?faces-redirect=true";
}
}
- flashResult.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://java.sun.com/jsf/html" lang="en">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>リダイレクト結果</title>
</h:head>
<h:body>
<h:outputText value="#{flash.userId}"/>
</h:body>
</html>
- 実行結果
- Redirect (304 Moved Permanentry) している
- RequestScope? なら情報が失われるが、FlashScope? に userId を格納しているので表示される
- 一度読み出されたら userId は消える。flashResult を再読込すると何も表示されない
コールバック (@PreConstruct?, @PreDestroy?) †

@ManagedBean(eager = true)
@ApplicationScoped
public class AppConst {
private File workDir;
@PostConstruct
private void init() {
// ... 初期化処理 ...
}
@PreDestory
private void init() {
// ... 終了処理 ...
}
public File getWorkDir() {
return workDir;
}
}
ManagedBean?のPassivate †
- Glassfish では、どうなるのかよく分からん。多分 JBOSS と同じだろう
- JBOSS では、ManagedBean? が Serializable だと、適宜 Passivate (ManagedBean?のディスクへの待避) / Activate (ManagedBean?のメモリへの復帰) が発生するらしい
他のManagedBean?を参照する †
EJBを呼び出す †
Glassfish JSF2