首页技术struts2教程电子书?struts2的执行过程

struts2教程电子书?struts2的执行过程

编程之家2026-05-31803次浏览

大家好,关于struts2教程电子书很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于struts2的执行过程的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

struts2教程电子书?struts2的执行过程

Struts2简介

一什么是Struts?

虽然Struts号称是一个全新的框架但这仅仅是相对Struts而言 Struts与Struts相比确实有很多革命性的改进但它并不是新发布的新框架而是在另一个赫赫有名的框架 WebWork基础上发展起来的从某种程度上来讲 Struts没有继承Struts的血统而是继承WebWork的血统或者说 WebWork衍生出了Struts而不是Struts衍生了Struts因为Struts是WebWork的升级而不是一个全新的框架因此稳定性性能等各方面都有很好的保证而且吸收了Struts和WebWork两者的优势因此是一个非常值得期待的框架

Apache Struts是一个优雅的可扩展的JAVA EE web框架框架设计的目标贯穿整个开发周期从开发到发布包括维护的整个过程

Apache Struts即是之前大家所熟知的WebWork在经历了几年的各自发展后 WebWork和Struts社区决定合二为一也即是Struts

Struts和Struts的不同

Action类

struts2教程电子书?struts2的执行过程

◆Struts要求Action类继承一个抽象基类 Struts的一个普遍问题是使用抽象类编程而不是接口

◆Struts Action类可以实现一个Action接口也可实现其他接口使可选和定制的服务成为可能 Struts提供一个ActionSupport基类去实现常用的接口 Action接口不是必须的任何有execute标识的POJO对象都可以用作Struts的Action对象

线程模式

◆Struts Action是单例模式并且必须是线程安全的因为仅有Action的一个实例来处理所有的请求单例策略限制了Struts Action能作的事并且要在开发时特别小心 Action资源必须是线程安全的或同步的

◆Struts Action对象为每一个请求产生一个实例因此没有线程安全问题(实际上 servlet容器给每个请求产生许多可丢弃的对象并且不会导致性能和垃圾回收问题)

Servlet依赖

struts2教程电子书?struts2的执行过程

◆Struts Action依赖于Servlet API因为当一个Action被调用时HttpServletRequest和 HttpServletResponse被传递给execute方法

◆Struts Action不依赖于容器允许Action脱离容器单独被测试如果需要 Struts Action仍然可以访问初始的request和response但是其他的元素减少或者消除了直接访问HttpServetRequest和 HttpServletResponse的必要性

可测性

◆测试Struts Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)一个第三方扩展——Struts TestCase——提供了一套Struts的模拟对象(来进行测试)

◆Struts Action可以通过初始化设置属性调用方法来测试依赖注入支持也使测试更容易

捕获输入

◆Struts使用ActionForm对象捕获输入所有的ActionForm必须继承一个基类因为其他JavaBean不能用作ActionForm开发者经常创建多余的类捕获输入动态Bean(DynaBeans)可以作为创建传统ActionForm的选择但是开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)

◆ Struts直接使用Action属性作为输入属性消除了对第二个输入对象的需求输入属性可能是有自己(子)属性的rich对象类型 Action属性能够通过web页面上的taglibs访问 Struts也支持ActionForm模式 rich对象类型包括业务对象能够用作输入/输出对象这种ModelDriven特性简化了taglib对POJO输入对象的引用

表达式语言

◆Struts整合了JSTL因此使用JSTL EL这种EL有基本对象图遍历但是对集合和索引属性的支持很弱

◆Struts可以使用JSTL但是也支持一个更强大和灵活的表达式语言—— Object Graph Notation Language(OGNL)

绑定值到页面(view)

◆ Struts使用标准JSP机制把对象绑定到页面中来访问

◆Struts使用 ValueStack技术使taglib能够访问值而不需要把你的页面(view)和对象绑定起来 ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)

类型转换◆Struts ActionForm属性通常都是String类型 Struts使用Commons Beanutils进行类型转换每个类一个转换器对每一个实例来说是不可配置的

◆Struts使用OGNL进行类型转换提供基本和常用对象的转换器

校验◆Struts支持在ActionForm的validate方法中手动校验或者通过Commons Validator的扩展来校验同一个类可以有不同的校验内容但不能校验子对象

◆Struts支持通过validate方法和XWork校验框架来进行校验 XWork校验框架使用为属性类类型定义的校验和内容校验来支持chain校验子属性Action执行的控制◆Struts支持每一个模块有单独的Request Processors(生命周期)但是模块中的所有Action必须共享相同的生命周期

◆Struts支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期堆栈能够根据需要和不同的Action一起使用

Struts的工作流程图

