husted      2002/10/20 10:05:19

  Added:       doc/proposals struts-faces.xml
  Log:
  Add Craig's advice regarding Struts-Faces.
  
  Revision  Changes    Path
  1.1                  jakarta-struts/doc/proposals/struts-faces.xml
  
  Index: struts-faces.xml
  ===================================================================
  <?xml version="1.0"?>
  <document url="./struts-faces-1.xml">
  
    <properties>
      <author>Craig R. McClanahan</author>
      <title>About Struts and JavaServer Faces [forward-looking]</title>
    </properties>
  
    <body>
  
  <section name="background" href="Background">
  <p>
  [18-Sep-2002] JavaServer Faces (JSF) is being developed as JSR 127 under the Java
  Community Process, with the goal of creating a standard framework for user
  interface components to be used in web applications.  Included will be the
  following basic features:
  </p>
  
  <ul>
  <li>
    User interface component model
  </li>
  
  <li>
    Event handling model
  </li>
  
  <li>
    Validation framework
  </li>
  
  <li>
    Flexible rendering model (plugin support for rendering different
    kinds of HTML, or different markup languages and technologies)
  </li>
  
  <li>
    A standard RenderKit (and associated Renderers) for generating basic
    HTML/4.01 markup.  This library is primarily for making JSF useful
    out of the box, and allow apps to be portable across JSF
    implementations.  However, we expect a lot of innovation in this
    area among competing JSF implementations.
  </li>
  </ul>
  
  <p>
  All of the above functionality is available via standard Java APIs, and is
  thus not tied to JavaServer Pages (JSP).  However, because a large
  majority of JSF users will also be using JSP, an additional set of
  requirements is included in the JSF specification, including:
  </p>
  
  <ul>
  <li>
    A standard tag library for generic things that are independent of
    the specific RenderKit in use (such as adding a validator to a
    component).
  </li>
  
  <li>
    A standard tag library for the basic HTML RenderKit, with a tag for
    each combination of a component type and a method of rendering that
    component type.  An example will make this clearer -- consider the
    UISelectOne component, which represents a list of options, and allows
    only a single option from the list to be selected.  Such a component
    can be rendered in three different ways (in the basic HTML RenderKit),
    each with a different Renderer and a corresponding custom tag:<br/>
  
    &lt;h:selectone_listbox> - Display a list of all the possible
    options (expanding the box to include all of them so that no scrollbar
    is required).<br/>
  
    &lt;h:selectone_menu> -  Display as a combo box (the traditional HTML
    &lt;select> element with size="1").<br/>
  
    &lt;h:selectone_radio> - Display as a set of radio buttons and
    corresponding labels.
  </li>
  </ul>
  
  <p>
  Note that the application developer doesn't know or care which mechanism
  was used to display this component -- that's up to the page author, who
  will pick the desired representation by virtue of which tag he or she
  selects (at the Java API level, you make this choice by setting the
  "rendererType" property on the component instance).  This is one of the
  many advances that JSF provides over Struts tags, where there is one and
  only one way to render each individual element.
  </p>
  
  <p>
  There are also provisions for creating more complex components like grids,
  tree controls, and the like -- a common theme you will see is "compose
  complex things out of little things" -- that is accomplished in JSP by
  nesting component tags inside each other, just like you nest HTML &lt;input>
  elements inside a &lt;form> element.
  </p>
  
  <p>
  For more information about JavaServer Faces, and an early access draft of
  the specification (and an early access version of the RI that corresponds
  to an even earlier draft of the spec), you'll want to bookmark:
  </p>
  
  <p>
    <a 
href="http://java.sun.com/j2ee/javaserverfaces/";>http://java.sun.com/j2ee/javaserverfaces/</a>
  </p>
  
  <p>
  In addition, there is a forum on the Java Developer Connection (free
  registration required) focused on JavaServer Faces, so please ask your
  general Faces-related questions there instead of here.  Here's a direct
  link to the forum page:
  </p>
  
  <p>
    <a 
