freedom of innovation

Jakarta Struts
An Apache Software Foundation Project

25th February, 2006 Hyderabad, AP India

• Replaces CGI ↑ Single heavy weight process – multiple lightweight threads ↑ Availability of entire Java API ↓ Hard-coding HTML ↓ Internationalization overhead

JavaServer Pages
• Combination of static HTML, XML like tags and scriptlets • Compiled • Support for scripting and access to Java API • Extended through use of custom tags

JSP Model 1 Architecture .

JSP Model 2 Architecture .

Overview • • • • • • • • • Model-View-Controller Design Pattern Model Components View Components Controller Components Tag Libraries STRUTS Configuration File Web Application Descriptor File Application Resources File Resources .

Model-View-Controller Design Pattern • Central controller mediates application flow • Controller delegates to appropriate handler • Handlers are tied to model components • Model encapsulates business logic • Control forwarded back through the Controller to the appropriate View .

MVC Design Pattern .

MVC Design Pattern • 3 Major Components in STRUTS – Servlet controller (Controller) – Java Server Pages (View) – Application Business Logic (Model) • Controller bundles and routes HTTP request to other objects in framework • Controller parses configuration file .

MVC Design Pattern • Configuration file contains action mappings (determines navigation) • Controller uses mappings to turn HTTP requests into application actions • Mapping must specify – A request path – Object type to act upon the request .

Model Components • Model divided into concepts – Internal state of the system – Actions that can change that state • Internal state of system represented by – JavaBeans – Enterprise JavaBeans .

across one or more requests – Application .visible to all JSP pages and servlets that are part of a web application . or forwarded to by this page – Session – visible to all JSP pages and servlets that participate in a particular user session. as well as to any page or servlet that is included in this page.Model Components • JavaBeans and Scope – Page – visible within a single JSP page. for the lifetime of the current request – Request – visible within a single JSP page.

the Controller Servlet will perform the following: • Check session for instance of bean of appropriate class • If no session bean exists. the corresponding setter method will be called • The updated ActionForm bean will be passed to the Action Class perform() method when it is called.Model Components • ActionForm Beans – Extends the ActionForm class – Create one for each input form in the application – If defined in the ActionMapping configuration file. making these values immediately available . one is created automatically • For every request parameter whose name corresponds to the name of a property in the bean.

an ActionForm bean will have only property getter and property setter methods. If you override a "stub" method. Typically. and provide error messages in the standard application resource. It is used to identify the role these particular beans play in the overall architecture.Model Components • When coding ActionForm beans consider: – The ActionForm class itself requires no specific methods to be implemented. Struts will automatically validate the input from the form . with no business logic – The ActionForm object also offers a standard validation mechanism.

getName() and" in your JSP view.setName(string Name) on your customer bean . For example. and use nested property references. you have a "customer" bean on your Action Form. and then refer to the property "customer. This would correspond to the methods customer.Model Components • Continued… – Define a property (with associated getXxx() and setXxx() methods) for each field that is present in the form. The field name and property name must match according to the usual JavaBeans conventions – Place a bean instance on your form.

or ordinary JavaBeans that access a database using JDBC calls .Model Components • Business Logic Beans – Should encapsulate the functional logic of your application as method calls on JavaBeans designed for this purpose – For maximum code re-use. business logic beans might be ordinary JavaBeans that interact with system state beans passed as arguments. business logic beans should be designed and implemented so that they do not know they are being executed in a web application environment – For small to medium sized applications.

Model Components • Accessing Relational Databases – Struts can define the datasources for an application from within its standard configuration file – A simple JDBC connection pool is also provided .

standard implementation of ResourceBundle that allows you to define resources using the same "name=value" syntax used to initialize properties files • MessageFormat .allows you to replace portions of a message string with arguments specified at run time • MessageResources . and allows you to request a particular message string for a particular Locale .fundamental Java class that supports internationalization • ResourceBundle .supports messages in multiple languages • PropertyResourceBundle .View Components • Internationalized Messages – Struts builds upon Java platform to provide assistance for building internationalized and localized applications • Locale .lets you treat a set of resource bundles like a database.

properties – Contains the same messages in the language whose ISO language code is "xx .hello=Hello • – Contains the messages in the default language for your server. you might have an entry like this: prompt. If your default language is English.View Components • ApplicationResources.

• Forms and FormBean interactions – HTML Forms and their limitations – Errors not easily handled .

