Thông tin tài liệu
this print for content only—size & color not accurate spine = 0.998" 528 page count
EMPOWERING PRODUCTIVITY FOR THE JAVA
™
DEVELOPER
John Carnell, coauthor of
Pro Jakarta Struts
US $44.99
Shelve in
Java Programming
User level:
Intermediate–Advanced
Carnell
Apache Struts with Ajax
THE EXPERT’S VOICE
®
IN JAVA
™
TECHNOLOGY
John Carnell
with Rob Harrop
Edited by Kunal Mittal
Pro Apache
Struts
with Ajax
CYAN
MAGENTA
YELLOW
BLACK
PANTONE 123 CV
ISBN 1-59059-738-9
9 781590 597385
54499
6 89253 59738 5
Companion
eBook Available
Architect, build, and configure multitier web applications
using the Apache Struts framework along with some Ajax.
www.apress.com
SOURCE CODE ONLINE
forums.apress.com
FOR PROFESSIONALS
BY PROFESSIONALS
™
Join online discussions:
Companion eBook
See last page for details
on $10 eBook version
Pro Apache Struts with Ajax
Dear Reader,
Open source has had a huge impact on the ability of software developers to
quickly build and deploy applications. One of the most vibrant areas of open
source development is that of Java
™ development frameworks. In this book, we
present the open source Apache Struts framework, which provides the infra-
structure code that developers otherwise would need to write to build enterprise
web-based applications.
We explore Struts by looking at these key topics:
• Learning the core features of the Apache Struts framework, starting
with the architecture of Struts through to setting up and configuring
web applications using Struts
• Building each tier of a sample application, starting with the presentation
tier and diving through all of the tiers in a web-based application
• Leveraging the Struts JSP
™
tag libraries and their templating capabilities
to simplify the development of web application screens
• Using Struts and industry accepted J2EE
™
design patterns to build
business logic that can be easily re-used and maintainable across multiple
Struts and non-Struts applications
• Integrating open source Object Relational mapping tools such as Apache’s
ObjectRelationalBridge in the data access tier
Throughout the book, we also look at how to integrate Struts with powerful
open source tools such as Lucene, Velocity, and XDoclet, so you can add a sig-
nificant amount of functionality to your web applications. We show you the
mechanics of building a Struts application, and we also demonstrate proven
techniques for building multitier, web-based applications. Our aim is to enable
you to build on our own experience working with Struts over the course of our
careers.
Sincerely,
John Carnell and Rob Harrop
THE APRESS JAVA
™
ROADMAP
Beginning Apache Struts Pro Apache Struts with Ajax
Pro Apache Ant
Pro Apache Tomcat 6
Enterprise Java
™
Development on a Budget
Rob Harrop, coauthor of
Pro Jakarta Struts
Kunal Mittal, author of
Pro Apache Beehive
BEA WebLogic Server 8.1
Unleashed
Pro
John Carnell
with Rob Harrop,
Edited by Kunal Mittal
Pro Apache Struts
with Ajax
Ch00_7389_CMP3 9/28/06 8:37 PM Page i
Pro Apache Struts with Ajax
Copyright © 2006 by John Carnell, Rob Harrop, Kunal Mittal
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13 (pbk): 978-1-59059-738-5
ISBN-10 (pbk): 1-59059-738-9
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Java™ and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc., in the
United States and other countries. Apress, Inc., is not affiliated with Sun Microsystems, Inc., and this book
was written without endorsement from Sun Microsystems, Inc.
Lead Editor: Steve Anglin
Technical Reviewer: John Fallows
Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick,
Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser,
Keir Thomas, Matt Wade
Project Managers: Beth Christmas, Elizabeth Seymour
Copy Edit Manager: Nicole Flores
Copy Editors: Ami Knox, Bill McManus
Assistant Production Director: Kari Brooks-Copony
Production Editor: Lori Bring
Compositor: Diana Van Winkle, Van Winkle Design
Proofreader: April Eddy
Indexer: Michael Brinkman
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail orders-ny@springer-sbm.com, or
visit http://www.springeronline.com.
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219,
Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail info@apress.com,
or visit http://www.apress.com.
The information in this book is distributed on an “as is” basis, without warranty. Although every
precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have
any liability to any person or entity with respect to any loss or damage caused or alleged to be caused
directly or indirectly by the information contained in this work.
The source code for this book is available to readers at http://www.apress.com in the Source Code/
Download section.
Ch00_7389_CMP3 9/28/06 8:37 PM Page ii
To my wife, Janet: Thank you for the love, the patience,and the time I needed
to complete this book (and every other book I have worked on).Without your love
and wisdom, my life would be a shadow of what it is now.You are everything to me.
To my son, Christopher: Every experience I have had or will have will never compare
with the first time I held you in my arms. Everyday, I revel in the miracle that you are.
—John Carnell
This book is dedicated to my secondary school English teacher,Neville McGraw,
for sparking my abiding interest in literature and teaching me the
importance of the written word.
—Rob Harrop
Ch00_7389_CMP3 9/28/06 8:37 PM Page iii
Ch00_7389_CMP3 9/28/06 8:37 PM Page iv
Contents at a Glance
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
About the Editor
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi
About the Technical Reviewers
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Acknowledgments
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xviii
Preface for This Edition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Preface from Previous Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx
■CHAPTER 1 What We Do Wrong: Web Antipatterns Explained . . . . . . . . . . . . . . . . 1
■CHAPTER 2 Struts Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
■CHAPTER 3 Form Presentation and Validation with Struts . . . . . . . . . . . . . . . . . . 75
■CHAPTER 4 Managing Business Logic with Struts . . . . . . . . . . . . . . . . . . . . . . . . . 123
■CHAPTER 5 Architecting the Data Access Tier with ObjectRelationalBridge. . . 173
■CHAPTER 6 Building Flexible Front-Ends with the Tiles Framework . . . . . . . . 225
■CHAPTER 7 Dynamic Forms and the Struts Validator Framework . . . . . . . . . . . 255
■CHAPTER 8 Speeding Struts Development with XDoclet . . . . . . . . . . . . . . . . . . . 289
■CHAPTER 9 Logging and Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
■CHAPTER 10 Velocity Template Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
■CHAPTER 11 Extending the Struts Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
■CHAPTER 12 Struts and Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
■APPENDIX A JavaEdge Setup and Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
■APPENDIX B Struts Development Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
■APPENDIX C Struts and Strecks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
v
Ch00_7389_CMP3 9/28/06 8:37 PM Page v
Ch00_7389_CMP3 9/28/06 8:37 PM Page vi
Contents
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
About the Editor
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi
About the Technical Reviewers
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Acknowledgments
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xviii
Preface for This Edition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Preface from Previous Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx
■CHAPTER 1 What We Do Wrong: Web Antipatterns Explained. . . . . . . . . . 1
What This Book Is About . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
What This Chapter Is About
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Challenges of Web Application Development . . . . . . . . . . . . . . . . . . . . . . . . . 4
Enterprise Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Application Services
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
An Introduction to Patterns and Antipatterns . . . . . . . . . . . . . . . . . . . . . . . . . 8
Web Application Antipatterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Concern Slush . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Tier Leakage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Hardwired . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Validation Confusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Tight-Skins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Data Madness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Antipatterns, JOS Frameworks, and Economics . . . . . . . . . . . . . . . . . . . . . 24
The JavaEdge Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
■CHAPTER 2 Struts Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
The JavaEdge Application Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
The Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Using Struts to Implement the MVC Pattern . . . . . . . . . . . . . . . . . . . . 34
Getting Started: The JavaEdge Source Tree . . . . . . . . . . . . . . . . . . . . 37
The Power of the Command Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . 48
vii
Ch00_7389_CMP3 9/28/06 8:37 PM Page vii
Constructing the Presentation Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
The JavaEdge Home Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Bean Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Logic Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Iteration Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Conditional Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Movement Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
■CHAPTER 3 Form Presentation and Validation with Struts . . . . . . . . . . . . 75
Problems with Form Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Using Struts for Form Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Implementing Form Validation with Struts . . . . . . . . . . . . . . . . . . . . . . . . . . 79
The struts-config.xml File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Struts ActionForm Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Prepopulating an ActionForm with Data . . . . . . . . . . . . . . . . . . . . . . . 87
Another Technique for Prepopulation . . . . . . . . . . . . . . . . . . . . . . . . . 91
Prepopulating a Form the Correct Way . . . . . . . . . . . . . . . . . . . . . . . . 92
Validating the Form Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
The Struts HTML Tag Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Setting Up a Struts HTML Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Using Text and TextArea Input Fields
. . . . . . . . . . . . . . . . . . . . . . . . . 107
Drop-Down Lists, Checkboxes, and Radio Buttons . . . . . . . . . . . . . 108
Building More Dynamic ActionForms . . . . . . . . . . . . . . . . . . . . . . . . 111
ActionForms and Business Logic
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
■CHAPTER 4 Managing Business Logic with Struts. . . . . . . . . . . . . . . . . . . . 123
Business Logic Antipatterns and Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Concern Slush and Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Tier Leakage and Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Separating Business Logic from Struts . . . . . . . . . . . . . . . . . . . . . . . 132
Implementing the Design Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Implementing the Business Delegate Pattern . . . . . . . . . . . . . . . . . 135
Implementing the Service Locator Pattern . . . . . . . . . . . . . . . . . . . . 141
The Service Locator Revisited . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
EJBs and Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Handling Exceptions in the Action Class . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Exception Handling in Struts 1.0.x . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
■CONTENTSviii
Ch00_7389_CMP3 9/28/06 8:37 PM Page viii
Exception Handling in Struts 1.1 and Later . . . . . . . . . . . . . . . . . . . 163
Rewriting the ApplicationException Class . . . . . . . . . . . . . . . . . . . . . 164
Setting Up the struts-config.xml File . . . . . . . . . . . . . . . . . . . . . . . . . 164
Writing a Custom ExceptionHandler . . . . . . . . . . . . . . . . . . . . . . . . . 167
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
■CHAPTER 5 Architecting the Data Access Tier with
ObjectRelationalBridge
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Developing a Data Access Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
The JavaEdge Data Access Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Value Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
The JavaEdge Value Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Using an O/R Mapping Tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Setting Up the Object/Relational Mappings . . . . . . . . . . . . . . . . . . . 190
Which Sequence Manager to Use? . . . . . . . . . . . . . . . . . . . . . . . . . . 201
OJB in Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Retrieving Data: A Simple Example . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Retrieving Data: A More Complicated Example . . . . . . . . . . . . . . . . 215
Storing Data Using OJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Deleting Data with OJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Bringing It All Together
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
■CHAPTER 6 Building Flexible Front-Ends with the Tiles Framework . . 225
What Is the Tiles Framework? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Enabling Struts Version 1.1 to Use Tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Configuring the Tiles Plug-In
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
The tiles-defs.xml File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Adding the Tiles TLDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Your First Tiles Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
What Are Tiles Definitions? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Tiles Definitions: A JSP-Based Approach . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Overriding the Attribute Values in a Tiles Definition . . . . . . . . . . . . 238
Using Dummy Values in Your Tiles Definition . . . . . . . . . . . . . . . . . . 239
Disadvantages of JSP Tiles Definitions . . . . . . . . . . . . . . . . . . . . . . . 239
Anatomy of the tiles-defs.xml File . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Inheritance Using Tiles Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Extending a Tiles Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Modifying the template.jsp File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
■CONTENTS
ix
Ch00_7389_CMP3 9/28/06 8:37 PM Page ix
[...]... Struts MVC web framework in the following ways: • The Struts web framework in this edition is based on final Struts 1.2.x • This edition acknowledges the graduation of Struts from Jakarta to Apache within the Apache Software Foundation • This edition provides a new chapter that shows how to integrate Ajax (Asynchronous JavaScript and XML) with Apache Struts While this book addresses the above matters,... This Edition A pache Struts 1.2.x is still the de facto Java industry-standard MVC-based Web framework despite challenges from JavaServer Faces (JSF), Spring MVC, WebWork, Wicket, and other APIs and frameworks Pro Apache Struts with Ajax is essentially a revision of the previously published Pro Jakarta Struts, Second Edition that accounts for changes to the open source Apache Struts MVC web framework... 419 ■ CHAPTER 12 Struts and Ajax 421 Ajax Dissected 421 Ajax on Google 422 Ajax on Yahoo 422 Where Should I Use Ajax? 422 Ajax and Web 2.0 423 Ajax and SOA ... • Professional Struts Applications: Building Web Sites with Struts, Object Relational Bridge, Lucene, and Velocity (Apress, 2003) • Coauthor, J2EE Design Patterns Applied (Apress, 2002) • Coauthor, Oracle 9i Java Programming: Solutions for Developers Using PL/SQL and Java (Apress, 2001) • Coauthor, Beginning Java Databases (Apress, 2001) • Coauthor, Professional Oracle 8i Application Programming with. .. RequestProcessor 398 Building a RequestProcessor 399 Using RequestProcessor Instead of Filter 400 Verifying Host Access with RequestProcessor 403 Creating Configuration Beans 403 Building the JavaEdgeActionMapping 404 Revisiting RequestProcessor... matters, it does not address the evolving and still nascent Apache Shale nor Struts 2.0, also known as Struts Action Framework 2.0, which combines Struts 2 and WebWork However, future Apress books likely will address these areas Sincerely, Editors of this revision xix Ch00_7389_CMP3 9/28/06 8:37 PM Page xx Preface from Previous Edition (Pro Jakarta Struts, Second Edition) O ne of the questions I always... team will work together on a quick prototype for an application as a proof of concept The code for the prototype is poorly designed However, upon demonstrating the prototype, it becomes a huge success The developers now fall victim to this success as they are put under heavy pressure to deliver the prototyped application quickly Therefore, they decide to use the prototype code as the basis for the... the JavaServer Faces standard and to enhance the standard with Ajax functionality in the ADF Faces project John is a popular speaker at international conferences such as JavaOne and JavaPolis, and has written numerous articles for leading IT magazines such as Java Developer’s Journal John is coauthor of the highly popular book, Pro JSF and Ajax: Building Rich Internet Components (Apress, 2006) xvii... best Struts programmers in the world Thanks to everyone at Apress, especially Beth Christmas and Ami Knox; without the support of such a great team, writing this book would have been an absolute nightmare A final word of thanks goes to my girlfriend, Sally, for putting up with me through all the nights I spent sitting in front of the computer and for listening to all the “cool” stories about Struts. .. things with it I have been coding since I was 12 years old I have worked with dozens of technologies, and for the last four years I have had the opportunity to build enterprise-level software using several different open source projects I have been consistently blown away with the quality and functionality these technologies bring to the table One of my favorite open source technologies is the Apache
Ngày đăng: 27/03/2014, 13:35
Xem thêm: pro apache struts with ajax (2006), pro apache struts with ajax (2006)