использование f: viewParam с требуемым атрибутом и командами

Я хочу поделиться своим опытом с помощью primefaces, f:viewParam и P: commandButton и задать несколько вопросов.Взгляните на эту страницу:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
  <h:head></h:head>
  <h:body>  
    <f:metadata>
      <f:viewParam required="true" name="id_file" value="#{bean.idFile}" />
    </f:metadata>
    <h:form id="tableform" prependId="false">              
      <p:commandButton actionListener="#{bean.myMethod())}" icon="ui-icon-search" title="View" />
    </h:form>
    <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" />      
  </h:body>
</html>

у резервного компонента есть метод " myMethod ()", который ничего не делает. Когда вы входите на страницу, он ожидает параметр "id_file" и помещает его в свойство idFile резервного компонента. Затем вы нажимаете кнопку, и вызывается myMethod. Затем вы нажимаете еще раз, и вы получаете неясную ошибку проверки, и myMethod никогда крикнул:

j_idt1: Validation Error: Value is required.j_idt1: Validation Error: Value is required.

прежде всего, помните, что без P: messages вы не можете видеть это сообщение, вы должны копать XML, который primefaces отправляют на вызовы ajax. Во-вторых, после 4 часов отладки я попытался изменить f: viewParam следующим образом:

<f:viewParam name="id_file" value="#{bean.idFile}" />

без "требуется": магически все начинает работать, я могу нажать 1,2,3 и т. д.,и myMethod вызывается каждый раз. Итак, проблема в том, что ajax submit проверяет параметр, указанный с помощью f:viewParam, это звучит глупо для меня, но ладно, я могу жить с этим.

мои вопросы:

  • почему эта ошибка проверки не появляется при первом нажатии кнопки? Если вы посмотрите на сообщения ajax, они идентичны

  • предполагается, что нормально проверять параметры представления (которые, по моей идее, принадлежат представлению) при частичном вызове ajax?

  • есть ли способ сказать primefaces не проверять на конкретном ajax запрос (process="@this" не разрешает)?

Спасибо, я надеюсь, что мой опыт позволит вам избежать расходов часов отладки!

1 ответов


  1. на viewParam это UIComponent. Это означает, что семантически он ничем не отличается от <h:commandButton/> или <h:inputText/> и он может пройти через каждый предписанный этап жизненного цикла обработки запросов JSF, вплоть до проверки и преобразования. На самом деле, сам тег заставляет любой данный вид идти в полную обработку любой данной страницы, просто находясь там

  2. на <p:commandButton/> собирается делать postback, что означает, что это будет повторный запрос того же представления, используя сообщение. Поэтому, чтобы решить вашу текущую проблему, вам нужно основывать необходимое условие на этом факте:

    <f:viewParam  required="#{!facesContext.postback}" name="id_file" value="{bean.idFile}"/>
    

    что вы получаете от нового условия, так это то, что параметр будет необходим только при первом запросе. Последующие обратные связи не вызовут этого условия. Просто убедитесь, что у вас нет никакой логики (возможно в @PostConstruct это построено вокруг этого ожидания