<%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="bean" %> <html:html> <head> <title> <bean:message key="logon.title"/> </title> <body bgcolor="white"> <html:errors/> <html:form action=“/logonpath.username"/> </th> <td align="left"> <html:text property="username" size="16"/> </td> </tr> <tr> <td align="right"> <html:submit> <bean:message key="button.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-bean.submit"/> </html:submit> </td> .do"> <table border="0" width="100%"> <tr> <th align="right"> <html:message key="prompt.

or nothing if no errors have been stored .View Components • Building Forms with Struts – The taglib directive tells the JSP page compiler where to find the tag library descriptor for the Struts tag library – message tag is used to look up internationalized message strings from a MessageResources object containing all the resources for this application – The errors tag displays any error messages that have been stored by a business logic component.

View Components • Building Forms with Struts – continued – The form tag renders an HTML <form> element. based on the specified attributes – The form tag also associates all of the fields within this form with a request scoped FormBean that is stored under the key FormName – The form bean can also be specified in the Struts configuration file. in which case the Name and Type can be omitted here – The text tag renders an HTML <input> element of type "text“ – The submit and reset tags generate the corresponding buttons at the bottom of the form .

• Input field types supported – – – – – – – – – – checkboxes hidden fields password input fields radio buttons reset buttons select lists options submit buttons text input fields textareas .

and defines the result as a page scope attribute of type String or String .• Useful Presentation Tags – [html] link generates a HTML <a> element as an anchor definition or a hyperlink to the specified URL. and automatically applies URL encoding to maintain session state in the absence of cookie support – [html] img generates a HTML <img> element with the ability to dynamically modify the URLs specified by the "src" and "lowsrc" attributes in the same manner that <html:link> can – [bean] parameter retrieves the value of the specified request parameter.

override the validate() method in your ActionForm class – The validate() method is called by the controller servlet after the bean properties have been populated. but before the corresponding action class's perform() method is invoked .• Automatic Form Validation – Struts offers an additional facility to validate the input fields it has received – To utilize this feature.

and assign different developers to the different segments – Use the include capability of JavaServer Pages technology to combine the results into a single result page. or use the include tag provided with Struts .• Page Composition with Includes – The development of the various segments of a site is easier if you can divide up the work.

• Page Composition with Includes – continued – There are three types of include available. and is handled transparently by the server • The bean:include tag takes either an argument "forward" representing a logical name mapped to the jsp to include. or the "id" argument. depending on when you want the combination of output to occur: • An <%@ include file="xxxxx" %> directive can include a file that contains java code or jsp tags • The include action (<jsp:include page="xxxxx" flush="true" />) is processed at request time. which represents a page context String variable to print out to the jsp page .

Controller Components • Struts includes a Servlet that implements the primary function of mapping a request URI to an Action class (ActionServlet) .

