0

I've tried to investigate the problem but haven't found solution at all. I use primefaces datatable with pagination. I wrote and exception handler for viewexpiredexception error as Ed Burns suggested in his blog but when used in combiation with ajax submits (eg. datatable page navigation) the page redirection on vee is not handled. I used the solution suggested by BalusC here JSF Status bar / connection status information but chrome says it's missing jsf.ajax.* javascript namespace. The page runs on tomcat 7.0.22 with no error/warning at startup and back-end is based on spring and mybatis. Here is the web.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_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_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>

here is the faces-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>

and here is the index.xhtml page:

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

I've put more than needed just for tests. The alert("1") and "2" does not show and jsf.ajax.add... raise error in browser. If I look and generated page in chrome I can't see any inclusion of jsf.js bundled into mojarra package. Where is the flaw?

Thanks to anyone and sorry for the lenght!

Community
  • 1
  • 1
crick77
  • 65
  • 8
  • I see that jsf.js is present in jsf-impl-2.1.6.jar. Just to confirm on your end can you include this tag inside your form and see if jsf.js is included in the page source. – Ravi Kadaboina Feb 04 '12 at 18:25
  • Yes, Ravi...adding a h: element into form added jsf.js to the script inclusion list. I tought that just adding the namespaces, h:head and h:form elements would resolve every needed inclusion. I found another solution by myself by just redirecting to the expired-info page using faces-redirect=true param. I'm trying right now to use original solution with jsf.ajax javascipt functions. I will tell you! Thanks anyway for your reply! – crick77 Feb 05 '12 at 10:10
  • Ouch...the functions are REALLY present but declared **AFTER** my scripts! The – crick77 Feb 05 '12 at 10:27
  • If you use – Ravi Kadaboina Feb 06 '12 at 04:19
  • Hi @Ravi I include script with normal script tag into h:head section (as you can see in the source). But the problem is that when I add h:commandLink as you suggested, the jsf.js script is included into the body tag (I saw generated html) right at the same place where h:commandLink was declared and not in the head section. So the script is declared AFTER the real use and brwoser won't find it. Need to move my script at the bottom of the page and use h:outputScript tags... Thank you for your reply! – crick77 Feb 06 '12 at 09:14

1 Answers1

1

The problem is that you are using primefaces components (<p:commandButton) <p:commandButton id="bEnter" value="Entra" action="#{accessMode.onEntraClick}" update="growl"/> try this: <h:commandButton id="bEnter" value="Entra" action="#{accessMode.onEntraClick}"> <f:ajax execute="@form" render="growl"/> </h:commandButton>

primefaces register their own callbacks and any jsf.ajax.* won't be able to be executed from primefaces components.