粗略了解struts2
花了半天的时间再把struts2详细拟了一遍,之前用习惯了servlet加jsp,再看struts2的时候终于明白为什么大家都愿意学,以人类天生的惰性,要让他们愿意去学习一个新的东西,这东西一定可以让他们懒得更彻底;个人觉得,struts2就是通过拦截器、过滤器这些,对servlet进行了一系列的封装,其实本质都是一样的,而且封装过后可能很多东西实现得更加复杂一些,但是那些我们都不用管,反正封装好了之后,我们用着是方便简单多了(最大的体会便是在文件上传上了)。
首先来说,作为2.0版本,它肯定是要比1.0好很多了(好得太彻底,几乎没啥关系了),struts2中,action每处理一次请求就会生成一个实例,当然用完马上销毁,这样做的一大好处就是,保证了线程安全,而线程安全的一大好处在于,我们可以放放心心的定义使用属性了,使用了属性,在拦截器中,获取到action对象,通过反射就可以直接给属性赋值啦!!这样action里面只需要定义属性,添加它们的设定器、访问器,就可以完成jsp和action的值传递,相交起servlet的getParameter()要方便太多了,而且struts2还解决了中文乱码的问题。。。
struts2的工作原理也很简单,客户端发来http请求,先通过web.xml这个工程配置文件,要使用 struts2就需要在里面配置一个filter,作为一个struts2框架的入口,请求通过这个filter,发现这个工程用的是struts2的框架,那完成一系列初始化,整个跳到struts2的状态;
这个时候请求就该去ActionMapper,ActionMapper里面汇集了整个工程中所有action在struts.xml文件中配置的action元素的name属性,这些name属性是和url对应的,那请求过来在这一堆中找,如果没找到,那证明该工程内是没有它要找的那个action的,这个请求到这儿也就夭折了;
如果要是找到了,个人认为,此时算是对这个请求的正式处理开始了;ActionMapper将请求送到FilterDispatcher,然后通过一系列的过滤器,通过了就能来到ActionProxy处了,ActionProxy不能直接获取到你要的action啊,它又交代ConfigurationManager到struts.xml文件中去找到你要去的action,ConfigurationManager把结果告诉它,它再告诉给请求,这个时候ActionProxy的工作算是完成一半了,剩下一半是把请求送走,怎么送?第一步,创建一个ActionInvocation action调用的对象,第二步,把请求交给ActionInvocation,完成,到这里ActionProxy的工作彻底完成。
此时,请求经过一系列的拦截器,完了之后终于可以到action了,执行完成过后,根据return携带数据返回,再倒序经过那一系列的拦截器,将响应数据交给HttpServletResponse,完成响应。
过程其实很简单,但是这里面有几个很重要的东西。
第一个,action,,,action就是一个普通的java类,它可以不实现不继承任何东西,这样实现了与框架的完全解耦,同样的也不能用框架写好的一些方法了;
也可以通过实现Action接口 或者继承ActionSupport类, 绝大部分时候大家都是选择继承ActionSupport,方便用其写好的方法,但我在应用过程中绝大部分方法都是自己定义的,并没有使用它写好的方法,对我来说,差别不大, ActionSupport也实现了Action接口, 其实里面就定义了五个常量 一个execute方法
action在配置上面 除了name和url对应这一点之外,action被调用是 默认的执行的方法是execute,要调用其他方法可以在url后面加!方法名,也可以method设定
return元素的name属性值和return返回的字符串一致
第二个,拦截器,,,,拦截器和过滤器很像,不同的是拦截器只能拦截action,而过滤器可以过滤全部 struts2中拦截器完成了很大一部分的工作
struts中定义了很多拦截器,对应各种功能,也通过Interceptor-stack来组织一系列的拦截器,struts.xml中package继承struts-default时其实就引用了默认的拦截器栈,也可以自定义拦截器 对于拦截器 在interceptor元素中定义,在interceptor-ref元素中使用
第三个,ognl表达式,,这个表达式和el表达式其实也很像,但它可以操作动态操作集合这些
第四个,actionContext,,,action上下文 它也可以去得到request、session、application 但是这四者和HttpservletRequest、HttpSession、servletContext这些不同,它是“假的”,他们本质是map 是用servlet的几个作用域的副本封装的
第五个,标签,,,struts的标签感觉更精简了一些,但是html本身差别不是很大,不过struts2从2.0.11版开始不能使用el表达式了,用ognl代替
粗略了解struts2的更多相关文章
- 深入浅出Struts2+Spring+Hibernate框架
一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...
- Java框架Struts2
struts2的核心和工作原理 在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于we ...
- Struts2(一)入门及工作原理
Apache Struts 2 是一种流行的 Java模型 - 视图 - 控制器(MVC)框架,成功地结合了 WebWork和Struts1.x 两种 web 框架. Apache Struts2与S ...
- Struts2 原理
.Struts2原理 .Struts 1 原理 .Struts1 和webwork的关系 .HttpServletRequest Struts2原理
- Struts2体系结构图以及详解
Strut2的体系结构如图所示: 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的过滤器(F ...
- struts2的工作原理
在学习struts2就必须的了解一下它的工作原理: 首先来看一下这张图 这张工作原理图是官方提供的: 一个请求在Struts2框架中的处理大概分为以下几个步骤 1.客户端初始化一个指向Servlet容 ...
- struts2从认识到细化了解
目录 Struts2的介绍与执行流程 介绍: 执行流程: 运行环境搭建 基础示例 Action类的编写 介绍: 访问servlet API 补充: 配置文件 常见配置文件: 常量的配置: struts ...
- Struts2 核心流程
1.Struts2架构图 这是Struts2官方站点提供的Struts 2 的整体结构. 执行流程图 2.Struts2部分类介绍 这部分从Struts2参考文档中翻译就可以了. ActionM ...
- struts2的核心和工作原理 <转>
在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就 ...
随机推荐
- css 变量与javascript结合
<div onClick="test('yellow')"> CSS Variable</div> ================CSS :root{ - ...
- python 打印 网格
#/usr/bin/python # -*- coding:utf-8 -*- # width 单个网格有多少个 - 宽度# height 单个网格有多少个 | 高度# lateral 横向有多少个网 ...
- iOS GCD NSOperation NSThread等多线程各种举例详解(拷贝)
2年多的iOS之路匆匆而过,期间也拜读来不少大神的博客,近来突然为自己一直做伸手党感到羞耻,是时候回馈社会.回想当年自己还是小白的时候,照着一些iOS多线程教程学,也只是照抄,只知其然.不知其所以然. ...
- 在VS2010中建立C#三层结构
转自:http://www.blueidea.com/microsoft/vs2010/2010_con/2010081301.htm 三层结构,会有多个项目.为了让各项目之间的关系反映在目录结构上所 ...
- Secondary NameNode:的作用?
前言 最近刚接触Hadoop, 一直没有弄明白NameNode和Secondary NameNode的区别和关系.很多人都认为,Secondary NameNode是NameNode的备份,是为了防止 ...
- 简单高效快捷的百度地图demo
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...
- block的常见用法
一.声明和定义 1.声明 声明方式:返回值(^block)(参数).声明时,参数变量名可以省略:使用时,参数变量名不能省略,不然会无法调用传入的参数 void(^block)(); void(^blo ...
- Allegro padstack
在ALLEGRO中,建立PCB封装是一件挺复杂的事,而要建立FOOTPRINT,首先要有一个PAD,所以就要新建PADSTACK. 焊盘可以分两种,表贴焊盘和通孔焊盘,表贴焊盘结构相对简单,下面首先分 ...
- Android测试关注点
Android系统app测试,一般有native app原生,web app网页, hybird app混合 1.功能测试,考虑业务逻辑,主要手机和APP交互功能,来电,短信,闹钟可能对app造成的影 ...
- HTML 行内元素和块级元素的理解及其相互转换
块级元素:div, p(段落), form(表单), ul(无序列表), li(列表项), ol(有序列表), dl(定义列表), hr(水平分割线), menu(菜单列表), table(表格).. ...