Robust, scalable, and feature-rich Web applications are attainable. Using the industry-standard Unified Modeling Language (UML) to create designs allows Web application
developers to easily integrate them with other systems modeled in UML.
Written for project managers, architects, analysts, designers, and implementers, Building
Web Applications with UML, Second Edition, demystifies the challenging aspects of
modeling with the Web Application Extension (WAE) for the Unified Modeling Language.
Because UML has been widely accepted as the standard language for modeling software
systems, it is without question the best option for modeling Web application designs. The
WAE extends the UML notation with semantics and constructs that empower you to model
Web-specific architectural elements using the Rational Unified Process or an alternative
methodology. Furthermore, using UML allows the modeling of Web applications as a part
490 trang |
Chia sẻ: banmai | Lượt xem: 1957 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Đề tài Buiding web applications with uml second edition, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
by
the type tag value (type = { tag | directive }).
«forward» Association
A «forward» association is coded with the tag.
«redirect» Association
A «redirect» association is implemented by the sendRedirect(String location) operation on the
HttpResponse object, which is available in the context of a JSP by the response variable.
«JSP Tag» Class
A «JSP Tag» in the model corresponds to a JSP custom tag (Figure A-47). The class defines a number of
tag attributes and scripting variables. Attributes of the «JSP Tag» that are stereotyped are element
attributes that can be specified in the opening tag. These attributes are captured in the tag library
descriptor file with the following XML fragment:
Entry
app.glossary.taglib.EntryTag
app.glossary.taglib.EntryTEI
JSP
Figure A-47. Sample «JSP Tag» class
entryid
true
true
convertLineBreaks
false
true
Page 406
Tag values on the attributes indicate whether the attribute is required (required = { yes | no }).
Scripting variable stereotyped attributes must be defined in a TagExtraInfo class, which is identified by
a «tei» stereotyped dependency from the «JSP Tag». The TagExtraInfo class for the example in Figure
A-47 follows.
public class EntryTEI extends TagExtraInfo {
public EntryTEI() { super(); }
public VariableInfo[] getVariableInfo(TagData data) {
return new VariableInfo[]
{
new VariableInfo("id", "String", true, VariableInfo.NESTED),
new VariableInfo("term", "String", true, VariableInfo.NESTED),
new VariableInfo("acronym", "String", true, VariableInfo.NESTED),
new VariableInfo("longTerm", "String", true, VariableInfo.NESTED),
new VariableInfo("description", "String", true, VariableInfo.NESTED),
new VariableInfo("includesHTML", "String", true, VariableInfo.NESTED),
new VariableInfo("lastmodified", "String", true, VariableInfo.NESTED)
};
}
}
The «JSP Tag» implementing class is identified with a «tag» dependency. Its implementation must
include certain operations (see the JSP specification for details). The class in this example follows, with
operation bodies removed for clarity. Each specified attribute must provide a get and a set operation.
Public class EntryTag extends BodyTagSupport {
public String getConvertLineBreaks(){ }
public void setConvertLineBreaks(String _convertLineBreaks ){}
public String getEntryid() {}
public void setEntryid(String _id ){}
public void doInitBody() throws JspException {}
public int doStartTag() throws JspException {}
public int doEndTag() throws JspTagException {}
public void release() {}
}
«JSP Tag Library» Package
A JSP tag library (Figure A-48) maps to a .tld descriptor file. This file uses the «attribute» stereotyped
attributes and the two dependency relationships to the implementing classes («tag» and «tei») to define
most of the fields in this descriptor file.
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"">
Page 407
1.0
1.1
Entry
app.glossary.taglib.EntryTag
app.glossary.taglib.EntryTEI
JSP
entryid
true
true
convertLineBreaks
false
true
Figure A-48. Tag library package
I l@ve RuBoard
Page 408
I l@ve RuBoard
Appendix B. The Number Store Reference Application
Vision
Background
Requirements and Features
Software Architecture Document
Sample Screen Shots
I l@ve RuBoard
Page 409
I l@ve RuBoard
Vision
In most software development efforts, the vision document is created early to obtain
funding. In this book, the need for this application was solely to provide a nontrivial
example of the Web Application Extension (WAE) profile for UML for this second edition.
The publisher and I are in essence the primary stakeholders, and it is to this audience that
this document is oriented.
Because the publisher and I are the primary stakeholders and are undertaking this vision
document solely to produce supplementary material for the book, the vision does not
contain much market analysis or cost/value comparisons. Rather, it contains a lot of the
mental discussions I've had with myself about what type of application would be a good
exemplar of a J2EE application, one that would be good candidate to show the most
important aspects of the WAE.
I l@ve RuBoard
Page 410
I l@ve RuBoard
Background
Understanding and building sophisticated Web applications is difficult. One of the biggest overall
issues facing development teams is managing complexity. With each succeeding generation,
our applications are becoming increasingly large and complex. In addition, these applications
are taking on more mission-critical roles. All this underscores the need for good tools and
processes that will make our teams more efficient and result in a higher quality of work.
A primary goal of the book is to demonstrate how teams can effectively leverage UML as a
development tool for building Web applications, which in this context are software applications
that manage business state and that have adopted a Web-centric presentation tier that relies
heavily on standard Web technologies and standards, such as HTTP, HTML, Web browsers, and
client-side scripting.
The WAE focused primarily on the presentation tier of modern Web applications. As a result,
most of the discussions center on the shape and the nature of this tier, leaving detailed
discussions of other tiers—business logic, entity, data—to other books.
All the UML elements are managed in one Rational Rose 2002 model file. The top-level package
diagram is shown in Figure B-1. The full UML model is not included in this appendix but can be
downloaded, along with all the source code for the application, from the Addison-Wesley Web
site at www.awl.com/cseng. The model is available in Rational Rose 2002 format (.mdl file).
Figure B-1. Top-level model and package summary
Page 411
I l@ve RuBoard
Page 412
I l@ve RuBoard
Requirements and Features
For this application to be an effective tool for understanding the WAE and Web application
architectures in general, the following architecturally significant design elements must be
included:
l JSP and servlet classes
l Client-side scripting
l Specializations for certain browser versions
l JavaBean use in JSPs
To keep the focus on the modeling and architecture, a commonly understood domain,
such as e-retail applications, should be used. Having to explain both the domain problem
and the architecture would distract from the goal of seeing the modeling technique in
action. Well-documented code and simplicity and understandability are favored over
efficiency and performance.
I l@ve RuBoard
Page 413
I l@ve RuBoard
Software Architecture Document
The Number Store is a J2EE application that allows users to browse a catalog of numbers and
select some for purchase. When a customer purchases a number, fictitious payment
information is collected and processed. Real users are advised not to submit credit card
information because anything that is provided will be accepted. In addition to browsing a
catalog of numbers, a user can take a tutorial on adding fractions.
The principal goal of the Number Store application is not to give its users functionality of value
but rather to provide a J2EE exemplar application for demonstrating the Web Application
Extension for UML (WAE). The WAE is a formal Unified Modeling Language (UML) profile that
allows Web application development teams to use UML to model design-level abstractions of
their Web applications. The vision document for this application outlines the overall goal and
context that this application is being developed in and is treated as the originating
requirements source. The meat of this application, however, can be found in this document.
This abbreviated architecture document describes the underlying architecture of this application
and relies on the use of the WAE. The intent is that this document, combined with the entire
UML model, will serve as a sufficient example of the use and benefits of UML modeling.
The architecture is expressed in terms of multiple views of the system. Each view represents
certain aspects of the system under construction. This document contains the most
architecturally significant elements across all development artifacts. As a result, the document
may appear to be a summary of the entire collection of software development processes'
artifacts.
Requirements View
The requirements for the Number Store application are drawn from the vision document. The
vision document, of course, cannot contain all the application's requirements, which are
contained in a full-size requirements document/database. In this section of the architecture
document, only the significant architectural requirements (SARs) are expressed. These
requirements directly lead to design decisions in the architecture.
The nonfunctional requirements are not conveniently expressed in terms of dialogue scenarios
between the system's users and the system. This simple application has few of these
requirements.
1. Fundamental Architectural and Design Elements
1.1. Use both JSP and servlets to accept and build page requests.
1.2. The application will use servlets to accept incoming HTTP requests
and JSPs to build outgoing HTML pages.
1.3. The JSPs will include other JSPs, as well as reference and use beans.
1.4. If possible, JSPs will use custom tag libraries.
1.5. The application will have at least one instance in which a targeted
link is used.
Page 414
1.6. The application will use common Web application design patterns.
1.6.1. Model View Controller pattern: Separate, discrete
elements for managing the business state, building and
presenting the user interface, and coordinating and
controlling their activities.
1.6.2. Controlled Controllers pattern: Allowance for use
and definition of multiple concurrent controllers in the
application.
1.6.3. Paged List pattern: A way to present large lists of
data to the user one page at a time. The user will scroll
through pages of data one at a time to examine the list.
This keeps the maximum page size and response time to
a manageable level.
1.6.4. Shopping Cart pattern: A mechanism for
application users to maintain references to items in the
application throughout a session or a scenario. The items
are selected for further processing, that is, purchase.
2. Domain
2.1. The application should mimic a common e-retail application. Its
interface should be simple and not contain many specializations. In
effect, the problem domain should almost be commonplace and invisible
to the architecture.
2.2. The problem domain shall be a store that sells numbers. The
products of this store are therefore numbers: integers, primes, squares,
and so on. Using numbers as products should simplify the process of
creating a sample inventory.
2.3. The product catalog should be divided into category groups. The
initial release will contain categories for integers, primes, perfect
squares, and miscellaneous.
2.3.1. The integer category will have products ranging
from 1 to 499.
2.3.2. The primes category will contain the first 1,000
prime numbers.
2.3.3. The squares category will contain the first 20
perfect squares.
2.3.4. The special category will contain three values—PI,
the natural log root, and the number 42, the ultimate
answer to the universal question, whatever that might
be. (This is a nod to the Hitchhiker's Guide to the Galaxy
trilogy.)
2.4. Each product will be able to produce a value for its name, that is, a
numerical value, a brief description, and a price.
Page 415
2.5. Shopping
2.5.1. Users should be able to select and to purchase
numbers.
2.5.2. The shopping cart should be accessible at all times
and exhibit the standard behaviors for shopping carts.
2.5.3. The checkout process shall accept fictitious
payment information and appear to process it.
2.5.4. Orders are to be confirmed to the user with an
invoice.
2.6. Tutorials
2.6.1. A tutorial controller shall be added to the
application, after the shopping and ordering functionality
is completed, to demonstrate how controllers can be
added without affecting (too much) the rest of the
application design.
2.6.2. The tutorial will present a lesson on adding simple
fractions.
2.6.3. The tutorial will leverage DHTML and will present a
separate user interface to leverage the capabilities of
one specific browser version. The browser version will be
IE 3.0 or greater. This browser has a straightforward
interface for doing dynamic text replacement in a Web
page on the client. Other browser versions will see a non-
DHTML-enabled page.
3. Runtime Environment
3.1. The application should be capable of running both the client and the
server tiers on the same machine to facilitate examination and
experimentation. The application can also be deployed on a separate
node without design change.
3.2. The use of a formal entity and data tier should be minimized and
eliminated, if possible. The focus of the modeling technique is on the
presentation tier. The other tiers should be stubbed out when possible.
4. Performance
4.1. Page response times should be under 5 seconds for all pages during
normal operation.
5. Security
5.1. There are no special security requirements or policies for this
application.
Page 416
Use Case View
The Number Store has only three use cases, so all three are architecturally significant. Figure B-
2 shows the top-level use case view diagram for the application.
Figure B-2. Use case model top-level diagram
This application has a single actor: Number Customer. The customer is an anonymous Internet
user who will browse the catalog and purchase items. Figures B-3 through B-6 outline the basic
flows of the scenarios.
Figure B-3. Shop for Numbers: basic flow
Page 417
Figure B-6. Add Fraction Tutorial: basic flow
Page 418
User Experience View
The user experience (UX) model expresses the application from the viewpoint of screens of
information and is very much a user interface model. The two class stereotypes for elements in
the logical view are screen and form. A screen is a complete user interface presented to the
user. A form is a user input element that accompanies requests to the server.
In this model, the convention of using a dollar sign ($) indicates that the screen is accessible
from most screens in the system: The screen is in a global scope. The plus sign (+) is
appended to screen names that implement the paged list mechanism. These screens display a
large list of items one "page" at a time. The dollar sign and the plus sign are simply notational
conventions used in the context of this application and do not represent a defined modeling
convention in the WAE or any other UML profile.
Figure B-4. Order Numbers: basic flow
Page 419
Figure B-7 shows the top-level UX model expressed as a class diagram and using the WAE
stereotypes for screens and forms. In this diagram, the principal navigational routes through
the system are expressed as associations between the screens. When form input is used—the
user supplies data, not just hyperlink selection—the form is expressed as a stereotyped
association class.
Figure B-7. Top-level navigation map
Page 420
Figure B-8 shows the same navigation map but with its details exposed. In this diagram, all the
dynamic content is exposed.
Figure B-8. Detailed view of navigation map
Page 421
Figure B-5. Invalid Payment Information: alternative flow
Page 422
Figure B-9 shows the main compartments defined in this application. Nearly every screen in the
application uses these compartments.
Figure B-9. Common compartments
The UX model has additional elements and diagrams that are not shown here. For the most
part, these additional elements do not, from a UX design point of view, represent anything
architecturally significant that cannot be understood from the figures shown already.
Figure B-10 shows a top-level summary of the storyboards defined in the application. Each
storyboard, or UX realization, realizes a use case defined in the use case model. The sequence
diagram for the Shop for Numbers storyboard is shown in Figures B-11 and B-12. The
remaining storyboards can be found in the UML model.
Figure B-10. Storyboards
Page 423
Figure B-11. Shop for Numbers storyboard
Page 424
Figure B-12. Part 2 of the Shop for Numbers storyboard
Page 425
Design
The top-level package diagram is shown in Figure B-13. This is a small application, one that is
focused almost exclusively on the client and presentation tiers, so the model was not organized
along tier boundaries but includes the elements for all tiers in the same packages.
[1]
[1] This is a departure from the recommended way to partition a
design model according to the Rational Unified Process and
Rational's general design guidelines.
Figure B-13. Top-level design model packages
Page 426
The Number Store recognizes four major architectural tiers: client, presentation, entity, and
data. Only the client and the presentation tiers are implemented.
Client Tier
Most of the implementation in the client tier has already been accomplished with the use of
standard Web browsers. The only custom client-tier code in this application is the JavaScript
scripting in the fraction tutorial practice (Try It) page and the polynomial tutorial applet. Figure
B-14 shows the Web page classes that implement the fraction tutorial client scripts. In this
diagram, the TryItIE.html page is included only when an Internet Explorer browser is
detected, because this particular set of scripting does not work in other browsers. For other
Page 427
browsers, no client scripting is used, and the TryItOther.jsp is used to build the page.
Figure B-14. Web page elements involved in the fraction tutorial
Page 428
Figures B-13 and B-14 show the polynomial tutorial applet and the client page interactions.
Presentation Tier
The vast majority of the design and code in this application is in the presentation tier. This tier
is responsible for responding to client requests and preparing suitable HTML responses. The
principal components in this tier are the Web server and the JSP engine. In this
implementation, Tomcat 3.2.3 is used. Tomcat is a reference implementation for the Java
servlet 2.2 and JavaServer Page technologies.
Each page request in this application is a request for a named screen. The screens are defined
in the UX model. Figure B-15 shows the mappings from the Home screen and its compartments
to the JSPs that are used to build that screen. The suffix .jsp is only a naming convention,
used here to help distinguish between client and server pages, which often have similar names.
Each screen in this application has mappings to the JSPs, or HTML pages, that are used to build
it. The dependency from the screen to the server page uses the name to indicate which
template parameter the JSP fulfills. In this figure, the home page is made up of a banner, a
footer, and a content page. The JSPs that make up this screen are the dependent classes.
Figure B-15. UX and design model mappings
A fundamental part of this system's architecture is the mechanism it uses for accepting and
processing incoming requests. This mechanism is derived from two common Web application
architectural patterns: Controlled Controllers and Master Template, which are described in
Appendixes C and D.
Page Request Handling
Page 429
The overall architecture for handling page requests in this application begins with a mapping in
the web.xml file that redirects all incoming requests for pages with the .scr extension to an
instance in the RequestProcessor class. The request processor is a servlet and, technically, a
«server page» stereotyped class, although in this particular model, it is stereotyped
«HttpServlet» as a result of the UML tool's code engineering engine.
The request processor accepts all incoming requests and then instructs the appropriate
controller to update the state of the business with the request, which contains not only the
requested URL but also all incoming parameters and form input. Once the state has been
updated, the processor checks to see whether another controller has been requested: a
parameter on the URL. If a new controller has been requested, the processor checks with the
active controller to see whether it requires exclusive control. If it doesn't, the new controller is
made active, given the incoming request to update with, and placed on top of the active
controller stack. A UseCaseCoordinator class is responsible for managing this stack. As a
last step, the request processor asks the active controller for the next screen ID to redirect to.
With this ID, control is passed, via a request dispatcher forward, to the ControlTemplate.
The ControlTemplate, a JSP that provides a utility method for defining screen definitions, is
responsible for setting in context any scriptlet values useful in the PresentationTemplate.
The PresentationTemplate is the JSP that is the main template of the Master Template
pattern. This JSP is responsible for formatting all outgoing pages consistently. It accesses the
screen definition attributes and uses them as the template's parameters. Most of these
parameters point to JSPs that are aggregated to produce one output screen. The
PresentationTemplate uses five parameters: a header, a footer, content and menu JSPs,
and one string value for the page name, used in the title element of the head element. Figure B-
16 shows principal classes and JSPs involved in processing all page requests.
Figure B-16. Overview of page request class
Page 430
The design model use case realizations show how each page request updates the active
controller and then redirects the output page, building to a set of server page classes. The basic
scenario for handling page requests is shown in the sequence diagram in Figure B-17.
Figure B-17. Sequence diagram showing the basic page request–handling scenario
Page 431
Figure B-18 shows some of the utility classes that participate in the page request scenarios.
The RequestProcessor servlet is the main point of entry for all HTTP requests. It uses the
UseCaseCoordinator object, held in the user's HttpSession object, to coordinate the
controllers. The ScreenDefinition class is a small wrapper around definitions for screens,
that is, composition of individual JSP pages.
Figure B-18. Utility classes involved in page request handling
Page 432
Defining Controllers
The Number Store application is heavily dependent on discrete controllers for managing
navigational flow and coordinating business logic execution. Figure B-19 shows the page classes
that support shopping functionality. Figure B-20 shows the main Java classes that provide
access to the business logic in the page, along with the ShopController class.
Figure B-19. Main pages supporting shopping functionality
Page 433
Figure B-20. Main Java classes supporting shopping functions
Page 434
The ShopController is a special controller; it is the default controller for all users of the
application and never expires, so it can always be found on the controller stack. All controllers
in this application define a state machine.
[2]
The state machine for the shopping controller is
shown in Figure B-21. The state machine can easily be seen reflected in the
determineNextScreen() operations in each of the controllers.
[2] It was the only way I could keep my sanity when developing the
application. Until I started defining state machines for each
controller, I found myself continually trying to correct boundary
conditions in behavior.
Page 435
Figure B-21. State diagram for shopping controller
UX Mapping
An example of the UX and design model mapping diagrams is shown for the Fraction Tutorial
section of the application (Figure B-22).
Figure B-22. Design and UX model mappings for Add Fraction tutorial
Page 436
Entity Tier
In a real Web application, business state is changed. This state usually corresponds to elements
in a database. The entity tier is the layer on top of the database, responsible for all the
business rules and logic in the system. This tier is in a J2EE application and is implemented with
Enterprise JavaBeans (EJB). The EJB container(s) manage all the transactional logic in the
system. For this reference application, however, EJBs are not used, since the purpose of this
application is to show how to model presentation-tier components. For details on how to model
EJBs, refer to the official Java specification for modeling Enterprise JavaBeans with UML (Java
Specification Request, or JSR, 26). Instead, this application uses standard Java classes to
implement the entity tier. Figure B-23 shows some of the entity classes that make up the
catalog.
Figure B-23. Entity-tier classes, implemented as standard Java classes
Page 437
Data Tier
The persistence part of the application is the data tier. In this application, all persistence is
mimicked by classes in the presentation tier. The data tier provides persistence services to the
entity tier. In some architectures, this tier might implement business logic—stored procedures—
whereas in others, only integrity constraints are implemented. In this application, the data tier
doesn't exist.
Component View
To accurately model the component view of this application, two separate but connected
hierarchies in the model, identified by the package stereotypes «virtual root» and «physical
root». The «virtual root» contains component elements that map directly to valid URLs that the
system will respond to. Each component is stereotyped «HttpResource» and realizes the screen
elements in the UX model. The «physical root» contains JSP and HTML stereotyped elements
that map directly to JSP and HTML files in the development file system and, presumably, the
relative runtime file system. Figure B-24 shows the top-level component view.
Figure B-24. Top-level component diagram
Page 438
Under the «virtual root» package, NumberStore Web, are components stereotyped
«HttpResource». Each of these components represents a valid URL in the system that a client
browser can request. All the components have a .scr extension, which is identified by the Web
server container. All HTTP requests made for resources with this extension are forwarded to the
RequestProcessor servlet. Figure B-25 shows the contents of the «virtual root» package in a
hierarchy tree. Next to this tree are some contents of the «physical root» package. In this
component package are «static page» and «dynamic page» stereotyped components—in this
case, the JSP components are stereotyped «JSP». Also under this hierarchy is a component for
the web.xml configuration file and some key image files.
Figure B-25. Component hierarchies of the packages «virtual root» and «physical
root»
Page 439
Figure B-26 shows a component diagram in the «virtual root». In this diagram, all the screen
definitions are organized by use cases.
Figure B-26. Component diagram for the «virtual root» containing «HTTPResource»
stereotyped component elements
Page 440
Component realizations begin with «HTTPResource» components that realize screens in the UX
model. «JSP» components in the «physical root» package realize «server page» and «client
page» classes in the design model. The connection between which HTTP resources (URLs) are
handled by which «JSP» components can be determined only by the UX and design model
mappings. Using the mapping between the UX screen and the «server page» or «client page»
logical class and then following the realization to the component will identify which JSP pages
are used to respond to which requested URLs (Figure B-27).
Figure B-27. Realizing components
Page 441
This may seem overly complex—and in my opinion it is. However, this architecture does have
advantages for extensibility and maintainability. The architecture imposes certain rules and
regulations for expanding the application with new pages and controllers. Adhering to the rules
will make application maintenance much easier than what might happen in an application
without a formal control-driven architecture.
I l@ve RuBoard
Page 442
I l@ve RuBoard
Sample Screen Shots
Figures B-28 through B-33 are screen shots that show the kinds of things the user would view
at some point in the Number Store application.
Figure B-28. The house page for the Number Store application
Figure B-29. The product details screen for the number PI
Page 443
Figure B-30. The shopping cart screen
Page 444
Figure B-31. The payment information screen
Page 445
Figure B-32. The fraction tutorial's try it screen
Page 446
Figure B-33. Debug information appears at the bottom of every screen of the
application
Page 447
I l@ve RuBoard
Page 448
I l@ve RuBoard
Appendix C. Controlled Controllers Pattern
Use Case View
Analysis Model Classes
Analysis Model Collaborations
I l@ve RuBoard
Page 449
I l@ve RuBoard
Use Case View
The controlled controllers mechanism allows the application to be designed around multiple
discrete presentation-tier controllers. Related to the Model View Controller (MVC) pattern, the
controlled controllers mechanism is a manager of individual MVC controllers. Each controller
represents a separate use case and is responsible for managing the dialogue between the user,
or actor, and the system for all supported scenarios. The top-level use case model is shown in
Figure C-1. The basic flow for accepting and managing a user page request is documented in
the sequence diagram of Figure C-2. The sequence diagram for adding controllers to the stack
is shown in Figure C-3. Figure C-4 shows how controllers are removed.
Figure C-1. Top-level use case model
Figure C-2. Basic flow scenario
Page 450
Figure C-3. New controller scenario
Page 451
Figure C-4. Remove Controller
Page 452
I l@ve RuBoard
Page 453
I l@ve RuBoard
Analysis Model Classes
Each controller is a single object—which may have many helper objects, if necessary—but all
support a common interface. A key element in this mechanism is that the Web application
server is configured to route all incoming requests through a single class: one object instance
for each user session. This object is the RequestProcessor.
At the heart of this mechanism is the coordinator, an object that manages all the active
controller instances for a particular user. When a user begins using the application, the default
controller is pressed into service and manages all the user page resource requests. A different
controller can be requested to take control of the user session, by specifying it as a parameter
in a URL hyperlink. This implies that at least some hyperlinks in the application will have
knowledge of the other controllers that can be activated and used by the user. (A good example
of this is a common menu HTML component whereby each hyperlink in it specifies the controller
that manages that activity.)
When it sees a request for a new controller, the coordinator first checks with the active
controller to ensure that it doesn't require exclusive control—for example, in the middle of an
important scenario that cannot be postponed. If it doesn't, the current controller is placed on a
stack, and the new controller is made the current one. All subsequent page resource requests
are managed by this controller until it is completed.
When a controller is completed, the coordinator removes it from the active stack, and the next
controller on the top is made the current active controller. (If there are none on the stack, a
new instance of the default controller is created.) Figure C-5 shows an analysis-level diagram of
the coordinator and its relations to the individual controllers.
Figure C-5. Main analysis-level class diagram for mechanism
Page 454
Each controller must be able to accept an incoming HTTP request for a page resource, process
any parameters or field data, update the state of the business, and identify the next page
resource to send to the requester. In some situations, the requested page resource cannot be
returned to the user, and a different one is sent. For example, the user might submit payment
information, and normal flow would be to the page that redisplays this information and prompts
for confirmation. If the data was invalid, the requested page—payment confirmation—shouldn't
be returned; rather, the payment information request page should be, with an informational
message indicating the invalid information. The controller is responsible for processing the
payment information and determining which of the two response pages should be sent back.
Each response page may interact with the state of the business in order to get and to assemble
the dynamic content in each page. It is also expected that each "page builder" can easily get a
reference to the current active controller, which provides a convenient access point to the
business state. Figure C-6 shows an analysis diagram of the controller and its relationship to
Page 455
the individual page builders and page user interfaces.
Figure C-6. Sample set of controllers
I l@ve RuBoard
Page 456
I l@ve RuBoard
Analysis Model Collaborations
The basic dynamic behavior of this mechanism is shown in Figure C-7. In this sequence
diagram, the client browser requests a page resource. The RequestProcessor handles this
request and delegates the processing of any input data—URL parameters or form data—to the
current active controller. If this is the first page request, a new instance of the default
controller is created and made currently active. The processor then requests the next page
resource to load, execute, and send back to the client browser.
Figure C-7. Basic flow use case realization
The Figure C-8 sequence diagram shows how the request processor and the coordinator add a
controller to the active stack. In this scenario, the request processor examines the incoming
request for a parameter that indicates a new controller request. Before invoking the new
controller, the request processor makes sure that the current controller doesn't require
exclusive control. If it doesn't, the new controller is made current and active and given the
input request for processing. The new controller now is the current active controller.
Figure C-8. New Controller use case realization
Page 457
In Figure C-9, the current controller indicates that it is finished and that the coordinator can
remove it from being active. The next controller in the stack is now returned to active and
current status and is given the input request, which it most likely will ignore, and asked which
page to load and send to the client. The overall flow of this mechanism is shown in Figure C-10.
Figure C-9. Remove Controller use case realization
Page 458
Figure C-10. Activity diagram summarizing mechanism
I l@ve RuBoard
Page 459
I l@ve RuBoard
Appendix D. Master Template Pattern
Overview
Use Case View
Logical View
I l@ve RuBoard
Page 460
I l@ve RuBoard
Overview
The master template mechanism was influenced by the Java Pet Store 1.0.1 example
documented in the Java BluePrints. In this mechanism, one page template (JSP) is used
for all outgoing pages, thereby helping enforce a consistent user interface look-and-feel
and providing a single source for updates. This mechanism is most useful for applications
that can benefit from an explicitly controlled user interface template, one in which pages
are expected to be added to the application. This mechanism does carry some
performance penalties, so it should be examined in detail before being used in applications
that are expected to scale quickly.
I l@ve RuBoard
Page 461
I l@ve RuBoard
Use Case View
The basic use case for page requests has only one scenario flow. Figure D-1 shows the top-level
use case diagram for this mechanism. The basic flow scenario is shown in Figure D-2.
Figure D-1. Use case diagram
Figure D-2. Basic flow scenario
I l@ve RuBoard
Page 462
I l@ve RuBoard
Logical View
The class diagram in Figure D-3 shows the principal participants in this mechanism. The user
screen represents any Web page rendered on the client. Each screen could be assembled from
the output of many Web server "pages," or JSPs. Each page component may contain dynamic
content and so may interact with the application server or middle-tier components of the
application. The Web server is the main controller for this mechanism and the single point of
entry for page requests. The Web server is most likely a commodity component, such as
Tomcat, WebSphere, Web Logic, and IIS.
Figure D-3. Main analysis class diagram
The screen template is the single template used to assemble and to format all outgoing
screens, or pages. Depending on which URL was requested, the template uses the URL as a key
to the screen's dictionary. The screen definitions are a dictionary, or map, of possible screens.
Each entry has a set of parameter values that are used by the template when assembling the
outgoing screen. A screen component is one part of an outgoing page and is implemented by
either a static HTML fragment file or a dynamic page—JSP, PHP, ASP—which produces HTML
fragments with dynamic content.
The parameters of the template are string identifiers of the individual page components.
Typically, they point to files to include and contain HTML fragments or, in the case of dynamic
components, contain JSP, PHP, or ASP code, which is processed before it returns the HTML
fragments. Each parameter is named; this name is used by the template as a key to get the
parameter value. For example, a template that defines a header, a footer, and the main body
would have three defined parameters. The header and footer values might reference a standard
HTML document that is intended to be used in every outgoing page, whereas the main body
parameter would most likely reference a dynamic page that assembles the bulk of the
application's presentation.
For each incoming screen request, the Web server delegates the request to the single "master"
template, which examines the request and uses it to determine which screen definition to use
for the outgoing page. With the next screen identified, the template gets its parameters and
Page 463
uses them to load and to process the page components individually. The result is sent to the
requesting client browser. Figure D-4 shows the sequence diagram of this basic flow.
Figure D-4. Use case realization for basic flow analysis model
I l@ve RuBoard
Page 464
I l@ve RuBoard
Appendix E. Glossary Application
Introduction
Requirements and Use Case Model
User Experience Model
Design Model
Component View
Sample Screen Shots
I l@ve RuBoard
Page 465
I l@ve RuBoard
Introduction
In the first edition of this book, a simple Active Server Page sample application was
created to demonstrate the UML artifacts that were created. This is the second, J2EE
version of that application. For the most part, the functionality of the application remains
the same; however, one new feature was added: versioning. This feature allows users to
examine the history of changes to any glossary entry.
I l@ve RuBoard
Page 466
I l@ve RuBoard
Requirements and Use Case Model
The overall goal and vision for this application is to demonstrate, in the context of a simple and
functional application, a technique for modeling Web applications with UML. Because the WAE is
applicable for only client- and presentation-tier elements, most of the effort in this application
can be found in these two tiers. The entity and data tiers, although functional, are not the focus
of the development efforts and are not very interesting.
A new requirement for this second version of the Glossary application is to include an example
of a «client script object». An excellent example of a well-engineered JavaScript object is the
Menu object designed by Gary Smith of Netscape. This object was included in this application
without modification and shows how you can build objects in JavaScript.
Another requirement is to allow HTML formatting in entry definitions. The application, however,
must not require users to know or to understand HTML, so the use of HTML-encoded
descriptions should be optional.
This application has only two simple use cases: Browse Entries and Edit Entry. The top-level
model is shown in Figure E-1. The Edit Entry use case extends the normal browsing of the
Glossary application by allowing an entry to be edited only in context, which, of course, means
that it must be browsed to first.
Figure E-1. Glossary use cases
The basic flow scenarios for the two use cases are shown in Figures E-2 and E-3.
Figure E-2. Browse Entries basic flow
Page 467
Figure E-3. Edit Entry basic flow
Page 468
I l@ve RuBoard
Page 469
I l@ve RuBoard
User Experience Model
The top-level diagram of the UX model for the Glossary application is shown in Figure E-4,
which shows definitions for five screens. Two of the screens contain input forms. One complex-
content-type class, Entry, is identified in this diagram. Entry is the key entity in the system;
indeed, Entry is the only entity of this application.
Figure E-4. Top-level navigation map
The two storyboards for this application are expressed in the sequence diagrams of Figures E-5
and E-6.
Page 470
Figure E-5. Browse Entries storyboard
Figure E-6. Edit Entry storyboard
I l@ve RuBoard
Page 471
I l@ve RuBoard
Design Model
The design model contains an expression of the logical structure and behavior of the
application's main objects. At the highest level, the design model is partitioned into
architectural tiers (i.e., client, presentation, business, and data).
Client Tier
The client tier is limited to the objects and collaborations that execute in the client browser.
Each Web page in this application contains a pop-up menu implemented with JavaScript. The
menu is modeled by the «client script object» menu. Most pages define two instances of the
menu: one main menu (actionMenu) and one submenu (browseMenu).
The Menu class contains member variables of type Array, shown in Figure E-7 as associations
to the JavaScript Array object. The complete JavaScript 1.3 object model is included in this
application's model as a reference.
Figure E-7. Use of menu «client script object» Menu class
Page 472
Presentation Tier
The majority of the work in this application is in the presentation tier. In this application, the
navigational control is left to the individual pages; there is no single controller, as might be
found in MVC-based applications. This application uses custom JSP tags extensively. The tag
library is modeled as a «tag library» stereotyped subsystem and is seen in Figure E-8 modeled
by the Entry Tags subsystem. In this diagram, the server pages index.jsp and listing.jsp
both use the library.
Figure E-8. Web pages involved in Browse use case
The Entry Tags library contains three tag definitions: EntryList, EntryLoop, and Entry.
Figure E-9 shows the «JSPTag» stereotyped elements with stereotyped dependencies to their
implementation classes. Each tag defined here also defines several scripting variables that can
be used in the tag body. These variables are modeled as «scripting variable» stereotyped
attributes. The other attributes of the «JSPTag» elements are the tag attributes, the legal
attributes that can be specified when using a JSP custom tag. For example, in the following
code fragment, the Entry tag specifies the entryid and convertLineBreaks tag attributes
and uses the term and description scripting variables in the body's tag. A detailed view of
the classes that make up the tag implementation classes is shown in Figure E-10. The TEI
classes are required for all tags that define scripting variables.
Page 473
Figure E-9. JSP tag definitions
Page 474
Figure E-10. Entry Tag's implementing classes
The JSP interacts with the entity tier through the tag implementation classes. All
communication to the entity-tier components is via the custom tags (Figure E-11). This allows
the JSP source to have a minimal amount of Java code and instead contain mostly HTML or
HTML-like code.
Figure E-11. EntryListTag interacting with entity-tier objects
Page 475
The EntryList tag is required in every JSP that uses the tags and must be a parent tag to the
other two tags: EntryLoop and Entry. The EntryList tag is responsible for connecting to
the Glossary entries, which are then made available by the other two tags. The EntryLoop tag
is used to get entry values that are part of a list, as would be the case when browsing. The
Entry tag is used when only one entry is required, as is the case in the entry view and editing
pages.
The tags are also responsible for ensuring that the encodings of the entity values are
appropriate for HTML. This means that string values in entry attributes should convert less-than
and greater-than characters to the appropriate HTML: < and >.
Entity Tier
The entity tier in this application has only one true entity—Entry—and one entity manager—
Page 476
Glossary. An additional class acts as a wrapper for an entry query. This class combines all the
search criteria information and makes it easier to cache and to pass along to the Glossary. An
instance of this class is cached in the user's session (HttpSession) in the presentation tier.
The interfaces for the main entity-tier classes are shown in Figure E-12, and the classes that
implement them are shown in Figure E-13.
Figure E-12. Key entity-tier interfaces
Figure E-13. Main entity classes
Page 477
Data Tier
The logical data model is very simple and was intended to use only a minimal number of
database features, in order to be portable across many relational databases. In this reference
application, the mySQL database was used, but this application has also been successfully used
with SQL Server, Oracle 8, and even MS Access. The only real requirement is to support
standard SQL and to have a JDBC (Java Database Connectivity)-compliant driver.
Figure E-14 shows the database diagram, which contains two tables: PK and Entry. The PK
table is simple and is used for primary key creation. One column in this table contains the name
of another database table—in this case, there is only one row for the Entry table. The other
column is an integer-type column that keeps the value of the next primary key for the table. To
get a new primary key, the application must lock the row, get its value, increment it by 1, and
then unlock the row.
Figure E-14. Logical data model diagram
Page 478
The Entry table contains all the attributes of the glossary entry. Versions are managed by a self-
referential foreign key (FK). When this FK is null, the entry row is considered to be the current
version. When this row is updated, the columns in the row are not updated; rather, another
row is inserted into the database, and the FK of the original row is set to the new row. This
simple mechanism for versioning database rows works well enough for an application like this,
with an expected low volume of use.
I l@ve RuBoard
Page 479
I l@ve RuBoard
Component View
The top-level package view of the application's component is shown in Figure E-15. In this
diagram, the «virtual root»/glossary defines the application's URL hierarchy, and the «physical
root» Glossary defines the physical location of all JSP files that are requestable by the
browsers. This diagram shows the component package hierarchy for the additional Java classes
(app.glossary.taglib) and two reference Java packages that are part of the JDK and J2EE
specifications.
Figure E-15. Top-level packages in the component view
Some of the requestable URLs are implemented with servlets instead of JSPs. Because the
Page 480
physical location of servlets is bound to their package hierarchies in the component view,
«HTTPResource» elements are created to map these servlets into the URL space under the
virtual root (Figure E-16).
Figure E-16. «HTTPResources» elements mapped to the system's servlets
The components under the physical root (Figure E-17) make up the rest of the requestable
HTTP resources. These components are modeled with «JSP» components, with one «static
page» and one «script library» component.
Figure E-17. «JSP» components in the «physical root»
Page 481
I l@ve RuBoard
Page 482
I l@ve RuBoard
Sample Screen Shots
Figures E-18 through E-22 are screen shots the user would view at different points in the
Glossary application.
Figure E-18. The Glossary home page, showing a message of the most recent user
activity and the most recent definition changes
Figure E-19. The pop-up menu, available by clicking the top banner
Page 483
Figure E-20. The Entry details screen
Page 484
Figure E-21. Edit Entry screen
Page 485
Figure E-22. An Entry History screen, showing version history
Page 486
I l@ve RuBoard
Page 487
I l@ve RuBoard
[SYMBOL] [O]
I l@ve RuBoard
Page 488
I l@ve RuBoard
[SYMBOL] [O]
_Hlt14251805
_Hlt503173336
I l@ve RuBoard
Page 489
I l@ve RuBoard
[SYMBOL] [O]
OLE_LINK3
I l@ve RuBoard
Page 490
Các file đính kèm theo tài liệu này:
- Building Web Applications with UML Second Edition.pdf