0
votes

What should be the return type for getResponse and submit, and are both necessary?

When a guess is entered in either the firstForm or SecondForm, how do I echo that guess to the same webpage?

Either with ajax, and so not reloading the same page

or

loading a new page, guessResults.xhtml, for example, which echo's the guess.

backing bean, NextClient:

package dur.beans;

import dur.jpa.Client;
import dur.jpa.ClientFacadeLocal;
import java.util.concurrent.atomic.AtomicInteger;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@Named("nextClient")
@ApplicationScoped
public class NextClient implements NextClientLocal {

    @EJB
    private ClientFacadeLocal clientFacade;
    private AtomicInteger next = new AtomicInteger(1009);
    private AtomicInteger guess = new AtomicInteger(0);
    private final boolean correct = true;

    @Override
    public String getNext() {
        next.addAndGet(1);
        Client client = clientFacade.find(next.intValue());
        return client.toString();
    }

    @Override
    public void setGuess(int guessInt) {
        guess = new AtomicInteger(guessInt);
    }

    @Override
    public int getGuess() {
        return guess.intValue();
    }

    //not sure what do with these methods

    @Override
    public String getResponse() {
        return "the guess  of " + guess.intValue() + " is " + correct;
    }

    @Override
    public String submit() {
        return "the guess  of " + guess.intValue() + " is " + correct;
    }

}

facelets template client, next.xhtml:

<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      >

    <h:head></h:head>
    <h:body>
        This and everything before will be ignored
        <ui:composition template="template.xhtml">
            <ui:define name="navigation">
                <ui:include src="menu.xhtml"/>
            </ui:define>
            <ui:define name="main">
                <h1>next bird</h1>
                <p>
                    #{nextClient.next}
                </p>

                <p>


                    <h:panelGroup id="firstPanel">
                        <h:form id="firstForm">
                            <h:outputLabel for="input" value="First form input" />
                            <h:inputText id="input" value="#{nextClient.guess}" required="true" />
                            <h:commandButton value="Submit form" action="#{nextClient.submit}">
                                <f:ajax execute="@form" render="@form :secondPanel :secondForm :messages" />
                            </h:commandButton>
                            <h:message for="input" />
                        </h:form>
                    </h:panelGroup>
                    <h:panelGroup id="secondPanel">
                        <h:form id="secondForm">
                            <h:outputLabel for="input" value="Second form input" />
                            <h:inputText id="input" value="#{nextClient.guess}" required="true" />
                            <h:commandButton value="Submit other form" action="#{nextClient.submit}">
                                <f:ajax execute="@form" render="@form :firstPanel :firstForm :messages" />
                            </h:commandButton>
                            <h:message for="input" />
                        </h:form>
                    </h:panelGroup>
                    <h:messages id="messages" globalOnly="true" layout="table" />



                </p>
            </ui:define>
        </ui:composition>
        This and everything after will be ignored
    </h:body>
</html>

see also:

http://balusc.blogspot.ca/2011/09/communication-in-jsf-20.html#AjaxRenderingOfContentWhichContainsAnotherForm

JSF 2.0 commandButton do nothing

https://javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/h/commandButton.html

http://docs.oracle.com/javaee/7/tutorial/doc/jsf-facelets003.htm

I'm running facelets on Glassfish, using CDI, so am using @Named and not @ManagedBean -- some of the documentation above is more geared for @ManagedBean, but I'm not sure how much that matters.

The goal is one step better than "hello world", "hello world, your guess is " would be a good result. If there's a specific manual, I don't mind a RTFM to that specific documentation. The Oracle docs are probably the best for facelets?

code:

https://github.com/THUFIR/EntAppWeb

1

1 Answers

0
votes

This response.xhtml:

<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

    <h:head>response</h:head>
    <h:body>
        This and everything before will be ignored
        <ui:composition template="template.xhtml">
            <ui:define name="navigation">
                <ui:include src="menu.xhtml"/>
            </ui:define>
            <ui:define name="main">
                <h1>submitted value</h1>
                <p>
                    #{nextClient.guess}
                </p>
                <h2>for this bird</h2>
                <p>
                    #{nextClient.client}
                </p>
            </ui:define>
        </ui:composition>
        This and everything after will be ignored
    </h:body>
</html>

to next.xhtml:

<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

    <h:head>next</h:head>
    <h:body>
        This and everything before will be ignored
        <ui:composition template="template.xhtml">
            <ui:define name="navigation">
                <ui:include src="menu.xhtml"/>
            </ui:define>
            <ui:define name="main">
                <h1>next bird</h1>
                <p>
                    #{nextClient.next}
                </p>
                <p>
                    <h:panelGroup id="simpleGroup">
                        <h:form id="simpleForm">
                            <h:outputLabel for="input" value="First form input" />
                            <h:inputText id="input" value="#{nextClient.guess}" required="true" />
                            <h:commandButton value="submit" action="response">
                            </h:commandButton>
                        </h:form>
                    </h:panelGroup>

                </p>
            </ui:define>
        </ui:composition>
        This and everything after will be ignored
    </h:body>
</html>

using the backing bean NextClient:

package dur.beans;

import dur.jpa.Client;
import dur.jpa.ClientFacadeLocal;
import java.util.concurrent.atomic.AtomicInteger;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@Named("nextClient")
@ApplicationScoped
public class NextClient implements NextClientLocal {

    @EJB
    private ClientFacadeLocal clientFacade;
    private AtomicInteger next = new AtomicInteger(1009);
    private AtomicInteger guess = new AtomicInteger(0);
    private final boolean correct = true;
    private Client client = new Client();

    @Override
    public String getNext() {
        next.addAndGet(1);
        client = clientFacade.find(next.intValue());
        return client.toString();
    }

    @Override
    public void setGuess(int guessInt) {
        guess = new AtomicInteger(guessInt);
    }

    @Override
    public int getGuess() {
        return guess.intValue();
    }

     @Override
    public Client getClient() {
        return client;
    }

    @Override
    public void setClient(Client client) {
        this.client = client;
    }

}

outputs the submitted value to the response, along with the bird. It might make more sense to output the result to the same page, but this is sufficient.