Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Part of the Jakarta Project Sponsored by the Apache Software Foundation Developed by: Roger W Barnes of Project Refinery, Inc.
Introduction to Struts
STRUTS
Course
Objectives
Overview Unit 1 - Model-View-Controller Design Pattern Unit 2 - Model Components Unit 3 - View Components Unit 4 - Controller Components Unit 5 - Tag Libraries
Project Refinery, Inc. 2
STRUTS
Unit
Objectives
6 - STRUTS Configuration File Unit 7 - Web Application Descriptor File Unit 8 - Application Resources File Unit 9 Resources
Unit 1
STRUTS
Central
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
Project Refinery, Inc. 5
STRUTS
STRUTS
3
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
STRUTS
Configuration
file contains action mappings (determines navigation) Controller uses mappings to turn HTTP requests into application actions Mapping must specify
A
Model Components
Unit 2
STRUTS
Model
Internal
Model Components
JavaBeans Enterprise
10
STRUTS
Model Components
11
STRUTS
Model Components
ActionForm Beans
Extends the ActionForm class Create one for each input form in the application If defined in the ActionMapping configuration file, the Controller Servlet will perform the following:
Check session for instance of bean of appropriate class If no session bean exists, one is created automatically For every request parameter whose name corresponds to the name of a property in the bean, the corresponding setter method will be called The updated ActionForm bean will be passed to the Action Class perform() method when it is called, making these values immediately available
Project Refinery, Inc. 12
STRUTS
Model Components
STRUTS
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, and use nested property references. For example, you have a "customer" bean on your Action Form, and then refer to the property "customer.name" in your JSP view. This would correspond to the methods customer.getName() and customer.setName(string Name) on your customer bean
Project Refinery, Inc. 14
STRUTS
Model Components
System State Beans Actual state of a system is normally represented as a set of one or more JavaBeans classes, whose properties define the current state A shopping cart system, for example, will include a bean that represents the cart being maintained for each individual shopper, and will (among other things) include the set of items that the shopper has currently selected for purchase
15
STRUTS
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 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, business logic beans might be ordinary JavaBeans that interact with system state beans passed as arguments, or ordinary JavaBeans that access a database using JDBC calls
Project Refinery, Inc. 16
STRUTS
Model Components
Business Logic Beans - Continued For larger applications, these beans will often be stateful or stateless Enterprise JavaBeans (EJBs)
17
STRUTS
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
18
View Components
Unit 3
19
STRUTS
View Components
Internationalized Messages Struts builds upon Java platform to provide assistance for building internationalized and localized applications
Locale - fundamental Java class that supports internationalization ResourceBundle - supports messages in multiple languages PropertyResourceBundle - 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 - lets you treat a set of resource bundles like a database, and allows you to request a particular Project Refinery, Inc. 20 message string for a particular Locale
STRUTS
Contains
View Components
ApplicationResources.properties
the messages in the default language for your server. If your default language is English, you might have an entry like this: prompt.hello=Hello the same messages in the language whose ISO language code is "xx"
ApplicationResources_xx.properties
Contains
21
STRUTS
Forms
HTML
View Components
22
STRUTS
View Components
<%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <html:html> <head> <title> <bean:message key="logon.title"/> </title> <body bgcolor="white"> <html:errors/> <html:form action=/logonpath.do"> <table border="0" width="100%"> <tr> <th align="right"> <html:message key="prompt.username"/> </th> <td align="left"> <html:text property="username" size="16"/> </td> </tr> <tr> <td align="right"> <html:submit> <bean:message key="button.submit"/> </html:submit> </td>
23
STRUTS
View Components
STRUTS
View Components
STRUTS
View Components
STRUTS
View Components
STRUTS
View Components
28
STRUTS
View Components
29
STRUTS
Page
The
View Components
development of the various segments of a site is easier if you can divide up the work, 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
30
STRUTS
View Components
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, and is handled transparently by the server The bean:include tag takes either a an argument "forward" representing a logical name mapped to the jsp to include, or the "id" argument, which represents a page context String variable to print out to the jsp page
31
Controller Components
Unit 4
32
STRUTS
Struts
Controller Components
includes a Servlet that implements the primary function of mapping a request URI to an Action class (ActionServlet)
33
STRUTS
Controller Components
STRUTS
Action
The
Controller Components
Classes:
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;
35
STRUTS
The
Controller Components
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
36
STRUTS
Controller Components
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, 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, based on the newly updated beans
Project Refinery, Inc. 37
STRUTS
Controller Components
Design issues to remember when coding Action classes include the following
The controller Servlet creates only one instance of your Action class, and uses it for all requests. Thus, you need to code your Action class so that it operates correctly in a multi-threaded environment, 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, not instance variables, in your Action class
38
STRUTS
Controller Components
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
Project Refinery, Inc. 39
STRUTS
Controller Components
type - Fully qualified Java class name of the Action implementation class used by this mapping. name - The name of the form bean defined in the config file that this action will use path - The request URI path that is matched to select this mapping. See below for examples of how matching works. unknown - Set to true if this action should be configured as the default for this application, to handle all requests not handled by another action. Only one action can be defined as a default within a single application. validate - Set to true if the validate() method of the action associated with this mapping should be called.
Project Refinery, Inc. 40
STRUTS
Controller Components
41
STRUTS
Controller Components
<form-beans> This section contains your form bean definitions. You use a <form-bean> element for each form bean, 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
42
STRUTS
Controller Components
<action-mappings> This section contains your action definitions. You use an <action> element for each of your actions you would like to define. 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
43
STRUTS
Controller Components
One more section of good use is the <datasources> section, which specifies data sources that your application can use.This is how you would specify a basic data source for your application inside of struts-config.xml:
<struts-config> <data-sources> <data-source autoCommit="false" description="Example Data Source Description" driverClass="org.postgresql.Driver" maxCount="4" minCount="2" password="mypassword" url="jdbc:postgresql://localhost/mydatabase" user="myusername"/> </data-sources> </struts-config>
Project Refinery, Inc. 44
STRUTS
The
Controller Components
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
45
Tag Libraries
Unit 5
46
STRUTS
HTML
Tag Libraries
47
HTML Tags
The tags in the Struts HTML library form a bridge between a JSP view and the other components of a Web application. Since a dynamic Web application often depends on gathering data from a user, input forms play an important role in the Struts framework. Consequently, the majority of the HTML tags involve HTML forms. Other important issues addressed by the Struts-HTML tags are messages, error messages, hyperlinking and internationalization.
48
HTML Tags
button cancel checkboxes file hidden image multibox password input fields radio buttons reset buttons
select lists with embedded option options submit buttons text input fields
textareas
49
50
51
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 - Extended syntax to refer to JavaBean properties with simple names (same as the standard JSP tags <jsp:getProperty> and <jsp:setProperty>), nested names (a property named address.city returns the value retrieved by the Java expression getAddress().getCity()), and indexed names (a property named address[3] retrieves the fourth address from the indexed "address" property of a bean). Bean Creation - New JSP beans, in any scope, can be created from a variety of objects and APIs associated with the current request, or with the servlet container in which this page is running. Bean Output - Supports the rendering of textual output from a bean (or bean property), which will be included in the response being created by your JSP page.
52
Bean Tags
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. Define a scripting variable based on the value(s) of the specified bean property. Define a scripting variable based on the value(s) of the specified request header. Load the response from a dynamic application request and make it available as a bean. Render an internationalized message string to the response. Expose a specified item from the page context as a bean. Define a scripting variable based on the value(s) of the specified request parameter. Load a web application resource and make it available as a bean. Define a bean containing the number of elements in a Collection or Map. Expose a named Struts internal configuration object as a bean. Render the value of the specified bean property to the current JspWriter.
53
Logic Tags
The
Logic tag library contains tags that are useful in managing conditional generation of output text, looping over object collections for repetitive generation of output text, and application flow management.
55
Logic Tags
For tags that do value comparisons (equal, greaterEqual, greaterThan, lessEqual, lessThan, notEqual), the following rules apply:
The specified value is examined. If it can be converted successfully to a double or a long, it is assumed that the ultimate comparison will be numeric (either floating point or integer). Otherwise, a String comparison will be performed. The variable to be compared to is retrieved, based on the selector attribute(s) (cookie, header, name, parameter, property) present on this tag. It will be converted to the appropriate type for the comparison, as determined above. A request time exception will be thrown if the specified variable cannot be retrieved, or has a null value. The specific comparison for this tag will be performed, and the nested body content of this tag will be evaluated if the comparison returns a true result.
Project Refinery, Inc. 56
Logic Tags
For tags that do substring matching (match, notMatch), the following rules apply:
The specified variable is retrieved, based on the selector attribute(s) (cookie, header, name, parameter, property) present on this tag. The variable is converted to a String, if necessary. A request time exception will be thrown if the specified variable cannot be retrieved, or has a null value. The specified value is checked for existence as a substring of the variable, in the position specified by the location attribute, as follows: at the beginning (if location is set to start), at the end (if location is set to end), or anywhere (if location is not specified).
Project Refinery, Inc. 57
Logic Tags
Tag Name empty equal forward greaterEqual greaterThan iterate lessEqual lessThan match messagesNotPresent Description Evaluate the nested body content of this tag if the requested variable is either null or an empty string. Evaluate the nested body content of this tag if the requested variable is equal to the specified value. Forward control to the page specified by the specified ActionForward entry. Evaluate the nested body content of this tag if requested variable is greater than or equal to specified value. Evaluate the nested body content of this tag if the requested variable is greater than the specified value. Repeat the nested body content of this tag over a specified collection. Evaluate the nested body content of this tag if requested variable is greater than or equal to specified value. Evaluate the nested body content of this tag if the requested variable is less than the specified value. Evaluate the nested body content of this tag if specified value is an appropriate substring of requested variable. Generate the nested body content of this tag if the specified message is not present in this request.
messagesPresent
notEmpty notEqual notMatch notPresent present redirect
Generate the nested body content of this tag if the specified message is present in this request.
Evaluate the nested body content of this tag if the requested variable is neither null nor an empty string. Evaluate the nested body content of this tag if the requested variable is not equal to the specified value. Evaluate the nested body content of tag if specified value not an appropriate substring of requested variable. Generate the nested body content of this tag if the specified value is not present in this request. Generate the nested body content of this tag if the specified value is present in this request. Render an HTTP Redirect
58
59
Template Tags
The
Template tag library contains three tags: put, get, and insert. Put tags put content into request scope, which is retrieved by a get tag in a different JSP page (the template). That template is included with the insert tag.
60
Template Tags
Insert
Inserts (includes, actually) a template. Templates are JSP pages that include parameterized content. That content comes from put tags that are children of insert tags. Put Puts content into request scope. Get Gets the content from request scope that was put there by a put tag.
61
Custom Tags
<%@ taglib uri="WEB-INF/imagebroker.tld" prefix="broker" %> <table width=750 cellspacing=0 cellpadding=2 border=2 > <tr> <td><broker:form lob='<%=test.getLob()%>' unitnbr='<%=test.getUnitnbr()%>' userid='<%=test.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> Project Refinery, Inc. 62
</attribute>
</tag>
63
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; } Project Refinery, Inc. 64
65
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>.
66
Struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"> <struts-config> <!-- ========== Form Bean Definitions =================================== --> <form-beans> <form-bean </form-beans> <!-- ========== Global Forward Definitions ============================== --> <global-forwards> <forward name="start" path="/index.html"/> name="CryptForm" type="com.pri.imagebrokerWeb.CryptForm" />
</global-forwards> <!-- ========== Action Mapping Definitions ============================== --> <action-mappings> <action path="/CryptForm" type="com.pri.imagebrokerWeb.CryptAction"
name="CryptForm"
<forward name="encrypt" </action> </action-mappings> </struts-config>
scope="request"
input="/pgCrypt.jsp">
path="/pgCryptDisplay.jsp"/>
68
69
Web.xml File
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. Using the deployment descriptor for the example application as a guide, we see that the following entries need to be created or modified.
Project Refinery, Inc. 70
Web.xml File
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.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.apache.struts.action.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.xml</param-value> </init-param> </servlet> Project Refinery, Inc. 71
72
<taglib>
<taglib-uri>WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location> </taglib>
74
Application.properties File
error.cryptvalue.required=<li>You must enter some text.</li> error.lob.required=<li>You must enter the Line of Business.</li> error.unitnbr.required=<li>You must enter the Unit Number.</li> error.onbase_dns.required=<li>You must enter the OnBase DNS.</li> imagebroker.linkname=Project Refinery, Inc. imagebroker.title=pri Image Broker imagebrokerlink.title=pri Image Broker Link Test imagelocationlist.title=Image Location List imagelocationdetail.title=Image Location Detail imagelocationinsert.title=Image Location Insert errors.header= errors.footer=
75
Resources
Unit 9
76
Resources
Main
Struts
77