• Your primary responsibilities are: – Write an Action class (that is.xml) – Update the web application deployment descriptor file (in XML) for your application to include the necessary Struts components – Add the appropriate Struts components to your application . an extension of the Action class) for each logical request that may be received – Write the action mapping configuration file (in XML) that is used to configure the controller servlet (struts-config.

ServletException. ActionForm form. HttpServletResponse response) throws IOException.• Action Classes: – The Action class defines a perform method that you override public ActionForward perform( ActionMapping mapping. . HttpServletRequest request.

• The goal of an Action class is to process this request. and then to return an ActionForward object that identifies the JSP page (if any) to which control should be forwarded to generate the corresponding response .

• A typical Action class will implement the following logic in its perform() method – Validate the current state of the user's session – If validation has not yet occurred. based on the newly updated beans . validate the form bean properties as necessary – Perform the processing required to deal with this request – Update the server-side objects that will be used to create the next page of the user interface – Return an appropriate ActionForward object that identifies the JSP page to be used to generate this response.

and uses it for all requests. Thus. just as you must code a Servlet's service() method safely – The most important principle that aids in threadsafe coding is to use only local variables.• Design issues to remember when coding Action classes include the following – The controller Servlet creates only one instance of your Action class. in your Action class . you need to code your Action class so that it operates correctly in a multi-threaded environment. not instance variables.

• Design issues to remember when coding Action classes include the following – continued – The beans that represent the Model of your system may throw exceptions due to problems accessing databases or other resources. You should trap all such exceptions in the logic of your perform() method. and log them to the application logfile – As a general rule. allocating scarce resources and keeping them across requests from the same user (in the user's session) can cause scalability problems .

The name of the form bean defined in the config file that this action will use • path .Set to true if the validate() method of the action associated with this mapping should be called.Fully qualified Java class name of the Action implementation class used by this mapping. See below for examples of how matching works. Only one action can be defined as a default within a single application. • unknown .The request URI path that is matched to select this mapping.• The ActionMapping Implementation • type . • name .Set to true if this action should be configured as the default for this application. to handle all requests not handled by another action. • validate . .

there two important elements that you use to describe your actions: .xml. and place it in the WEB-INF directory of your application – The outermost XML element must be <struts-config> – Inside of the <struts-config> element.• The Actions Mapping Configuration File – The developer's responsibility is to create an XML file named struts-config.

which has the following important attributes: – name: The name of the request or session level attribute that this form bean will be stored as – type: The fully-qualified Java classname of your form bean .• <form-beans> This section contains your form bean definitions. You use a <form-bean> element for each form bean.

You use an <action> element for each of your actions you would like to define.– <action-mappings> This section contains your action definitions. Each action element has requires the following attributes to be defined: • path: The application context-relative path to the action • type: The fully qualified java classname of your Action class • name: The name of your <form-bean> element to use with this action .

Driver" maxCount="4" minCount="2" password="mypassword" url="jdbc:postgresql://localhost/mydatabase" user="myusername"/> </data-sources> </struts-config> .postgresql.xml: <struts-config> <data-sources> <data-source autoCommit="false" description="Example Data Source Description" driverClass="org.– One more section of good use is the <data-sources> section.This is how you would specify a basic data source for your application inside of struts-config. which specifies data sources that your application can use.

• The Web Application Deployment Descriptor – The final step in setting up the application is to configure the application deployment descriptor (stored in file WEB-INF/web.xml) to include all the Struts components that are required .

Tag Libraries • • • • • HTML Tags Bean Tags Logic Tags Template Tags Custom Tags .

error messages. hyperlinking and internationalization.The tags in the Struts HTML library form a bridge between a JSP view and the other components of a Web application. input forms play an important role in the Struts framework. the majority of the HTML tags involve HTML forms. Other important issues addressed by the Struts-HTML tags are messages. Since a dynamic Web application often depends on gathering data from a user. Consequently. .

HTML Tags • HTML "form" tags – – – – – – – – – – button cancel checkboxes file hidden image multibox password input fields radio buttons reset buttons • HTML "form" tags – select lists with embedded – option – options – submit buttons – text input fields – textareas .

HTML Tags – Typical HTML Form <HTML> <BODY> <FORM> <TABLE WIDTH="100%"> <TR><TD>First Name</TD> <TD><INPUT TYPE="TEXT" NAME="Name" SIZE="40" MAXLENGTH="40"></TD></TR> <TR><TD>Street Address</TD> <TD><INPUT TYPE="TEXT" NAME="Address" SIZE="40" MAXLENGTH="40"></TD></TR> <TR><TD>City</TD> <TD><INPUT TYPE="TEXT" NAME="City" SIZE="20" MAXLENGTH="20"></TD></TR> <TR><TD>State</TD> <TD><INPUT TYPE="TEXT" NAME="State" SIZE="2" MAXLENGTH="2"></TD></TR> <TR><TD>Postal Code</TD> <TD><INPUT TYPE="TEXT" NAME="ZipCode" SIZE="9" MAXLENGTH="9"></TD></TR> <TR><TD ALIGN=CENTER><INPUT TYPE="SUBMIT" NAME="Submit" VALUE="Save"></TD> <TD><INPUT TYPE="RESET" NAME="Reset" VALUE="Cancel"></TD></TR> </TABLE> </FORM> </BODY> </HTML> .

city"/></TD> <TD><HTML:TEXT property="city" size ="20" maxlength ="20" /></TD></TR> <TR><TD><bean:message key=""/></TD> <TD><HTML:TEXT property="name" size="40" maxlength="40" /></TD></TR> <TR><TD><bean:message key=""/></TD> <TD><HTML:TEXT property="zip" size ="9" maxlength ="9" /></TD></TR> <TR><TD ALIGN=CENTER><html:submit property="action" value ="Save"/></TD> <TD><html:reset property="action" value ="Reset"/></TD></TR> </TABLE> </HTML:FORM> </BODY> </HTML:HTML> .HTML Tags – Typical Struts Form <HTML:HTML> <BODY> <HTML:FORM Action="/CustomerForm" focus=“name” > <TABLE WIDTH="100%"> <TR><TD><bean:message key="customer.state"/></TD> <TD><HTML:TEXT property="state" size ="2" maxlength ="2" /></TD></TR> <TR><TD><bean:message key="customer.address"/></TD> <TD><HTML:TEXT property="address" size ="40" maxlength ="40" /></TD></TR> <TR><TD><bean:message key="customer.

– Bean Creation .Extended syntax to refer to JavaBean properties with simple names (same as the standard JSP tags <jsp:getProperty> and <jsp:setProperty>). – Bean Output . can be created from a variety of objects and APIs associated with the current request. in any scope.getCity()). which will be included in the response being created by your JSP returns the value retrieved by the Java expression getAddress().New JSP beans. . and indexed names (a property named address[3] retrieves the fourth address from the indexed "address" property of a bean). or with the servlet container in which this page is running.Bean Tags • The "struts-bean" tag library provides substantial enhancements to the basic capability provided by <jsp:useBean>. as discussed in the following sections: – Bean Properties .Supports the rendering of textual output from a bean (or bean property). nested names (a property named address.

Render the value of the specified bean property to the current JspWriter. Expose a specified item from the page context as a bean. Define a scripting variable based on the value(s) of the specified bean property. Define a bean containing the number of elements in a Collection or Map. Define a scripting variable based on the value(s) of the specified request header.Tag Name cookie define header include message page parameter resource size struts write Description Define a scripting variable based on the value(s) of the specified request cookie. . Load the response from a dynamic application request and make it available as a bean. Load a web application resource and make it available as a bean. Expose a named Struts internal configuration object as a bean. Render an internationalized message string to the response. Define a scripting variable based on the value(s) of the specified request parameter.

unitnbr”/></th> <th align="left"><bean:message key=“<bean:write name='image' property='lob'/> &unitnbr=<bean:write name='image' property='unitnbr'/> &onbase_dns=<bean:write name='image' property='onbase_dns'/>" > <bean:write name="image" property="lob"/></a></td> <td><bean:write name="image" property="unitnbr"/></td> <td><bean:write name="image" property="onbase_dns"/></td> </tr> </logic:iterate> </table> .onbase_dns”/></th> </tr> <logic:iterate id="image" property="collection" name="ImageLocationListForm"> <tr> <td><a href="ImageLocationListForm.lob”/></th> <th align="left"><bean:message key=“imagebroker.Bean Tag Example <table border="2"> <tr> <th align="left"><bean:message key=“imagebroker.

looping over object collections for repetitive generation of output text.Logic Tags • The Logic tag library contains tags that are useful in managing conditional generation of output text. and application flow management. etc . substring matching. • Can do value comparison.

Example <html:html> <head> <title><bean:message key="imagebrokerlink.title"/> </logic:notEqual> <logic:equal property="action" name="ImageLocationForm" value="Insert"> <bean:message key="imagelocationinsert.title"/> </logic:equal> … … .Logic Tags .title"/></title> <META name="GENERATOR" content="IBM WebSphere Studio"> </head> <body> <html:form action="/ImageLocationForm" > <center> <font size=3> <br> <b> <logic:notEqual property="action" name="ImageLocationForm" value="Insert"> <bean:message key="imagelocationdetail.

That template is included with the insert tag.Template Tags • The Template tag library contains three tags: put. which is retrieved by a get tag in a different JSP page (the template). Put tags put content into request scope. . get. and insert.

tld" prefix="broker" %> <table width=750 cellspacing=0 cellpadding=2 border=2 > <tr> <td><broker:form lob='<%=test.getUnitnbr()%>' userid='<%=test.getLob()%>' unitnbr='<%=test.Custom Tags <%@ taglib uri="WEB-INF/imagebroker.getUserid()%>' > <broker:doctype value="Invoice"/> <broker:keyword name="CompanyNbr" value="55555"/> <broker:keyword name="PONbr" value="M12345"/> <broker:constraint name="FromDate" value="02/02/2002"/> <broker:constraint name="ToDate" value="02/28/2002"/> Image Broker Link Test </broker:form> </td> </tr> </table> .

Custom Tags – tld File
<tag> <name>doctype</name> <tagclass>com.pri.brokertag.ImageBrokerDoctype</tagclass> <attribute> <name>value</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>

Custom Tags – Tag Class
public class ImageBrokerDoctype extends TagSupport { private String value = null; public int doStartTag() throws JspException { Hashtable ht = null; String keyword_count = null; int iCnt = 0; HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); ht = (Hashtable) request.getAttribute("keyword_parms"); keyword_count = (String) request.getAttribute("queryobject_count"); iCnt ++; ht.put("QueryObject" + iCnt, value); request.setAttribute("keyword_parms", ht); request.setAttribute("queryobject_count", new String(new Integer(iCnt).toString())); return EVAL_PAGE; } }

STRUTS Configuration File • The developer's responsibility is to create an XML file named strutsconfig.xml, and place it in the WEB-INF directory of your application. This format of this document is constrained by it's definition in "struts-config_1_0.dtd". The outermost XML element must be <struts-config>.

there are two important elements that are used to describe your actions: <form-beans> This section contains your form bean definitions. <action-mappings> This section contains your action definitions. Each action element requires the following attributes to be defined: • path: The application context-relative path to the action • type: The fully qualified java classname of your Action class • name: The name of your <form-bean> element to use with this action . this is also the name of the request or session attribute under which this form bean will be stored. You use an <action> element for each of your actions you would like to define. which has the following important attributes: • name: A unique identifier for this bean. which will be used to reference it in corresponding action mappings. • type: The fully-qualified Java classname of your form bean. Usually. You use a <formbean> element for each form bean.• Inside of the <struts-config> element.

CryptForm" /> </form-beans> <!-.CryptAction" name="CryptForm" scope="request" input="/pgCrypt.imagebrokerWeb.apache.jsp"/> </action> </action-mappings> </struts-config> .html"/> </global-forwards> <!-.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.========== Action Mapping Definitions ============================== --> <action-mappings> <action path="/CryptForm" type="com.jsp"> <forward name="encrypt" path="/pgCryptDisplay.pri.========== Global Forward Definitions ============================== --> <global-forwards> <forward name="start" path="/index.0//EN" " Form Bean Definitions =================================== --> <form-beans> <form-bean name="CryptForm" type="com.pri.Struts-config.xml • • • • • • • • • • • • • • • • • • • • <?xml version="1.dtd"> <struts-config> <!-.

Using the deployment descriptor for the example application as a guide.xml) to include all the Struts components that are required. . we see that the following entries need to be created or modified.Web Application Descriptor File • The final step in setting up the application is to configure the application deployment descriptor (stored in file WEB-INF/web.

xml</param-value> </init-param> </servlet> .struts.ActionServlet</servlet-class> <init-param> <param-name>application</param-name><param-value>imagebrokerWeb</paramvalue> </init-param> <init-param> <param-name>config</param-name><param-value>WEB-INF/strutsconfig.action.dtd"> <web-app id="WebApp"> <display-name>imagebrokerWeb</display-name> <!-.Action Servlet Configuration --> <servlet id="Servlet_1"> <servlet-name>action</servlet-name> <servlet-class>org.2//EN" " Web Application 2.apache. Inc.xml File • • • • • • • • • • • • • • • • <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems.web.

The Welcome File List --> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> .web.continued <!</url-pattern> </servlet-mapping> <!-.xml File .Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.

tld</taglib-uri> <taglib-location>/WEB-INF/struts-logic.web.tld</taglib-uri> <taglib-location>/WEB-INF/struts-html.tld</taglib-uri> <taglib-location>/WEB-INF/struts-bean.continued <!-.tld</taglib-location> </taglib> </web-app> .tld</taglib-location> </taglib> <taglib> <taglib-uri>WEB-INF/struts-html.tld</taglib-location> </taglib> <taglib> <taglib-uri>WEB-INF/struts-logic.xml File .Struts Tag Library Descriptors --> <taglib> <taglib-uri>WEB-INF/struts-bean.

required=<li>You must enter the Line of Business. imagebroker.title=pri Image Broker Link Test imagelocationlist.required=<li>You must enter the Unit Number.</li> imagebroker.linkname=Project Refinery.lob.</li> error.unitnbr.Application Resources File • • • • • • • • • • • • error. Inc.title=Image Location Detail imagelocationinsert.cryptvalue.title=Image Location Insert errors.footer= .required=<li>You must enter the OnBase DNS.</li> error.onbase_dns.header= errors.required=<li>You must enter some text.</li> error.title=pri Image Broker imagebrokerlink.title=Image Location List imagelocationdetail. • Demystifying Jakarta Struts .Resources • Jakarta Struts Web Site • Learn Technology • Struts Community Resources http://struts.

Books Chuck Cavaness James Holmes .

Books… Ted Husted .

Coordinating for TWINCLING Saturday Meet (TSM) Providing LCD projector and Meeting .Special thanks AppLabs Technologies Pvt. http://www.applabs. Ltd.

OpenSource software development & promotion society. . independent. "not-for-profit".About Us India's first.twincling.

Sign up to vote on this title
UsefulNot useful