href="http://java.sun.com/j2ee/javaserverfaces/";>http://forums.java.sun.com/forum.jsp?forum=427</a>
  </p>
  
  <p>
  Note that JavaServer Faces depends on Servlet 2.3 and JSP 1.2 (i.e. J2EE
  1.3 containers).
  </p>
  </section>
  
  <section href="struts" name="How does this affect Struts?">
  <p>
  At first glance, the low level components sound a lot like the struts-html
  tag library that Struts users know and love.  Indeed, there is a very
  substantial amount of overlap.  So, what's going to happen?
  </p>
  
  <p>
  In my JavaOne BOF on Struts (March, 2002), I made the statement that
  Struts would have a very clean integration with JSF, so that you can use
  JSF components in your user interface, but continue to use the controller,
  Actions, and associated business logic.  Indeed, I stated that it will be
  possible to transition your application from using Struts HTML tags to
  using Faces component tags, one page at a time -- in most cases, with zero
  changes to the business logic or Action classes and minimal changes to the
  &lt;forward> elements in your struts-config.xml configuration file.
  </p>
  
  <p>
  Along with developing JavaServer Faces itself (I am the specification lead
  for JSR-127), I have been working on just such an integration library for
  Struts (1.1 only; sorry in advance to 1.0 users).  While not completed
  yet, it is clear that the goals stated in the previous paragraph are
  achieveable with the current evolving design of JSF.  While things can
  always change in the future, many JSR-127 expert group members consider
  high quality integration with Struts to be an important success factor for
  JavaServer Faces to be accepted.  Therefore, I do not expect that JSF will
  evolve in ways that make this kind of integration difficult or impossible.
  </p>
  
  <p>
  From the developer's perspective, you will need to do only the following
  to start using JSF components in your pages:
  </p>
  
  <ul>
  <li>
    Add a new struts-faces.jar file, and the JAR files for an
    appropriate JSF implementation, to your /WEB-INF/lib directory.
  </li>
  
  <li>
    Note that JSF and the JSP Standard Tag Library (JSTL) interoperate
    very nicely, so you will also be able to use JSTL tags in your
    new pages if you wish to.
  </li>
  
  <li>
    Add a couple of elements to your web.xml deployment descriptor,
    corresponding to the requirements outlined in Chapter 9 of the
    JSF specification.
  </li>
  
  <li>
    Transition one page at a time to use the new tag libraries,
    making an appropriate modification to the &lt;forward> elements
    for your pages (the URL needs to change to meet Faces requirements).
  </li>
  </ul>
  
  <p>
  The integration library will be available as a separately packaged
  download that runs with Struts 1.1, and will include a converted copy of
  the canonical struts-example web application so that you can see exactly
  what had to change in order to use Struts with JSF.
  </p>
  
  <p>
  Besides the integration classes themselves (primarily an implementation of
  the JSF ApplicationHandler API), the library will include some
  Struts-flavored components and renderers that provide functionality
  similar to that provided by the existing struts-html tags, when this is
  not provided by the standard JSF components.  For example, there will be a
  Struts version of the UIForm component that accepts an "action" attribute
  that looks up the corresponding action mapping, and creates the form bean
  as needed, just like the &lt;html:form> tag does today.
  </p>
  
  <p>
  The good news -- development of this integration library is well under
  way.
  </p>
  
  <p>
  The bad news -- you can't see it quite yet.  This is primarily because it
  relies on changes to JSF that have occurred since the early access release
  of the RI was published, so you wouldn't be able to use it anyway.
  However, as soon as it is feasible, this library will be added to the
  "contrib" folder of Struts, with the sources (and downloadable
  distributions) available under the usual Apache license terms.  (The
  source code will also give you a head start at creating your own JSF
  components, too).
  </p>
  </section>
  
  <section href="choices" name="So what user interface technology should i choose?">
  <p>
  Everyone's functionality and schedule requirements are different.
  However, the following points summarize my basic recommendations and
  thoughts about the future:
  </p>
  
  <ul>
  <li>If you have existing Struts-based applications that use the existing
    HTML tag library, feel free to continue to use them if you wish.
    Struts 1.1 offers full support for this existing functionality.
  </li>
  
  <li>
    Once the integration library becomes available, you should do some
    experimenting and prototyping to determine the effort required to
    migrate your apps to the new JSF component architecture (I'm betting
    that the extra functionality you gain by doing this will be well
    worth the effort in many cases).  As described above, the actual
    migration can be done piecemeal -- it doesn't need to happen all
    at once.
  </li>
  
  <li>
    For applications now (or about to be) under development that have
    relatively short term schedules (i.e. the next few months), you
    should probably stick with the existing HTML library.
  </li>
  
  <li>
    For applications with a longer lead time, seriously consider waiting
    for the ability to use JSF components instead of the Struts HTML
    tag library.  Doing this will let you leverage not only the standard
    HTML components that come with JSF out of the box, but also the rich
    libraries of JSF components likely to be created by third parties in
    the future (including Struts developers).
  </li>
  </ul>
  
  <p>
  For Struts after 1.1 is released, the developers haven't yet had formal
  conversations (which will happen on STRUTS-DEV) about what a future Struts
  will look like.  However, I'm going to continue to advocate a long term
  migration to using standards like JSF and JSTL when they are available,
  and de-emphasize the further development of the Struts proprietary tag
  libraries.
  </p>
  
  <p>
  The Struts tag libraries have had a tremendous positive impact on the
  development of the standard Java APIs for user interfaces.  I joked with
  the JSTL spec lead that Struts users would *never* accept JSTL without an
  expression language at least as powerful as the Struts one; and there is
  more than a little truth to that statement :-).  The same thing is
  happening now for the HTML tags -- and it's time for us to start migrating
  to the standards, which gives us the time to focus on extending Struts in
  other directions in the future.
  </p>
  
  <p>
  Comments?  Questions?  If it's about Struts, or Struts/JSF integration,
  feel free to ask about these issues on STRUTS-DEV or STRUTS-USER (although
  I'm going to be relatively incommunicado over the next week; I'll be in
  Yokohama at JavaOne Japan and only intermittently connected to email).
  Questions about JSF itself should be addressed to the JSF forum at the URL
  listed above.
  </p>
  
  <p>
  And thanks to all of you for your continued support and use of Struts --
  the community that has developed around this framework continues to amaze
  and humble me.
  </p>
  
  <p>
  Craig McClanahan
  </p>
  </section>
  </body>
  </document>
  
  
  
  

--
To unsubscribe, e-mail:   <mailto:struts-dev-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:struts-dev-help@;jakarta.apache.org>

Reply via email to