无法在GateIn 3.1 GA中使用向导示例

时间:2011-10-07 15:30:54

标签: jsf richfaces facelets gatein

我无法让Richfaces wizard example在GateIn 3.1中工作。

我使用的是JSF 1.2,Facelets 1.1.15,GateIn 3.1 GA,Richfaces 3.3.3,IE8。

我在这里转发,因为我过去在stackoverflow上运气很好(最初发布在JBoss用户论坛上但没有收到任何回复)。

我完全按照示例创建了文件,但是当我单击第一页上的“下一步”按钮时,下一页不会包含(显示不会更改)。

我应该补充一点,我在尝试获取此处描述的Max Katz模型向导示例时遇到了同样的问题: http://mkblog.exadel.com/2010/06/richfaces-wizard-inside-modal-panel/

我在IE8和Chrome中遇到同样的问题。

注意:我还尝试将<redirect/>添加到导航规则中,当我单击“下一步”按钮时,整个portlet将转到空白页面。

调试时有什么帮助吗?我把log4j调到DEBUG但是没有看到任何关于错误的提示。

另一个区别是我们使用Spring。

以下是faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<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_1_2.xsd"
    version="1.2">
    <application>
        <view-handler>org.jboss.portletbridge.application.PortletViewHandler</view-handler>
        <state-manager>org.jboss.portletbridge.application.PortletStateManager</state-manager>
    </application>

    <!-- SPRING INTEGRATION TO JSF -->
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>

    <application>
        <locale-config>
            <default-locale>en</default-locale>
            <supported-locale>es</supported-locale>
            <supported-locale>en</supported-locale>
        </locale-config>
    </application>

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

    <managed-bean>
        <managed-bean-name>profile</managed-bean-name>
        <managed-bean-class>com.Profile</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>

    <navigation-rule>
        <from-view-id>/richfaces/include/examples/wstep1.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>next</from-outcome>
            <to-view-id>/richfaces/include/examples/wstep2.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule> 

    <navigation-rule>
        <from-view-id>/richfaces/include/examples/wstep2.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>previous</from-outcome>
            <to-view-id>/richfaces/include/examples/wstep1.xhtml</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>next</from-outcome>
            <to-view-id>/richfaces/include/examples/finalStep.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule> 

    <navigation-rule>
        <from-view-id>/richfaces/include/examples/finalStep.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>previous</from-outcome>
            <to-view-id>/richfaces/include/examples/wstep2.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>

这是spring-beans.xml中的bean:

<bean id="profile" class="com.Profile" scope="request" >
</bean>

这是start.xhtml(完全来自演示):

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

    <style type="text/css">
        .col1 { vertical-align:top; }
        .col2 { vertical-align:top; width:450px; }
        .wizard { width:400px; }
        .wform td { vertical-align:top; }
        .wfcol1 { text-align: right; white-space:nowrap;}
        .wfcol2 { }
        .wfcol3 { }
        .s1row td { height:30px; }
        .rich-message { color:red;  }
        .navPanel {
            position:absolute;
            bottom:0;
            height:23px;
            margin:0;
            padding:2px;
        }
    </style>
    <br/>
    <h:panelGrid width="100%" columns="2" columnClasses="col1,col2">
        <a4j:keepAlive beanName="profile" />
        <rich:panel styleClass="wizard">
            <f:facet name="header">
                <h:outputText value="Using a4j:include for Wizard-like behaviour" />
            </f:facet>
            <h:form>
                <a4j:include viewId="/richfaces/include/examples/wstep1.xhtml" />
            </h:form>
        </rich:panel>
    </h:panelGrid>
    <br/>
</ui:composition>

这是wstep1.xhtml(此页面最初在portlet中加载):

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

    <div style="position:relative;height:140px">
        <h:panelGrid rowClasses="s1row" columns="3" columnClasses="wfcol1,wfcol2,wfcol3">
            <h:outputText value="First Name:" />
            <h:inputText id="fn" value="#{profile.firstName}" label="First Name" required="true" />
            <rich:message  for="fn" />

            <h:outputText value="Last Name:" />
            <h:inputText  id="ln" value="#{profile.lastName}"  label="Last Name"  required="true" />
            <rich:message  for="ln" />

            <h:outputText value="Company:" />
            <h:inputText id="comp" value="#{profile.company}"  label="Company"  required="true" />
            <rich:message for="comp"/>
        </h:panelGrid>
        <div class="navPanel" style="width:100%;">
            <a4j:commandButton style="float:right" action="next" value="Next &gt;&gt;"/>
        </div>
    </div>
