Struts2框架基础概念总结
⼀、struts2框架
Struts2是⼀个基于MVC设计模式的Web应⽤框架,它本质上相当于⼀个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建⽴模型与视图的数据交
互。Struts2在Struts1融合webwork。
ONGL表达式:就是对象图形化导航语⾔,在前端页⾯中,访问action的属性、⽅法;类似于认为就是对JSP的封装,是编程更加⽅便。(以下详解)
⼆、framework(框架)
el表达式获取session中的值⼀个基本概念上的结构,⽤于去解决或者处理复杂的问题,框架是在特定的领域内解决问题。
框架的优点:
(1)重⽤代码⼤⼤增加,软件⽣产效率和质量也得到了提⾼
(2)使⽤框架开发,它提供统⼀的标准,⼤⼤降低了我们的后期维护。
三、Struts2框架运作
⼯作流程:
(1)客户端浏览器发送HTTP请求到Web应⽤
(2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,⽽不让后续过滤器清楚,以延长Action中属性(包括⾃定义属性)的⽣命周期。
(3)再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核⼼控制器
(4)StrutsPrepareAndExecuteFilter调⽤ActionMapper(Action映射器)确定调⽤哪个Action,再将控制权转移给ActionProxy代理
(5)ActionProxy代理调⽤配置管理器ConfigurationManager从配置⽂件l中读取配置信息,然后创建ActionInvocation对象
(6)ActionInvocation在调⽤链中的后再调⽤Action,根据Action返回的结果字符串查对应的Result
(7)Result调⽤视图模板,再以相反的顺序执⾏链,返回HTTP响应
(8)HTTP响应以相反的顺序返回给核⼼控制器StrutsPrepareAndExecuteFilter以及其他l中定义的过滤器,最终返回给客户端。
四、Struts2执⾏流程
1. Struts2源码导⼊(Struts2官⽹下载地址:/)
(1) struts2核⼼部分源代码org.apache.struts2xx : src\core\src\main\java
(2) struts2的xwork核⼼部分源代码 :src\xwork-core\src\main\java\com\opensymphony\xwork2
(3)struts2的插件的源代码: src\plugins
2.关于l的中⽂乱码
第⼀步:
在eclipse的window下⾸选⾯中查xml catalog
第⼆步:
Location:配置本地的dtd⽂件路径
key type:选择URI
Key: /dtds/struts-2.3.dtd
注意版本要对应,如果你可以上⽹,那么会⾃动缓存dtd,具有提⽰功能。
3.执⾏流程介绍
1.当通过浏览器发送⼀个请求
2.会被StrutsPrepareAndExecuteFilter拦截
3.会调⽤struts2框架默认的(interceptor)完成部分功能
4.在执⾏Action中操作
5.根据Action中⽅法的执⾏结果来选择来跳转页⾯Resutl视图⼀般管StrutsPrepareAndExecuteFilter叫做前端控制器(核⼼控制器),只有配置了这个filter,Struts2框架才能使 ⽤,Struts2的默认(interceptor)它们是在l⽂件中配置。
注意:这上xml⽂件是在struts-core.jar包中,默认的是在defaultStack中定义的。
五、Struts2配置详解
1. Struts2配置⽂件加载顺序
init_DefaultProperties()加载的是 default.properties ⽂件
位置:struts2-core.jar 包 org.apache.struts2 包下
作⽤:主要是声明了 struts2 框架的常量
init_TraditionXmlConfigurations()加载的是⼀批配置⽂件
l
位置:struts2-corl.jar
作⽤:声明了 interceptor result bean
l
位置:在 struts2 的插件包中
作⽤:主要⽤于插件的配置声明
l
位置:在我们⾃⼰的⼯程中
作⽤:⽤于我们⾃⼰⼯程使⽤ struts2 框架的配置
init_LegacyStrutsProperties()加载的是⾃定义的struts.properties
位置:都是在⾃⼰⼯程的 src 下
作⽤:定制常量
init_CustomConfigurationProviders()⾃定义配置提供
init_FilterInitParmeters()加载的是 l 配置⽂件
主要是加载 struts2 框架在 l ⽂件中的相关配置.
init_AliasStandardObjects() bean 相关配置
重点掌握:
1.Default.properties
l
l
l
l
l件配置介绍
(1) package配置(l只存在⼀个package相当于⼀个struts的项⽬)
name属性作⽤:定义⼀个包的名称,它必须唯⼀。
namespace属性作⽤:主要是与action标签的name属性联合使⽤来确定⼀个 action的访问路径。
extends属性作⽤:指定继承⾃哪个包。⼀般值是struts-default,struts-default包是在l⽂件中声明的。
abstruct属性它代表当前包是⼀个抽象的,主要是⽤于被继承。
(2) action配置(对应相应的以action结尾的类,⼀个package可以有多个action)
name属性作⽤:主要是与package的namespace联合使⽤来确定action的访问路径。
class属性作⽤:⽤于指⽰当前的action类。
method属性作⽤:⽤于指⽰当前的action类中的哪个⽅法执⾏。
(3) result配置(⽤于显⽰视图的结果)
name属性作⽤是与action类的method⽅法的返回值进⾏匹配,来确定跳转路径。
type属性作⽤是⽤于指定跳转⽅式。
六、Action类详解
Action类相当于javaWeb阶段下的Servlet类,做着调⽤service层的关系,实现页⾯的跳转,完成业务逻辑操作。
1. Action类的创建(注意:action类的全路径(即包名)必须含有”action”的词汇)
(1) 创建⼀个POJO类;(hibernate⾃动会封装成PO类)
(2) 创建⼀个类实现⼀个Action接⼝;
(3) 创建⼀个类继承ActionSupport类。
2. 访问Action类
(1) 直接通过<action>标签来配置,通过method来指定访问的⽅法,如果method没有,默认访问的是execute⽅法;
(2) 简化的 action 访问⽅式,可以使⽤*通配符来访问,使⽤*来简化操作⽅案,它对名称规范必须进⾏⼀个统⼀。
七、Struts2框架封装数据
1. 属性驱动
直接在 action 类中提供与请求参数匹配属性,提供get/set⽅法在, action 类中创始⼀个javaBean,对其提供get/set,在请求时页⾯上要进⾏修改,例如 user.username user.password ,要使⽤ognl表达式
以上两种⽅式的优缺点:
第⼀种⽐较简单,在实际操作我们需要将action的属性在赋值给模型(javaBean)去操作;
第⼆种:不需要在直接将值给javaBean过程,因为直接将数据封装到javaBean中。它要求在页⾯上必须使⽤ognl表达式,就存在页⾯不通⽤问题。
2. 模型驱动
(1)让 Action 类要实现⼀个指定接⼝ ModelDriven;
(2)实例化模型对象(就是要new出来javaBean);
(3)重写getModel⽅法将实例化的模型返回。
⼋、Struts2中获取Servlet
1.ServletActionContext获取
获取request: Request();
获取response: Response();
获取servletContext: ServletContext();
2.采⽤注⼊⽅式
Struts2框架在运⾏时,请求会被StrutsPrepareAndExecuteFilter拦截,会根据请求,去l⽂件中查到匹配的action,在action执⾏前,会⾛⼀些interceptor默认执⾏的是l⽂件中定义的,在默认执⾏的中有⼀个。
ServletRequestAware, 实现这个接⼝可以获取HttpServletRequest;
ServletResponseAware ,实现这个接⼝可以获取HttpServletResponse;
ServletContextAware 实现这个接⼝可以获取ServletContext;
九、OGNL表达式
OGNL是Object-Graph Navigation Language(对象图导航语⾔)的缩写,它是⼀种功能强⼤的表达式语⾔,通过它简单⼀致的表达式语法,可以存取对象的任意属性,调⽤对象的⽅法,遍历整个对象的结构图,实现字段类型转化等功能。它使⽤相同的去存取对象的属性。
Struts2框架内置了OGNL,OGNL本⾝也是⼀个项⽬,它是可以单独使⽤。
OGNL作⽤:
⽀持对象的操作,调⽤对象的⽅法;
⽀持静态成员访问;
⽀持赋值操作与表达串联;
访问OGNL上下⽂,访问ActionContext;
操作集合对象。
Strtus2框架中如何使⽤ognl表达式
在struts2框架中我们使⽤ognl表达式的作⽤是从valueStack中获取数据,在struts2框架中可以使⽤ognl+valueStack达到在页⾯(jsp)上来获取相关的数据,要想在jsp页⾯上使⽤ognl表达式,就需要结合struts2框架的标签<s:property value=”表达式”>来使⽤。
⼗、valueStack(值栈)
1. valueStack介绍
valueStack的主要⽬的是为action中产⽣的数据携带到页⾯上,也就是说valueStack它就是⼀个容器,在Struts2框架中将valueStack设计成⼀个接⼝,当客户端向我们发送⼀个请求,服务器就会创始⼀个Action来处理请求,struts2中的action是⼀个多例,每⼀次请求都会有⼀个新的action对应。所以它不存在线程安全问题,⼀个valueStack对应⼀
个action,valueStack贯穿整个action的⽣命周期,struts2框架将valueStack保存在request中。
2. valueStack内部结构
valueStack主要有两部分组成:
CompoundRoot:它就是⼀个ArrayList它主要存储的是action的相关数据;
Map<String,Object> context:就是⼀个Map,Context中主要存储了⼀些引⽤,这个引⽤主要是关于web开发中相关信息;
pameters :请求参数;
request:请求对象中所有属性;
session:会话对象中所有属性;
application:application对象中的所有发展;
在struts2框架中我们通过ognl表达式来获取valueStack中数据,没有使⽤#就会从CompoundRoot中获取数据,如果使⽤#来获取,这时就会从context中来获取。
3. 获取ValueStack
(1) 通过request对象来获取;
ValueStack vs = (Request()
.getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);
(2) 通过ActionContext来获取
ValueStack vs = ServletContext()getValueStack();
4. ActionContext
ActionContext它是action上下⽂,Strtus2框架它使⽤ActionContext来保存Action在执⾏过程中所需要的⼀些对象,例如 session, application… ActionContext的获取是通过它的静态⽅法getContext()得到。
Struts2会根据每⼀次的http请求来创建对应的ActionContext,它是与当前线程绑定的。每⼀次请求,就是⼀个线程,对应着⼀个request,每⼀次请求,会创建⼀个Action,每⼀个action对应⼀个ActionContext.每⼀次请求也对应着⼀个valueStack。它们都对应着⼀次请求(⼀个线程),valueStack与ActionContext本质上是可以获取。
5. ValueStack的存储数据
(1) ⼿动向valueStack存储数据;
vs.push(String str); 和 vs.set(Object obj String str);
(2) Struts2框架⾃动向valueStack中存储数据;
每次请求,访问action,这个对象会存储到valueStack中。
在DefaultActionInvocation的init⽅法内,调⽤:vs.push(Action action);
在ModelDrivernInterceptor中,调⽤ModelDrivern的getModel()⽅法;
6. ValueStack的获取数据
(1). Jsp页⾯获取,导⼊s标签库
<s:property value = “ “ />
(2). 在Action中属性
调⽤PO类getter⽅法;
(3). 在Model类中(即模型驱动)
调⽤getModel()⽅法;
7. EL表达式从ValueStack中获取数据
El表达式可以从valueStack中获取信息,在jsp页⾯中显⽰:如:{$ model.name},org.apache.struts2.dispatcher.StrutsRequestWrapper这个类可以使ValueStack使⽤EL表达式,Struts2框架对request进⾏了增强,重写了getAttribute⽅法,如果在request域中查不到数据,就会在valueStack中获取。
8. Ognl表达式中特殊字符
OGNL是通常要结合Struts 2的标志⼀起使⽤。主要是#、%和$这三个符号的使⽤,#号:它是从⾮root中获取数据,%号⽤于强制是否要解析ognl表达式,$号主要是从配置⽂件中来获取valueStack中数据。
⼗⼀、Interceptor
1. Interceptor介绍
Struts2中的interceptor它是基于spring aop思想,⽽aop思想它本质上是通过动态代理来实现。我们strtus2的它主要是拦截Action的操作,在action的执⾏前或执⾏后进⾏⼀些其它的功能操作。
链(栈)简单说,就是可以将多个形成⼀个链,在访问它们时依次访问。执⾏图见上图;
执⾏的过程:
当我们发送请求访问Action时,会被StrutsPrepareAndExecuteFilter拦截在其doFilter⽅法内执⾏了uteAction(request, response, mapping);这个代码执⾏
后dispatcher.serviceAction(request, response, mapping);serviceAction⽅法执⾏在这个⽅法执⾏过程中会创建Action代理对象ActionProxy proxy =
getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace, name, method, extraContext, true, false);通过proxy去执⾏了ute();在execute⽅法内return invocation.invoke();invocation它是ActionInvocation⼀个对象。会去加载我们的配置⽂件,将配置⽂件中所有的interceptor得到进⾏遍历。在l⽂件中定义了默认加载的栈 defaultStack,在每⼀个的interceptor⽅法内,⼜调⽤了DefaultActionInvocation的invoke⽅法,其实就是递归调⽤。
2. ⾃定义Interceptor
所有的Interceptor都要实现⼀个接⼝,在配置⽂件中声明Interceptor,可以将多个interceptor封装成⼀个stack,可以在Action的配置中引⼊⾃⼰的interceptor,在使⽤时name也可以引⼊⼀个interceptor stack。注意:当我们显⽰的引⼊了⼀个⾃定义的Interceptor,那么默认的defaultStack就不会在导⼊,需要⼿动导⼊。
⼗⼆、Struts2注解开发(现阶段主流)
1. xml⽂件与注解互换
@Namespace来代替<package namespace=””>
@ParentPackage来代替<package extends=””>
@Action来描述关于<action>配置
value属性<action name=””>
使⽤@Action的results来描述关于结果类型的配置<result>
<result name=”” type=””>
@Action(results={@Result(name=””,type=””,location=””)})
2. 其他注解
@Actions
作⽤:可以通过多个映射来访问同⼀个action;
@Results
类似于全局的结果视图;
@InterceptorRef
它是⽤于处理的;
⼀、struts2框架
Struts2是⼀个基于MVC设计模式的Web应⽤框架,它本质上相当于⼀个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建⽴模型与视图的数据交
互。Struts2在Struts1融合webwork。
ONGL表达式:就是对象图形化导航语⾔,在前端页⾯中,访问action的属性、⽅法;类似于认为就是对JSP的封装,是编程更加⽅便。(以下详解)
⼆、framework(框架)
⼀个基本概念上的结构,⽤于去解决或者处理复杂的问题,框架是在特定的领域内解决问题。
框架的优点:
(1)重⽤代码⼤⼤增加,软件⽣产效率和质量也得到了提⾼
(2)使⽤框架开发,它提供统⼀的标准,⼤⼤降低了我们的后期维护。
三、Struts2框架运作
⼯作流程:
(1)客户端浏览器发送HTTP请求到Web应⽤
(2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,⽽不让后续过滤器清楚,以延长Action中属性(包括⾃定义属性)的⽣命周期。
(3)再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核⼼控制器
(4)StrutsPrepareAndExecuteFilter调⽤ActionMapper(Action映射器)确定调⽤哪个Action,再将控制权转移给ActionProxy代理
(5)ActionProxy代理调⽤配置管理器ConfigurationManager从配置⽂件l中读取配置信息,然后创建ActionInvocation对象
(6)ActionInvocation在调⽤链中的后再调⽤Action,根据Action返回的结果字符串查对应的Result
(7)Result调⽤视图模板,再以相反的顺序执⾏链,返回HTTP响应
(8)HTTP响应以相反的顺序返回给核⼼控制器StrutsPrepareAndExecuteFilter以及其他l中定义的过滤器,最终返回给客户端。
四、Struts2执⾏流程
1. Struts2源码导⼊(Struts2官⽹下载地址:/)
(1) struts2核⼼部分源代码org.apache.struts2xx : src\core\src\main\java
(2) struts2的xwork核⼼部分源代码 :
src\xwork-core\src\main\java\com\opensymphony\xwork2
(3)struts2的插件的源代码: src\plugins
1. 关于l的中⽂乱码
第⼀步:
在eclipse的window下⾸选⾯中查xml catalog
第⼆步:
Location:配置本地的dtd⽂件路径
key type:选择URI
Key: /dtds/struts-2.3.dtd
注意版本要对应,如果你可以上⽹,那么会⾃动缓存dtd,具有提⽰功能。
1. 执⾏流程介绍
1.当通过浏览器发送⼀个请求
2.会被StrutsPrepareAndExecuteFilter拦截
3.会调⽤struts2框架默认的(interceptor)完成部分功能
4.在执⾏Action中操作
5.根据Action中⽅法的执⾏结果来选择来跳转页⾯Resutl视图⼀般管StrutsPrepareAndExecuteFilter叫做前端控制器(核⼼控制器),只有配置了这个filter,Struts2框架才能使⽤,Struts2的默认(interceptor)它们是在l⽂件中配置。
注意:这上xml⽂件是在struts-core.jar包中,默认的是在defaultStack中定义的。
五、Struts2配置详解
1. Struts2配置⽂件加载顺序
init_DefaultProperties()加载的是 default.properties ⽂件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论