工作流程图

工作流程当接收到一个request Interceptor做一些拦截或者初始的工作当外部的ervletrequest到来时初始到了servlet容器传递给一个标准的过滤器链ActionContextCleanUp这个在集成插件方面非常有用Other filters(SitMesh etc)

调用FilterDispatecher会去查找相应的ActionMapper如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy ActionProxy将会通过ConfigurationManager来查找配置struts xml下一步将会通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)

一旦action返回会查找相应的Result Result类型可以是 jsp或者freeMark等这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)

lishixinzhi/Article/program/Java/ky/201311/28090

struts2的工作流程

在Struts2框架中的处理大概分为以下几个步骤:

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。

在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及ActionMapper。

扩展资料:

应用流程注解

当Web容器收到请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器。

经过Other filters(SiteMesh,etc),需要调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求哪个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。

FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager)从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象。

ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N)一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)来呈现页面。

拦截器(Interceptor N)会再被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和核心控制器(FilterDispatcher)。

参考资料:百度百科-Struts 2

谁能谈谈使用struts2的心得

最近做一个应用的时候用到了Jmesa(至于Jmesa的详细介绍,请Google),但是关于Struts2和Jmesa的资料特别少,费尽周折总算让他们两个正常运行了,现在把使用他们的一些心得写下来与大家分享。

版本:

Struts2: 2.0.11

Spring: 2.5.1

Freemarker: 2.3.12

Jmesa: 2.2.9

Eclipse 3.3

对应Eclipse3.3的插件(没用MyEclipse,我依然活得不错,哈哈~)

Tomcat 6.0.*

Struts2与Freemarker的配置非常简单——根本不用配置,呵呵,关键点就在:怎么在Struts2环境下使用Jmesa?当然我只用到了Jmesa提供的Taglib,没用使用到其他高级功能。

(1)、Jmesa实现的Taglib只需要在页面给它一个 List等集合类型的变量就可以正常显示。使用分页功能需要加入下面这段脚本:<script type="text/javascript">

function onInvokeAction(id)...{

setExportToLimit(id,'');

createHiddenInputFieldsForLimitAndSubmit(id);

}

</script>

(2)、使用导出功能,此处以Excel为例。需要加入以下脚本:<script type="text/javascript">

function onInvokeExportAction(id)...{

var parameterString= createParameterStringForLimit(id);

alert(parameterString);

location.href='${request.getContextPath()}/(此处为Action的Url)?'+ parameterString;

}

</script>

还有关键的一点就是:Action要实现ServletRequestAware,ServletResponseAware这两个接口,并且加入以下代码: private HttpServletRequest request;

private HttpServletResponse response;

public void setServletRequest(HttpServletRequest request)......{

this.request= request;

}

public void setServletResponse(HttpServletResponse response)......{

this.response= response;

}

以上变量定义了实例变量request和 response,为什么要这样做呢?看一下Jmesa的Tag example就知道了,如下:

TableFacade tableFacade= new TableFacadeImpl(id, request);

tableFacade.setItems(items);

tableFacade.setColumnProperties("password","nickname");

tableFacade.setExportTypes(response, CSV, EXCEL);// Tell the tableFacade what exports to use.

Limit limit= tableFacade.getLimit();

if(limit.isExported())...{

tableFacade.getTable().setCaption("user");

tableFacade.getTable().getRow().getColumn("password").setTitle("password");

tableFacade.getTable().getRow().getColumn("nickname").setTitle("nickname");

tableFacade.render();

return null;

}

最关键的就是这两句了: TableFacade tableFacade= new TableFacadeImpl(id, request);

tableFacade.setExportTypes(response, CSV, EXCEL);// Tell the tableFacade what exports to use.

第一句中如果没有request对象的话,不能实例化TableFacade类型的对象。

第二句中如果没有response对象的话,就没有数据。

除此之外还有一点要注意的就是页面中定义的tableFacade的id一定要与Action中的id的值相同,此id起标识导出文件的文件名的作用,也唯一标识一个table。

好了只要注意以上这些Jmesa的这个Taglib就可以使用了。

至于在Freemarker中使用Jmesa的这个Taglib,有以下注意事项:

(1)、items的值(即数据集合)直接写变量名就可以

(2)、maxRows属性写为maxRows=8不用加引号

以上两处注意事项不知道是不是Freemarker版本的问题,呵呵,有待检验。

注:Jmesa的功能非常强大,可以实现复杂的表格。。。。。。好东西思想先进

关于struts2教程电子书到此分享完毕,希望能帮助到您。

点燃火炬,点燃火炬的方式契魔者吧(契魔者什么属性攻击)