</ui:composition>

以下是portlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app
    xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"
    version="2.0">

    <portlet>
        <portlet-name>Rule Portlet</portlet-name>
        <display-name>Rule Editor</display-name>
        <portlet-class>javax.portlet.faces.GenericFacesPortlet</portlet-class>
        <init-param>
            <name>javax.portlet.faces.defaultViewId.view</name>
            <value>/start.xhtml</value>
        </init-param>
        <init-param>
            <name>javax.portlet.faces.preserveActionParams</name>
            <value>true</value>
        </init-param>
        <supports>
            <mime-type>text/html</mime-type>
            <portlet-mode>VIEW</portlet-mode>
        </supports>
        <portlet-info>
            <title>Rule Editor</title>
        </portlet-info>
    </portlet>
</portlet-app>

以下是web.xml

<?xml version="1.0" encoding="UTF-8"?>
<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_2_5.xsd"
    id="WebApp_ID" version="2.5">

    <display-name>Filter Portal</display-name>

    <context-param>
        <param-name>org.jboss.portletbridge.WRAP_SCRIPTS</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.portlet.faces.renderPolicy</param-name>
        <param-value>ALWAYS_DELEGATE</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.RESOURCE_URI_PREFIX</param-name>
        <param-value>rfRes</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadStyleStrategy</param-name>
        <param-value>ALL</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadScriptStrategy</param-name>
        <param-value>ALL</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.DEVELOPMENT</param-name>
        <param-value>false</param-value>
    </context-param>

    <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>/faces/*</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>10</session-timeout>
    </session-config>

    <!-- Spring Configuration -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-beans.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>

    <context-param>
        <param-name>com.sun.faces.IS_SAVE_BINDINGS_STATE</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.BUILD_BEFORE_RESTORE</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.RESOURCE_RESOLVER</param-name>
        <param-value>com.CustomResourceResolver</param-value>
    </context-param>
</web-app>

1 个答案:

答案 0 :(得分:0)

我认为你的web.xml中有三个最后一个参数可能存在问题。他们知道会导致AJAX问题(我也有这些问题)。关于这些参数的文献很少。虽然我发现了关于它们的评论:

<!-- Undocumented, so using "default"...(should be used in conjunction with following 2 parameters)
<context-param>
        <param-name>com.sun.faces.IS_SAVE_BINDINGS_STATE</param-name>
        <param-value>false</param-value>
</context-param>
-->
<!-- http://javaspecialist.wordpress.com/2010/05/30/performance-tuning-of-seam-jsf-richfaces-for-webapps/
BUILD_BEFORE_RESTORE:
         Idea behind using buildBeforeRestore is to restore the view even if the associated session
         has expired and thereby avoiding the ViewExpiredException.
         Setting it to true, Facelets can build view before request processing
         instead of state saving. But this will cause some other issues.
 RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE:
         In JSF 1.2 with Facelets, you can reduce the memory overhead by not saving
         the ValueExpressions. But for this you also need to set
         the BUILD_BEFORE_RESTORE to true, which can cause unpredictable behaviour
         for the components.

This paramS from facelets is notorious for breaking some of the Ajax components.
Seen with Richfaces Ajax4jsf. There isn’t any documented work around for this.
Hence explicitly turn both BUILD_BE… and RECREATE… to false.
--> 

这种知识的来源:
http://code.google.com/p/java-education/source/browse/trunk/JPA-Spring-JSF/CZU-PEF-DataModelling/web-gui/src/main/webapp/WEB-INF/web.xml?spec=svn200&r=200

所以我建议你从web.xml中注释掉这个:

<context-param>
        <param-name>facelets.BUILD_BEFORE_RESTORE</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.RESOURCE_RESOLVER</param-name>
        <param-value>com.CustomResourceResolver</param-value>
    </context-param>

希望它会有任何帮助。