2014-01-19 7 views
5

Я хочу поделиться своим опытом использования primefaces, F viewParam и р: CommandButton, и задать несколько questions.Take посмотреть на этой странице:с помощью е: viewParam с обязательным атрибутом и команды

<?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. 

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

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

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

Мои вопросы:

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

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

  • Есть ли способ рассказать, чтобы строки не проверялись на конкретный запрос ajax (process = "@ this" не разрешается)?

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

ответ

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

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

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

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

+0

Спасибо вам Kolossus, он работает, как я ожидал, в настоящее время. Но я до сих пор удивляюсь, почему первый щелчок кнопки не генерирует любая ошибка проверки, я имею в виду, также в первом вызове ajax у меня нет «id_file», или нет? –

+0

@moretti.fabio - не совсем уверен, кажется мне странным. Вы переходите на эту страницу из другого? Или вы загружаете страницу заново? – kolossus

+0

Я пробовал загружать страницу с нуля, исходя из другой страницы и обновляя страницу с помощью ctrl + f5, результат всегда один и тот же: первая работа клика, последующие клики нет. –

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