Struts2并非继承自Struts1的构架机制,而是继承自WebWork,因为Struts2是对WebWork的升级而产生的,Struts2吸收了Struts1和WebWork两者的优势,从而在稳定性、性能等各方面都有很好的保证。
Apache Struts2即使之前的WebWork2,经历几年的发展后WebWork和Struts2社区决定合并,也即是现在的Struts2。
Struts1和Struts2的不同
Action类:
Struts1要求Action类继承一个抽象基类,Struts1的普遍问题是使用抽象类编程而不是接口
Struts2 Action类可以实现一个Action接口,也可实现其他接口使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用接口,Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象
注:POJO:Plains and old Java Object普通的Java类,不继承自特殊类,包含但不限於JavaBean
Struts1和Struts2的不同
线程模式:
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Struts1和Struts2的不同
Servlet依赖:
Struts1Action依赖于Servlet API因为Action被调用时HttpServletRequest和HttpServletResponse被传递给execute方法。
Struts2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要Struts2 Action仍然可以访问初始的request和response。但是,其他元素减少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性
Struts1和Struts2的不同
捕获输入:
Struts1使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。
Struts2直接使用Action属性作为输入属性,消除了对第二输入对象的要求。Action属性能够通过web页面上的taglibs访问。
Struts2也支持AcionForm模式。
Struts1和Struts2的不同
类型转换:
Struts1 ActionForm属性通常是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每个实例来说是不可配置的。
Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。
校验:
Struts1支持在ActionForm的validate方法手动校验,或者通过Commons Validateor的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
Struts2支持通过validate方法和Xwork校验框架来进行校验。Xwork叫要框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
XWork
实现独立运行的命令模式框架:
Action作为命令对象存在于XWork中。
添加了高级功能
拦截器
包括设置表单数,处理文件上传等
结果
包括多个Action之间的连接,转向表示层
简单的IoC(或者DI,依赖注入)容器,可对Action对象注入值(Spring)
强大的对象查询语言-OGNL
自动类型转换
元数据驱动的验证框架
插件机制
Struts2基础包
struts2-core-2.0.11.jar
Struts2框架的核心类库
commons-logging-1.0.4.jar
Struts2框架日志包
freemaker-2.3.8.jar
Struts2的UI标签的模板
ognl-2.6.11.jar
对象图导航语言包
xwork-2.0.4.jar
XWork类库,struts2基于此构建
注:
加入所有jar包后项目无法启动:
struts2基于插件机制,插件载入时会自动实例化需要的类库,此时会出错。
Struts Core
封装HTTP请求/响应对象为Map
处理Sessions/Application范围
ServletDispatcher转换HTTP请求执行Action
提供了Web层的拦截器
将Result转换为具体的redirect&dispatch,或者其他表示层
Struts2的系统架构图
MVC
MVC是Model-View-Controller的简写。"Model"代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),"View"是应用的表示面(由JSP页面产生),"Controller"是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model 1的不足。
*Model 1: JSP页面中可以非常容易地结合业务逻辑(jsp:useBean)、服务端处理过程(jsp:scriplet)和HTML(),在JSP页面中同时实现显示,业务逻辑和流程控制,从而可以快速地完成应用开发。现在很多的Web应用就是由一组JSP页面构成的。这种以JSP为中心的开发模型我们可以称之为Model 1。
在Struts2中
Controller:FilterDispatcher
Model:Action,Interceptors
Struts2流程
一个请求在Struts 2框架中的处理大概分为以下几个步骤。
客户端提交一个(HttpServletRequest)请求,如上文在浏览器中输入
http://localhost: 8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)请求。
请求被提交到一系列(主要是3层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher)。注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。
FilterDispatcher是控制器的核心,就是MVC的Struts 2中实现控制层(Controller)的核心。
Struts2流程
FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。
ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。例如,用户注册示例将找到UserReg类。
ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)。
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。
执行流程
Action->FilterDispatcher->struts.xml
->namespace+ActionName->new Action
->填充表单setXxx()->action.execute()
->”success”->Result->设置request属性
->跳转目标页
下载Struts2
下载地址:
http://struts.apache.org/2.x/点击Download,选择下载
完整版:
http://apache.etoak.com/struts/binaries/struts-2.1.8-all.zip
完整版-------------------------------------
示例应用----------------------------------
基础依赖类库----------------------------
文档----------------------------------------
源代码-------------------------------------
下载XWork
Struts2下载包内不含XWork源码,如有需要需从XWork网站下载
下载地址:http://www.opensymphony.com/xwork/download.action
Struts2开发环境需求
JDK 1.5或者更高版本
Tomcat 5.5或者更高版本
Eclipse(MyEclipse)或者NetBeans等
暂无专门的Eclipse struts2插件】
MyEclipse对JavaEE 5.0支持存在问题,一般使用J2EE1.4建立新项目
MyEclipse的汉化
运行后MyEclipse,进入主界面。在主菜单栏处依次点:“help”-->“software update”-->“Find And Install”,这时弹出一个界面,选择要安装的功能部件,选择第2项(搜索要安装的新功能部件),然后点next,进入下一步。
然后选择New Remote Site(新建远程站点),弹出一个对话框,有两项,第一项是起的名字,随便起,就叫language吧,第2项是个URL,填入:http://download.eclipse.org/technology/babel/update-site/ganymede或http://download.eclipse.org/technology/babel/update-site/europa这个下载地址,(finish)确定就行了。
更新了一段时间后,会弹出一个对话框,选择一个站点,比如选择china(beijing)这个下载站点,速度挺快的(15分钟的样子就能下完汉化包),选择好站点后,又更新一段时间,然后会弹出一个语言包列表框(language pack),一共有32个语言包,不需要全部下载,只需下载chinese(Simplified)”这个语言包就行了,选择好后,点next,继续下载更新。最后,会弹出一个对话框,让选择安装路径,默认即可(D:\Program Files\MyEclipse 6.5\eclipse),点"finish"。下载完后,会提示安装,然后点“install all”就行了。安装完后,提示要关闭myelicpse,确认即可。
MyEclipse6.5汉化包安装完成后,把D:\Program Files\MyEclipse 6.5\eclipse\eclipse.ini里的-Duser.language=en删除掉并保存,重启Myeclipse,则汉化成功
Struts2项目开发基本配置
启动MyEclipse
创建Web Project
添加必须的struts2 jar包
向web.xml加入Struts2过滤器
创建jsp表示层页面
创建Action类
创建struts.xml并加入Action定义
运行测试
struts.xml配置
<package name="test1" extends="struts-default">
<action name="test" class="a.c.b.s">
<result name="success">OK.jsp</result>
</action>
</package>
表单标签
Radio单选标签
Select下拉列表标签
Optgroup分组列表
Checkboxlist复选框
Doubleselect双关联列表
Combobox文本框+下拉列表
Updownselect复选框
Optiontransferselect传输选择列表
Submit提交
*附:表单标签属性及配置实例
Radio标签
radio标签
radio标签将呈现为一组单选按钮,单选按钮的个数与程序员通过该标签的list属性提供的选项的个数相同。虽说radio标签也可以用于只用提供一种选项的场合,但正规的做法是用它来实现一组"多选一"选项。对于那些可以归结为"真/假"选择的情况,你应该选用checkbox标签而不是radio标签来处理。
Select标签
struts2的select标签中,常用的有以下几个属性:
(1)struts2中的select标签中,必须设置的属性只有一个,即是list。
(2)select标签的list中必须有值,不然会报错。如果没有值,可以加上headerKey, headerValue,这样就可以通过了
其中,即使list中有值,我们也通常会加上headerKey, headerValue,即列表中显示的第一个选项。注意,headerKey不可以为空,不可以为-1
(3)list属性:通常是在action中定义的,必须是一个可以迭代的源,如为一个List, Map, Set等。如果是一个Map,那么map的key就对应于select标签中的value,map中的value就对应于select标签中的option。而如果是一个List或者是一个Set,那么可以通过listKey和listValue指定。
(4)listKey和listValue:listKey即对应于select标签中的value,listValue即对应于select标签中的option。
(5)name属性:即是表单中select的名称。
Optgroup标签
用optgroup标签对选项进行分组
你可以用optgroup标签对select元素所提供的选项进行分组。每个选项组有它自己的来源。
Checkboxlist标签
checkboxlist标签
checkboxlist标签将呈现为一组单选框。
Combobox标签
combobox标签将呈现为一个文本输入字段和一个select元素。
Updownselect标签
updownselect标签的功能与checklist标签相似,它也允许你从一组选项里选中多个选项。updownselect标签将呈现为一个select元素,这个select元素的multiple属性被设置为multiple,并且还有用来同时选中所有选项的按钮,和用来对那些选项重新排序的按钮
Optiontransferselect标签
optiontransferselect标签将呈现为两个select元素,内建在这个标签里的Javascript函数可以在那两个select元素之间来回“传输”各个选项。
注意只有被选中(突出显示)的选项才会被发送到服务器。把一个选项从左侧的select元素移动到右侧的select元素并不等于选中了它。
Doubleselect标签
doubleselect标签将呈现为两个相互关联的select元素
OGNL
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
OGNL的应用场景:
标签中:<s:propertyvalue="user.name"/>
配置文件中:<result type="redirect">/main.jsp?name=${name}</result>
OGNL中%的使用:
用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.
例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息.
OGNL中“$”有两个主要
评论