- 浏览: 919291 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (498)
- J2EE (52)
- 数据库 (17)
- java基础 (43)
- web技术 (19)
- 程序设计 (6)
- 操作系统 (18)
- IT资讯 (7)
- 我的IT生活 (12)
- 学习笔记 (9)
- Jquery (25)
- JavaScript (18)
- spring (40)
- Hibernate (12)
- Struts (10)
- YUI (2)
- Extjs (22)
- .net (0)
- Eclipse (10)
- 社会主义 (2)
- 服务器 (9)
- CSS (8)
- 网络安全 (16)
- 版本控制 (9)
- PHP (2)
- Oracle (42)
- SQL server (1)
- Mysql (11)
- 项目管理 (3)
- 开发工具使用 (10)
- SQL语句 (7)
- Perl (0)
- Shell (6)
- 漏洞 (4)
- ibatis (5)
- hacker (2)
- SQL注入 (6)
- Hacker工具 (2)
- 入侵和渗透 (7)
- 插件/组件 (2)
- 最爱开源 (5)
- 常用软件 (2)
- DOS (1)
- HTML (2)
- Android (9)
- CMS (1)
- portal (8)
- Linux (7)
- OSGI (1)
- Mina (5)
- maven (2)
- hadoop (7)
- twitter storm (2)
- sap hana (0)
- OAuth (0)
- RESTful (1)
- Nginx (4)
- flex (1)
- Dubbo (1)
- redis (1)
- springMVC (1)
- node.js (1)
- solr (2)
- Flume (1)
- MongoDB (2)
- ElasticSearch (1)
最新评论
-
M_drm:
请问要怎么设置浏览器才不报没权限呢?
用JS在页面调用本地可执行文件的方法(ACTIVEX) -
Alexniver:
官方文档。When importing data into I ...
mysql导入数据过慢 解决方法 -
camelwoo:
我记得 Criteria 可以做连接查询与子查询,也可以做分页 ...
Hibernate总结篇二 -
zhenglongfei:
楼主如果SubKeyName 这个节点不存在,怎么办??怎么用 ...
Java操作注册表 -
yxx676229549:
用log4j 2 了
logback
Struts2 相 关 资 料
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 的系统架构图
M V C
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:property value="user.name" />
配置文件中:<result type="redirect">/main.jsp?name=${name}</result>
OGNL中%的使用:
用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.
例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息.
OGNL中“$”有两个主要的用途
用于在国际化资源文件中,引用OGNL表达式
在Struts 2配置文件中,引用OGNL表达式,
<result type="redirect">/main.jsp?name=${name}</result>
OGNL中#的使用
名称
作用
例子
parameters
包含当前HTTP请求参数的Map
#parameters.id[0]作用相当于request.getParameter("id")
request
包含当前HttpServletRequest的属性(attribute)的Map
#request.userName相当于request.getAttribute("userName")
session
包含当前HttpSession的属性(attribute)的Map
#session.userName相当于session.getAttribute("userName")
application
包含当前应用的ServletContext的属性(attribute)的Map
#application.userName相当于application.getAttribute("userName")
attr
用于按request > session > application顺序访问其属性(attribute)
#attr.userName相当于request/session/application.getAttribute("userName")
#可以取出堆栈上下文中的存放的对象.
集合的伪属性
OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.
Collection
Special Properties
Collection(inherited by Map, List &Set)
size ,isEmpty
List
iterator
Map
keys , values
Set
iterator
Iterator
next , hasNext
Enumeration
next , hasNext , nextElement , hasMoreElements
值 栈
ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。
Struts2拦截器
拦截器,在AOP(Aspspect-Oriented Programming 面向方面编程)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Struts2中解释为-----拦截器是动态拦截Action调用对象。它提供了一种机制可以使开发者可以定义一个在action执行的前后执行的代码,也可以在action之前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
Interceptor是Struts2的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化、转换器,校验等
Struts2拦截器
首先初始化Action代理对象和Action对象
依次执行各个拦截器
返回逻辑视图
可添加用户自定义拦截器
拦截器链是将拦截器按一定顺序链接成一条链,在访问被拦截方法或字段时,拦截器链中的拦截器就会按照之前定义的顺序被调用
Struts2拦截器配置
<package name="default" extends="struts-default">
Interceptor定义
***********************************************
<interceptors>
<intercept name="test" class="interceptor.MyIntercept"></interceptor>
<intercept name="test1" class="interceptor.Intercept1"></interceptor>
<intercept name="test2" cllss="interceptor.Intercept2"></interceptor>
-----------------------------------------------------
<interceptor-stack name=“test12”>
<interceptor-ref name=“test1”>
<interceptor-ref name=“test2”> 拦截器链
</interceptor >
------------------------------------------------------
</interceptors>
***********************************************
<action name="name1" class="">
Interceptor引用
***********************************************
<interceptor-ref name="test">
<interceptor-ref name="test1">
***********************************************
<interceptor-ref name=“test12”> 引用拦截器链
</action>
</packsge>
默认拦截器链
每个package均可设置自己的默认拦截器链
<default-interceptor-ref name=“defaultStack”>
单个Action也可以定义自己的拦截器引用
<action name=“VelocityCounter”
class=“a.b.c.d”>
<result name=“success”>…</result>
<interceptor-ref name=“defaultComponentStack”/>
</action>
附:内置拦截器种类
alias:实现在不同请求中相似参数别名的转换。
autowiring:这是个自动装配的拦截器,主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的Bean。
chain:构建一个Action链,使当前Action可以访问前一个Action的属性,一般和<result type=“chain” .../>一起使用。
conversionError:这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误。
createSession:该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中。
debugging:当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息。
execAndWait:后台执行Action,负责将等待画面发送给用户。
exception:这个拦截器负责处理异常,它将异常映射为结果。
附:内置拦截器种类
fileUpload:这个拦截器主要用于文件上传,它负责解析表单中文件域的内容。
i18n:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。
logger:这是一个负责日志记录的拦截器,主要是输出Action的名字。
model-driven:这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果堆入ValueStack中。
scoped-model-driven:如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例。
params:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
prepare:如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。
static-params:这个拦截器负责将xml中<action>标签下<param>标签中的参数传入action。
附:内置拦截器种类
scope:这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。
servlet-config:如果某个Action需要直接访问Servlet API,就是通过这个拦截器实现的。
注意:尽量避免在Action中直接访问Servlet API,这样会导致Action与Servlet的高耦合。
roles:这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action。
timer:这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。
token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。
token-session:这个拦截器的作用与前一个基本类似,只是它把token保存在HttpSession中。
validation:通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。
workflow:这个拦截器负责调用Action类中的validate方法,如果校验失败,则返回input的逻辑视图。大部分时候,开发者无需手动控制这些拦截器,因为struts-default.xml文件中已经配置了这些拦截器,只要我们定义的包继承了系统的struts-default包,就可以直接使用这些拦截器。
国际化消息
在Action类所在的同一个包下创建package.properties文件以及语言地区分支
Action类必须继承自ActionSupport,用getText(String key)方法来读取信息
Result指向的JSP页面可以使用s:text标签读取,纯JSP页面可使用s:18n标签配合s:text标签加载资源
创建package.properties文件
命名方式Package.properties,package_zh_CN.properties,properties_en_UK.properties
package.properties默认信息文件
HelloWorld.message = Struts 2 Running
package_zh_CN.properties中国大陆
Struts 2 \u8fd0\u884c
运行native2ascii转码
带参数的消息处理
Pacage.properties
welcome=Welcome to {0}
Action
getText(“welcome”,”默认值”)
getText(“welcome”,String[] params)
getText(“welcome”,List params)
JSP
<s:text name=“welcome”>
<s:param>BeiJing</s:param>
</s:text>
Struts2国际化运行机制
在Struts2中,可以通过
ActionContext.getContext().setLocale(Locale arg)
设置用户的默认语言。
为了简化设置用户默认语言环境,Struts2提供了一个名为i18n的拦截器(Interceptor),并且将其注册在默认的拦截器中(defaultStack)。
i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。
除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为WW_TRANS_I18N_LOCALE的属性中。一旦用户Session中存在一个名为WW_TRANS_I18N_LOCALE的属性,则该属性指定的Locale将会作为浏览者的默认Locale
转自:http://student.csdn.net/space.php?uid=248401&do=blog&id=24325
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Micheal_J/archive/2010/07/17/5741390.aspx
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 的系统架构图
M V C
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:property value="user.name" />
配置文件中:<result type="redirect">/main.jsp?name=${name}</result>
OGNL中%的使用:
用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.
例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息.
OGNL中“$”有两个主要的用途
用于在国际化资源文件中,引用OGNL表达式
在Struts 2配置文件中,引用OGNL表达式,
<result type="redirect">/main.jsp?name=${name}</result>
OGNL中#的使用
名称
作用
例子
parameters
包含当前HTTP请求参数的Map
#parameters.id[0]作用相当于request.getParameter("id")
request
包含当前HttpServletRequest的属性(attribute)的Map
#request.userName相当于request.getAttribute("userName")
session
包含当前HttpSession的属性(attribute)的Map
#session.userName相当于session.getAttribute("userName")
application
包含当前应用的ServletContext的属性(attribute)的Map
#application.userName相当于application.getAttribute("userName")
attr
用于按request > session > application顺序访问其属性(attribute)
#attr.userName相当于request/session/application.getAttribute("userName")
#可以取出堆栈上下文中的存放的对象.
集合的伪属性
OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.
Collection
Special Properties
Collection(inherited by Map, List &Set)
size ,isEmpty
List
iterator
Map
keys , values
Set
iterator
Iterator
next , hasNext
Enumeration
next , hasNext , nextElement , hasMoreElements
值 栈
ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。
Struts2拦截器
拦截器,在AOP(Aspspect-Oriented Programming 面向方面编程)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Struts2中解释为-----拦截器是动态拦截Action调用对象。它提供了一种机制可以使开发者可以定义一个在action执行的前后执行的代码,也可以在action之前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
Interceptor是Struts2的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化、转换器,校验等
Struts2拦截器
首先初始化Action代理对象和Action对象
依次执行各个拦截器
返回逻辑视图
可添加用户自定义拦截器
拦截器链是将拦截器按一定顺序链接成一条链,在访问被拦截方法或字段时,拦截器链中的拦截器就会按照之前定义的顺序被调用
Struts2拦截器配置
<package name="default" extends="struts-default">
Interceptor定义
***********************************************
<interceptors>
<intercept name="test" class="interceptor.MyIntercept"></interceptor>
<intercept name="test1" class="interceptor.Intercept1"></interceptor>
<intercept name="test2" cllss="interceptor.Intercept2"></interceptor>
-----------------------------------------------------
<interceptor-stack name=“test12”>
<interceptor-ref name=“test1”>
<interceptor-ref name=“test2”> 拦截器链
</interceptor >
------------------------------------------------------
</interceptors>
***********************************************
<action name="name1" class="">
Interceptor引用
***********************************************
<interceptor-ref name="test">
<interceptor-ref name="test1">
***********************************************
<interceptor-ref name=“test12”> 引用拦截器链
</action>
</packsge>
默认拦截器链
每个package均可设置自己的默认拦截器链
<default-interceptor-ref name=“defaultStack”>
单个Action也可以定义自己的拦截器引用
<action name=“VelocityCounter”
class=“a.b.c.d”>
<result name=“success”>…</result>
<interceptor-ref name=“defaultComponentStack”/>
</action>
附:内置拦截器种类
alias:实现在不同请求中相似参数别名的转换。
autowiring:这是个自动装配的拦截器,主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的Bean。
chain:构建一个Action链,使当前Action可以访问前一个Action的属性,一般和<result type=“chain” .../>一起使用。
conversionError:这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误。
createSession:该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中。
debugging:当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息。
execAndWait:后台执行Action,负责将等待画面发送给用户。
exception:这个拦截器负责处理异常,它将异常映射为结果。
附:内置拦截器种类
fileUpload:这个拦截器主要用于文件上传,它负责解析表单中文件域的内容。
i18n:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。
logger:这是一个负责日志记录的拦截器,主要是输出Action的名字。
model-driven:这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果堆入ValueStack中。
scoped-model-driven:如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例。
params:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
prepare:如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。
static-params:这个拦截器负责将xml中<action>标签下<param>标签中的参数传入action。
附:内置拦截器种类
scope:这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。
servlet-config:如果某个Action需要直接访问Servlet API,就是通过这个拦截器实现的。
注意:尽量避免在Action中直接访问Servlet API,这样会导致Action与Servlet的高耦合。
roles:这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action。
timer:这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。
token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。
token-session:这个拦截器的作用与前一个基本类似,只是它把token保存在HttpSession中。
validation:通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。
workflow:这个拦截器负责调用Action类中的validate方法,如果校验失败,则返回input的逻辑视图。大部分时候,开发者无需手动控制这些拦截器,因为struts-default.xml文件中已经配置了这些拦截器,只要我们定义的包继承了系统的struts-default包,就可以直接使用这些拦截器。
国际化消息
在Action类所在的同一个包下创建package.properties文件以及语言地区分支
Action类必须继承自ActionSupport,用getText(String key)方法来读取信息
Result指向的JSP页面可以使用s:text标签读取,纯JSP页面可使用s:18n标签配合s:text标签加载资源
创建package.properties文件
命名方式Package.properties,package_zh_CN.properties,properties_en_UK.properties
package.properties默认信息文件
HelloWorld.message = Struts 2 Running
package_zh_CN.properties中国大陆
Struts 2 \u8fd0\u884c
运行native2ascii转码
带参数的消息处理
Pacage.properties
welcome=Welcome to {0}
Action
getText(“welcome”,”默认值”)
getText(“welcome”,String[] params)
getText(“welcome”,List params)
JSP
<s:text name=“welcome”>
<s:param>BeiJing</s:param>
</s:text>
Struts2国际化运行机制
在Struts2中,可以通过
ActionContext.getContext().setLocale(Locale arg)
设置用户的默认语言。
为了简化设置用户默认语言环境,Struts2提供了一个名为i18n的拦截器(Interceptor),并且将其注册在默认的拦截器中(defaultStack)。
i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。
除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为WW_TRANS_I18N_LOCALE的属性中。一旦用户Session中存在一个名为WW_TRANS_I18N_LOCALE的属性,则该属性指定的Locale将会作为浏览者的默认Locale
转自:http://student.csdn.net/space.php?uid=248401&do=blog&id=24325
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Micheal_J/archive/2010/07/17/5741390.aspx
发表评论
-
Struts2中的Result类型应用(action...etc跳转)
2012-08-27 11:19 1049概况 Result类型 是在Action执行完,一个结果返回后 ... -
struts2 专栏
2012-03-09 00:18 803http://blog.csdn.net/struts2/ar ... -
Struts2与Struts1.x的深度比较
2012-03-05 22:18 896http://doc.chinaunix.net/java/2 ... -
利用Token机制解决重复重复提交问题
2011-02-17 15:46 1014http://www.blogjava.net/eamoi/a ... -
Struts2截取字符串的方法
2010-10-14 13:11 3200在开发中,经常会遇到字符串太长,需要适当截取后再显示的问题,其 ... -
struts2的action中获得request response session
2010-10-09 13:04 1748在struts2中有两种方式可以得到这些对象 1 ... -
使用 Felix 和 Struts2 开发 Web 应用
2010-08-22 00:23 1338引言 Open Service Gateway Init ... -
struts2标签的五大类
2010-07-23 14:38 1426在struts1.x 中提供了4个标签库用以支持它的集成开 ... -
Struts工作机制?为什么要使用Struts?
2010-05-13 08:55 2404工作机制: Struts的工作流程: 在web应用启动时就会加 ...
相关推荐
在本文中,我们将深入探讨Struts2拦截器的工作原理。 ### 一、拦截器概念 拦截器是基于Java的动态代理机制实现的,它允许我们在Action执行前后插入自定义的行为。在Struts2中,拦截器是一个实现了`Interceptor`...
本篇文章将详细介绍如何配置Struts2的登录拦截器,以及其背后的原理和实践应用。 首先,让我们理解一下拦截器的概念。在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序对Action调用进行...
了解了拦截器的基本原理后,我们可以通过`Struts2.x 拦截器.avi`这个视频文件深入学习Struts2拦截器的实现细节,比如如何编写自定义拦截器、如何配置拦截器链、如何处理异常等。`readme.txt`可能是关于这个主题的...
Struts2 拦截器是基于Java的Servlet Filter设计模式的一种实现,它提供了一种在Action执行前后插入额外逻辑的方式。拦截器是Struts2框架的核心组件之一,用于增强应用的功能,比如权限验证、日志记录、数据校验等。 ...
Struts2 工作原理及拦截器和过滤器 Struts2 框架的工作原理可以分为以下几个步骤: 1. 客户端发出一个指向 Servlet 容器的请求(Tomcat); 2. 这个请求会经过几个过滤器,最后会到达 FilterDispatcher 过滤器。...
在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...
这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP(面向切面编程)思想的组件,它可以理解为在Action调用前后插入的逻辑处理。在...
下面将详细探讨Struts2拦截器及其工作原理。 ### 一、Struts2 拦截器概念 1. **拦截器是什么**:拦截器是一种动态拦截Action调用的对象,它可以理解为一个过滤器,它在Action被调用之前和之后执行特定的逻辑。...
下面我们将详细介绍如何创建自定义的Struts2拦截器。 1. **理解Struts2拦截器工作原理** Struts2中的拦截器是一个实现了`Interceptor`接口或者继承了`AbstractInterceptor`抽象类的Java类。当一个请求到达时,...
通过这两个实例,你将更深入地理解Struts2拦截器的工作原理和配置方式,以及它们如何在实际项目中发挥作用。记得在实践中多尝试,理解拦截器如何与其他Struts2组件协作,以提升你的Web应用开发技能。
在Struts2中,拦截器的工作原理如下: 1. 用户发起HTTP请求,请求到达Struts2的Front Controller(DispatcherServlet)。 2. DispatcherServlet会根据配置找到对应的Action(动作)类。 3. 在调用Action之前,...
本篇将深入探讨Struts2的核心拦截器以及其工作原理。 在Struts2中,拦截器是一个实现了`Interceptor`接口的类,它通过在动作执行前后插入额外的处理逻辑,实现了对请求处理的增强。拦截器链是由多个拦截器按照特定...
以下是对Struts2拦截器原理与实现的详细解析: 1. **拦截器的概念** Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加...
下面我们将深入探讨Struts2拦截器的实现原理。 首先,让我们理解一下拦截器的基本概念。拦截器是基于Java的动态代理机制实现的,它可以看作是一个过滤器,它在Action调用前后执行一些额外的任务,如日志记录、权限...
下面将详细探讨Struts2拦截器的源码及其工作原理。 首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的...
本文将深入探讨Struts2拦截器的基本概念、工作原理以及其实现机制,并结合实际应用场景来展示如何利用拦截器提高代码的复用性与可维护性。 #### 二、拦截器的概念与作用 拦截器(Interceptor)是一种设计模式,...
首先,我们需要理解Struts2拦截器的工作原理。拦截器是基于Java的动态代理机制实现的,它们在Action调用之前和之后执行,形成一个拦截器链。开发者可以通过配置struts.xml或struts.properties文件来定义拦截器链和其...
首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的顺序在Action执行之前和之后执行。通过实现`Interceptor`接口或继承`AbstractInterceptor`类,我们可以创建...
首先,我们需要理解Struts2拦截器的工作原理。拦截器是一个实现了`Interceptor`接口的Java类,它们按照指定的顺序组成一个拦截器栈。当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会...
在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...