はじめに
JSFで初歩的な動きを確認しようとしたところ、Managed Bean
のプロパティをバインドして表示してくれない事象が発生。解決方法をメモ。
要は#{}
を使って画面に「Hello!」と表示したいのに、表示されない。
index.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"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<head>
<title>FirstPage</title>
</head>
<f:view>
#{myBean.message}
</f:view>
</html>
MyBean.java
package mypkg;
import jakarta.inject.Named;
import jakarta.enterprise.context.RequestScoped;
@Named
@RequestScoped
public class MyBean {
private String message = "Hello!";
public MyBean(String message){
this.message = message;
}
/* ゲッタ */
public String getMessage(){
return this.message;
}
/* セッタ */
public void setMessage(String message) {
this.message = message;
}
/* リスナ */
public String getIdForNextPage(){
return "success";
}
}
解決策
引数なしのコンストラクタを作成する。
MyBean.java
package mypkg;
import jakarta.inject.Named;
import jakarta.enterprise.context.RequestScoped;
@Named
@RequestScoped
public class MyBean {
private String message;
/* 引数なしのコンストラクタ */
public MyBean(){
this.message = "Hello!";
}
/* ゲッタ */
public String getMessage(){
return this.message;
}
/* セッタ */
public void setMessage(String message) {
this.message = message;
}
/* リスナ */
public String getIdForNextPage(){
return "success";
}
}
めでたしめでたし。
ちなみに
引数なしのコンストラクタ作成前のコードで、Managed Bean
にリスナを設定してもアクションがうまく機能せずにTarget Unreachable, identifier 'hoge' resolved to null
が出てしまってました。
こちらも引数なしコンストラクタの作成で解決しました。