JavaServer? Facesでじゃんけんをするページを作成する。
ボタンを押すたびにキャラクターがじゃんけんしてくれる。
まず、ManagedBean?を作成する。
じゃんけんの結果を格納する変数resultとそのgetter/setterを作成する。
値の意味は0:初期状態、1:グー、2:チョキ、3:パー、4:グッチョッパー(任意)とする。
(本来はenumを使用するが簡略化のため)
乱数を使用してじゃんけんをするjanken()メソッドを作成する。
グー:30%、チョキ:30%、パー:30%、グッチョッパー(任意):10%の確率に設定した。
結果を初期状態に戻すreset()メソッドも作成する。
import javax.inject.Named; import javax.enterprise.context.RequestScoped; @Named(value = "janken") @RequestScoped public class janken { private int result; public janken() { } // getter/setter省略 public void janken() { double rand = Math.random(); result = (int) (rand / 0.3) + 1; } public void reset() { result = 0; } }
続いて、じゃんけんをする画面をFaceletsで作成する。
事前に、初期画面、グー、チョキ、パー、グッチョッパー(任意)用の同一サイズの画像を作成し、プロジェクト名/プロジェクト名-war/webに格納しておく。
#ref(): File not found: "jn1.jpg" at page "じゃんけん(JSF)"
h:graphicImageは画像を表示するためのタグである。
実際の画像に合わせて画像の幅(width)、高さ(height)、場所(value)を指定する。
ただし、画像の場所をじゃんけんの結果(result)で変えるようにする。eqは==の意味である。
janken()メソッドを呼び出してじゃんけんをするグー、チョキ、パーのボタンとreset()メソッドを呼び出して初期状態にする戻るボタンを作成する。
各ボタンに対しf:ajaxタグを使用して、ボタンが押されたときに画像のみを書き換えるようにする。
<?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"> <h:head> <title>じゃんけんポン</title> </h:head> <h:body> じゃんけんポン♪ <h:form> <h:graphicImage id="im" width="240" height="135" value="#{janken.result eq 0 ? 'd.jpg' : janken.result eq 1 ? 'g.jpg' : janken.result eq 2 ? 'c.jpg' : janken.result eq 3 ? 'p.jpg' : 'gcp.jpg'}"/> <br/> <h:commandButton value="グー" action="#{janken.janken()}"> <f:ajax render="im"/> </h:commandButton> <h:commandButton value="チョキ" action="#{janken.janken()}"> <f:ajax render="im"/> </h:commandButton> <h:commandButton value="パー" action="#{janken.janken()}"> <f:ajax render="im"/> </h:commandButton> <h:commandButton value="戻る" action="#{janken.reset()}"> <f:ajax render="im"/> </h:commandButton> </h:form> </h:body> </html>
(注意)
乱数の質が悪いため、同じ結果が連続で出やすい。