JAVA学习

JAVA学习

BlogJava 首页 新随笔 联系 聚合 管理
  2 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

2007年11月5日 #

Struts2与Struts1的对比

来源:struts2开发组

Action 类:
" Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
" Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

线程模式:
" Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
" Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet 依赖:
" Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
" Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

可测性:
" 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
" Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

捕获输入:
" Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。
" Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。

表达式语言:
" Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
" Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).

绑定值到页面(view):
" Struts 1使用标准JSP机制把对象绑定到页面中来访问。
" Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
 
类型转换:
" Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
" Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

校验:
" Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
" Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

Action执行的控制:
" Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
" Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

posted @ 2007-12-24 11:02 痞子杰 阅读(233) | 评论 (0)编辑 收藏

第一部分: Struts 开发 6.83MB 22分36秒 http://beansoft.java-cn.org/download/ssh_1_struts.exe

第二部分: Hibernate + Spring 11.5MB 38分59秒 http://beansoft.java-cn.org/download/ssh_2_hibernate_spring.exe

第三部分: 自己实现 SpringProxyAction 5.05MB 14分25秒 http://beansoft.java-cn.org/download/ssh_3_struts_proxy_asm.exe

第四部分: ASM 错误解决及用 Spring 的代理实现整合 9.95MB 23分49秒 http://beansoft.java-cn.org/download/ssh_4_spring_struts.exe

大纲 PDF 下载: http://beansoft.java-cn.org/download/spring_struts_hibernate.pdf 427KB

代码下载(不带类库): http://beansoft.java-cn.org/download/myssh.rar 45KB

 

视频大纲:

Java EE 讲座

MyEclipse 5.5 开发 Spring 整合 Struts, Hibernate 的应用

刘长炯

2007.10

本章要点

*创建数据库

*快速开发 Struts 应用

*添加 Hibernate 功能

*添加 Spring 功能

*Spring 整合 Hibernate

*模拟 Action 代理类实现 Struts + Spring

*Spring 整合 Struts

*Asm 出错和 log4j.properties 文件

*测试运行

创建数据库

• 创建数据库

Ø 用 MyEclipse Derby 或者其它数据库
Ø 用 MyEclipse Database Explorer 管理数据库
Ø 执行 SQL:
• CREATE TABLE bbsuser (
• id int(11) NOT NULL,
• username varchar(200) NOT NULL,
• password varchar(20) NOT NULL,
• age int,
• PRIMARY KEY (id)
• )
• ENGINE=MyISAM DEFAULT CHARSET=GBK;

快速开发 Struts 应用

添加 Hibernate 功能

添加 Spring 功能

Spring 整合 Hibernate

Spring 整合 Hibernate(续)

模拟 Action 代理类实现 Struts + Spring

Spring 整合 Struts

• 添加 Spring Plug in

Ø <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
Ø <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
Ø </plug-in>

• 替换 Action 的 Type

Ø <action path="/login“ …
Ø type="org.springframework.web.struts.DelegatingActionProxy" />

• 在 Spring 配置文件中配置 Bean

Ø 要点: 通过 path 和 bean 的 name 进行匹配, 这两个值必须一样
Ø <bean name="/login" class="com.test.struts.action.LoginAction"></bean>

• 注入 DAO 的代理 bean

• 详细步骤参考文档

Spring 整合 Struts 的两种方式

• struts1加载spring的两种方式:
第一种:通过web.xml配置加载spring上下文环境,其配置方式如下:
web.xml
     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/applicationContext.xml</param-value>
       </context-param>
通过listener加载
<listener>
             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
       </listener>
或者利用severlet类加载
<servlet>
             <servlet-name>context</servlet-name>
             <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
             <load-on-startup>1</load-on-startup>
         </servlet>
第二种方式:
使用Struts插件
在struts-config.xml中
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
        <set-property property="contextConfigLocation"
            value="/WEB-INF/applicationContext.xml"/>
    </plug-in>

• 这两种配置的明显区别就是,第一种方式可以配置多个spring配置文件。

Asm 出错和 log4j.properties 文件

• Log4j.properties

Ø # Configure logging for testing: optionally with log file
Ø log4j.rootLogger=WARN, stdout
Ø # log4j.rootLogger=WARN, stdout, logfile
Ø log4j.appender.stdout=org.apache.log4j.ConsoleAppender
Ø log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
Ø log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
Ø log4j.appender.logfile=org.apache.log4j.FileAppender
Ø log4j.appender.logfile.File=target/spring.log
Ø log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
Ø log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

• 删除 asm-2.2.3.jar

测试运行

• 测试运行

Ø 用 MyEclipse 发布到 Tomcat
Ø 运行
Ø 打开浏览器测试
posted @ 2007-11-05 11:58 痞子杰 阅读(1140) | 评论 (0)编辑 收藏