Raible's Wiki

Raible Designs
Wiki Home
Recent Changes


  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in

Referenced by

JSPWiki v2.2.33


Hide Menu


This is version 5. It is not the current version, and thus it cannot be edited.
[Back to current version]   [Restore this version]

  • 本页正在翻译之中,将处于双语状态,直至最终翻译确认结束为止。翻译中难免存在许多错误。欢迎与我(fantastechnol AT yahoo.com)联系。
  • This page is under translation. Before the final confirmation, the page will be in the bilingual status. You will be appreciated if you tell me the problems of the translation. fantastechnol AT yahoo.com)


AppFuse LogoCheck out our Frappr! AppFuse是一个为"一键完成"式的网络应用开发而设计的应用程序。下载, 解冻并执行 ant new可立即启动运行Tomcat/MySQL应用。使用Ant, XDoclet, Spring, Hibernate (or iBATIS), JUnit, StrutsTestCase, Canoo's WebTest, Struts Menu, Display Tag Library, OSCache, JSTL and Struts (or Spring MVC). 从2004年2月启用Spring框架极大加强了AppFuse. 他被使用在从Hibernate/iBATIS支持,声明式Trasaction管理, 相关性绑定和分层的解耦合。这个清晰简介的框架极大减小了AppFuse的复杂性,并且减少了许多代码行。简而言之,对于J2EE - 它是最好的切片面包(sliced bread)。想了解更多的关于AppFuse的信息请参阅此处

各种各样的机能包括认证(使用Acegi Security), 记忆(Remember Me), 自助注册(Self Registration), 密码提示(Password Hint)和GZip压缩. The fuse to start your apps.

Live Demos

视频: 新项目和机能教程
Setup Screenshot
视频: AppGen代码生成
AppGen Screenshot

What is AppFuse?

AppFuse LogoCheck out our Frappr! AppFuse is an application for "kickstarting" webapp development. Download, extract and execute ant new to instantly be up and running with a Tomcat/MySQL app. Uses Ant, XDoclet, Spring, Hibernate (or iBATIS), JUnit, StrutsTestCase, Canoo's WebTest, Struts Menu, Display Tag Library, OSCache, JSTL and Struts (or Spring MVC). The Spring Framework has greatly enhanced AppFuse since February 2004. It's used throughout for its Hibernate/iBATIS support, declarative transactions, dependency binding and layer decoupling. This clean and simple framework has greatly reduced the complexity of AppFuse, and also eliminated many lines of code. In short, for J2EE - it's the best thing since sliced bread. To learn more about what AppFuse is check out this wiki page.

Features include Authentication (using Acegi Security), Remember Me, Self Registration, Password Hint and GZip Compression. The fuse to start your apps.

Live Demos

Video: New Project and Feature Tour
Setup Screenshot
Video: Code Generation with AppGen
AppGen Screenshot

If you want to get started with AppFuse right away, view the QuickStart Guide. If you want to learn more about AppFuse's architecture view my "About AppFuse" PowerPoint" or checkout a live demo. I also wrote a recent presentation for Denver's No Fluff Just Stuff conference.

For HowTos when developing with AppFuse, view the AppFuse Tutorials.

For common questions and howto's, view the FAQ, the mailing list archive or visit the AppFuse IRC channel. AppFuse's project homepage is at http://appfuse.dev.java.net.

To see what's next for AppFuse, see the Roadmap.

July 11, 2006 - AppFuse 1.9.3

This release is primarily a bug fix release, but also contains upgrades to several dependent libraries, including Acegi Security 1.0.1.

June 6, 2006 - AppFuse 1.9.2

This release includes CSS Framework integration, EMMA code-coverage support and AppGen sub-package support. Thanks to the CSS Framework Design Contest Winners, Doug Hays and Mika Göckel for their help with this release.

April 7, 2006 - AppFuse 1.9.1

This release includes improvements and upgrades to Tapestry 4.0.1, WebWork 2.2.2, as well as support for using AppGen to reverse engineer database tables (using Middlegen). iBATIS is now supported by AppGen and a Create DAO tutorial has been put together for iBATIS. iBATIS and Middlegen support were provided by Bobby Diaz - thanks Bobby! Also, a big thanks goes to Mika Göckel for writing an XFire Tutorial and installer. To install and configure AppFuse for development, see the QuickStart Guide. Thanks to all the sponsors who have contributed products and free hosting to the AppFuse project.

January 14, 2006 - AppFuse 1.9

This release includes full Acegi Security integration, support for Ajax with DWR and Scriptaculous and many bug fixes/upgrades. In addition, AppFuse can now be deployed without configuring your appserver. Of course, if you'd prefer to use a JNDI DataSource, that's easy as well. To install and configure AppFuse for development, see the AppFuseQuickStart. Thanks to all the sponsors who have contributed products and free hosting to the AppFuse project.

