Struts 总结文档格式.docx
《Struts 总结文档格式.docx》由会员分享,可在线阅读,更多相关《Struts 总结文档格式.docx(102页珍藏版)》请在冰豆网上搜索。
●自定义的标记库使得创建和验证HTML表单更加容易
2.1Struts体系结构
让我们从MVC角度观察struts框架中的组件
框架中三个部分:
模型,视窗和控制器。
模型
在struts框架中,模型分为两个部分:
●系统的内部状态
●可以改变状态的操作(事务逻辑)
内部状态通常由一组ActinFormJavaBean表示。
根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。
大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。
比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。
小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。
当逻辑简单时这个方法很适合。
建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。
视窗
由JSP建立,struts包含扩展自定义标签库,可以简化创建完全国际化用户界面的过程。
控制器
struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。
2.2Struts框架中的组件
(由于ROSE工具还未能下载,只能找来这幅图,它说明了一定问题,特别是ActionErrors,但它并没有将ActionMapping,JSP和TagLibrary包含进来,有时间作完替换)
框架中所使用的组件:
ActionServlet
ActionClass
包含事务逻辑
ActionForm
显示模块数据
ActionMapping
帮助控制器将请求映射到操作
ActionForward
用来指示操作转移的对象
ActionError
用来存储和回收错误
Struts标记库
可以减轻开发显示层次的工作
下面我们看看各自在框架中所扮演的角色和责任。
2.3Struts配置文件
这是将struts组件结合在一起的东东:
struts-config.xml。
默认值
\WEB-INF\struts-config.xml。
配置文件可以定义:
●全局转发
●ActionMapping类
●ActionFormbean
●JDBC数据源
配置全局转发
全局转发用来在JSP页之间创建逻辑名称映射。
转发都可以通过对调用操作映射的实例来获得,例如:
actionMappingInstace.findForward(“logicalName”);
全局转发的例子:
(所有的例子我没有进行解释,一是结合表可以理解,二是例子大部分来自系列四的示例,你应该在作完实验后,再来看一便)
<
global-forwards>
forwardname="
bookCreated"
path="
/BookView.jsp"
/>
/global-forwards>
属性
描述
Name
全局转发的名字
Path
与目标URL的相对路径
配置ActionMapping
ActionMapping对象帮助进行框架内部的流程控制,它们可将请求URI映射到Action类,并且将Action类与ActionFormbean相关联。
ActionServlet在内部使用这些映射,并将控制转移到特定Action类的实例。
所有Action类使用perform()方法实现特定应用程序代码,返回一个ActionForward对象,其中包括响应转发的目标资源名称。
例如:
action-mappings>
actionpath="
/createBook"
type="
BookAction"
name="
bookForm"
scope="
request"
input="
/CreateBook.jsp"
>
/action>
forwardname=”failure”path=”/CreateBook.jsp”/>
forwardname=”cancel”path=”/index.jsp”/>
/action-mappings>
属性
Path
Action类的相对路径
与本操作关联的Actionbean的名称
Type
连接到本映射的Action类的全称(可有包名)
Scope
ActionFormbean的作用域(请求或会话)
Prefix
用来匹配请求参数与bean属性的前缀
Suffix
用来匹配请求参数与bean属性的后缀
attribute
作用域名称。
className
ActionMapping对象的类的完全限定名默认的类是org.apache.struts.action.ActionMapping
input
输入表单的路径,指向bean发生输入错误必须返回的控制
unknown
设为true,操作将被作为所有没有定义的ActionMapping的URI的默认操作
validate
设置为true,则在调用Action对象上的perform()方法前,ActionServlet将调用ActionFormbean的validate()方法来进行输入检查
通过<
forward>
元素,可以定义资源的逻辑名称,该资源是Action类的响应要转发的目标。
Id
ID
ClassName
ActionForward类的完全限定名,默认是org.apache.struts.action.ActionForward
操作类访问ActionForward时所用的逻辑名
响应转发的目标资源的路径
redirect
若设置为true,则ActionServlet使用sendRedirect()方法来转发资源
配置ActionFormBean
ActionServlet使用ActionForm来保存请求的参数,这些bean的属性名称与HTTP请求参数中的名称相对应,控制器将请求参数传递到ActionFormbean的实例,然后将这个实例传送到Action类。
例子:
form-beans>
form-beanname="
BookForm"
/form-beans>
ActionFormbean的完全限定名,默认值是org.apache.struts.action.ActionFormBean
表单bean在相关作用域的名称,这个属性用来将bean与ActionMapping进行关联
类的完全限定名
配置JDBC数据源
用<
data-sources>
元素可以定义多个数据源。
Key
Action类使用这个名称来寻找连接
实现JDBC接口的类的名称
下面属性需要<
set-property>
元素定义,在框架1.1版本中已不在使用,但你可用<
data-source>
元素。
data-sourceid=”DS1”
key=”conPool”
type=”org.apache.struts.util.GenericDataSource”
set-propertyid=”SP1”
autoCommit="
true"
description="
ExampleDataSourceConfiguration"
driverClass="
org.test.mm.mysql.Driver"
maxCount="
4"
minCount="
2"
url="
jdbc:
mysql:
//localhost/test"
user="
struts"
password="
wrox"
/>
data-source/>
/data-sources>
desciption
数据源的描述
autoCommit
数据源创建的连接所使用的默认自动更新数据库模式
driverClass
数据源所使用的类,用来显示JDBC驱动程序接口
loginTimeout
数据库登陆时间的限制,以秒为单位
maxCount
最多能建立的连接数目
minCount
要创建的最少连接数目
password
数据库访问的密码
readOnly
创建只读的连接
User
访问数据库的用户名
url
JDBC的URL
通过指定关键字名称,Action类可以访问数据源,比如:
javax.sql.DataSourceds=servlet.findDataSource(“conPool”);
javax.sql.Connectioncon=ds.getConnection();
2.4Struts运行流程
1.根据访问路径查找web.xml文件,发现过滤器
<
filter>
<
filter-name>
struts2<
/filter-name>
filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter<
/filter-class>
/filter>
filter-mapping>
url-pattern>
/*<
/url-pattern>
/filter-mapping>
所以,将所有控制权交给struts框架中的StrutsPrepareAndExecuteFilter类
2.StrutsPrepareAndExecuteFilter类会自动去classes文件夹下查找struts.xml文件
在struts.xml文件中查找是否有对应名字的action,如果找到,就调用其配置的class的类com.ambow.demo.HelloAction。
actionname="
helloworld"
class="
com.ambow.demo.HelloAction"
<
resultname="
abcd"
/index.jsp<
/result>
success"
/login.jsp<
3.在HelloAction中,自动调用execute方法。
publicStringexecute(){
System.out.println("
myexecuterunning"
);
return"
;
}
execute方法必须定义为:
publicStringexecute(){}
4.针对execute方法的返回字符串,StrutsPrepareAndExecuteFilter回去查找struts.xml中对应action的result标签里面的name。
如果发现了,就跳转到指定的页面如果没发现,报404错误
2.4.1运行流程图
struts2框架的执行流程:
1)用户发起请求(.action结尾的请求表示请求一个Action)
2)struts2框架的主控器(FilterDispatcher)接收用户发起的请求,
然后判断这个请求交给Action处理还是交给web组件处理.
如果请求的Action或者web组件不存在,那么出现404错误.在整个处理
过程中需要一个辅助对象:
Action映射器(ActionMapper).
3)第二步判断的结果是交给Action处理,并且存在对应的Action.
那么根据struts.xml文件中对此Action的配置信息,首先执行拦截
此Action的所有拦截器,然后再执行请求的Action对象.在这个处理
过程中需要辅助对象:
Action代理(ActionProxy)、配置管理器(ConfigurationManager)、ActionInvocation.
4)Action执行完毕之后返回一个结果(此结果用字符串表示),这个结果
经过拦截Action的所有拦截器之后,返回给主控器.主控器根据此结果
从配置文件中找到真正的路径,然后将请求转发给对应的视图.
5)由视图向客户端作出响应
上图来源于Struts2官方站点,是Struts2的整体结构。
一个请求在Struts2框架中的处理大概分为以下几个步骤
1客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:
SiteMeshPlugin)
3接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类
6ActionProxy创建一个ActionInvocation的实例。
7ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
在表示的过程中可以使用Struts2框架中继承的标签。
在这个过程中需要涉及到ActionMapper
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
Struts2:
(1)客户端提交一个HttpServletRequest请求(.action或JSP页面)
(2)请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等
(3)FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器
(4)请求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个Request(一般根据URL后缀是否为.action来判断)
(5)如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求交到ActioProxy,由其进行处理.
(6)ActionProxy通过ConfigurationManager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action类.
(7)ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用Action,(在调用之前会根据配置文件加载相关的所有Interceptor拦截器)
(8)Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器.
(9)最后ActionInvocation负责根据struts.xml中配置的result元素,找到与返回值对应的result,决定进行下一步输出.
2.5Struts.xml配置详解
1
!
DOCTYPE
struts
PUBLIC
"
-//Apache
Software
Foundation//DTD
Struts
Configuration
2.0//EN"
http:
//struts.apache.org/dtds/struts-2.0.dtd"
2
struts>
3
4
--
include节点是struts2中组件化的方式
可以将每个功能模块独立到一个xml配置文件中
然后用include节点引用
-->
5
include
file="
struts-default.xml"
/include>
6
7
8
package提供了将多个Action组织为一个模块的方式
9
package的名字必须是唯一的
package可以扩展
当一个package扩展自
10
另一个package时该package会在本身配置的基础上加入扩展的package
11
的配置
父package必须在子package前配置
12
name:
package名称,不可省略
13
extends:
继承的父package名称
14
abstract:
设置package的属性为抽象的
抽象的package不能定义action
值true:
false
15
namespace:
定义package命名空间
该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http:
//localhost:
8080/struts2/test/XX.action
16
17
package
name="
com.kay.struts2"
extends="
struts-default"
namespace="
/test"
18
interceptors>
19
定义拦截器
20
name:
拦截器名称
21
class:
拦截器类路径,拦截器的实现类
22
23
interceptor
timer"
class="
com.kay.timer"
/interceptor>
24
logger"
com.kay.logger"
25
定义拦截器栈
26
interceptor-stack
mystack"
27
interceptor-ref
/interceptor-ref>
28
29
/interceptor-stack>
30
/interceptors>
31
32
定义默认的拦截器
每个Action都会自动引用
33
如果Action中引用了其它的拦截器
默认的拦截器将无效
34
default-interceptor-ref
/default-interceptor-ref>
35
36
37
全局results配置
38
global-results>
39
result
input"
/error.jsp<
40
/global-results>
41
42
Action配置
一个Action可以被多次映射(只要action配置中的name不同)
43
action名称
44
对应的类的路径
45
method:
调用Action中的方法名
46
47
action
hello"
com.kay.struts2.Action.LoginAction"
48
引用拦截器
49
拦截器名称或拦截器栈名称
50
51
n