开源框架之struts2笔记归纳Word文档下载推荐.doc
《开源框架之struts2笔记归纳Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《开源框架之struts2笔记归纳Word文档下载推荐.doc(17页珍藏版)》请在冰点文库上搜索。
![开源框架之struts2笔记归纳Word文档下载推荐.doc](https://file1.bingdoc.com/fileroot1/2023-4/30/b8cc05cf-5e85-4606-a937-1f156f71ede5/b8cc05cf-5e85-4606-a937-1f156f71ede51.gif)
Servlet,JSP,Filter,JDBC
a.原ShoppingCart程序就是一个MVC结构实现
View实现部分:
采用JSP组件实现
Model实现部分:
采用DAO、Entity等组件实现
Controller实现部分:
采用ActionServlet组件实现
b.ShoppingCart程序虽然基于MVC,但结构还有一些问题:
当请求数量比较多时,需要在Servlet中编写大量的if...else分支语句,而且Servlet代码量非常多。
改造方案:
为Servlet提供一个XML配置文件,用于定义请求和Action组件的对应关系。
然后将if...else分支中的代码提取到对应的Action组件中。
*4)Struts2的主要工作流程
a.首先客户端浏览器发送一个请求,请求到达控制器。
b.控制器根据xml配置信息调用相应的Action组件(XML配置了请求和Action对应关系)
c.执行Action组件业务处理,该组件可以调用DAO,Cart,Entity等组件。
d.控制器调用JSP视图组件生成一个响应界面给浏览器
5)Struts的内部原理:
编程原理:
用户发送http请求---》Web服务器(tomcat)--》加载
web.xml(web部署描述文件)文件-执行struts核心控制器(
StrutsPrepareAndExecuteFilter或者filterDispatcher)-->
加载struts.xml文件,通过请求action名字找到匹配的action
-->
在action中调用(execute)(业务层|数据层)
-->
执行result=“"
-->
通过result找到struts.xml与result名字匹配结果--》转发到
页面返回给调用者
程序调用:
struts内部原理图:
(1)用户发送http请求--》启动web服务器---》加载web.xml(web部署描述文件)配置文件---》执行web.xml中相应过滤器
ActionContextCleanUp:
清除页面中的属性
otherfilter(SiteMesh:
装饰过滤器)
SiteMesh作用:
页面布局、装饰
FilterDispatcher:
struts2核心控制器
注意:
(a)使用SiteMesh(装饰过滤器),struts2容器不在管理页面中属性,需要调用ActionContextCleanUp完成销毁
(b)过滤器执行是有顺序
ActionContextCleanUp-->
SiteMesh-->
FilterDispatcher
(2)中央控制器FilterDistpacher询问ActionMapper是否需要请求action
(3)如果需要请求action,FilterDispatcher就会调用它的代理(ActionProxy)加载配置文件
(4)ActionProxy会调用ConfigurationManager读取strus.xml配置文件
注意:
只加载一次
(5)根据请求名字,ActionProxy(action代理)调用所有拦截器(Inertceptor),ActionProxy(action代理)创建ActionInvocation,去执行所对应action类,根据Action类中名字找到匹配result页面
(jsp、freeMarker、Velocity)等技术,在此执行拦截器
注意:
struts2拦截器和servlet过滤器功能相同,并比filter强大
拦截器执行顺序:
先进后出
(6)相应给用户(HttpServletResponse)
3.Struts2框架的历史
Struts2框架和Struts1没有必然联系,它是将原来的WebWork框架核心部分Xwork提取,进行封装后发布为Struts2。
*4.Struts2框架基本使用
*1)Struts2使用步骤
*a.下载发布包,将核心包导入web工程
struts2-core-2.1.8.jar:
Struts2核心包
xwork-core-2.1.6.jar:
Xwork核心包
ognl-2.7.3.jar:
OGNL技术工具包,与EL相似,但比EL强大。
freemarker-2.3.15.jar:
界面模板技术,与JSP相似。
commons-fileupload-1.2.1.jar:
文件上传包。
*b.配置Struts2控制器,在src下添加struts.xml、Struts2控制器采用的是StrutsPrepareAndExecuteFilter组件实现。
在web.xml文件中配置该Filter组件。
c.根据请求编写Action,DAO,Entity等组件
*2)HelloWord示例
welcome.action-->
struts2控制器-->
WelcomeAction-->
welcome.jsp
----------------------Struts2详细工作流程---------------------------
a.浏览器发出welcome.action请求
b.请求到达Struts的Filter控制器(由于web.xml配置)
c.Struts控制器判断请求类型,如果是/welcome.action或/welcome格式请求,将调用struts.xml配置,寻找对应的Action组件
d.调用Action组件的execute方法处理请求,最后返回一个String视图标识
e.Struts控制器根据视图标识寻找相应的JSP(struts.xml中result配置)
f.调用JSP视图生成响应界面给浏览器显示。
======================Day02=========================
1.Struts2使用基本规则
1)web.xml配置
涉及了Struts2的Filter控制器配置
a.<
filter-class>
指定正确包名.类名
b.<
url-pattern>
指定/*,控制器可以识别Action组件请求
2)Action编写规则
a.执行方法的定义publicStringXXX(){}默认方法名是execute
b.属性变量的定义
publicclassUser{
privateStringusername;
//成员变量是username
//属性是user
publicvoidsetUser(Stringuser){
this.username=user;
}
publicStringgetUser(){
returnusername;
}
如果action需要接收请求数据或向JSP传递数据,需要与属性名保持一致。
3)struts.xml中的Action配置
1)元素嵌套顺序<
struts>
<
package>
action>
result>
2)<
元素的extends属性必须继承自struts-default
3)<
元素name请求名不要加.action,class指定的Action类要正确。
4)<
元素的name属性与Action方法返回值保持一致。
2.实现一个列表显示功能
/list.action-->
ProjectListAction-->
projectlist.jsp
1)开发步骤
a.引入struts2和数据库的驱动包
b.添加struts.xml配置文件,web.xml添加了Struts控制器配置
c.添加DBUtil工具类
d.添加Entity类
e.添加DAO编写方法
f.添加Action
g.添加Action配置(struts.xml)
h.添加JSP,显示列表
引入jstl标签库的jar包。
在JSP页面添加标签库引入指令
使用<
c:
forEach>
标签
limitbegin,size
begin=(page-1)*size
pagebegin
10
23
36
n(n-1)*3
===========================
Struts2标签+OGNL表达式
3.OGNL表达式
1)什么是OGNL
OGNL技术可以独立使用,封装在ognl.jar开发包中。
ObjectGraphicsNavigationLanguage对象图导航语言。
主要作用是对一些复杂对象的属性和方法进行访问。
EL表达式主要功能:
用于访pageContext,request,session,application范围内存储的数据。
OGNL不仅可以访问数据,还具有访问方法,对集合进行操作等功能。
2)OGNL工作原理
OGNL工具由三部分构成,分别是
a.OGNL引擎:
负责解释执行OGNL表达式,按表达式区root或map区域寻找数据。
b.Root根对象区域:
访问该区域数据OGNL表达式简洁方便。
适合放置访问频繁的对象元素。
c.Map对象存储区:
访问该区域需要使用“#key”访问。
适合放置访问不频繁的对象元素。
使用时,给OGNL引擎指定一个表达式,该引擎根据表达式去Root区或Map区访问对象的属性或方法。
*3)OGNL表达式语法
a.访问Root对象某个简单属性
表达式:
"
属性名"
b.访问Root对象某个数组或者List集合
"
属性名[0]"
c.访问Root对象某个Map集合
表达式:
属性名.key"
或者"
属性名['
key'
]"
d.访问Root对象某个复合类型属性address
表达式:
address.子属性"
e.访问Root对象某个复杂属性List<
Address>
addresses
表达式:
addresses[0].子属性"
f.访问Root对象的某个属性的方法
表达式:
属性名.方法()"
g.支持Java中的表达式和运算符
h.定义一个List常量
{"
A"
"
B"
C"
}
i.定义一个Map常量
#{"
key1"
:
value1,"
key2"
value2}
j.访问静态常量或方法
@包名.类型@常量名或方法"
上述语法如果访问Map区域一样使用,只要注意追加"
#key"
.
OGNL分析学习
OGNL是ObjectGraphicNavigationLanguage(对象图导航语言)的缩写,
它是一个开源项目。
Struts2框架使用OGNL作为默认的表达式语言。
OGNL相对其它表达式语言具有下面几大优势:
1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式:
@[类全名(包括包路径)]@[方法名|
值名],例如:
@java.lang.String@format('
foo%s'
'
bar'
)
或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100,discount=0.8,
calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNLcontext)和ActionContext;
5、操作集合对象。
Ognl有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现
了java.utils.Map的接口.
理解Struts2中的ValueStack
ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础
ValueStack(值栈):
贯穿整个Action的生命周期(每个Action类的对象实例都拥有一个
ValueStack对象).相当于一个数据的中转站.在其中保存当前Action对象和其他相关对象.
Struts框架把ValueStack对象保存在名为“struts.valueStack”的请求属性request中。
在ValueStack对象的内部有两个逻辑部分:
ObjectStack:
Struts把动作和相关对象压入ObjectStack中--List
ContextMap:
Struts把各种各样的映射关系(一些Map类型的对象)压入ContextMap中
Struts会把下面这些映射压入ContextMap中
parameters:
该Map中包含当前请求的请求参数
request:
该Map中包含当前request对象中的所有属性
session:
该Map中包含当前session对象中的所有属性
application:
该Map中包含当前application对象中的所有属性
attr:
该Map按如下顺序来检索某个属性:
request,session,application
理解OGNLContext
OgnlValueStack类包含两个重要的属性一个root和一个context。
*其中root本质上是一个ArrayList.
*而context是一个Map(更确切的说是一个OgnlContext对象)
在这个OgnlContext对象(context)中,有一个默认的顶层对象_root,OGNL访问context中这个默认顶层对象中的元素时,是不需要#号的,直接通过元素的名称来进行访问,
而访问其他对象时,如request、session、attr等,则需要#号引用。
注:
Struts2将OgnlValueStack的root对象赋值给了OgnlContext中的_root对象,在OgnlValueStack的root对象中,保存着调用Action的实例,因此,在页面上通过Struts2标签访问Action的属性时,就不需要通过#号来引用
总结:
ognlContext包含ObjectStack属性和ContextMap属性
4.OGNL在Struts2中的应用
1)xwork对ognl进行扩展和改造
xwork对OGNL原有的Root区域进行了改造,将其扩建成了一个栈结构。
可以存储多个目标对象。
当输入"
id"
表达式时,首先去栈顶对象寻找id属性值,没有再去次栈顶,依次向下寻找,找到返回。
*2)ValueStack对象(参考valuestack.jpg)
Struts2将扩展之后的OGNL封装成了ValueStack对象,利用该对象存储当前请求相关的所有数据。
例如action,request,session,application等。
root栈:
存储了action对象
context(map)区:
存储了request,session,application等对象引用。
*3)在JSP中访问ValueStack数据方法
a.使用Struts标签+OGNL表达式
<
s:
debug>
可以显示当前状态的ValueStack信息
<
property>
显示ValueStack数据。
使用value属性指定OGNL表达式
date>
将ValueStack的日期类型数据格式化后显示。
使用name属性指定OGNL表达式,format属性指定格式化模板。
iterator>
将ValueStack的集合属性迭代循环。
使用value属性指定OGNL表达式。
if>
...<
else>
分支判断。
使用test属性指定一个OGNL判断表达式
b.使用EL表达式
EL表达式可以从pageContext,request,session,application范围获取数据,显示到页面。
但是在Struts2中利用EL表达式可以访问到ValueStack中的数据。
*在Struts2中EL表达式依次访问pageContext,request,valuestack,session,application范围的数据。
=================原因如下=====================
JSP--》${user}--》request.getAttribute("
user"
);
在Struts2中,将原有的Request对象封装成StrutsRequestWrapper,并重写它的getAttribute()方法。
publicclassStrutsRequestWrapperextendsHttpServletRequestWrapper{
//覆盖原request的getAttribute
publicObjectgetAttribute(Stringname){
//去原有的request对象中查找信息
Objectval=super.getAttribute(name);
//如果原有的request找不到
if(val==null){
//去valuestack查找
vs.findValue(name);
//--->
Ognl.getValue("
name"
ctx,root)
}
returnval;
}
${user}-->
request.getAttribute("
)-->
======================Day03=========================
1.Struts2框架Action组件的核心应用
1)Action组件基本原理
a.当浏览器发送一个请求给Struts2控制器
b.控制器要创建一个ValueStack对象,将其存储在request中,使用struts.valueStack当做key。
c.控制器创建一个Action对象,并Action对象添加到ValueStack对象栈顶位置。
d.控制器将request封装之后,再将request,session,application等对象添加到ValueStack的context(Map)区域。
e.控制器调用Action对象的业务方法,处理请求。
默认调用execute
f.控制器根据execute返回结果,调用result视图响应
上述过程:
Action对象在请求处理完毕后销毁,因此与req