husted 2002/10/29 03:09:24 Added: doc/faqs ssl.xml project.xml newbie.xml kickstart.xml index.xml helping.xml Log: + Setup FAQ and Howto section. Revision Changes Path 1.1 jakarta-struts/doc/faqs/ssl.xml Index: ssl.xml =================================================================== <?xml version="1.0"?> <document url="./ssl.xml"> <properties> <author>Steve Ditlinger</author> <title>Secure Socket Layer and Web Applications</title> </properties> <body> <chapter href="ssl" name="Secure Socket Layer and Web Applications"> <section href="overview" name="Overview"> <p> Many web applications, especially those deployed for e-commerce, necessitate the transmission of sensitive data between the web server and the client browser. This data may include passwords, credit card numbers, bank account numbers or any other information that users would not want to divulge to the general public. To protect sensitive data during transmission, application developers typically use the Secure Sockets Layer (SSL) and its companion protocol, HTTP over Secure Sockets Layer (HTTPS). HTTPS employs SSL to protect data by encrypting it at the source, be it the server or the client, and decrypting it at the destination. This prevents anyone monitoring Internet data transmissions from easily capturing this data. The client and server exchange public keys to enable encryption and decryption to occur. </p> <p> The encryption/decryption process comes at a performance price, however. The throughput of data for a web server transmitting via HTTPS is often as little as one-tenth that of data transmission via HTTP. For this reason, it is undesirable to deploy an entire web application under SSL. For fastest performance, it is best to deploy a web application under HTTP and employ HTTPS only for those pages and processes that transmit sensitive data. </p> </section> <section href="mixing" name="Mixing Protocols in Web Applications"> <p> Switching back and forth between the two protocols can require hard-coding the protocol and full URL in every link to each resource in the web application. This creates an ongoing maintenance headache for developers each time a server name changes or secure protocol requirements change for resources in the web app. </p> <p> Another significant hazard is that there is nothing to prevent a user from specifying the wrong protocol by manually entering a URL into the browser. The penalty for manually specifying HTTPS for a page or servlet that does not require HTTPS is reduced performance. Far worse is the penalty for manually specifying HTTP for non-secure access of a page that does require HTTPS: public exposure of sensitive data. </p> </section> <section href="help" name="Help from Deployment Descriptor"> <p> To help overcome the problem of non-secure access of sensitive data, the Java Servlet Specification (versions 2.2 and 2.3) defines the transport-guarantee element of the web.xml deployment descriptor file. The transport-guarantee element must specify one of three types of protection for communication between client and server: NONE, INTEGRAL, or CONFIDENTIAL. For most containers a specification of INTEGRAL or CONFIDENTIAL is treated as a requirement for SSL usage. Web application containers will prevent users from accessing web resources over HTTP if they have been so specified. </p> <p> The implementation for blocking HTTP access to web resources specified as INTEGRAL or CONFIDENTIAL varies from container to container. If a user attempts to access such a resource over HTTP, some containers will present that user with an error message instructing them to use the HTTPS protocol for accessing the requested resource. Other containers will actually redirect the request using the HTTPS protocol, but then continue using the HTTPS protocol for all subsequent requests, even those for resources with a transport-guarantee specification of NONE. </p> </section> <section href="sslext" name="The sslext Struts Extension"> <p> An extension to Struts 1.1, named sslext, helps solve many of these issues for Struts developers. It extends the ActionConfig class, RequestProcessor, and Plugin classes to define a framework where developers may specify the transmission protocol behavior for Struts applications. Within the Struts configuration file, developers specify which action requests require HTTPS transmission and which should use HTTP. Developers can also specify whether to redirect "improperly-protocoled" requests to the correct protocol. </p> <p> In addition to these extensions, the <html:link> and the <html:form> tags have been extended. In these extensions, the Struts actions specified in either of these tags are analyzed to determine the protocol that should be used in requesting that action. The HTML generated by these tags will specify the proper protocol. An additional custom tag is defined for allowing users to specify the transmission protocol for an individual JSP. This is most often used for form-based authentication pages. </p> </section> <section href="legacy" name="Legacy Browser Issue"> <p> One additional complication faced by developers of web applications is that some browsers (e.g. pre-6.0 versions of Netscape Navigator) will treat requests to different protocols and ports on the same server as requests to different domains. This causes these browsers to initiate a new session each time a different protocol or port is specified in a request. This problem can only be solved at the container level. Some containers have a "session domain" or "cookie domain" configuration parameter to allow the session to be shared across different servers in the same domain. As an example, the Weblogic Server has a "CookieDomain" property configured in its weblogic.xml deployment descriptor. Thankfully, the effects of this problem are diminishing as people upgrade their browsers to the current versions. </p> </section> <section href="containers" name="Configuring Containers for SSL"> The procedure for configuring SSL for a container will be specific to that container. The procedure for enabling SSL for Tomcat can be found <a href="http://jakarta.apache.org/tomcat/tomcat-4.1-doc/ssl-howto.html">here</a>. </section> </chapter></body></document> 1.1 jakarta-struts/doc/faqs/project.xml Index: project.xml =================================================================== <?xml version="1.0" encoding="ISO-8859-1"?> <project name="Struts Framework" href="http://jakarta.apache.org/struts" image="images/struts.gif"> <title>Struts Framework</title> <menu name="FAQs"> <item href="kickstart.html" name="Kickstart"/> <item href="newbie.html" name="Newbie"/> <item href="helping.html" name="How to Help"/> </menu> <menu name="Howtos"> <item href="ssl.html" name="SSL"/> </menu> <menu name="Welcome"> <item name="Home" href="../index.html"/> <item name="News & Status" href="../news.html"/> <item name="FAQs and Howtos" href="../faqs/index.html"/> <item name="Resources" href="../resources/index.html"/> <item name="List Archive" href="http://nagoya.apache.org/eyebrowse/SummarizeList?listId=42"/> <item name="Who We Are" href="../volunteers.html"/> </menu> </project> 1.1 jakarta-struts/doc/faqs/newbie.xml Index: newbie.xml =================================================================== <?xml version="1.0"?> <document url="./kickstart.xml"> <properties> <author>Ted Husted</author> <author>James Holmes</author> <title>The Struts User's Guide - Newbie FAQ</title> </properties> <body> <chapter href="faq" name="Newbie FAQ"> <section href="contents" name="Index"> <p> Here are answers to 24 common questions people ask when using Struts on their first project. <b>For an in-depth, searchable FAQ, visit our friends at <a href="http://www.jguru.com/faq/home.jsp?topic=Struts">JGuru</a>.</b> </p> <p><font color="red"><b>UNDER CONSTRUCTION</b></font> (contributions welcome)</p> <ul> <li><a href="#reload">Why was reload removed from Struts 1.1?</a></li> <li><a href="#modules">What is a modular application? What does module-relative mean?</a></li> <li><a href="#naming">Why are some of the class and element names counter-intuitive?</a></li> <li>Why is ActionForm a base class rather than an interface?</li> <li>Do I have to have a separate ActionForm bean for every HTML form?</li> <li>do ActionForms have to be true JavaBeans?</li> <li>Can I use other beans or hashmaps with ActionForms?</li> <li>How can I prepopulate a form?</li> <li><a href="#multiple">Can I use multiple HTML form elements with the same name?</a></li> <li><a href="#actionforms">Why are my checkboxes not being set from ON to OFF?</a></li> <li>How can I capture binary or formatted values, like dates or telephone numbers?</li> <li>Why do my option lists disappear when validation fails?</li> <li><a href="#scriptlets">Can't I just create some of my JavaBeans in the JSP using a scriptlet?</a></li> <li><a href="#tags">Why do the Struts tags provide for so little formatting?</a></li> <li>When is the best time to validate input?</li> <li>How can I avoid validating a form before data is entered?</li> <li>How can I create a "wizard" workflow?</li> <li>How can I "chain" Actions?</li> <li>Can I have an Action without a form?</li> <li>How do I access my database?</li> <li>How can I authenticate my users?</li> <li>How can I scroll through list of pages like the search results in google?</li> <li>Can I have multiple submit buttons on the same form?</li> <li>Why can't my Javascript submit a form?</li> <li><a href="minimization">Why does the option tag render selected="selected" instead of just "selected"?</a></li> <li>Can I create dynamic ActionForwards?</li> <li>How can I use my own (ActionForm, ActionForward, ActionMapping, ActionServlet) class?</li> <li>Do I have to use JSPs with my application?</li> </ul> </section> <section href="reload" name="Why was reload removed from Struts 1.1?"> <p>ReloadAction is not supported in 1.1 for two reasons:</p> <ul> <li>It never did let you reload everything that you would really want to -- particularly changed classes -- so many people ended up having to reload the webapp anyway.</li> <li>Not supporting ReloadAction lets Struts avoid doing synchronization locks around all the lookups (like figuring out which action to use, or the destination of an ActionForward) so apps can run a little faster.</li> </ul> </section> <section href="modules" name="What is a modular application? What does module-relative mean?"> <p> Since Struts 1.1, the framework supports multiple application modules. All applications have at least one root, or default, module. Like the root directory in a file system, the default application has no name. (Or is named with an empty string, depending your viewpoint.) Developing an application with only a default module is no different from how applications were developed under Struts 1.0. Since Struts 1.1, you can add additional modules to your application, each of which can have their own configuration files, messages resources, and so forth. Each module is developed in the same way as the default module. Applications that were developed as a single module can added to a multiple module application, and modules can promoted to a standalone application without change. For more about configuring your application to support multiple modules, see <a href="userGuide/building_controller.html#module_config">Building Controller Components</a> in the User Guide. </p> <p> But to answer the question =:0), a modular application is a Struts application that uses more than one module. Module-relative means that the URI starts at the application-module level, rather than at the application-context level, or the absolute-URL level. </p> <ul> <li>Absolute URL: http://localhost/myApplication/myModule/myAction.do</li> <li>context-relative: /myModule/myAction.do</li> <li>module-relative: /myAction.do</li> </ul> </section> <section href="naming" name="Why are some of the class and element names counter-intuitive?"> <p> The framework grew in the telling and as it evolved some of the names drifted. </p> <p>The good thing about a nightly build, is that everything becomes available to the community as soon as it is written. The bad thing about a nightly build is that things like classnames get locked down early and then become difficult to change. </p> </section> <section href="actionforms" name="Wither ActionForms?"> <p> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg19281.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg19281.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg19338.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg19338.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg20833.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg20833.html</a><br/> </p> </section> <section href="JavaBeans" name="Do ActionForms have to be true JavaBeans?"> <p> The utilities that Struts uses (Commons-BeanUtils since 1.1) require that ActionForm properties follow the JavaBean patterns for mutators and accessors (get*,set*,is*). Since Struts uses the Introspection API with the ActionForms, some containers may require that all the JavaBean patterns be followed, including declaring "<code>implements serializable</code>" for each subclass. The safest thing is to review the <a href="userGuide/preface.html#javabeans">JavaBean specification</a> and follow all the prescribed patterns.</p> </section> <section href="multiple" name="Can I use multiple HTML form elements with the same name?"> <p> Yes. Define the element as an array and Struts will autopopulate it like any other. </p> <pre> <code> private String[] id= {}; public String[] getId() { return this.id; } public void setItem(String id[]) {this.id = id;} </code> </pre> <p> And so forth </p> </section> <section href="checkbox" name="Why are my checkboxes not being set from ON to OFF?"> <p> A problem with a checkbox is that the browser will only include it in the request when it is checked. If it is not checked, the HTML specification suggests that it not be sent (i.e. omitted from the request). If the value of the checkbox is being persisted, either in a session bean or in the model, a checked box can never unchecked by a HTML form -- because the form can never send a signal to uncheck the box. The application must somehow ascertain that since the element was not sent that the corresponding value is unchecked. </p> <p> The recommended approach for Struts applications is to use the reset method in the ActionForm to set all properties represented by checkboxes to null or false. The checked boxes submitted by the form will then set those properties to true. The omitted properties will remain false. Another solution is to use radio buttons instead, which always submit a value. </p> <p> It is important to note that the HTML specification recommends this same behavior whenever a control is not "successful". Any blank element in a HTML form is not guaranteed to submitted. It is therefor very important to set the default values for an ActionForm correctly, and to implement the reset method when the ActionForm might kept in session scope. </p> </section> <section href="scriptlets" name="Can't I just create some of my JavaBeans in the JSP using a scriptlet?"> <p> Struts is designed to encourage a <a href="http://www.javaworld.com/javaworld/jw-12-1999/f_jw-12-ssj-jspmvc.html"> Model 2/MVC architecture</a>. But there is nothing that prevents you from using Model 1 techniques in your JavaServer Pages, so the answer to the question is "Yes, you can". </p> <p> Though, using Model 1 techniques in a Struts application does go against the grain. The approach recommended by most Struts developers is to create and populate whatever objects the view may need in the Action, and then forward these through the request. Some objects may also be created and stored in the session or application context, depending on how they are used. </p> <p> Likewise, there is nothing to prevent you from using scriptlets along with JSP tags in your pages. Though, many Struts developers report writing very complex scriplet-free applications and recommend the JSP tag approach to others. </p> <p> For help with Model 1 techniques and scriptlets, you might consider joining the <a href="http://archives.java.sun.com/jsp-interest.html">Javasoft JSP-interest mailing list</a>, where there are more people still using these approaches. </p> </section> <section href="tags" name="Why do the Struts tags provide for so little formatting?"> <p> <i>The Struts tags seem to provide only the most rudimentary funcationality. Why is there not better support for date formatting and advanced string handling?</i> </p> <p> Three reasons: </p> <p> First, work started on the JSTL and we didn't want to duplicate the effort. </p> <p> Second, work started on Java Server Faces, and we didn't want to duplicate that effort either. </p> <p> Third, in a Model 2 application, most of the formatting can be handled in the ActionForms (or in the business tier), so all the tag has to do is spit out a string. This leads to better reuse since the same "how to format" code does not need to be repeated in every instance. You can "say it once" in a JavaBean and be done with it. </p> </section> <section name="How do I access my database?"> <p> The best thing is use the Action as a thin adaptor between the web/presentation-tier and your business classes (including those that access a database). </p> <p> So you first design a business API that uses plain Java classes. The best thing is to use objects that take ordinary Java types and return a JavaBean or collection of JavaBeans. The Action then calls these objects and passes the result back to the web/presentation tier. </p> <p> A common approach is to create an Action class for each of the business API methods/classes that you need to call. Ideally, all the database access code should be encapsulated in the business API classes, so Struts doesn't know what persistent layer you are using (or even if there is a persisentance layer). It just passes a key or search String and gets back a bean or collection of beans. This lets you use the same business API classes in other environments, and also to run unit tests against your business API outside of Struts or a HTTP environment. </p> <p> To get started, it's simplest to setup a 1:1 correspondence between the Actions and the entry-points to your business API. As you gain experience, you will find ways to combine your Actions, say by using the DispatchAction. It's even possible to use a single "framework" Action to call all of your business classes, as is done with Scaffold ProcessAction in the contrib folder. Using fewer Actions does require a deeper understanding of how Struts and MVC frameworks operate. Don't hestitate to err on the side of creating more Actions at first. The Struts configuration makes it easy to refactor your Actions later, since you can change the Action type without changing anything else in the application. </p> <p> For more, see </p> <p> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24621.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24621.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24709.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24709.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24626.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24626.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24331.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24331.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24102.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24102.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23501.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23501.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23455.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23455.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23375.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23375.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23321.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23321.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23098.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23098.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg22713.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg22713.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg21974.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg21974.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg21026.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg21026.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg19338.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg19338.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg18323.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg18323.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg14975.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg14975.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg14914.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg14914.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg14435.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg14435.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg01562.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg01562.html</a> </p> <p> Transformation/Data Transfer<br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24480.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24480.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23623.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg23623.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg10195.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg10195.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg10205.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg10205.html</a> </p> </section> <section name="How can I authenticate my users?"> <p> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24504.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg24504.html</a><br/> <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg22949.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg22949.html</a> </p> </section> <section href="pager" name="How can I scroll through list of pages like the search results in google?"> <p>Many Struts developers use the Pager from the JSPTags site.</p> <p><a href="http://jsptags.com/tags/navigation/pager/">http://jsptags.com/tags/navigation/pager/</a></p> </section> <section href="minimization" name="Why does the option tag render selected=selected instead of just selected?"> <p> Attribute minimization (that is, specifying an attribute with no value) is a place where HTML violates standard XML syntax rules. This matters a lot for people writing to browsers that support XHTML, where doing so makes the page invalid.It's much better for Struts to use the expanded syntax, which works the same on existing browsers interpreting HTML, and newer browsers that expect XHTML-compliant syntax. Struts is following the behavior recommended by the <a href="http://www.w3.org/TR/xhtml1/#h-4.5"> XHTML specification</a></p> </section> </chapter></body></document> 1.1 jakarta-struts/doc/faqs/kickstart.xml Index: kickstart.xml =================================================================== <?xml version="1.0"?> <document url="./kickstart.xml"> <properties> <author>Ted Husted</author> <author>Craig R. McClanahan</author> <author>James DeVries</author> <author>James Holmes</author> <title>The Struts User's Guide - Kickstart FAQ</title> </properties> <body> <chapter href="faq" name="Kickstart FAQ"> <section href="contents" name="Index"> <p> Here are answers to the usual getting-started questions. <b>For an in-depth, searchable FAQ, visit our friends at <a href="http://www.jguru.com/faq/home.jsp?topic=Struts">JGuru</a>.</b> </p> <ul> <li><a href="#why">Why do we need Struts?</a></li> <li><a href="#how">How does Struts work?</a></li> <li><a href="#compat">Is Struts compatible with other Java technologies?</a></li> <li><a href="#who">Who wrote Struts?</a></li> <li><a href="#struts">Why is it called Struts?</a></li> <li><a href="#license">How is Struts licensed?</a></li> <li><a href="#usage">Can Struts be used in a commercial application?</a></li> <li><a href="#credits">Do I have to credit Struts on my own website?</a></li> </ul><ul> <li><a href="#where">Where can I get a copy of Struts?</a></li> <li><a href="#install">How do I install Struts?</a></li> <li><a href="#jar">When do I need the struts.jar on my classpath?</a></li> <li><a href="#tests">Does Struts provide its own unit tests?</a></li> </ul><ul> <li><a href="#help">Where can I get help with Struts?</a></li> <li><a href="#consultants">Is commercial support available for Struts?</a></li> <li><a href="#hosts">Are there ISPs that will host my Struts application?</a></li> <li><a href="#powered">What Web sites are already Powered by Struts?</a></li> </ul><ul> <li><a href="#turbine">What's the difference between Struts and Turbine?</a></li> <li><a href="#taglibs">Why aren't the Struts tags maintained as part of the Jakarta Taglibs project?</a></li> <li><a href="#xhmtl">Are the Struts tags XHTML compliant?</a></li> <li><a href="#jsf">What about the JSTL and JavaServer Faces?</a></li> </ul><ul> <li><a href="#digest">Is there a digest for the mailing list?</a></li> <li><a href="#newsgroup">Is there a Struts Newsgroup?</a></li> <li><a href="#mailbounce">Why didn't my posting show up on the user list?"</a></li> <li><a href="#unsubscribe">How do I unsubscribe from the mailing list?</a></li> </ul><ul> <li><a href="#more">Are there any other FAQs?</a></li> </ul> </section> <section href="why" name="Why do we need Struts?"> <p>Java technologies give developers a serious boost when creating and maintaining applications to meet the demands of today's public Web sites and enterprise intranets. Struts combines Java Servlets, Java ServerPages, custom tags, and message resources into a unified framework. The end result is a cooperative, synergistic platform, suitable for development teams, independent developers, and everyone in between.</p> </section> <section href="how" name="How does Struts work?"> <p>Java Servlets are designed to handle requests made by Web browsers. Java ServerPages are designed to create dynamic Web pages that can turn billboard sites into live applications. Struts uses a special Servlet as a switchboard to route requests from Web browsers to the appropriate ServerPage. This makes Web applications much easier to design, create, and maintain.</p> </section> <section href="javasoft" name="Is Struts compatible with other Java technologies?"> <p>Yes. Struts is committed to supporting industry standards. Our lead developer is a member of <a href="http://java.sun.com/aboutJava/communityprocess/jsr/jsr_052_jsptaglib.html">JSR052</a>, Sun's Expert group for developing a standard library of custom JSP tags. A primary design criteria is that Struts must be compatible with Sun's J2EE platform for corporate enterprises. In fact, Struts really acts as an integrator of Java technologies, so that they can be used in the "real world".</p> </section> <section href="who" name="Who wrote Struts?"> <p>Struts was created by Craig R. McClanahan, and donated to the Apache Software Foundation in May 2000. Craig is the primary developer of both Struts and <a href="http://jakarta.apache.org/tomcat/index.html">Tomcat 4</a>, the basis for the official reference implementation for a servlet 2.3 and JSP 1.2 container. With stable releases of Struts and Tomcat 4 in circulation, Craig is now the Specification Lead for <a href="http://jcp.org/jsr/detail/127.jsp">JavaServer Faces (JSR-127)</a>, and is the Web Layer Architect for the Java2 Enterprise Edition (J2EE) platform as a whole.</p> <p>There are now many active committers to the Struts project, working cooperatively from around the globe. Other Java developers are invited to <a href="#contribute">contribute to the project</a>. Struts is an <a href="http://jakarta.apache.org/">Apache Jakarta</a> project, with the common mission to "provide commercial-quality server solutions based on the Java Platform that are developed in an open and cooperative fashion". All told, 17 individual developers and committers contributed to the Struts 1.0 codebase.</p> </section> <section href="struts" name="Why is it called Struts?"> <p>It's a reference to struts in the architectural sense, a reminder of the nearly invisible pieces that hold up buildings, houses, and bridges.</p> </section> <section href="license" name="How is Struts licensed?"> <p>Struts is copyrighted software available under a "free-to-use-license" by the Apache Software Foundation. The license appears at the head of every source code file. A reference copy of the license is available <a href="http://www.apache.org/LICENSE-1.1">here</a>.</p> </section> <section href="usage" name="Can Struts be used in a commercial product?"> <p>Yes. The only requirements you must meet are those listed in the Apache Software Foundation license, which is included at the top of each source file and in the file LICENSE in the top-level directory of the distribution.</p> <p>In addition, <a href="helping.html#bugs">contributions of patches, improved code, new features,</a> or even just requests for features are also welcome.</p> </section> <section href="credits" name="Do I have to credit Struts on my own website?"> <p>You need to credit Struts if you <strong>redistribute your own framework</strong> based on Struts for other people to use. (See the <a href="http://www.apache.org/LICENSE">Apache License</a> for details.) But you do <strong>not</strong> need to credit Struts just because your web application utilizes the framework. It's the same situation as using the Apache HTTPD server or Tomcat. Not required if its just running your web site. Required if you've used the source code to create your own server that you are redistributing to other people.</p> </section> <section href="where" name="Where can I get a copy of Struts?"> <p>The best place to download Struts is at <a href="http://jakarta.apache.org/struts/">jakarta.apache.org/struts</a>. The nightly builds are very stable, and recommended as the best place to start today.</p> </section> <section href="install" name="How do I install Struts?"> <p>To develop applications with Struts, you can usually just add the Struts JAR file to your Java development environment. You can then start using the Struts classes as part of your own application. A blank Struts application (in the <code>webapps</code> directory, open <code>struts-blank.war</code>) is provided, which you can just copy to get a quick-start on your own brainchild.</p> <p>Since the full source code for Struts is available, we also provide <a href="http://jakarta.apache.org/struts/installation.html">complete instructions</a> for compiling your own Struts JAR from scratch. (This is actually easier than it looks!)</p> <p>Your Struts application can usually be deployed using a standard WAR file. In most cases, you simply deposit the WAR file on your application server, and it is installed automatically. If not, step-by-step installation instructions for <a href="http://jakarta.apache.org/struts/installation.html#Containers">various servlet containers</a> are available.</p> </section> <section href="jar" name="When do I need "struts.jar" on my classpath?"> <p>When you are compiling an application that uses the Struts classes, you must have the "struts.jar" on the classpath your <b>compiler</b> sees -- it does not <i> have</i> to be on your CLASSPATH environment variable.</p> <p>Why is that an important distinction? Because if you are using a servlet container on your development machine to test your application, the "struts.jar" <b>must not</b> be on your CLASSPATH environment variable when running the container. (This is because each Web application must also have their own copy of the Struts classes, and the container will become confused if it is on the environment path as well.)</p> <p>There are several general approaches to this issue:</p> <ul> <li><b>Use ANT</b> for building your projects -- it can easily assemble classpaths for the compiler. (This is how Struts itself is built, along with Tomcat and most other Java-based projects).</li> <li><b>Use an IDE</b> where you can configure the "class path" used for compilation independent of the CLASSPATH environment variable.</li> <li><b>Use a shell script</b> that temporarily adds struts.jar to the classpath just for compilation, for example<br/> <i>javac -classpath /path/to/struts.jar:$CLASSPATH $@</i></li> </ul> </section> <section href="tests" name="Does Struts include its own unit tests?"> <p> Struts currently has two testing environments, to reflect the fact that some things can be tested statically, and some really need to be done in the environment of a running servlet container.</p> <p> For static unit tests, we use the <a href="http://www.junit.org">JUnit framework</a>. The sources for these tests are in the "src/test" hierarchy in the CVS repository, and are executed via the "test.junit" target in the top-level build.xml file. Such tests are focused on the low-level functionality of individual methods, are are particularly suitable for the static methods in the org.apache.struts.util utility classes. In the test hierarchy, there are also some "mock object" classes (in the org.apache.struts.mock package) so that you can package up things that look like servlet API and Struts API objects to pass in as arguments to such tests.</p> </section> <section href="help" name="Where can I get help with Struts?"> <p>The Struts package comes complete with a <a href="http://jakarta.apache.org/struts/userGuide/index.html">Users Guide</a> to introduce people to the framework and its underlying technologies. Various components also have their own in-depth Developers Guide, to cover more advanced topics. Comprehensive <a href="http://jakarta.apache.org/struts/api/index.html">Javadocs</a> are included along with the <b>full source code</b>. For your convenience, these are bundled together as a self-installing application. The <code>struts-documentation.war</code> is the same bundle that is deployed as the <a href="http://jakarta.apache.org/struts/">Struts Web site</a>. </p> <p> The <a href="http://jakarta.apache.org/site/mail.html">Strut's mailing list</a> is also very active, and welcomes posts from new users. Before posting a new question, be sure to consult the <a href="http://www.mail-archive.com/struts-user%40jakarta.apache.org/"> <b>MAILING LIST ARCHIVE</b></a> and the very excellent <a href="http://www.tuxedo.org/~esr/faqs/smart-questions.html"> How To Ask Questions The Smart Way</a> by Eric Raymond. Please do be sure to <a href="http://expita.com/nomime.html">turn off HTML</a> in your email client before posting. </p> <p> There are also many third-party tutorials, articles, and books that cover Struts. See our <a href="resources/tutorials.html">Resources page</a> for current listings and links. </p> </section> <section href="support" name="Is commercial support available?"> <p>There is no official, commercial support for Struts, though third parties may offer different degrees of support. A list of Struts consultants is available on our <a href="resources/consultants.html">Resources page</a></p> </section> <section href="providers" name="Are there ISPs that will host my Struts application?"> <p>For a listing of some Java and Struts ISPs, visit our <a href="resources/hosts.html">Resources page</a>.</p> </section> <section href="powered" name="What Web sites are already Powered by Struts?"> <p>For a listing of some Struts-powered Web sites available to the public, visit our <a href="resources/powered.html">Resources page</a>.</p> </section> <section href="turbine" name="What's the difference between Jakarta Struts and Jakarta Turbine?"> <p>See</p> <ul> <li>< <a href="http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg03206.html">http://www.mail-archive.com/struts-user@;jakarta.apache.org/msg03206.html</a> ></li> <li>< <a href="http://www.mail-archive.com/general@;jakarta.apache.org/msg00495.html">http://www.mail-archive.com/general@;jakarta.apache.org/msg00495.html</a> ></li> <li>< <a href="http://jakarta.apache.org/velocity/ymtd/ymtd.html">http://jakarta.apache.org/velocity/ymtd/ymtd.html</a> ></li> </ul> </section> <section href="taglibs" name="Why aren't the Struts tags maintained as part of the Jakarta Taglibs project?"> <p>Development of both products began about the same time. Leading up to the release of 1.0, it was thought better to continue to develop the taglibs alongside the controller. Now that 1.0 is out, the Java ServerPages Standard Taglib is in active development. Once work on the JSPTL stabilizes, the Struts taglibs will be revisited. Tags which are not linked directly to the framework may be hosted at Jakarta Taglibs instead.</p> </section> <section href="xhtml" name="Are the Struts tags XHTML compliant?"> <p>If you utilize a <html:html xhtml="true> element on your page, the tags will render in a XHTML compatible manner (since Struts 1.1 beta 2). </p> </section> <section href="wml" name="Will the Struts tags support other markup languages such as WML"> <p> Struts itself is markup neutral. The original Struts taglibs are only one example of how presentation layer components can access the framework. The framework objects are exposed through the standard application, session, and request contexts, where any Java component in the application can make use of them. </p> <p>Markup extensions that use Struts are available for <a href="http://jakarta.apache.org/velocity">Velocity</a> and <a href="http://www.openroad.ca/opencode/">XLST</a>, among others. A new Struts tag for <a href="#jsf">Java Server Faces</a> is also in development. </p> <p>For more about using WAP/WML with Struts see the article <a href="http://www.sys-con.com/pbdj/archives2/0904/hamboeck/"> WAP up your EAserver</a>. </p> </section> <section href="jsf" name="What about the JSTL and JavaServer Faces?"> <p> The lead developer of Struts, Craig McClanahan, was a member of the expert group for the JavaServer Standard Tag Library (JSR 052) and now the specification lead for JavaServer Faces (JSR 127). Both technologies are complementary to Struts.</p> <p> The mainstay of the Struts framework is the controller components, which can be used with any Java presentation technology. As new technologies become available, it is certain that new "glue" components will also appear to help these technologies work as well with Struts as the bundled JSP tags. This would apply to both the JSTL and JSF.</p> <p> At some point, we would not be surprised to see Faces become the preferred UI implementation technology once it is standardized and available. You can be assured that any future migration will be made as painless as possible, and maximize your investment in Struts.</p> <p> The JSTL is available through the Jakarta Taglibs site: <br/> <a href="http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html">http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html</a> </p> <p> The JavaServer Faces specification is still being finalized. Public release of the specification is scheduled for Summer 2002, and an implementation may be available in Fall of 2002. <a href="http://servlet.java.sun.com/javaone/sf2002/conf/sessions/display-1697.en.jsp"> A presentation was given at JavaOne 2002</a> with some additional background. </p> <p> In September 2002, McClanahan announced that a <a href="../proposals/struts-faces.html">struts-faces taglib</a> is in development and might be released sometime in the Q4 2002. The taglib depends on unreleased JSF features, and so an early release of the taglib must follow release of a later implementation of JSF. </p> </section> <section href="digest" name="Is there a digest for the User list?"> <p> Yes. <a href="mailto:struts-user-digest-subscribe@;jakarta.apache.org">send a blank message</a> to < <a href="mailto:struts-user-digest-subscribe@;jakarta.apache.org">[EMAIL PROTECTED]</a>>. </p> <p> If you are subscribed to the digest, you can also post to the list. Just be sure to send your post to the <a href="mailto:struts-user@;jakarta.apache.org">user list</a> rather than trying to reply to the digest. </p> </section> <section href="newsgroup" name="Is there a Struts newsgroup?"> <p> Not a usenet group, but the Struts User list can be accessed with your favorite newsgroup reader from the <a href="http://news.basebeans.com/forums.jsp"> BaseBeans Engineering</a> site. </p> </section> <section href="mailbounce" name="Why didn't my posting show up on the user list?"> <p> You must be subscribed to the <a href="mailto:struts-user-subscribe@;jakarta.apache.org">user list</a> or <a href="mailto:struts-user-digest-subscribe@;jakarta.apache.org">user digest</a> before posting (or use the <a href="http://news.basebeans.com/forums.jsp">BaseBeans newsgroup</a> instead). </p> </section> <section href="unsubscribe" name="How do I unsubscribe from the mailing list?"> <p> <b>From the email account used to subscribe to the list,</b> <a href="mailto:struts-user-unsubscribe@;jakarta.apache.org">send a blank message</a> to < <a href="mailto:struts-user-unsubscribe@;jakarta.apache.org">[EMAIL PROTECTED]</a>>. </p> <p> If you are receiving the digest, you must send a blank email to <<a href="mailto:struts-user-digest-unsubscribe@;jakarta.apache.org">[EMAIL PROTECTED]</a>> instead. </p> </section> </chapter></body></document> 1.1 jakarta-struts/doc/faqs/index.xml Index: index.xml =================================================================== <?xml version="1.0" encoding="ISO-8859-1"?> <document url="./index.xml"> <properties> <author>Ted Husted</author> <title>FAQs and Howtos - Jakarta Struts</title> </properties> <body> <section name="Struts FAQs and Howtos"> <ul> <li><a href="kickstart.html">Kickstart FAQ</a> (read me first)</li> <li><a href="newbie.html">Newbie FAQ</a> </li> <li><a href="helping.html">How to Help FAQ</a> </li> </ul> <ul> <li><a href="ssl.html">SSL Howto</a></li> </ul> </section> <section name="Offsite FAQs and Howtos"> <ul> <li><a href="http://www.jguru.com/faq/home.jsp?topic=Struts">jGuru FAQ</a></li> </ul> <ul> <li><a href="http://www.husted.com/struts/tips">Struts Tips</a></li> </ul> </section> </body></document> 1.1 jakarta-struts/doc/faqs/helping.xml Index: helping.xml =================================================================== <?xml version="1.0"?> <document url="./helping.xml"> <properties> <author>Ted Husted</author> <author>Craig R. McClanahan</author> <title>The Struts User's Guide - How to Help FAQ</title> </properties> <body> <chapter href="faq" name="How to Help FAQ"> <section href="contents" name="Index"> <p> <font face="Arial, Helvetica, sans serif">"You can't always get what you want / but if you try real hard / you might just find / that you get what you need". </font><br/> [Rolling Stones] </p> <ul> <li><a href="#corp">What can my company do to help support Struts?</a></li> <li><a href="#bugs">How can I report bugs or make feature requests?</a></li> <li><a href="#contribute">How can I contribute to Struts source code?</a></li> <li><a href="#documentation">How can I contribute to the documentation?</a></li> <li><a href="#release">So when is the next release coming out?</a></li> <li><a href="#release_help">How can I help the next release along?</a></li> </ul> </section> <section href="corp" name="What can my company do to help support Struts?"> <p> Struts is an all volunteer product. Our customers are the volunteers who donate their time and energy to supporting the product. If you want to support Struts, and become one of our customers, then you need to <a href="http://jakarta.apache.org/site/getinvolved.html">get involved</a> and become a volunteer. </p> <p> Our challenge to any team using Struts is to donate the time of one team member one afternoon a week (or more if you can spare the resources). Have your team member browse Bugzilla for any issues without a <a href="#code">patch</a> or <a href="#tests">unit test</a>, and add the patch or test. If the patch is written on company time, and you want to give your company an author's credit, that's fine with us. </p> <p> If Struts doesn't do what <i>you</i> want, it's up to <b>you</b> to step up and propose the patch. If Struts doesn't ship as often as you would like, it's up to you to step up with the tests and fixes that get a release out the door. </p> <p> If Struts does do what you want, help others become involved by turning your war stories into FAQs and how-tos that we can make part of the <a href="documentation">documentation</a>. The mailing list is very active and trundling through the archives is no picnic. We can always use people who can reduce the best threads to coherent articles that we can put in the User Guide. </p> <p> We don't sell Struts for money, but anyone who wants to be our customer can pay us back by donating the time and energy that money represents. </p> </section> <section href="bugs" name="How can I report bugs or make feature requests?"> <p> You can research and report outstanding fixes and feature requests using <a href="http://jakarta.apache.org/site/bugs.html">Jakarta Bugzilla</a>. If you are unsure if this is an actual problem, feel free to bring it up the list first. But to sure that an issue is resolved, read <a href="http://www.chiark.greenend.org.uk/~sgtatham/bugs.html">How to Report Bugs Effectively</a> and report it to <a href="http://jakarta.apache.org/site/bugs.html"><b>Bugzilla</b></a>. </p> <p> Feature requests are also maintained in the Bugzilla database. Some older requests are still listed the <a href="../todo-1.1.html">wish list</a> page. </p> <p> <a href="http://jakarta.apache.org/site/source.html">Patches</a> are always welcome. If you can't write a patch to fix your bug, a <a href="#tests">unit test</a> that demonstrates the problem is also welcome. (And, of course, unit tests that prove your patch work are equally welcome.) </p> <p> If your bug or feature is already in Bugzilla, <strong>you can vote</strong> for the issue and call more attention to it. Each user can cast up to six votes at a time. </p> <p> If there is a patch attached to the issue, you can also try applying to your local copy of Struts, and report whether it worked for you. Feedback from developers regarding a proposed patch is really quite helpful. Don't hesitate to "me too" if you've tried the patch yourself. </p> </section> <section href="contribute" name="How can I contribute to the Struts source code?"> <p> Struts is distributed by the <a href="http://apache.org/">Apache Software Foundation</a>. These are the same people who distribute the Apache Web server. Like all ASF projects, Struts is managed as a "meritocracy", where everyone's contribution is welcome. Users can help other users the <a href="http://jakarta.apache.org/site/mail.html">mailing lists</a>, <a href="http://jakarta.apache.org/site/bugs.html">report bugs</a>, and <a href="http://jakarta.apache.org/site/bugs.html">request new features</a>. Developers can contribute patches, new code, and documentation. The most active Developers may become <a href="http://jakarta.apache.org/site/roles.html">Committers</a>, who make the actual decisions about Strut's codebase. </p> <p> If you are new to open source development, see the "<a href="http://jakarta.apache.org/site/getinvolved.html">How to get involved</a>" page the main Jakarta site. </p> <p> A very good place to start is by <b>reviewing the list of open issues</b> and pending feature requests (<a href="#bugs">Bugzilla</a>). If you see an issue that needs a patch you can write, feel free to annex your patch. If you seen an issue that needs a unit test to prove its fixed, feel free to annex your test case. If someone has posted a patch to an issue you'd like to see resolved, apply the patch to your local development copy of Struts. Then let us know if it works for you, and if it does, cast your vote for the issue and its patch. </p> <p> If none of the pending issues scratch your itch, another good place to start is by <b>contributing unit tests</b> for existing features (even those that still work). </p> <p> Our current approach to <a href="kickstart.html#tests">unit testing</a> works fairly well for exercising most method-level stuff, but does not really address situations of dynamic behavior -- most particularly the execution of custom tags for Struts. You can try to fake what a JSP container does, but a much more reliable testing regime would actually execute the tag in a real container. For that purpose, we use the <a href="http://jakarta.apache.org/cactus">Cactus</a> testing framework , which re-executes the JUnit-based tests as well to make sure that nothing bad happens when you switch environments. Right now, there are very few dynamic tests; ideally, we will have tests for every tag, that cover every reasonable combination of tag attribute values (yes, that's a tall order -- the totally lines of test source code will undoubtedly exceed the totally lines of code in the framework itself if we achieve this). </p> </section> <section href="documentation" name="How can I contribute to the documentation?"> <p> The only difference is that the documentation is kept in XML rather than Java source code. Otherwise, all the same precepts and procedures pertain. </p> <p> The trick to getting started is to download the nightly build and try building the documentation WAR. Then try adding your own XML page under doc/ to see if the build succeeds. If it doesn't, it will report where the bad element is, much like it reports where a bad programming expression is. If it does, then your page should available under target/documentation/. </p> <p> The website portion of the package is the root directory of doc/. The User Guide portion is under the userGuide/ folder. If the material you'd to add doesn't fit right in with what's there, the best thing may to start a new section after the existing material. The navigation column can found in the project.xml document. </p> <p> To display markup, substitute &lt; for <. The unmatched trailing > will ignored. Since it is XML, all elements also need to closed. So elements like <br> and <hr> need to set out as <br/> and <hr/>. </p> <p> Also watch for the length of code samples. These do not wrap. If a line is too long, it will force the right margin out past the edge of the screen or printed page. </p> <p> The stylesheets we use are adequate, but could certainly improved by an XML guru, if you happen to one of those. </p> </section> <section href="release" name="So when is the next release coming out?"> <p> Here is the truth regarding releases: </p> <p> Jakarta products are released the basis of merit, and ~not~ according to a strict timetable. The volunteers devote whatever time they can to working the product. But all volunteers have real jobs and real lives, that do take precedence. Since Struts does not have paid personnel working the project, we simply cannot make date-oriented commitments. </p> <p> All Jakarta products must circulate a public beta before release. If a beta is not in circulation, then it's a good bet that a release is not forthcoming any time soon. Products sometimes go through several betas before final release. So if this is beta 1, then it still may not released any time soon. </p> <p> The bottom line is that Jakarta takes releases very seriously. We do not compromise the quality of our software by watching the calendar (and then ship something ready or not). A release is ready when it is ready. </p> <p> That may sound flip, but it ~is~ the truth. The delivery of production-quality, leading-edge software is not something anyone can prognosticate. If anyone tries, they are lying to you. That, we won't do ;-) </p> <p> What we ~will~ do is release all of our development software as soon as it is developed. This way you can judge for yourself how quickly the development is proceeding, and whether what is being developed will meet your needs. If you need a feature right now, you can use the nightly build, or roll your own patch. There are no private CVS's or private development lists. What you see is what we got. If you are following the DEV list, then you know everything the developers know. Really, you do. </p> <p> <i>So, what do you tell your team?</i> If you can ship your application based the nightly build of your choice, then consider that an option. You can still ship yours, even if we don't ship ours, and you will have access to all the latest patches or enhancements. (Just like we were working down the hall.) If you can only ship your application based a release build of Struts, then you should base your development the release build of Struts, and keep an eye what is coming down the pipeline. This way you are at least forewarned and forearmed. </p> </section> <section href="release_help" name="What can I do to help the next release along?"> <ul> <li> Most importantly, <b>download the latest beta</b> or release-candidate and test it against your own applications. Report any and all issues or suspected issues to <a href="http://jakarta.apache.org/site/bugs.html">Bugzilla</a>. The sooner we resolve any problems, the fewer betas or release candidates we will have to distribute before we are done. (How do we know when we done? -- When we run out of issues =:o) The sooner we find them, the sooner we are done.) </li> <li> <b>Contribute <a href="kickstart.html#tests">unit tests</a></b>. The closer we get to a release, the more we worry about breaking something. The more tests we have, the more confident we can when applying patches. Tests that proves that a pending issue is actually a bug are the most welcome. But we are eager for any and all tests for any and all features, even those that still work =:0). </li> <li> <b>Review the list of issues</b> at <a href="#bugs">Bugzilla</a>. If there are any to which you can respond, please do. If there any patches posted, feel free to test the patch your system, report the results, and cast your vote if it works. </li> <li> <b>Confirm an issue's category and status</b>. Newbies often post feature requests or help-desk questions as "bugs". This bloats the list of fixes we (apparently) need to apply before the next beta, making it hard to see the forest for the trees. If an issue doesn't seem to categorized correctly, exercise your best judgment and change it. If one ticket seems like a duplicate of another, go ahead and enter the change. Every modification to the ticket is echoed to the DEV list and automatically subjected to peer review. Err on the side of doing. </li> <li> Use Bugzilla to <b>vote for issues</b> you feel should be handled first. If an issue on your ballot doesn't include a patch, feel free to try coding one yourself. (At Jakarta, patches are the only votes that truly count.) Well over <a href="volunteers.html">thirty developers</a> have contributed code or documentation to the product. You can too =:0) </li> <li> <b>Answer questions on the user list.</b> The Committers only have so much time to volunteer. If Developers are supporting each other on the lists, the Committers have more time to spend on the next release. </li> </ul> </section> <section href="decisions" name="Who makes the final decisions regarding Struts"> <p> The management of the Jakarta site, and the Struts product, is based on principles and practices used by creators of the Apache HTTPD server. Struts follows the <a href="http://jakarta.apache.org/site/guidelines.html">Project Guidelines</a> on the main Jakarta site. </p> <p>If you are new to this style of development, the Apache HTTPD Dev list is available in a <a href="[EMAIL PROTECTED]">digest form</a>. Even if you are not working on the HTTPD server yourself, it is interesting to watch how the HTTPD team works on the server. </p> <p> The Struts project has its own <a href="index.html#lists">Dev list</a>, where all of the decisions regarding Struts are made. Most development takes place via "<a href="http://jakarta.apache.org/site/proposal.html#decisions/voting/items">Lazy Consensus</a>". Committers post most changes to the product unilaterally, using their own best judgment, and only discuss or vote upon controversial matters. Another Committer can veto any change in an unreleased product with cause. </p> </section> </chapter> </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>