2013-06-02 5 views
1

Я хочу спросить вас о том, как работает xhtml.xhtml + jsf получить значения из класса контроллера

это мой tablero.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:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:p="http://primefaces.org/ui"> 

    <ui:composition template="/template.xhtml"> 
     <ui:define name="title"> 
      <h:outputText value="Dak's Hangman"></h:outputText> 
     </ui:define> 
     <ui:define name="body"> 
      <h:panelGroup id="messagePanel" layout="block"> 
       <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/> 
      </h:panelGroup> 
      <h:head id="demo" >Opportunities: </h:head>    
      <h:outputText value="#{partidaController.getRemainingOp()}"/>  
      <br/> 
      <h:outputText value="#{partidaController.getNombreJugador()}"/>     
      <br/> 
      <c:forEach var="x" items="#{partidaController.getLetrasColocadas()}" > 
       <h:inputText disabled="true" size="1" value="${x}"/> 
      </c:forEach> 
      <br/> 
      <h:panelGrid> 
       <h:form> 
        <p:commandButton id="b1" style="height: 30px; width: 30px;" value="a" action="#{turnoController.createTurno('a')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b2" style="height: 30px; width: 30px;" value="b" action="#{turnoController.createTurno('b')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b3" style="height: 30px; width: 30px;" value="c" action="#{turnoController.createTurno('c')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b4" style="height: 30px; width: 30px;" value="d" action="#{turnoController.createTurno('d')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b5" style="height: 30px; width: 30px;" value="e" action="#{turnoController.createTurno('e')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b6" style="height: 30px; width: 30px;" value="f" action="#{turnoController.createTurno('f')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b7" style="height: 30px; width: 30px;" value="g" action="#{turnoController.createTurno('g')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b8" style="height: 30px; width: 30px;" value="h" action="#{turnoController.createTurno('h')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b9" style="height: 30px; width: 30px;" value="i" action="#{turnoController.createTurno('i')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b10" style="height: 30px; width: 30px;" value="j" action="#{turnoController.createTurno('j')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b11" style="height: 30px; width: 30px;" value="k" action="#{turnoController.createTurno('k')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b12" style="height: 30px; width: 30px;" value="l" action="#{turnoController.createTurno('l')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b13" style="height: 30px; width: 30px;" value="m" action="#{turnoController.createTurno('m')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b14" style="height: 30px; width: 30px;" value="n" action="#{turnoController.createTurno('n')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b15" style="height: 30px; width: 30px;" value="o" action="#{turnoController.createTurno('o')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b16" style="height: 30px; width: 30px;" value="p" action="#{turnoController.createTurno('p')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b17" style="height: 30px; width: 30px;" value="q" action="#{turnoController.createTurno('q')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b18" style="height: 30px; width: 30px;" value="r" action="#{turnoController.createTurno('r')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b19" style="height: 30px; width: 30px;" value="s" action="#{turnoController.createTurno('s')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b20" style="height: 30px; width: 30px;" value="t" action="#{turnoController.createTurno('t')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b21" style="height: 30px; width: 30px;" value="u" action="#{turnoController.createTurno('u')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b22" style="height: 30px; width: 30px;" value="v" action="#{turnoController.createTurno('v')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b23" style="height: 30px; width: 30px;" value="w" action="#{turnoController.createTurno('w')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b24" style="height: 30px; width: 30px;" value="x" action="#{turnoController.createTurno('x')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b25" style="height: 30px; width: 30px;" value="y" action="#{turnoController.createTurno('y')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <p:commandButton id="b26" style="height: 30px; width: 30px;" value="z" action="#{turnoController.createTurno('z')}" onclick="document.getElementById(this.id).disabled=true;"/> 
        <br /> 
       </h:form> 
      <h:graphicImage value="../resources/images/hangman.jpg" width="480" height="400" /> 
      <h:link outcome="/index" value="#{bundle.CreateJugadorIndexLink}"/>   
     </h:panelGrid> 
     </ui:define> 
    </ui:composition> 
