Пакет PrimeFaces 3.0 + Mojarra 2.1.6 javascript ajax jsf.ajax.* недоступен — ViewExpiredException

Я пытался исследовать проблему, но не нашел решения вообще. Я использую первичные данные с нумерацией страниц. Я написал и обработчик исключений для ошибки viewexpiredexception, как предложил Эд Бернс в своем блоге, но при использовании в сочетании с отправкой ajax (например, навигация по страницам с данными) перенаправление страницы на vee не обрабатывается. Я использовал решение, предложенное BalusC здесь, JSF Statusbar/информация о состоянии соединения, но chrome говорит, что отсутствует пространство имен jsf.ajax.* javascript. Страница работает на tomcat 7.0.22 без ошибок/предупреждений при запуске, а серверная часть основана на spring и mybatis. Вот веб.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

    <application>  
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>  
    </application> 

    <factory>
      <exception-handler-factory>it.dipvvf.vi.app.common.ViewExpiredExceptionExceptionHandlerFactory</exception-handler-factory>
  </factory>
</faces-config>
5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <title>Prova</title>
    <script type="text/javascript">
    var statusUpdate = function statusUpdate(data) {
        var statusArea = document.getElementById("statusArea");
        var text = statusArea.value;
        text = text + "Name: "+data.source.id;
        if (data.type === "event") {
            text = text +" Event: "+data.name+"\n";
        } else {  // otherwise, it's an error
            text = text + " Error: "+data.name+"\n";
        }
        statusArea.value = text;
    };

    // Setup the statusUpdate function to hear all events on the page
    alert("0");
    jsf.ajax.addOnEvent(statusUpdate);
    alert("1");
    jsf.ajax.addOnError(statusUpdate);
    alert("2");
    </script>
</h:head>
<h:body>
    <h:form>
Selezionare il tipo di accesso:<br />
        <p:selectOneMenu id="somAccessMode" value="#{accessMode.mode}">
            <f:selectItem itemValue="#{accessMode.ufficioPersonale}"
                itemLabel="Ufficio Personale" />
            <f:selectItem itemValue="#{accessMode.capoTurno}"
                itemLabel="Capo Turno" />
        </p:selectOneMenu>
        <br />
        <p:commandButton id="bEnter" value="Entra"
            action="#{accessMode.onEntraClick}" update="growl" />
        <br />
        <p:dataTable var="nominativo" value="#{accessMode.elencoNominativi}" paginator="true" rows="1"  
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                 rowsPerPageTemplate="5,10,15">
            <p:column>
                <f:facet name="header">  
                    Cognome  
                </f:facet>
                <h:outputText value="#{nominativo.cognome}" />
            </p:column>

            <p:column>
                <f:facet name="header">  
                    Nome  
                </f:facet>
                <h:outputText value="#{nominativo.nome}" />
            </p:column>

            <p:column>
                <f:facet name="header">  
                    Data Iscrizione  
                </f:facet>
                <h:outputText value="#{nominativo.iscrizione}">
                    <f:convertDateTime pattern="dd-MM-yyyy" />
                </h:outputText>
            </p:column>
        </p:dataTable>
        <hr />
        <br />
        <!-- <p:messages showDetail="true" autoUpdate="true"/>   -->
        <p:growl id="growl" showDetail="true" sticky="true" />
        <h3>Status:</h3>
        <textarea id="statusArea" cols="40" rows="10" readonly="readonly" />
    </h:form>
</h:body>
</html>
0.xsd" version="3.0"> <display-name>Discontinui</display-name> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <context-param> <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> <param-value>resources.application</param-value> </context-param> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.jsf</welcome-file> </welcome-file-list> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <session-config> <session-timeout>2</session-timeout> </session-config> </web-app>

вот face-config.xml

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

    <application>  
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>  
    </application> 

    <factory>
      <exception-handler-factory>it.dipvvf.vi.app.common.ViewExpiredExceptionExceptionHandlerFactory</exception-handler-factory>
  </factory>
</faces-config>

и вот страница index.xhtml:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <title>Prova</title>
    <script type="text/javascript">
    var statusUpdate = function statusUpdate(data) {
        var statusArea = document.getElementById("statusArea");
        var text = statusArea.value;
        text = text + "Name: "+data.source.id;
        if (data.type === "event") {
            text = text +" Event: "+data.name+"\n";
        } else {  // otherwise, it's an error
            text = text + " Error: "+data.name+"\n";
        }
        statusArea.value = text;
    };

    // Setup the statusUpdate function to hear all events on the page
    alert("0");
    jsf.ajax.addOnEvent(statusUpdate);
    alert("1");
    jsf.ajax.addOnError(statusUpdate);
    alert("2");
    </script>
