использование 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 ответов
на
viewParam
этоUIComponent
. Это означает, что семантически он ничем не отличается от<h:commandButton/>
или<h:inputText/>
и он может пройти через каждый предписанный этап жизненного цикла обработки запросов JSF, вплоть до проверки и преобразования. На самом деле, сам тег заставляет любой данный вид идти в полную обработку любой данной страницы, просто находясь там-
на
<p:commandButton/>
собирается делать postback, что означает, что это будет повторный запрос того же представления, используя сообщение. Поэтому, чтобы решить вашу текущую проблему, вам нужно основывать необходимое условие на этом факте:<f:viewParam required="#{!facesContext.postback}" name="id_file" value="{bean.idFile}"/>
что вы получаете от нового условия, так это то, что параметр будет необходим только при первом запросе. Последующие обратные связи не вызовут этого условия. Просто убедитесь, что у вас нет никакой логики (возможно в
@PostConstruct
это построено вокруг этого ожидания