1


Java EE 7 チュートリアルを読んでいます。章 13.12 には、サンプル アプリケーション ajaxguessnumber があります。この例を Glassfish 4 で実行すると、すべて正常に動作します。次に System.out.println を Bean コンストラクターに配置すると、最初のページの読み込み中にコンストラクターが 2 回呼び出されていることがわかりました。@SessionScoped Beanの場合でも、なぜそうなのですか?
ここにxhtmlファイルがあります

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html lang="en"
      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>
        <h:outputStylesheet library="css" name="default.css"/>
        <title>Ajax Guess Number Facelets Application</title>
    </h:head>
    <h:body>
        <h:form id="AjaxGuess">
            <h:graphicImage value="#{resource['images:wave.med.gif']}"
                            alt="Duke waving his hand"/>
            <h2>
                Hi, my name is Duke. I am thinking of a number from
                #{dukesNumberBean.minimum} to #{dukesNumberBean.maximum}.
                Can you guess it?
            </h2>
            <p>
                <h:inputText 
                    id="userNo" 
                    title="Type a number from 0 to 10:"
                    value="#{userNumberBean.userNumber}">
                    <f:validateLongRange
                        minimum="#{dukesNumberBean.minimum}"
                        maximum="#{dukesNumberBean.maximum}"/>
                </h:inputText>

                <h:commandButton id="submit" value="Submit" >
                    <f:ajax execute="userNo" render="outputGroup" />
                </h:commandButton>
            </p>
            <p>
                <h:panelGroup layout="block" id="outputGroup">
                    <h:outputText id="result" style="color:blue"
                                  value="#{userNumberBean.response}" rendered="#{!facesContext.validationFailed}"/>
                    <h:message id="errors1" 
                               showSummary="true" 
                               showDetail="false"
                               style="color: #d20005;
                               font-family: 'New Century Schoolbook', serif;
                               font-style: oblique;
                               text-decoration: overline" 
                               for="userNo"/>
                </h:panelGroup>
            </p>
        </h:form>
    </h:body>
</html>

ここにビーン DukesNumberBean があります

package javaeetutorial.ajaxguessnumber;

import java.io.Serializable;
import java.util.Random;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;


@Named
@SessionScoped
public class DukesNumberBean implements Serializable {

    private Integer randomInt = null;
    private long maximum = 10;
    private long minimum = 0;

    public DukesNumberBean() {
        System.out.println("Inside DukesNumberBean constructor");

        Random randomGR = new Random();
        long range = maximum+minimum+1;
        randomInt = (int) (minimum + randomGR.nextDouble()*range);
        System.out.println("Duke's number: " + randomInt);
    }

    public long getMaximum() {
        return (this.maximum);
    }

    public void setMaximum(long maximum) {
        this.maximum = maximum;
    }

    public long getMinimum() {
        return (this.minimum);
    }

    public void setMinimum(long minimum) {
        this.minimum = minimum;
    }

    /**
     * @return the randomInt
     */
    public Integer getRandomInt() {
        return randomInt;
    }

    /**
     * @param randomInt the randomInt to set
     */
    public void setRandomInt(Integer randomInt) {
        this.randomInt = randomInt;
    }

}

そして、これがBean UserNumberBean です

    package javaeetutorial.ajaxguessnumber;

import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@RequestScoped
public class UserNumberBean implements Serializable {
    @Inject
    DukesNumberBean dukesNumberBean;
    private Integer userNumber = null;
    String response = null;

    public UserNumberBean()
    {
        System.out.println("Inside constructor");
    }

    public void setUserNumber(Integer user_number) {
        userNumber = user_number;
    }

    public Integer getUserNumber() {
        return userNumber;
    }

    public String getResponse() {
        if ((userNumber != null) && (userNumber.compareTo(dukesNumberBean.getRandomInt()) == 0)) {
            return "Yay! You got it!";
        }
        if (userNumber == null) {
            return null;
        } else {
            return "Sorry, " + userNumber + " is incorrect.";
        }
    }
}

どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1