</h:head>
<h:body>
    <h:form>
Selezionare il tipo di accesso:<br />
        <p:selectOneMenu id="somAccessMode" value="#{accessMode.mode}">
            <f:selectItem itemValue="#{accessMode.ufficioPersonale}"
                itemLabel="Ufficio Personale" />
            <f:selectItem itemValue="#{accessMode.capoTurno}"
                itemLabel="Capo Turno" />
        </p:selectOneMenu>
        <br />
        <p:commandButton id="bEnter" value="Entra"
            action="#{accessMode.onEntraClick}" update="growl" />
        <br />
        <p:dataTable var="nominativo" value="#{accessMode.elencoNominativi}" paginator="true" rows="1"  
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                 rowsPerPageTemplate="5,10,15">
            <p:column>
                <f:facet name="header">  
                    Cognome  
                </f:facet>
                <h:outputText value="#{nominativo.cognome}" />
            </p:column>

            <p:column>
                <f:facet name="header">  
                    Nome  
                </f:facet>
                <h:outputText value="#{nominativo.nome}" />
            </p:column>

            <p:column>
                <f:facet name="header">  
                    Data Iscrizione  
                </f:facet>
                <h:outputText value="#{nominativo.iscrizione}">
                    <f:convertDateTime pattern="dd-MM-yyyy" />
                </h:outputText>
            </p:column>
        </p:dataTable>
        <hr />
        <br />
        <!-- <p:messages showDetail="true" autoUpdate="true"/>   -->
        <p:growl id="growl" showDetail="true" sticky="true" />
        <h3>Status:</h3>
        <textarea id="statusArea" cols="40" rows="10" readonly="readonly" />
    </h:form>
</h:body>
</html>

Я поставил больше, чем нужно, просто для тестов. Предупреждение («1») и «2» не отображаются, а jsf.ajax.add... вызывает ошибку в браузере. Если я смотрю и сгенерирую страницу в chrome, я не вижу включения jsf.js в пакет mojarra. Где недостаток?

Спасибо всем и извините за длину!


person crick77    schedule 03.02.2012    source источник
comment
Я вижу, что jsf.js присутствует в jsf-impl-2.1.6.jar. Просто для подтверждения со своей стороны, можете ли вы включить этот тег ‹h:commandLink value=Main page /› внутри своей формы и посмотреть, включен ли jsf.js в исходный код страницы.   -  person Ravi Kadaboina    schedule 04.02.2012
comment
Да, Рави... добавление элемента h: в форму добавило jsf.js в список включения скриптов. Я думал, что простое добавление пространств имен, элементов h:head и h:form разрешит все необходимые включения. Я сам нашел другое решение, просто перенаправив на страницу с истекшей информацией, используя параметрfaces-redirect=true. Я пытаюсь прямо сейчас использовать оригинальное решение с функциями javascipt jsf.ajax. Я скажу тебе! Спасибо в любом случае за ваш ответ!   -  person crick77    schedule 05.02.2012
comment
Ой... функции ДЕЙСТВИТЕЛЬНО присутствуют, но объявлены ПОСЛЕ моих скриптов! Тег включения ‹script› ставится не в секцию head, а в body.form! Является ли это ошибкой времени выполнения jsf или известным поведением?   -  person crick77    schedule 05.02.2012
comment
Если вы используете тег ‹script› в ‹h:head›, он будет включен в заголовок, а если включен в ‹h:body›, он будет включен в тело. Или вы используете тег ‹h:outputScript›?   -  person Ravi Kadaboina    schedule 06.02.2012
comment
Привет, @Ravi. Я включаю скрипт с обычным тегом script в раздел h:head (как вы можете видеть в исходном коде). Но проблема в том, что когда я добавляю h:commandLink, как вы предложили, скрипт jsf.js включается в тег body (я видел сгенерированный html) именно там, где был объявлен h:commandLink, а не в секции head. Таким образом, скрипт объявляется ПОСЛЕ реального использования, и brwoser его не найдет. Нужно переместить мой скрипт внизу страницы и использовать теги h:outputScript... Спасибо за ответ!   -  person crick77    schedule 06.02.2012


Ответы (1)


Проблема в том, что вы используете компоненты Primefaces (<p:commandButton) <p:commandButton id="bEnter" value="Entra" action="#{accessMode.onEntraClick}" update="growl"/> попробуйте это: <h:commandButton id="bEnter" value="Entra" action="#{accessMode.onEntraClick}"> <f:ajax execute="@form" render="growl"/> </h:commandButton>

Primefaces регистрируют свои собственные обратные вызовы, и любой jsf.ajax. * не сможет быть выполнен из компонентов Primefaces.

person Pedro Garcia    schedule 07.03.2012