August 27, 2005 - AppFuse 1.8.2

​​​​This release is mostly a bug fix release with no new features. It also includes upgrades to Acegi Security and the Spring Framework. Thanks to all the sponsors who have contributed products and free hosting to this project.

June 15, 2005 - AppFuse 1.8.1

This release is mostly a bug fix release with no new features. It also includes many upgrades to the core libraries (Hibernate, Spring, iBATIS, MyFaces). Thanks to all the sponsors who have contributed products and free hosting to the AppFuse project.

June 15, 2005 - Thogau's Tutorials

Thomas Gaudin has put together a couple of detailed and easy-to-follow tutorials on his site.

May 6, 2005 - JIRA Installed

AppFuse Videos created and setup a new JIRA Issue Tracker. Thanks to Atlassian for the free JIRA license and to Contegix for hosting it. Also thanks to KGB Internet Solutions for sponsoring the hosting of the AppFuse Demos.

April 29, 2005 - AppFuse 1.8

This release replaces Container Managed Authentication (CMA) with Acegi Security. Other major features include numerous bug fixes to AppGen and a refactoring of build.xml to use Ant 1.6 features. Eclipse and IDEA project files were also improved so you can easily run tests from within your IDE. A MyJavaPack all-in-one installer was also added so you can download everything you need for AppFuse at once. Eclipse and its plugins were not included in the initial release, but may be in a future release.

December 8, 2004 - AppFuse 1.7

This release adds support for JSF/MyFaces and Tapestry as web framework options. AppGen has been updated to work with both of these frameworks and I added new tutorials as well. You can read about my experience in Integrating JSF and Tapestry into AppFuse.

November 9, 2004 - AppFuse 1.6.1

This release is primarily a bug fix release, but it also contains a slick "AppGen" tool for generating full CRUD (with sample data and tests) from a POJO. AppGen essentially automates everything you do in the tutorials. I still encourage users to read through and do the tutorials in order to learn the code that is being generated. Learn more about AppGen.

October 9, 2004 - AppFuse 1.6 Released

This release's main features are swapping out Tiles for SiteMesh and adding WebWork as a web framework option. I also refactored the Struts Action tests to use MockStrutsTestCase and eliminated the need to use Cactus for running web tests. This reduced test execution time by over 50%. The relationship between users and roles was re-worked to take advantage of Hibernate's features as well.

May 27, 2004 - AppFuse 1.5 Released

This release has lots of modifications that I've been meaning to make for quite some time. Specifically (1) removing the dependency on j2ee.jar and (2) removing Struts from the services layer. I also made improvements to Spring and its context file loading so you should be able to run unit tests from your IDE.

Other notables include full i18n support (with translations in Dutch, Portuguese and Chinese), improved setup-tomcat target (no additional JARs needed now), and an option to use Spring's MVC framework instead of Struts - with full tutorials! If you'd like, you can read more about my conversion from Struts to Spring. Enjoy!

2004.03.01 - AppFuse 1.4 Released

This release involves many changes: re-arranging packages/directories, Spring integration, Remember Me refactorings and I also added iBATIS as a persistence option. I also spent a lot of time going through the tutorials to make sure they are up to date. I've been using AppFuse 1.4 for a few weeks on my current project, and I really do like the way Spring makes it easy to configure Hibernate, Transactions and Interface->Implementation relationships. If you're interested in upgrading your AppFuse 1.x app to use Spring, you can checkout this howto.

I also made the leap and moved the AppFuse project from SourceForge to java.net. This is mainly so I have more control over mailing lists and adding other developers. As of today, CVS files in SourceForge and Java.net are the same - but I'll only be updating Java.net from here on out. I also have released files in both projects, but will only use java.net in the future.

