I use Shale, MyFaces, and Tiles and am very satisfied with that combination. I try to stay fairly current using the Shale nightly builds (I am currently using 20070817). My versions are Shale 1.1.0, MyFaces 1.1.5, Tomahawk 1.1.5, and Tiles "tiles-core-2.0-r468346-SNAPSHOT.jar". Excerpts from my files follow:
----------faces-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <!-- Tiles Integration --> <application> <view-handler> org.apache.shale.tiles.TilesViewHandler </view-handler> </application> -------------- faces-config-rules.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <navigation-rule> <from-view-id>/contactsLocaleMnt.jsp</from-view-id> <navigation-case> <from-outcome>cancel</from-outcome> <to-view-id>/contactsLocaleMntSearch.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/contactsLocaleMntSearch.jsp</from-view-id> <navigation-case> <from-outcome>cancel</from-outcome> <to-view-id>/menuContacts.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>testClear</from-outcome> <to-view-id>/contactsLocaleMnt.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>new</from-outcome> <to-view-id>/contactsLocaleMnt.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>selected</from-outcome> <to-view-id>/contactsLocaleMnt.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/systemLogoff.jsp</from-view-id> <navigation-case> <from-outcome>cancel</from-outcome> <to-view-id>/menuHome.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/systemLogon.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/systemLogon.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/menuHome.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/systemLogoff.jsp</from-view-id> <navigation-case> <from-outcome>cancel</from-outcome> <to-view-id>/menuHome.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/systemLogon.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>*</from-view-id> <navigation-case> <from-outcome>contactsLocaleMntSearch</from-outcome> <to-view-id>/contactsLocaleMntSearch.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>menuHome</from-outcome> <to-view-id>/menuHome.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>systemLogoff</from-outcome> <to-view-id>/systemLogoff.jsp</to-view-id> </navigation-case> ------------- starraLayout.jsp <f:view> <html> <head> <link href="<h:outputText value="#{facesContext.externalContext.requestContextPath}"/><h:outputText value="#{msg['style.base']}"/>" rel="stylesheet" type="text/css"/> <title><tiles:attribute flush="false" name="title"/></title> </head> <body background="<h:outputText value="#{facesContext.externalContext.requestContextPath}"/><h:outputText value="#{msg['img.background.app']}"/>"/> <table border="0" cellspacing="5" width="100%" > <tr> <td colspan="2"><tiles:attribute flush="false" name="header"/></td> </tr> <tr> <td valign="top" width="13%"> <tiles:attribute flush="false" name="menuBar"/> </td> <td valign="top"> <tiles:attribute flush="false" name="body"/> </td> </tr> <tr> <td align="center" colspan="2"> <tiles:attribute flush="false" name="info"/> </td> </tr> <tr> <td align="center" colspan="2"> <tiles:attribute flush="false" name="footer"/> </td> </tr> </table> </body> </html> </f:view> ------------- index.jsp <jsp:forward page="systemLogon.faces"/> <------------ logon.jsp <%@ include file="/jspf/common/taglibs.jsp" %> <%@ include file="/jspf/common/messages.jsp" %> <h:form id="logon"> <h:panelGrid border="1" cellspacing="2" cellpadding="2" columns="2" footerClass="starraPanelGridFooter" headerClass="starraPanelGridHeader" styleClass="starraBody"> <f:facet name="header"> <h:outputText value="#{msg['class.system.Logon']}"/> </f:facet> <h:outputLabel for="logonName"> <h:outputText value="#{msg['app.Logon.name']}"/> <h:outputText value="#{msg['symbol.sep1']}"/> </h:outputLabel> <h:panelGroup> <h:inputText id="logonName" maxlength="24" required="true" size="24" value="#{systemLogon.logonName}"> <f:validateLength minimum="4" maximum="24"/> </h:inputText> <h:message for="logonName" styleClass="starraMsgError"/> </h:panelGroup> <h:outputLabel for="logonPassword"> <h:outputText value="#{msg['app.Logon.password']}"/> <h:outputText value="#{msg['symbol.sep1']}"/> </h:outputLabel> <h:panelGroup> <h:inputText id="logonPassword" maxlength="24" required="true" size="24" value="#{systemLogon.logonPassword}"> <f:validateLength minimum="4" maximum="24"/> </h:inputText> <h:message for="logonPassword" styleClass="starraMsgError"/> </h:panelGroup> <f:facet name="footer"> <h:panelGroup styleClass="starraButtons"> <h:commandButton action="#{systemLogon.logon}" id="logonSub1" value="#{msg['button.Submit']}"/> </h:panelGroup> </f:facet> </h:panelGrid> </h:form> --------------------- localeMnt.jsp <%@ include file="/jspf/common/taglibs.jsp" %> <%@ include file="/jspf/common/messages.jsp" %> <t:saveState id="ssBean" value="#{contactsLocaleMnt.ssBean}"/> <t:saveState id="ssBean1" value="#{contactsLocaleMnt.ssBean1}"/> <h:form id="localeMnt"> <h:panelGrid border="1" cellspacing="2" cellpadding="2" columns="2" footerClass="starraPanelGridFooter" headerClass="starraPanelGridHeader" styleClass="starraBody"> <f:facet name="header"> <h:outputText value="#{msg['class.contacts.LocaleMnt']}"/> </f:facet> <f:facet name="footer"> <h:panelGroup styleClass="starraButtons"> <h:commandButton action="#{contactsLocaleMnt.create}" id="mntButtonsCreate" value="#{msg['button.Create']}"/> <h:commandButton action="#{contactsLocaleMnt.update}" id="mntButtonsUpdate" value="#{msg['button.Update']}"/> <h:commandButton action="#{contactsLocaleMnt.delete}" id="mntButtonsDelete" value="#{msg['button.Delete']}"/> <%@ include file="/jspf/common/mntButtons1.jsp" %> <h:commandButton action="#{contactsLocaleMnt.clearMnt}" id="mntButtonsClear" value="#{msg['button.Clear']}"/> <%@ include file="/jspf/common/mntButtons2.jsp" %> </h:panelGroup> </f:facet> <h:outputLabel styleClass="starraReadonly"> <h:outputText value="#{msg['app.Locale.id']}"/> <h:outputText value="#{msg['symbol.sep1']}"/> </h:outputLabel> <h:panelGroup> <h:inputText id="syLocaleId" readonly="true" value="#{contactsLocaleMnt.ssBean.syLocaleId}"/> </h:panelGroup> <h:outputLabel for="name"> <h:outputText value="#{msg['app.Name']}"/> <h:outputText value="#{msg['symbol.sep1']}"/> </h:outputLabel> <h:panelGroup> <h:inputText id="name" maxlength="32" required="true" size="32" value="#{contactsLocaleMnt.ssBean.name}"> <f:validateLength minimum="4" maximum="32"/> </h:inputText> <h:message for="name" styleClass="starraMsgError"/> </h:panelGroup> ... </h:form> -----------------------------web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- Display name for this application --> <display-name>Starr Accounting</display-name> <!-- Select JSF State Saving Mode --> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <!-- JSF Configuration Resources (comma-separated list) --> <context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value> /WEB-INF/conf/faces-config.xml, /WEB-INF/conf/faces-config-beans.xml, /WEB-INF/conf/faces-config-menus.xml, /WEB-INF/conf/faces-config-rules.xml </param-value> </context-param> <!-- Commons Chain Configuration Resources --> <context-param> <param-name>org.apache.commons.chain.CONFIG_WEB_RESOURCE</param-name> <param-value>/WEB-INF/conf/chain-config.xml</param-value> </context-param> <!-- Dialog Configuration Resources (comma-separated list) --> <context-param> <param-name>org.apache.shale.dialog.CONFIGURATION</param-name> <param-value>/WEB-INF/conf/dialog-config.xml</param-value> </context-param> <!-- Spring ApplicationContext Configuration (space separated list) --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/conf/spring.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> com.starrcs.common.SpringInitListener </listener-class> </listener> <!-- Tiles --> <context-param> <param-name>definitions-config</param-name> <param-value>/WEB-INF/conf/tiles.xml</param-value> </context-param> <listener> <listener-class> org.apache.tiles.listener.TilesListener </listener-class> </listener> <!-- Shale Application Controller Filter --> <filter> <filter-name>shale</filter-name> <filter-class> org.apache.shale.application.faces.ShaleApplicationFilter </filter-class> </filter> <!-- Shale Application Controller Filter Mapping --> <filter-mapping> <filter-name>shale</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> <!-- Commons Chain Configuration Listener --> <listener> <listener-class> org.apache.commons.chain.web.ChainListener </listener-class> </listener> <!-- Initialize singletons --> <listener> <listener-class> com.starrcs.common.StarraInitListener </listener-class> </listener> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- Session filter --> <filter> <filter-name>sessionFilter</filter-name> <filter-class>com.starrcs.common.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>*.faces</url-pattern> </filter-mapping> <!-- JavaServer Faces Servlet Configuration --> <servlet> <servlet-name>faces</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <!-- JavaServer Faces Servlet Mapping --> <servlet-mapping> <servlet-name>faces</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <servlet> <servlet-name>log4j-init</servlet-name> <servlet-class>com.starrcs.system.Log4jInitServlet</servlet-class> <init-param> <param-name>log4j-init-file</param-name> <param-value>/WEB-INF/conf/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- Welcome File List --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/tiles/common/error.faces</location> </error-page> <error-page> <exception-type>javax.faces.FacesException</exception-type> <location>/tiles/common/error.faces</location> </error-page> <error-page> <error-code>500</error-code> <location>/tiles/common/error.faces</location> </error-page> </web-app>