</html> 

и это боб я называю каждый раз, когда я нажимаю buttonCommand:

public String createTurno(String s) { 
    try { 
     Map<String, Object> sesionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap(); 
     Integer id = (Integer) sesionMap.get("id_partida"); 

     Partida p = new Partida(); 
     p.setIdPartida(id); 
     current= new Turno(); 
     current.setIdPartida(p); 
     current.setLetraTurno(s); 
     ejbFacade.create(current); 
     return "tablero"; 
    } catch (Exception e) { 
     JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured")); 
     return null; 
    } 
} 

и это метод, который я хочу, чтобы позвонить в обновить элементы ...

public List getLetrasColocadas() 
{ 
    String lc = getFacade().letrasColocadasById(current.getIdPartida()); 

    ArrayList<String> lista = new ArrayList<String>(); 
    int i; 
    for (i=0; i<lc.length(); i++){ 
     String h = "" + lc.charAt(i) + ""; 
     lista.add(h); 
    } 
    return lista; 
} 

в partidaController.getLetrasColocadas() работает отлично (я отлажена его и d что я хочу). Проблема в том, что значения inputText после их показа, они никогда не будут обновляться снова, если щелкнуть кнопку команды, например, вызвать bean-компонент, который возвращает строку с именем этого файла xhtml ... он всегда остается неизменным.

Любые магии, которые я должен знать о xhtml ???

+0

Вам также нужно показать модель/управляемый компонент, чтобы мы могли помочь. – skuntsel

ответ

2

Есть несколько проблем в текущем коде:

  1. Вы используете <c:forEach> для добавления <h:inputText> компонентов в представлении. Это приведет к проблемам, если вы обновите эти компоненты в будущем, используя операцию ajax. Чтобы решить эту проблему, используйте вместо этого <ui:repeat>. Обратитесь к JSTL in JSF2 Facelets... makes sense? за дополнительной информацией по этой теме.

  2. Ваши <p:commandButton> s отключены после отправки на сервер, но не включены снова, поэтому они перестанут работать после одного запуска. Добавьте oncomplete="document.getElementById(this.id).disabled=false;", чтобы включить его после завершения вызова ajax. Помните, что по умолчанию <p:commandButton> имеет ajax объект недвижимости true.

  3. Возможно, вы не заметили, но ваш метод getLetrasColocadas вызывается более одного раза на вашей странице. Такое поведение хорошо объяснено здесь: Why JSF calls getters multiple times. Как это решить? Переместите бизнес-логику с этого метода на некоторый метод loadLetrasColocadas и вызовите это в конце createTurno, таким образом вы используете геттер как простой return lista (при условии, что эта переменная lista станет полем вашего управляемого компонента).

Теперь, некоторые предупреждения о текущем дизайне

  1. Вашего <h:form> содержит только ваши <p:commandButton> элементов, таким образом, при представлении данных формы на сервер не будет посылать ничего из UIInput компонентов например информация из <h:inputText>, отмеченная выше, никогда не будет отправлена ​​на сервер.

  2. Поскольку вы всегда возвращаются "tablero" в методе createTurno, вы никогда не выполнить вызов Ajax и вся страница молча перезагрузке (за кадром, ответ является переадресация на ту же точку зрения, таким образом, не получают эффект полной переадресации из браузера). Я рекомендую изменить createTurno с возвратом String по номеру void.

Кроме того, так как вы собираетесь использовать Ajax только вызовы, было бы лучше, чтобы изменить управляемый компонент для @ViewScoped по крайней мере. Дополнительная информация о управляемых компонентах: Communication in JSF 2: Managed Bean Scopes от BalusC (эксперт JSF и Java EE).

1

Ну ... Я обнаружил, что свойство OnClick кнопки команды несовместимо с обновлением значений элементов ...

Смежные вопросы