Here's a specific rundown of all the changes from the changelog.

  • Added "cactus" task for running Cactus tests in Tomcat 4.x and Resin 3.0.5.
  • Added Tomcat Ant tasks for managing tomcat with the Manager app and Ant.
    • Currently supports: install, remove, start, stop, reload and list.
    • I recommend using "ant setup-tomcat deploy" and then using "ant reload" after running "ant deploy" when you change .java or config files.
  • Removed "upload" module and integrated file-upload into the core. Removed unnecessary scriplets from uploadForm.jsp.
  • UI Enhancements:
    • Changed CSS for error messages to have a red border around them - making it easier to distinguish errors from messages.
    • Added onclick and onfocus event handler to form inputs to select the text when an input type="text" is clicked or focuses on.
  • Changed directory structure from common/ejb/web to dao/service/web.
  • Added Spring to configure Hibernate, DAOs and Managers. Configured declarative transactions at the service and dao layers. Configured OpenSessionInViewFilter for guaranteeing one transaction per request. Read more...
  • Changed UserCounterListener to only record users that have logged in successfully. Also added a screen to show currently logged in users.
  • Changed default session timeout to 10 minutes instead of 60.
  • Implemented persistent login cookie strategy (for Remember Me) as recommended by Charles. Read more...
  • Added iBATIS as a persistence framework option.
  • Added custom web.xml XDoclet template for ordering filters and listeners.
  • Added support for generating indexed property setters in ActionForms when generating Forms with XDoclet. This support includes adding Velocity JARs to the the list of 3rd party JARs. Currently, Velocity is only used by XDoclet.
  • Added "Account Information" e-mail as part of registration process. This e-mail gets sent the e-mail address the user entered on signup.
  • Dependent packages upgraded:
    • Cactus 1.6 Nightly (20030119) to support the "cactus" task and Resin 3.0.5
    • JSTL 1.0.5
    • Patched Canoo's WebTest to work with Ant 1.6
    • Hibernate 2.1.2
    • MySQL JDBC Driver 3.0.11

2004.01.16 - AppFuse 1.3 Released

This release fixes a few compatibility issues with Resin and other databases - specifically PostgreSQL and DB2. The major new functionality in this release is Easy Database Switching. Basically, you can very easily switch from using MySQL to PostgreSQL by only changing a few properties in your build.properties. I implemented this on my current project last week because I do most of my development (at the client) on a PowerBook. The client wants to deploy onto a DB2 database - and there is not DB2 install for the Mac. Since Hibernate allows you to easily switch between databases, I figured I could develop using MySQL on the Mac, but have the default (CVS version) use DB2. One of the things I didn't want to do was to have a build.properties.sample, because I love projects that "just work" when you type "ant". So I changed the the build process so that database.properties is generated from default settings (MySQL) or the settings in build.properties (if specified). As part of the build process, Ant looks for the following build.properties files:

  • ${user.home}/.${ant.project.name}-build.properties
  • ${user.home}/.build.properties
  • build.properties

What this allows you to do is to take your customized database settings and put them in ~/.build.properties and they'll be applied to any AppFuse-derived project. This makes it easy to keep the CVS version of your project tied to one database and a developer's local version tied to a different database.

While it's true that you'll most likely only talk to one database during the duration of your project, this exercise proves that it's easy to migrate from MySQL to another database. It also proves that AppFuse can easily integrate with other database (at least as of this release). Slick stuff IMO. Here's a specific rundown of all the changes from the changelog.

  • Many changes to database settings so that database.properties is generated at run-time from properties in build.properties (defaults to MySQL). This makes it easy for users to run a MySQL database in development and have a DB2 database (or any other) in production. Just customize your database settings and put them in ~/.build.properties or ~/.appname- build.properties and these settings will be used instead of the default.
    • As part of this process, I tested AppFuse on DB2 8.1 (on Windows) and PostgreSQL 7.4 (on OS X).
    • Testing on other servers caused me to change from generator-class="native" to generator-class="increment" - which still works fine on MySQL.
    • I also changed tomcat-context.xml to dynamically substitute database properties and defaultAutoCommit is now "true" by default.
  • Added error pages for 404 (page not found) and 403 (access denied), both with pretty pictures. ;0) Protected /editUser.do for admin role only.
  • Moved filter-mappings from Filter's JavaDocs (XDoclet) to metadata/web/filter-mappings.xml in order to control the order of execution.
  • Made RememberMe feature configurable via a "rememberMe.enabled" property in app-settings.xml. This won't kick on Resin until the filter is invoked at least once. Tomcat initializes filters on startup.
  • Upgraded oscache.jar in Hibernate 2.1.1 to OSCache 2.0.1 and configured OSCache to cache JSP changes. Also modified the oscache-2.0.1.jar to have a URI for the tag library. Turned off caching of JSP pages - to enable, uncomment filter-mapping in metadata/web/filter-mappings.xml.
  • Made changes to be Resin 3.0.4 friendly.
  • Refactored BaseDaoHibernate to consolidate retrieveObject and removeObject methods. Also changed saveObject to do ses.saveOrUpdate and removed storeObject method.
  • Replaced CompressionFilter with GZipFilter that works on Resin.
  • Added print stylesheet support. Thanks to Bear Giles for the suggestion.
  • Added Clickstream and menu/JSPs to view user paths.
  • Dependent packages upgraded:
    • XDoclet 1.2.0
    • Cactus 1.6 Nightly (20030116) to support "cactus" task for supporting a "contextxml" attribute for testing in Tomcat.

