2015-09-19 3 views
0

У меня есть таблица с пользователями. Я могу зарегистрировать нового пользователя и удалить любого студента из таблицы. Но редактировать пользователя не работает. Я не знаю почему. Регистрация нового пользователя кнопки на моей странице JSF выглядит следующим образом:<p:inputText> значения не обновляются

<p:commandButton id="submit" value="Create Student" update=":dataTable" actionListener="#{studentManagedBean.createStudent()}" /> 

Это создает новый студент в моей базе данных и обновление моего <p:dataTable> ..... </p:dataTable> с идентификатором «DataTable».

В p:dataTable У меня есть edit | delete commandLinks для каждой строки. Удалить командуLink выглядит следующим образом.

<p:commandLink value="delete" update=":dataTable" action="#{studentManagedBean.deleteStudent(std)}"/> 

Это удаление выбранного студента из моей базы данных и обновление моего <p:dataTable> а также.

Редактировать commandLink выглядит следующим образом.

<p:commandLink value="edit" update=":dataTable" action="#{studentManagedBean.editStudent(std)}" rendered="#{std.editable eq '0'}"/>    
<p:commandLink value="save" update=":dataTable" action="#{studentManagedBean.editStudent(std)}" rendered="#{std.editable eq '1'}"/> 

И внутри каждого столбца в моей таблице данных выглядит так.

<p:outputLabel value="#{std.firstName}" rendered="#{std.editable eq '0'}"/> 
<p:inputText value="#{std.firstName}" rendered="#{std.editable eq '1'}"/> 

Как вы можете видеть, если editable (символ в дБ) является '1' то это показывает inputText поле вместо outputLabel. До сих пор все работает нормально. Когда я нажимаю на edit commandLink outputLabel поля скрываются и отображаются поля inputText, а текст командыLink изменяется с edit на save. Но он не обновляет мой std-объект новыми значениями, если я изменяю старые значения в строке.

editStudent (std) метод выглядит следующим образом.

public void editStudent(Student std) { 
    if(std.getEditable() == '0') { 
    std.setEditable('1'); 
    } else { 
    std.setEditable('0'); 
    } 
    studentFacade.edit(std); 
} 

меняет редактируемую колонку вручную перед вызовом метода studentFacade.edit(std). И он обновляет новые редактируемые значения в БД. Он просто не получает новые отредактированные значения из полей inputText.

studentFacade.edit метод выглядит следующим образом.

public void edit(Student entity) { 
    getEntityManager().merge(entity); 
} 

Я не могу захватить новые отредактированные значения в editStudent метод с JSF страницы. Что мне не хватает?

EDIT:

голец работал без проблем для моих оказываемых элементов. Но я изменил char на строку и заменил старую визуализацию на эту. rendered="#{std.editable eq '0'.charAt(0)}" Тот же результат. Посмотрите эти 2 фотографии.

when rendered is "0" и when rendered is "1"

Я не могу удалить вынесенное в этом случае. В противном случае вид таблицы не будет выглядеть одинаково. Есть ли лучшее решение?

EDIT 2:

1) Я использую MySQL, и он не поддерживает БУЛЕВЫ, как истинные или ложные, но не 0 или 0 значения. Итак, я не могу использовать rendered="#{std.editable}" могу ли я?

2) У меня нет <h:form> тег в datatable. Полная страница XHTML выглядит следующим образом:

