Author: craigmcc Date: Fri Jun 10 22:29:58 2005 New Revision: 190078 URL: http://svn.apache.org/viewcvs?rev=190078&view=rev Log: Add the beginnings of the Shale Framework web site, and the merest outline of the web site for the Struts-JSF integration library.
Added: struts/core/trunk/doc/faces/ struts/core/trunk/doc/faces/index.xml struts/core/trunk/doc/faces/project.xml struts/core/trunk/doc/shale/ struts/core/trunk/doc/shale/features.xml struts/core/trunk/doc/shale/index.xml (with props) struts/core/trunk/doc/shale/project.xml Modified: struts/core/trunk/doc/project.xml Added: struts/core/trunk/doc/faces/index.xml URL: http://svn.apache.org/viewcvs/struts/core/trunk/doc/faces/index.xml?rev=190078&view=auto ============================================================================== --- struts/core/trunk/doc/faces/index.xml (added) +++ struts/core/trunk/doc/faces/index.xml Fri Jun 10 22:29:58 2005 @@ -0,0 +1,39 @@ +<?xml version="1.0"?> +<document url="index.html"> + + <properties> + <title>Struts and JavaServer Faces Interation Library</title> + </properties> + + <body> + + + <section name="Struts-Faces Welcome" href="welcome"> + + <p>FIXME - Welcome to the Struts-Faces Integration Library.</p> + + </section> + + + <section name="Struts-Faces Download" href="download"> + + <p>Nightly builds of the Struts-Faces Integration Library are available from + <a href="http://cvs.apache.org/builds/struts/nightly/struts-faces/"> + http://cvs.apache.org/builds/struts/nightly/struts-faces/</a>.</p> + + </section> + + + <section name="Struts-Faces Issue Tracking" href="issue"> + + <p>Please report any bugs, or log any enhancement requests, in the + <a href="http://issues.apache.org/bugzilla">Apache Issue Tracking System</a>, + using product <code>Struts</code> and component + <code>Struts-Faces Library</code>.</p> + + </section> + + + </body> + +</document> Added: struts/core/trunk/doc/faces/project.xml URL: http://svn.apache.org/viewcvs/struts/core/trunk/doc/faces/project.xml?rev=190078&view=auto ============================================================================== --- struts/core/trunk/doc/faces/project.xml (added) +++ struts/core/trunk/doc/faces/project.xml Fri Jun 10 22:29:58 2005 @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<project name="Struts Framework" + href="http://struts.apache.org/bsf" + image="images/struts.gif"> + + <title>Struts and JavaServer Faces Integration Library</title> + + <menu name="Struts-Faces"> + <item name="Welcome" href="index.html#welcome"/> + <item name="Download" href="index.html#download"/> + <item name="Issue Tracking" href="index.html#issue"/> + </menu> + + <menu name="Quick Links"> + <item name="Struts" href="../index.html"/> + <item name="JavaServer Faces" href="http://java.sun.com/j2ee/javaserverfaces"/> + <item name="Shale Framework" href="../shale/index.html"/> + </menu> + +</project> + + + + + + Modified: struts/core/trunk/doc/project.xml URL: http://svn.apache.org/viewcvs/struts/core/trunk/doc/project.xml?rev=190078&r1=190077&r2=190078&view=diff ============================================================================== --- struts/core/trunk/doc/project.xml (original) +++ struts/core/trunk/doc/project.xml Fri Jun 10 22:29:58 2005 @@ -41,6 +41,14 @@ href="bsf/index.html" /> <item + name="JavaServer Faces Integration" + href="faces/index.html" + /> + <item + name="Shale Framework" + href="shale/index.html" + /> + <item name="Struts Flow" href="flow/index.html" /> Added: struts/core/trunk/doc/shale/features.xml URL: http://svn.apache.org/viewcvs/struts/core/trunk/doc/shale/features.xml?rev=190078&view=auto ============================================================================== --- struts/core/trunk/doc/shale/features.xml (added) +++ struts/core/trunk/doc/shale/features.xml Fri Jun 10 22:29:58 2005 @@ -0,0 +1,443 @@ +<?xml version="1.0"?> +<document url="index.html"> + + <properties> + <title>Shale Framework Features</title> + </properties> + + <body> + + + <section name="Shale View Controller" href="view"> + + + <subsection name="Introduction" href="view-introduction"> + + <p>Shale supports a mechanism that provides a 1:1 relationship between + a view tier presentation technology, which is responsible for creating + an HTTP response (such as a JSP page), and a corresponding JavaBean class + containing event handling logic, (optionally) values used in the dynamic + rendering of the response, and (optionally) bindings to the individual + user interface components included in the response page. Such a JavaBean + class is known (in JavaServer Faces terminology) as a <em>backing bean</em>. + In most circumstances, such a bean will be registered as a managed bean + (configured for creation in request scope).</p> + + <p>JavaServer Faces does not require that a backing bean implement any + particular interface, or extend any particular base class. Therefore, + Shale does not impose any such restriction either. Instead, it promises + that <em>if</em> an application's backing bean implements the + <code>ViewController</code> interface, then certain extra services will + be provided "for free."</p> + + </subsection> + + + <subsection name="Provided Services" href="view-services"> + + <p>Each backing bean that implements <code>ViewController</code> will + support a boolean property <code>postback</code>, which will be set to + <code>true</code> if this view is the one that is processing a form + submit previously rendered by the same page, or <code>false</code> if + this view was newly navigated to. The property will be set before any + of the lifecycle methods described below are called, so that application + logic may perform conditional tasks based on this state.</p> + + <p>As part of the standard JavaServer Faces managed beans processing, any + <code><managed-property></code> elements in the configuration + file, that are nested inside the <code><managed-bean></code> + element for this backing bean, will also be processed when a new bean + instance is created. You can use either literal values or value binding + expressions to customize properties on your backing bean class. Fans + of <em>Dependency Injection</em> will see that the managed beans facility + provides support for such a framework, using Setter Injection as the + mechanism for injecting dependencies.</p> + + <p>In addition, the following lifecycle events are called, by the + framework, at certain points in the JavaServer Faces request processing + lifecycle:</p> + + <ul> + <li><strong>init()</strong> - Called immediately after the view that + this backing bean is associated with is created. (Technically, it + happens when <code>ViewManager.createView()</code> is called.) + For a postback, this happens during the <em>Restore View</em> + phase of the request processing lifecycle, once it ha been + determined which view should be restored. If your application + navigates from one page to another, the <code>init()</code> method + of the second page will be called as part of the + <code>NavigationHandler.handleNavigation()</code> processing. + <blockquote> + Use this method to acquire resources that you will need, no + matter whether this is a postback request, a rendering request, + or both. + </blockquote></li> + <li><strong>preprocess()</strong> - Called after the <em>Restore View</em> + phase has been completed, but before <em>Apply Request Values</em> + phase starts, <strong>only</strong> for the view that will be + processing the postback. + <blockquote> + Use this method to acquire resources (such as database connections) + that you will need to process the postback. + </blockquote></li> + <li><strong>prerender()</strong> - Called immediately before the + <em>Render Response</em> phase that actually causes the view to + be rendered. This method will <strong>only</strong> be called for + the view that is actually rendered (the current view if you are + redisplaying, or the new view if you perform navigation). + <blockquote> + Use this method to acquire resources (such as database connections, + or performing queries) that you will need if this view is the one + to be rendered. NOTE - when portlet support is integrated, all of + the portlets on the current page will receive this event. + </blockquote></li> + <li><strong>destroy()</strong> - If <code>init()</code> was ever called + for a <code>ViewController</code>, then it is guaranteed that + <code>destroy()</code> will be called as well. + <blockquote> + Use this method to release any resources acquired during an earlier + event handler. + </blockquote></li> + </ul> + + <p>It can be difficult initially to visualize the order that events will + occur, based solely on the descriptions above. Let's look at some + common scenarios and see what happens when:</p> + + <ul> + <li><em>Initial navigation to welcome page, or a page directly accessed + via a URL</em>: + <ul> + <li>Backing bean is instantiated during <em>Restore View</em> phase, + which notices that there is no previous state to restore.</li> + <li>The <code>setPostback(false)</code> and <code>init()</code> methods + on your backing bean are called.</li> + <li>Because there is no previous state to restore, there will be no + form submit processing.</li> + <li>The <code>prerender()</code> method is called.</li> + <li>Standard <em>Render Response</em> phase processing occurs, + which causes the view to be rendered.</li> + <li>The <code>destroy()</code> method is called.</li> + </ul></li> + <li><em>Postback processed by a page that then redisplays itself (by + returning <code>null</code> from the action handler.</em>: + <ul> + <li>Backing bean is instantiated during <em>Restore View</em> phase, + which notices that there is previous state to restore.</li> + <li>The <code>setPostback(true)</code> and <code>init()</code> methods + on your backing bean are called.</li> + <li>Standard <em>Apply Request Values</em> through <em>Invoke + Application</em> phase processing occurs, which includes calling + your action and value change event handlers.</li> + <li>The <code>prerender()</code> method is called.</li> + <li>Standard <em>Render Response</em> phase processing occurs, + which causes the view to be rendered.</li> + <li>The <code>destroy()</code> method is called.</li> + </ul></li> + <li><em>Postback processed by page A, which then navigates to page B</em>: + <ul> + <li>Backing bean for page A is instantiated during <em>Restore View</em> + phase, which notices that there is previous state to restore.</li> + <li>The <code>setPostback(true)</code> and <code>init()</code> methods + on your backing bean for page A are called.</li> + <li>Standard <em>Apply Request Values</em> through <em>Invoke + Application</em> phase processing occurs for page A, which + includes calling your action and value change event handlers.</li> + <li>As part of the navigation process, the backing bean for + page B is created.</li> + <li>The <code>prerender()</code> method for page B is called.</li> + <li>Standard <em>Render Response</em> phase processing occurs, + which causes the view to be rendered.</li> + <li>The <code>destroy()</code> method is called for both page B + and page A (since two backing beans were instantiated).</li> + </ul></li> + </ul> + + </subsection> + + + <subsection name="Using View Controller" href="view-using"> + + <p>For each JavaServer Faces <em>view</em> that you wish to associate + with a <code>ViewController</code> backing bean, you must:</p> + + <ul> + <li>Implement the <code>ViewController</code> interface. The + most convenient way to do this is likely to be extending the + convenience base class (<code>org.apache.shale.view.ViewController</code>).</li> + <li>As required by the JavaBeans specification, provide a no-args + public constructor.</li> + <li>Declare your backing bean as a managed bean. In nearly all + circumstances, you will want the bean to be placed in + request scope.</li> + <li>(Optional) Provide public JavaBean properties that may be set + to customize the functionality provided by this bean. Typically, + such properties will be configured based on the managed beans + configuration defined in the JavaServer Faces configuration + resources for your application.</li> + <li>Ensure that the functionality of your backing bean is + <strong>not</strong> dependent upon the order in which property + setters are called, since managed beans are configured via + the "setter injection" pattern.</li> + <li>Create event handlers for the lifecycle events of interest, + plus standard JavaServer Faces event handlers for things like + actions and value changes.</li> + <li>(Optional but recommended) write a corresponding JUnit test + case using the Shale <a href="features.html#test">Test Framework</a>. + Because nearly all of your property and event handling methods + have no JavaServer Faces API dependencies for their parameter + signatures, it is generally quite easy to write such tests.</li> + </ul> + + </subsection> + + + </section> + + + <section name="Shale Dialog Manager" href="dialog"> + + + <subsection name="Introduction" href="dialog-introduction"> + + <p>One of the frustrating aspects of organizing the flow of control + in a web based application is that fact that it is composed of + completely disconnected interactions with the client (via the + HTTP protocol). The popularity of application frameworks based + on model-view-controller (MVC) principles, and particularly the + emergence of the <em>front controller</em> design pattern, have + become the de facto standard architectural approach.</p> + + <p>Like other frameworks, JavaServer Faces supports a mechanism + to define navigation rules for transitions between views. The + actual processing is performed by an implementation of + the <code>javax.faces.application.NavigationHandler</code>. The + standard implementation provided by the framework (which can be + customized via a pluggable API) performs transitions from one view + to another based on three inputs:</p> + + <ul> + <li>What view is currently processing this form submit?</li> + <li>Which of the potentially several actions were invoked? (This + allows you to support different "submit" buttons with different + functionality, or share actions between, say, a "Save" button + at the top and bottom of a table.)</li> + <li>What "logical outcome" was returned by the action that was + invoked?</li> + </ul> + + <p>Basing navigation on outcomes, by the way, assists in reducing + the coupling between pages, because the developer that writes the + action method is only focused on reporting "what happened" rather + than worrying about "where do I go next". This concept is also + found in the way Struts has <code>Action.execute()</code> methods + that return a logical <code>ActionForward</code> describing the + outcome of performing the action.</p> + + <p>However, it is still difficult to reuse individual views in + more than one "conversation" or "dialog" with the user, nor to + treat one dialog as a "black box" subroutine that can be called by + more than one calling dialog. To address these needs, Shale + offers Dialog Manager support.</p> + + <p>The functionality of this feature was <strong>heavily</strong> + inspired by the implementation of Spring Webflow (Preview 2), + whose home page is:</p> + <blockquote> + <a href="http://opensource.atlassian.com/confluence/spring/display/WEBFLOW/Home"> + http://opensource.atlassian.com/confluence/spring/display/WEBFLOW/Home</a> + </blockquote> + + </subsection> + + + <subsection name="Services Provided" href="dialog-services"> + + <p>Conceptually, a <em>dialog</em> can be thought of as a set of labelled + states, connected by labelled transitions between those states. Indeed, + a UML <em>State Diagram</em> is a popular way to represent the + architecture of such a dialog. Each dialog has a specified starting + state (with an automatic transition to this state when the dialog is + first started), and one or more ending states.</p> + + <p>Shale supports four state types, with specific implementations + realized as described below.</p> + + <ul> + <li><em>ActionState</em> - Represents a call to a public method, taking + no parameters, and returning a String that will be treated as the + logical outcome. The method to be called is configured with a + JavaServer Faces <em>method binding expression</em>, which means + you can leverage the managed beans facility to instantiate your + processing classes on demand. The logical outcome is used to + drive the transition to the next state, as described below.</li> + <li><em>ViewState</em> - Represents the rendering of a JavaServer Faces + <em>view</em>, followed by a wait for the subsequent form submit. + The logical outcome returned by the action method (typically on + the <code>ViewController</code> bean that you've associated with + the current page) is used to drive the transition to the next + state, as described below.</li> + <li><em>SubdialogState</em> - Represents pushing the state of the + current dialog onto a stack, and starting a specified new dialog + at its starting state. When the subordinate dialog returns, the + calling dialog is resumed, with the logical outcome returned by + the subordinate dialog is used to drive the transition to the next + state, as described below.</li> + <li><em>EndState</em> - Terminates the current dialog (popping the + stack if we are inside a subdialog), and returns a logical outcome + (to drive transition) in one of two ways: + <ul> + <li>If a view identifier was configured, cause that view to be + rendered and return the logical outcome from the application + action that is invoked (just like a ViewState, but also + terminates the dialog).</li> + <li>If no view identifier was configured (meaning that the parent + dialog will be responsible for rendering the response to the + current request), simply return the logical outcome that + caused this EndState to be selected.</li> + </ul></li> + </ul> + + <p>Transitions between states are performed by consulting the set of + <em>Transition</em>s that have been defined (either locally for this + State, or globally for the entire Dialog), matching on logical outcome. + The matching Transition is then used to select the identifier of the + next state to be performed (which can be of any type).</p> + + <p>It is <strong>not</strong> required that all JavaServer Faces + interactions be organized into dialogs -- you can have a mix of + dialog and standard navigation processing. Indeed, to enter a + dialog in the first place, simply have one of your standard action + methods return a logical outcome of <strong>dialog:xxxxx</strong>, + which will cause the dialog named <code>xxxxx</code> to be entered + at its starting state. Once that dialog completes, standard + JavaServer Navigation will resume.</p> + + <p>The configuration of a Dialog is represented as a tree of + JavaBeans defined in the <code>org.apache.shale.dialog</code>code> + package, rooted at an instance <code>Dialog</code>. The set of + all known <code>Dialog</code> instances is stored in a <code>Map</code>, + keyed by dialog identifier, which is stored in an application scope + attribute named by symbolic constant <code>Globals.DIALOGS</code>. + The <code>Dialog</code> instances may be configured by any desired + mechanism; however, the most commonly used will likely be an XML + document that conforms to a DTD provided by Shale.</p> + + </subsection> + + + <subsection name="Using Dialog Manager" href="dialog-using"> + + <p>To use the Dialog Manager facilities in Shale, take the following + steps:</p> + + <ul> + <li>Model your dialog as a series of <em>State</em>s with transitions + between them labelled with the logical outcome that selects + that particular transition. A UML State Diagram is a very useful + mechanism for visualizing such a model.</li> + <li>Build the views (and corresponding <code>ViewController</code> beans) + that comprise your dialog, using standard JavaServer Faces and + (optional) Shale <code>ViewController</code> facilities.</li> + <li>Define your dialogs in an XML document, conventionally named + <code>/WEB-INF/dialog-config.xml</code>, that conforms to the + required DTD, which defines all the state transitions: + <blockquote><pre> +<!DOCTYPE dialogs PUBLIC + "-//Apache Software Foundation//DTD Shale Dialog Configuration 1.0//EN" + "http://struts.apache.org/dtds/shale-dialog-config-1_0.dtd"> + +<dialogs> + + <dialog name="First Dialog Name" start="Start State Id"> + ... <action/>, <view/>, <subdialog/>, and <exit/> elements for states ... + </dialog> + + <dialog name="Second Dialog Name" start="Start State Id"> + ... <action/>, <view/>, <subdialog/>, and <exit/> elements for states ... + </dialog> + + ... + +</dialogs> +</pre></blockquote></li> + <li>If you have more than one dialog configuration file, or you have + defined your only dialog configuration file as a web application + resource with a name different than the one described above, use + a context initiaization parameter to define a comma-delimited list + of context-relative paths to configuration resources to be loaded: + <blockquote><pre> +<context-param> + <param-name>org.apache.shale.dialog.CONFIGURATION</param-name> + <param-value>/WEB-INF/foo.xml,/WEB-INF/bar.xml</param-value> +</context-param> +</pre></blockquote></li> + <li>In addition to the dialog configuration resources defined by this + context initialization parameter, a resource named + <code>/WEB-INF/dialog-config.xml</code> will be automatically + processed, if it exists.</li> +<!-- + <li>Alternatively, or in addition to the above, any JAR file in + <code>/WEB-INF/lib</code> will be scanned for configuration + documents at <code>META-INF/dialog-config.xml</code>. Such + resources will be automatically processed, making it easy to + define JAR files with dialog configurations and corresponding + Java classes and resources, which are recognized simply by + including this JAR file in the application.</li> +--> + <li>To initiate a dialog named "xxxxx", configure one of your standard + JavaServer Faces actions to return a logical outcome of + <code>dialog:xxxxx</code></li> + </ul> + + </subsection> + + + </section> + + + <section name="Shale Application Manager" href="application"> + + <p>FIXME - Describe application manager feature.</p> + + </section> + + + <section name="Shale Validation" href="validation"> + + <p>FIXME - Describe validation feature.</p> + + </section> + + + <section name="Shale Remoting" href="remoting"> + + <p>FIXME - Describe remoting feature.</p> + + </section> + + + <section name="Shale Spring Integration" href="spring"> + + <p>FIXME - Describe Spring integration feature.</p> + + </section> + + + <section name="Shale Reusable Views" href="clay"> + + <p>FIXME - Describe Clay plugin feature.</p> + + </section> + + + <section name="Shale Test Framework" href="test"> + + <p>FIXME - Describe Test Framework feature.</p> + + </section> + + + </body> + +</document> Added: struts/core/trunk/doc/shale/index.xml URL: http://svn.apache.org/viewcvs/struts/core/trunk/doc/shale/index.xml?rev=190078&view=auto ============================================================================== --- struts/core/trunk/doc/shale/index.xml (added) +++ struts/core/trunk/doc/shale/index.xml Fri Jun 10 22:29:58 2005 @@ -0,0 +1,115 @@ +<?xml version="1.0"?> +<document url="index.html"> + + <properties> + <title>Shale Framework</title> + </properties> + + <body> + + + <section name="Shale Framework" href="background"> + + <p>FIXME - Shale Framework background. While waiting for this section + to be completed, the <a href="http://people.apache.org/~craigmcc/struts-shale-README.html"> + Original Shale Proposal</a> makes for interesting reading.</p> + + </section> + + + <section name="Shale Features" href="features"> + + <p>The major features of the Shale Framework are described in the + following detail sections:</p> + + <ul> + <li><a href="features.html#view">View Controller</a> - Convenient + mechanism to associate a "backing" Java class with each + JavaServer Faces <em>view</em> in an application, with predefined + event handers for events significant to an application developer.</li> + <li><a href="features.html#dialog">Dialog Manager</a> - Mechanism to + define a "conversation" with a user that requires multiple HTTP + requests to implement, modeled as a state diagram.</li> + <li><a href="features.html#application">Application Manager</a> - + Traditional application wide front controller features that should + be applied to every request.</li> + <li><a href="features.html#validation">Validation</a> - Integration with + the <a href="http://jakarta.apache.org/commons/validator/"> + Jakarta Commons Validator Framework</a>, supporting both client side + and server side validations based on a single set of configured + validation rules.</li> + <li><a href="features.html#remoting">Remoting</a> - Server side support + for applications that employ <a href="http://wikipedia.org/wiki/AJAX"> + AJAX</a> (Asynchronous JavaScript and XML) style interactions.</li> + <li><a href="features.html#spring">Spring Integration</a> - Integration + with the <a href="http://www.springframework.org">Spring Framework</a>, + allowing the use of Spring's dependency injection framework to create + JavaServer Faces managed beans.</li> + <li><a href="features.html#clay">Reusable Views</a> - An innovative + sub-framework for supporting the configuration of reusable subtrees + of JavaServer Faces components for customizable reuse.</li> + <li><a href="features.html#test">Test Framework</a> - Set of mock objects + and <a href="junit.org">JUnit</a> test case base classes suitable for + testing both the framework classes themselves, as well as application + components built on top of the framework.</li> + </ul> + + </section> + + + <section name="Shale Download" href="download"> + + <p>Nightly builds of Shale are available from + <a href="http://cvs.apache.org/builds/struts/nightly/struts-shale/"> + http://cvs.apache.org/builds/struts/nightly/struts-shale/</a>. + For convenience, there are four available packages:</p> + + <ul> + <li><a href="http://cvs.apache.org/builds/struts/nightly/struts-shale/core-library/"> + Core Library</a> - The fundamental core of Shale, required for + all applications using the framework.</li> + <li><a href="http://cvs.apache.org/builds/struts/nightly/struts-shale/clay-plugin/"> + Clay Plug-In</a> - Library supporting reusable view fragments.</li> + <li><a href="http://cvs.apache.org/builds/struts/nightly/struts-shale/test-framework/"> + Test Framework</a> - Library of mock objects and convenience base + classes for JUnit test cases, suitable for testing both the framework + itself and the components of applications built on top of Shale.</li> + <li><a href="http://cvs.apache.org/builds/struts/nightly/struts-shale/use-cases/"> + Use Cases Sample App</a> - Composite set of use case based examples + of Shale features.</li> + </ul> + + </section> + + + <section name="Shale Documentation" href="documentation"> + + <p>Online Javadocs for Shale (based on the SVN trunk) are + periodically updated at:</p> + + <ul> + <li><a href="http://people.apache.org/~craigmcc/shale-core-javadocs/"> + Core Library</a>.</li> + <li><a href="http://people.apache.org/~craigmcc/shale-clay-javadocs/"> + Clay Plug-In</a>.</li> + <li><a href="http://people.apache.org/~craigmcc/shale-test-javadocs/"> + Test Framework</a>.</li> + <li><a href="http://people.apache.org/~craigmcc/shale-usecases-javadocs/"> + Use Cases Sample App</a>.</li> + </ul> + + </section> + + + <section name="Shale Issue Tracking" href="issue"> + + <p>Please report any bugs, or log any enhancement requests, in the + <a href="http://issues.apache.org/bugzilla">Apache Issue Tracking System</a>, + using product <code>Struts</code> and component <code>Shale</code>.</p> + + </section> + + + </body> + +</document> Propchange: struts/core/trunk/doc/shale/index.xml ------------------------------------------------------------------------------ svn:executable = * Added: struts/core/trunk/doc/shale/project.xml URL: http://svn.apache.org/viewcvs/struts/core/trunk/doc/shale/project.xml?rev=190078&view=auto ============================================================================== --- struts/core/trunk/doc/shale/project.xml (added) +++ struts/core/trunk/doc/shale/project.xml Fri Jun 10 22:29:58 2005 @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<project name="Struts Framework" + href="http://struts.apache.org/shale" + image="images/struts.gif"> + + <title>Shale Framework</title> + + <menu name="Shale"> + <item name="Background" href="index.html#background"/> + <item name="Features" href="index.html#features"/> + <item name="Download" href="index.html#download"/> + <item name="Documentation" href="index.html#documentation"/> + <item name="Issue Tracking" href="index.html#issue"/> + </menu> + + <menu name="Features"> + <item name="View Controller" href="features.html#view"/> + <item name="Dialog Manager" href="features.html#dialog"/> + <item name="Application Manager" href="features.html#application"/> + <item name="Validation" href="features.html#validation"/> + <item name="Remoting" href="features.html#remoting"/> + <item name="Spring Integration" href="features.html#spring"/> + <item name="Reusable Views" href="features.html#clay"/> + <item name="Test Framework" href="features.html#test"/> + </menu> + + <menu name="Quick Links"> + <item name="Struts" href="../index.html"/> + <item name="JavaServer Faces" href="http://java.sun.com/j2ee/javaserverfaces"/> + <item name="Struts-Faces Integration Library" href="../faces/index.html"/> + </menu> + + +</project> + + + + + + --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]