BTW, I hid all the older releases of AppFuse to avoid download confusion - if you need to download an older version, please let me know.

2004.01.08 - AppFuse and ant 1.6.0

Upgrading from ant 1.5.4 to 1.6.0 necessitates the following change in build.xml (just FYI):

RCS file: /cvsroot/struts/appfuse/build.xml,v
retrieving revision 1.37
diff -r1.37 build.xml
<     <!ENTITY properties SYSTEM "file:properties.xml">
<     <!ENTITY app-settings SYSTEM "file:app-settings.xml">
>     <!ENTITY properties SYSTEM "file:./properties.xml">
>     <!ENTITY app-settings SYSTEM "file:./app-settings.xml">
otherwise ant complains about file:properties.xml could not be found.
Friday, January 10th: Fixed in CVS. However, there's still issues with running Canoo's WebTest with 1.6.0

2003.12.20 - AppFuse 1.2 Released

This is primarily a bug fix release. Here are the details from the release notes:

  • Backed out Http Post for Remember Me. It was not redirecting user to the page they originally requested. Using reponse.sendRedirect does send the user to the proper location. Turned on password encryption (SHA) to protect any passwords that end up in log files. Turned off encryption in Tomcat.
  • Changed configuration parameters in servlet context to be in a hashmap.
  • Improvements to StrutsGen tool to generate list screen as well and to fill in more missing elements.
  • Changed to close Hibernate session when object not found in BaseDaoHibernate.
  • Fixed bug in UserAction.save: when creating a new user, role defaults to "tomcat" regardless of what the user chooses.
  • Dependent packages upgraded:
    • Hibernate 2.1.1
    • Struts Menu 2.1
    • WebTest Build 379

2003.12.12 - AppFuse 1.1 Released

This biggest feature in this release is Documentation. I finally found the time to write up some Tutorials on developing with AppFuse. They're on this wiki and also in the "docs" folder of the binary and source downloads. In writing this documentation, I went through almost all aspects of the code with a fine-tooth comb made sure it's doing what I want it to do.

I was finally able to get things working with J2EE 1.4, which basically involved removing j2ee.jar from my MailUtil's classpath and just including activation.jar and mail.jar. If you're not there yet, simply change the paths for activation.jar and mail.jar in properties.xml (look for common.compile.classpath). You can use j2ee.jar instead of mail.jar and activation.jar with J2EE 1.3 and 1.4 B2.

I was also able to get all unit tests to pass on Tomcat 5, and the "setup-tomcat" target now supports Tomcat 5. I wasn't able to get "Remember Me" to work - see the tomcat-user mailing list for more details.

Included in this release are upgrades to Hibernate 2.1 Final and Display Tag 1.0 B2. For a complete changelog, view the README.txt in CVS.

2003.11.30 - AppFuse 1.0 Released

I feel this release deserves the big 1.0 designation because it is an up-to-date representation of my learnings and my perceived best practices in building web applications. Of course, as I learn more, I will continue to push out new releases.

In this release, I did a lot of refactoring and enhancements to existing features. The DAO and Manager interfaces are no longer tied to Struts or Hibernate. Hibernate's Session object is now passed as an argument into Manager and DAO constructors, rather than method signatures. The DAOFactory was refactored by Bear Giles to use reflection to instantiate Hibernate DAO's. Now, if you add a new DAO, you don't have to edit DAOFactory and DAOFactoryHibernate. To insantiate a new DAO, the code is now:

LookupDAO dao = (LookupDAO) DAOFactory.getInstance(conn, LookupDAO.class);

...where conn is a connection object retrieved from ServiceLocator or ActionFilter. When you add new POJOs, you still have to add them to ServiceLocator (for JUnit tests) and hibernate.cfg.xml, which is kindof a pain. I'd like to figure out a way to tell Hibernate to just look in appfuse-ejb.jar.

The Remember Me feature has been refactored so the username and password cookies are only available under the /appfuse/security url-pattern. I also changed the posting to "j_security_check" in LoginServlet from response.sendRedirect to an HTTP POST, using Jakarta Common's HttpClient. The reason I have a LoginServlet vs. just using action="j_security_check" in my <form> is to encrypt passwords.

I've developed 3 different applications using AppFuse (struts-resume is one of them), and I have found that it's a pain to upgrade to new versions of AppFuse. Because of this, I don't recommend upgrading unless you really need to. I will be upgrading struts-resume to AppFuse 1.0, but I doubt I'll upgrade it to any future AppFuse releases - it's just too much work for not much reward.

Older releases can be found at http://raibledesigns.com/downloads.

If you'd like to encourage me to improve AppFuse, you can make a donation.

Go to top   More info...   Attach file...
This particular version was published on 06-Nov-2006 13:52:57 MST by FanYang.