<p:layout id="layout" styleClass="reg-student-layout"> 
      <p:layoutUnit id="layoutRegister" position="west" resizable="false" size="225"> 
       <h:form id="registerForm"> 
        <h3>Registrera ny student</h3> 

        <h:outputText value="Förnamn"/><h:message for="first_name"/> 
        <br><p:inputText id="first_name" value="#{studentManagedBean.student.firstName}"/></br> 

        <h:outputText value="Efternamn"/><h:message for="last_name"/> 
        <br><p:inputText id="last_name" value="#{studentManagedBean.student.lastName}"/></br> 

        <h:outputText value="Telefon"/><h:message for="tel_number"/> 
        <br><p:inputText id="tel_number" value="#{studentManagedBean.student.telefon}"/></br> 

        <h:outputText value="Adress"/><h:message for="address"/> 
        <br><p:inputText id="address" value="#{studentManagedBean.student.address}"/></br> 

        <h:outputText value="Email"/><h:message for="email"/> 
        <br><p:inputText id="email" value="#{studentManagedBean.student.email}"/></br> 

        <h:outputText value="Start Date"/><h:message for="start_date"/><br/> 
        <p:calendar id="start_date" value="#{studentManagedBean.student.startDate}" pattern="dd-MM-yyyy" /><br/> 

        <br><p:commandButton id="submit" value="Skapa Student" update="registerForm, :dataTable" 
             actionListener="#{studentManagedBean.createStudent()}" /></br> 
       </h:form> 
      </p:layoutUnit> 

      <!-- TABLE VIEW --> 
      <p:layoutUnit id="layoutTable" position="center"> 
       <p:dataTable id="dataTable" value="#{studentManagedBean.getStudents()}" var="std"> 

        <p:column> 
         <f:facet name="header">Förnamn</f:facet> 
         <p:outputLabel value="#{std.firstName}" rendered="#{std.editable eq '0'.charAt(0)}"/> 
         <p:inputText value="#{std.firstName}" rendered="#{std.editable eq '1'.charAt(0)}"/> 
        </p:column> 

        <p:column> 
         <f:facet name="header">Efternamn</f:facet> 
         <p:outputLabel value="#{std.lastName}" rendered="#{std.editable eq '0'.charAt(0)}"/> 
         <p:inputText value="#{std.lastName}" rendered="#{std.editable eq '1'.charAt(0)}"/> 
        </p:column> 

        <p:column> 
         <f:facet name="header">Telefon</f:facet> 
         <p:outputLabel value="#{std.telefon}" rendered="#{std.editable eq '0'.charAt(0)}"/> 
         <p:inputText value="#{std.telefon}" rendered="#{std.editable eq '1'.charAt(0)}"/> 
        </p:column> 

        <p:column> 
         <f:facet name="header">Adress</f:facet> 
         <p:outputLabel value="#{std.address}" rendered="#{std.editable eq '0'.charAt(0)}"/> 
         <p:inputText value="#{std.address}" rendered="#{std.editable eq '1'.charAt(0)}"/> 
        </p:column> 

        <p:column> 
         <f:facet name="header">Email</f:facet> 
         <p:outputLabel value="#{std.email}" rendered="#{std.editable eq '0'.charAt(0)}"/> 
         <p:inputText value="#{std.email}" rendered="#{std.editable eq '1'.charAt(0)}"/> 
        </p:column> 

        <p:column> 
         <f:facet name="header">Registrerad</f:facet> 
         <p:outputLabel value="#{std.startDate}" rendered="#{std.editable eq '0'.charAt(0)}"> 
          <f:convertDateTime pattern="dd-MM-yyyy"/> 
         </p:outputLabel> 

         <p:inputText value="#{std.startDate}" rendered="#{std.editable eq '1'.charAt(0)}"> 
          <f:convertDateTime pattern="dd-MM-yyyy"/> 
         </p:inputText> 
        </p:column> 

        <p:column> 
         <f:facet name="header">Edit</f:facet> 
         <p:commandLink value="edit" update=":dataTable" action="#{studentManagedBean.editStudent(std)}" rendered="#{std.editable eq '0'.charAt(0)}"/> 

         <p:commandLink style="color: royalblue" value="save" update=":dataTable" action="#{studentManagedBean.editStudent(std)}" rendered="#{std.editable eq '1'.charAt(0)}"/> 
        </p:column> 

        <p:column> 
         <f:facet name="header">Ta bort</f:facet> 
         <p:commandLink value="delete" update=":dataTable" action="#{studentManagedBean.deleteStudent(std)}"/> 
        </p:column> 
       </p:dataTable> 
      </p:layoutUnit> 
     </p:layout> 

Если я пытаюсь использовать <h:form> тег внутри <p:layoutUnit position="center">, то я получаю эту ошибку. Cannot find component with expression ":dataTable" referenced from "registerForm:submit". И я попробовал все комбинации в обновлении attr. без каких-либо успехов. Например: update="registerForm, :dataTableId", update="registerForm, :formId:dataTableId" (когда я использовал бланк), update="registerForm, :layoutUnitId:formId:dataTableId".

3) Я распечатал и получил все значения полей из существующего объекта. Там ничего плохого.

+0

Чтобы исключить одно и другое, удалите 'rendered' и повторите попытку. EL не любит 'char' таким образом, и это должно быть сделано по-другому (обычно с перечислением или в этом случае простым' boolean', поскольку, очевидно, нет других состояний). Возможный дубликат: http://stackoverflow.com/questions/14454261/rendered-attribute-not-working-on-a-character-property/ – BalusC

+0

@BalusC благодарит вас за ответ. Я проверил ссылку, которую вы предоставили, но мне это не помогло. Я добавил два скриншота, чтобы показать вам мою проблему. – oxyt

+0

Вам не нужно постоянно удалять 'rendered'. Только один раз для тестирования, чтобы вы могли исключить его логику из-за проблемы, с которой вы сталкиваетесь. Сделайте это, и если это сработает, тогда мы знаем, что это действительно причина всего этого, тогда мы знаем, где искать, чтобы решить проблему. Одним из способов устранения проблемы является просто устранение. Лучше всего это сделать, просто создав MCVE, как указано в http://stackoverflow.com/tags/jsf/info. В противном случае вы получите только слепые/образованные догадки в качестве ответов вместо того, чтобы точно объяснить и решить вашу реальную проблему. – BalusC

ответ

0

Я нашел свою проблему. В моем методе editStudent я использовал экземпляр global student вместо экземпляра (std), переданного в метод, и он работал нормально.

public void editStudent(Student std) { 
    if(std.getEditable() == '0') { 
    std.setEditable('1'); 
    } else { 
    std.setEditable('0'); 
    } 
    studentFacade.edit(student); 
} 
Смежные вопросы