标题：seasar
Seasar软件起源
  Seasar framework开发模式起源于日本，并且在日本非常流行。
Seasar framework最初公布于众是03年8月，那时是作为一个应用服务器，依托于Web 容器Jetty和数据库HSQLDB。后来，于04年3月，经过改造，成为一个轻量级DI（Dependency Injection）和AOP容器，并重新命名为Seasar2。经过一段时间的发展，从05年4月，该项目移到  sourceforge jp，并且真正意义上的开源，用的是apache liscense2.0。 
就像其它DI容器一样，Seasar中的组件也是通过xml配置文件定义，但是，它引入了“Convention over Configuration”，有点类似于Ruby On Rails的CoC，和Spring的配置文件比起来，确实小的很多。
Seasar框架组成
Seasar内核和扩展：框架的DI和AOP实现，以及一些相关服务，如连接池、事务、JDBC框架 
相关软件：如S2Hibernate，S2Dao，S2Struts，S2JSF 
Sandbox软件：就是相关软件的开发中版本。这类软件非常多，如对JMS、Remote的支持框架。 
Seasar框架，除了以Java版本为主外，还有.Net和php5版本。当然，这两种语言的扩展框架不如Java版丰富。 
Seasar框架认识
1、 从框架的使用来说，和使用Spring没有太大区别。Spring提供的IoC和AOP，它几乎都提供，而且第三方扩展也都差不多。 
2、 Seasar的配置文件，比Spring的少很多，这也是官方宣传的亮点。因为它可以根据规则，将组件和组件的关联一次性配置。这些规则，就是接口和接口的实现类的命名、分包方式。 
3、 Seasar的官方英文文档很少，而且几乎只有官方网站支持，没有论坛。我主要是看源码，再结合文档看。而且源码没有任何注释。  但是，它的代码量比较小，两个核心包加起来只有2w行代码（不包括注释和空行）。 
4、 Seasar也是一个一站式框架。它除了提供核心DI和AOP服务外，还有持久层和表示层框架，比较有特色的是Mayaa模板，类似于Tapestry那种方式，一个html，一个.mayaa文件。 
用Seasar开发过程中用到的一个流行框架组合：Seasar+S2Dao+S2Struts+Mayaa。 
S2Dao： 
这是Seasar自己的持久化解决方案。非常精致，只有6000多行代码。不过功能比起Hibernate弱很多。但是，对于不是非常强调OO建模的应用来说，我认为是足够了。它不是ORM，只是实现了DAO模式，并且开发人员不必和JDBC打交道。 
而且，我觉得它最大的亮点，就是不用写持久层代码，用户只需写接口，以及某些接口方法对应的sql。它会通过AOP自动生成实现类，而且也是声明式事务。 
它的开发过程大概是： 
1、 根据数据库table，写Entity类。注意，不是命名为Model，因为它只是数据库表的实体映射，就如同E-R图的E部分，在Entity类中，通过字段表示如下信息：对应的数据库table、字段对应信息、多对1关联关系等等。注意，它只能实现多对1关联。 
2、 写出DAO的接口，譬如基本的CRUDL操作，要是有复杂的CRUDL，可以通过方法名、以及对应的sql搞定。但只能用一条sql。所以，譬如当我们要实现复杂的insert操作，必须在Service层组合几个dao的接口方法，然后加上声明式事务。 
3、 对于多数据库支持，是通过在sql语句的文件名后面加上数据库后缀，如UserDAO_findByUsername_mysql.sql。我觉得非常不爽的地方时，它必须每个方法一个sql文件，要是我一个dao接口有30个方法，我不是要写30个sql文件？当然，sql语句可以注释在DAO接口上面。 
大概以上三步概括了S2Dao框架的基本使用，它没有什么特殊用法，因为我看源代码上也很简单。因为它省去了在ORM框架中最难的部分：关联映射、继承关系、cache等。不过，这样也让S2dao的持久层开发异常简单。 
对S2Dao的整体感觉，它和EJB中的实体Bean，特别是CMP非常类似，又有些BMP的特性。但是，它的配置文件除了sql，几乎没有。 
当然，持久层还有和Hibernate集成的S2Hibernate，但比起Spring差远了。 
S2Struts： 
它是Seasar用DI和AOP技术对Struts进行封装。它支持Struts的Action风格和配置，同时，也支持纯POJO的Action。后者的Action是官方的推荐，它不用像Webwork那样实现特定的Action接口，它就是普通的JavaBean，但是它一般需要实现一个自己的接口，这点有些不爽，但对于Action配置很方便。另外，它的ActionForm也完全是普通的JavaBean。 
整体上，S2Struts的使用和Webwork惊人的相似，类风格也非常一致，譬如方法的返回值是一个字符串。 
S2Struts通过 prototype的实例生成方式，解决了Struts本身的线程安全问题，因为Struts是共享一个Action实例。所以，在S2Struts的Action里面，我们可以声明实例变量。 
S2Struts的实现原理大致是：通过AOP将普通JavaBean的ActionForm动态注入自己的S2BeanValidatorBean，该Bean继承于Struts的ActionForm。普通POJO的Action类也类似这样：动态将ActionForm和ActionMapping等注入。而且，通过filter，将HttpServletRequest，HttpServletResponse等实例注入Seasar 容器的ThreadLocal变量里，而Action可以通过访问容器来获取这些组件，同时，这些对象也自动通过Setter方式注入Action，这样Action就可以和Web容器打交道了，譬如直接调用reponse.sendRedirect导航，因为在url里面动态注入参数这类需求不容易实现，但Webwork可以在配置文件里面通过类似viewUser do?id=${id}方式注入id值。
表示层模板语言Mayaa
我认为这是它的一个亮点，当然Mayaa不属于Seasea，它是一个单独的项目，譬如官方已经将Mayaa和Webwork2集成了，但是它挂在seasar下：http://mayaa.seasar org/。我接触过几种模板语言，如Velocity、Freemaker，Tapestry的html，但是，我认为，Mayaa是设计上最优雅的：它可以完全将html页面单独拿出来设计。通过每个html文件并列的mayaa文件写展现逻辑，动态注入html页面。 
Velocity和Freemake对于美工和可视化编辑并不友好，Tapestry这种事件驱动框架生成的url也不友好。 
不过，也有一些限制，它现在只有日文文档，模板出错调试几乎不太现实：大量反射。Mayaa的文档还是挺丰富的，我是用google的网站翻译工具，再结合官方examples学习的。 
Mayaa现在支持三种标签库：Struts、JSTL、mayaa标签，所以mayaa的使用主要在标签上。 
另外，Mayaa有自己的布局管理器，功能类似于Tiles和Sitemesh。 
Mayaa的实现原理，大致是根据html的tag ID，用mayaa模板对应的ID动态替换。 
Mayaa的demo，很多用直接的html请求，如listArticls.html?userId=12方式请求，mayaa模板文件里调用action方法 
Java代码 
<s2struts:init action="#{ownerAction.doInitRegisterOwner}" />  
<s2struts:init action="#{ownerAction.doInitRegisterOwner}" />
，虽然方便，但这样就退化到了Model 1请求方式，从Model 2的Push退化到了Pull，一会儿 .do请求，一会儿 .html请求，让人对Request.setAttribute很迷惑。 
目前国内常使用SEASAR2模式进行项目开发的企业有:  
上海桑友信息科技有限公司、上海小樱信息科技有限公司等日资企业。