Привет мир Facelets 2.0 навигации - PullRequest
0 голосов
/ 01 апреля 2012

Итак, у меня есть компонент поддержки, Foo и шаблон с клиентом, запросом и ответом.клиенты являются избыточными, я хочу только одного клиента.

Клиенты:

thufir@dur:~$ 
thufir@dur:~$ cat NetBeansProjects/NNTPjsf/web/foo/request.xhtml 
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./template.xhtml"
                xmlns:h="http://java.sun.com/jsf/html">

    <ui:define name="left">

        <h:form>
            <h:inputText size="2" maxlength="50" value="#{foo.bar}" />
            <h:commandButton id="submit" value="submit" action="response" />
        </h:form>
    </ui:define>

    <ui:define name="content">
        <h:outputText value="#{foo.bar}"></h:outputText>
    </ui:define>

</ui:composition>
thufir@dur:~$ 
thufir@dur:~$ cat NetBeansProjects/NNTPjsf/web/foo/response.xhtml 
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./template.xhtml"
                xmlns:h="http://java.sun.com/jsf/html">

    <ui:define name="left">

        <h:form>
            <h:inputText size="2" maxlength="50" value="#{foo.bar}" />
            <h:commandButton id="submit" value="submit" action="response" />
        </h:form>
    </ui:define>

    <ui:define name="content">
        <h:outputText value="#{foo.bar}"></h:outputText>
    </ui:define>

</ui:composition>
thufir@dur:~$ 

Что, я думаю, нормально, само по себе.

Поддерживающий компонент:

package guessNumber;

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpSession;

@Named
@SessionScoped
public class Foo implements Serializable {

    private String bar = "bar";
    private String response = "response";

    public Foo() {
    }

    /**
     * @return the bar
     */
    public String getBar() {
        return bar;
    }

    /**
     * @param bar the bar to set
     */
    public void setBar(String bar) {
        this.bar = bar;
    }

    /**
     * @return the response
     */
    public String getResponse() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        session.invalidate();
        response = "hmm";
        return response;
    }

    /**
     * @param response the response to set
     */
    public void setResponse(String response) {
        this.response = response;
    }
}

То, что я хотел бы, это просто один клиент, request_response или что-то еще.Чтобы форма ввода текста оставалась слева, а результат - справа.Это сделано с тегами композиции?Или третий «общий клиент», у которого есть два субклиента?

1 Ответ

2 голосов
/ 01 апреля 2012

Вам нужно изменить commandButton на странице запроса, чтобы вызвать метод действия в компоненте поддержки:

<h:commandButton id="submit" value="submit" action="#{foo.doAction}" />

В методе действия установить ответ:

public String doAction() {
  response = "hmm";
  return "response";
}

возвращаемое значение метода действия переходит на страницу /response.xhtml.

Но вам не нужны две страницы.Вы можете вернуть null из метода действия для перезагрузки текущей страницы (запроса):

public String doAction() {
  response = "hmm";
  return null;
}

Тогда измененные значения для бара и ответа могут быть показаны справа:

<ui:define name="content">
  <h:outputText value="#{foo.bar}"></h:outputText>
  <h:outputText value="#{foo.response}"></h:outputText>
</ui:define>
...