2010-10-28 2 views
1

У меня довольно обширная форма для сбора данных. Основная проблема заключается в том, что мне всегда нужно дважды щелкнуть кнопку отправки, чтобы форма была отправлена. В первый раз, когда я его нажимаю, он просто освежает и ничего не делает. Почему это так? В моей форме есть много входного текста.Почему я должен дважды нажимать кнопку отправки?

Есть также некоторые меню динамического выбора, в которых его список элементов изменяется в зависимости от выбранного элемента в другом меню. Мое подозрение заключается в том, что проблема заключается здесь в том, что существуют valueChangeListener, onchange = "submit()" и direct = "true", которые могут иметь некоторые побочные эффекты, которые я не совсем понимаю. Однако я не получаю сообщений об ошибках. Кто-нибудь сталкивался с такой проблемой раньше?

<h:commandButton type="submit" value="Add Job Profile" action="{formBean.commitData}"/> 

    public void commitData() { 
    QueryRunner run = new QueryRunner(ds); 
    String insertSql = "sql command here"; 

    try { 
     int numberOfCommits = run.update(insertSql); 
     if (numberOfCommits > 0) { 
      JOptionPane jop = new JOptionPane("Inserted " + numberOfCommits +"record"); 
      JDialog dialog = jop.createDialog("Upload complete"); 
      dialog.setAlwaysOnTop(true); 
      dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      dialog.setVisible(true); 
     } else { 
      JOptionPane jop = new JOptionPane("Upload failed. Please try again."); 
      JDialog dialog = jop.createDialog("Upload failed"); 
      dialog.setAlwaysOnTop(true); 
      dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      dialog.setVisible(true); 

     } 

    } catch (SQLException sqle) { 
     sqle.printStackTrace(); 
    } 
} 

Я даже не получил сообщение об ошибке при первом нажатии. При втором нажатии загрузка выполняется успешно.

EDIT: Это динамические меню выбора. Я могу отправить первый клик, если я удалю эти меню. Но как я могу это решить?

<h:outputLabel value="Family: " /> 
<h:selectOneMenu id="selectFamily" 
       value = "#{formBean.selectedFamily}" 
       valueChangeListener="#{menuBean.changeFamily}" 
       onchange="submit()" 
       immediate = "true" > 
<f:selectItems id="familyNames" value="#{menuBean.familyNames}" /> 
</h:selectOneMenu> 


<h:outputLabel value="Function: " /> 
<h:selectOneMenu id="selectFunction" 
       value="#{formBean.selectedFunction}" 
       immediate="true" > 

<f:selectItems id="functionNames" 
       value="#{menuBean.functions}" /> 
</h:selectOneMenu> 

    // listen for family change and render relevant function 
     public void changeFamily(ValueChangeEvent event) { 
      FacesContext context = FacesContext.getCurrentInstance(); 
      String value = (String) event.getNewValue(); 
      switchFunctions(value); 
      context.renderResponse(); 
     } 
+0

Вы пробовали установить немедленное = "true" на кнопку? – Steven

+0

yup уже сделал это, и это еще больше ухудшило ситуацию. все передается как null в моих полях ввода. –

ответ

1

У меня была аналогичная проблема, показывающая всплывающие окна. После того, как всплывающее окно было показано, нажатие кнопки отправки только обновило всплывающее окно. Данные не синхронизировались с управляемым компонентом. Однако, когда кнопка была нажата снова, она отправила данные.

Я решил, изменив код, который показывает всплывающее из ...

<a4j:commandButton value="Reserve" disabled="#{login.mayReserve == false}" immediate="true" 
     title="To set an available number to the Reserved state." 
     oncomplete="#{rich:component('selectCustomer')}.show();" render="selectCustomer" > 
    <f:setPropertyActionListener target="#{managementController.menuAction}" value="Reserve" /> 
</a4j:commandButton> 

К ...

<a4j:commandButton value="Reserve" disabled="#{login.mayReserve == false}" immediate="true" 
     title="To set an available number to the Reserved state." render="selectCustomer" > 
    <f:setPropertyActionListener target="#{managementController.menuAction}" value="Reserve" /> 
    <a4j:ajax event="click" oncomplete="#{rich:component('selectCustomer')}.show()" reRender="@all" /> 
</a4j:commandButton> 

Я не уверен, что технические особенности этого являются но, возможно, это помогает кому-то идти вперед ...

0

Видимо valueChangeListener получил вызвали на представить, как хорошо. Строка context.renderResponse() приведет к полному пропуску фазы приложения-приложения. valueChangeListener будет запущен, когда начальное значение меню не совпадает с представленным значением. Проверьте это.

Во всяком случае, наличие синхронных выпадающих меню, подобных этому в сочетании с проверкой на других полях ввода в одной и той же форме, на самом деле является питой. Поэтому, чтобы сделать длинный рассказ коротким, вот только ссылка: populate child menus (in JSF).

+0

hi BalusC, ваш метод, вероятно, работает, но я думаю, что его слишком много кода для выполнения такой простой задачи. Я нашел более простое решение ajax по адресу http://www.coreservlets.com/JSF-Tutorial/jsf2/#Ajax. Пробовал это, и это работает. Primefaces также предлагает другое простое решение ajax: http://www.primefaces.org/showcase/ui/pprSelect.jsf, хотя я еще не пробовал это. –

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