Starting Struts2 2.1.6 学习

近日在别人的博客上看到了Struts 2.1.6      发布的消息,发现自己好久没关注Struts了,客观原因是项目中不用Struts,
DWR+EXTJs 横行,日久生虫,我也渐渐喜欢了DWR,自然就......
  以下大部分内容 译自 Starting Struts2  Written By lan Roughley
  <a href="http://infoq.com/minibooks/sarting-struts2">InfoQ 下载地址 </a>
   自从1997年第一个 Servlet 技术标准发布后,用JAVA开发WEB Applicate 就由来以久了。Servlets 提供了一种 映射URL到一个类的指定的方法的方式。 Apache的Struts 是在2000年由Craig McClanahan启动的,直到2001 年1朋第一个版本才发布。我第一次接触Struts1.X 是在大二,秦老师给我们讲MVC,介绍了Struts
。当时感觉很那是很潮的。
   Struts2是Apache Struts 的下一代,是WebWork+Struts1.x的混血儿。
   再来看看WebWork,它是XWork 和WebWork的结合体,XWork 是一个通用的命令行框架,它提供了像
   actions、validation 和 interceptors 这样的核心特性。
   而WebWork 则是通过 Context  对XWork进行包装。
   Struts2的新特,基于框架的ACTION,集成了Spring 、SiteMesh(这种技术我喜欢的,和ASP.NET的母版页相似)、Titles和OGNL,对JSP,FreeMarker 、Velocity和XSLT 视图进行了支持,支持注解。当然还有别的,不过这些已经足够吸引人了。

 
 Struts2是一个pull-MVC架构。这是什么意思呢?从开发者角度看,就是说需要显示给用户的数据可以直接从Action中获取,而不像 Struts1.x那样,必须把相应的Bean存到Page、Request或者Session中才能获取。Struts1.x 必须继承org.apache.struts.action.Action或者其子类,表单数据封装在FormBean中。Struts 2无须继承任何类型或实现任何接口,表单数据包含在Action中。
 
 说说配置文件,Struts2支持struts.xml 和struts.properties。
 形式是 <struts> <package name="" extends=""> </package> </struts>
 大部分的配置信息写在 <package>里。
1 在实际的开发环境中,有一些配置可能是比较重要的:
 
  >> struts.i18n.reload=true
 
  >>struts.devMode=true     提供更多综合的调试
 
  >>struts.configuration.xml.reload=true   当一个ACTION改变时,不用重启整个 WEB APP
 
2 当STRUTS2 要包含别的配置时,用到的标签是  <include file="">
 
3  有两个例外的配置元素 <beans..><constant ...>不包含在<struts > 中。利用这两个标签可能配置框架的一些高级特性。


Action是一个重要的概念在许多的WEB 框架中,在STRUTS2在有很多重要的用法。
第一个就是action的功能,首先它不要实现什么接口或继承什么类,它就是一个简单的POJO类
   简单说一下,不举例子了,相信高手能看明白,呵呵
   action 执行一个方法,返回一个字符串,配置文件根据返回的结果去映躺URL
  
第二个  Request and Form Date
   Struts2沿续了JAVABEAN的范式,如果你要访问数据,你得有相应的GETTER  SETTER。
第三个 Accessing Business Services
    没有新鲜的,就是IOC  控制反转,相信每天Spring 柴米油盐的日子,你对这些不会陌生,我接着偷懒。
第四个 Interceptors  拦截器
 Struts2 的重要组成部分,大部分功能的实现都是通过它来实现的,在异常处理 ,文件上传,验证,生命期回调时进行拦截,进行别的操作,也不是什么新鲜玩意,和servlet filters (过滤器)、 JDKs Proxy(动态代理)是一个意思, 不过就是改头换面了。
 
 下面是一些我们经常提到、用到的
 ActionAutowiringInterceptor
 ParametersInterceptor
 ServletConfigInterceptor
 前两个能独立的工作,对action没要求;最后 一个和下面的接口一起才能工作
 SessionAware 
 ServletRequestAware
 .....
 ServletContextAware  等等,在STRUST2 里没有HTTPRequst Response类,通过上面的可以间接得到。
 配置文件中需要添加
 <interceptors>
  <interceptor name="AA" class=""/>
 </interceptors>
在action的配置中也要确保引用了配置的Interceptor
<action name="">
  <interceptor-ref name="AA">
</action>
   还有一种方式就是给当前的包分配一个过滤器
   <default-interceptor-ref name="AA">
   假如我有十个的过滤器,配置过滤器我就不说什么了,对于要引用的action呢,难道还有一个一个的加上,好大的工作量,呵呵,吓你一下,不用的啦。
 过滤器值栈
 <interceptor-stack name="BBCC">
        <interceptor-ref name="AA">  
 </interceptor-stack>
 你的action 这时可以再引用这个BBCC。
 
 编写自已的Interceptors
   
  要实现自己的过滤器,必须实现Intercepotr 接口。看看这个接口的代码吧:
 
  public interface Interceptor extends Serializable{
    void destroy();
     void init();
  String intercept (ActionInvocation invocation) throws Exception;
  }
    代码少,分析一下吧:ActionInvocation 提供了访问运行期的能力,允许访问action 本身,context ,actions 执行返回的结果,等等。
 
 Value Stack 和OGNL
  值栈和对象导航语言,我简单介绍 一下跳过
 
 Value Stack  由Temporary Objects 、Model Object 、Action Object、Named Actions
 OGNL是Struts 2框架的默认表达式语言,增强了Struts 2的数据访问能力,同时简化了代码。
 在Struts 2框架中,值栈(Value Stack)就是OGNL的根对象,假设值栈中存在两个对对象实例:Man和Animal,这两个对象实例都有一个name属性,Animal有一个 species属性,Man有一个salary属性,假设Animal在值栈的顶部,Man在Animal后面,下面的代码片断会帮助读者更好地理解 OGNL表达式:

 // 调用animal.getSpecies()
species
// 调用man.getSalary()
salary
// 调用animal.getName(),因为Animal位于值栈的顶部
name


最后一行示例代码,返回的是animal.getName()返回值,即返回了Animal的name属性,因为Animal是值栈的顶部元素,OGNL将从顶部元素搜索,所以会返回Animal的name属性值。如果要获得Man的name值,则需要如下代码:

 man.name

Struts 2允许在值栈中使用索引,示例代码如下所示:

[0].name   // 调用animal.getName()
[1].name   // 调用man.getName()

★ 注意 ★

使用索引,并不是直接获得指定的元素,而是从指定的索引位置搜索。
 
 好了,今天就到这里。
 
 Struts2 主要版本的发布日期
  13 Jan 2009 - Struts 2.1.6 General Availability Release
     
  26 May 2008 - Struts 2.1.2 Beta Release

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值