花了半天的时间再把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的更多相关文章

  1. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

  2. Java框架Struts2

    struts2的核心和工作原理   在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于we ...

  3. Struts2(一)入门及工作原理

    Apache Struts 2 是一种流行的 Java模型 - 视图 - 控制器(MVC)框架,成功地结合了 WebWork和Struts1.x 两种 web 框架. Apache Struts2与S ...

  4. Struts2 原理

    .Struts2原理 .Struts 1 原理 .Struts1 和webwork的关系 .HttpServletRequest Struts2原理

  5. Struts2体系结构图以及详解

    Strut2的体系结构如图所示: 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的过滤器(F ...

  6. struts2的工作原理

    在学习struts2就必须的了解一下它的工作原理: 首先来看一下这张图 这张工作原理图是官方提供的: 一个请求在Struts2框架中的处理大概分为以下几个步骤 1.客户端初始化一个指向Servlet容 ...

  7. struts2从认识到细化了解

    目录 Struts2的介绍与执行流程 介绍: 执行流程: 运行环境搭建 基础示例 Action类的编写 介绍: 访问servlet API 补充: 配置文件 常见配置文件: 常量的配置: struts ...

  8. Struts2 核心流程

    1.Struts2架构图  这是Struts2官方站点提供的Struts 2 的整体结构.  执行流程图 2.Struts2部分类介绍  这部分从Struts2参考文档中翻译就可以了. ActionM ...

  9. struts2的核心和工作原理 <转>

    在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就 ...

随机推荐

  1. CAS实现SSO单点登录原理

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  2. SVN相关

    Eclipse SVN忽略一些文件夹:Windows -> Preferences -> Team -> Ignored Resources里点 “Add Pattern”,然后把 ...

  3. codeblocks个性化配置

    1.general setting设置默认字体大小设置控制台字体大小:"Settings -> Environment -> View -> Message logs' f ...

  4. 转载:CDH5.X完全卸载步骤

    http://blog.csdn.net/wulantian/article/details/42706777 //CDH5.X完全卸载步骤 # by coco # 2015-01-14   1. 关 ...

  5. store前台数据过滤

    最近由于客户需要对grid进行大量的检索操作,而现有的grid数据是以分页的形式从数据库端获取,每次检索都需要重新进行获取,效率很低. 因而将数据进行一次加载,每次的检索操作在前台extjs进行过滤, ...

  6. [小菜随笔]新手使用appium+python进行自动化测试过程中webdriver.Remote报错的错误分析方法(带实例)

    很多人刚开始使用python+appium去执行APP自动化的时候经常会遇到webdriver.Remote,报错位置指向都是driver = webdriver.Remote('http://127 ...

  7. liunx 下 部署并运行java项目(非web)

    1. 将这三个包上传到liunx上,之后写一个run.sh 的脚本文件,然后在lib包中上传包<sunjce-provider.jar>包. 2.启动run.sh( ./run.sh st ...

  8. 对vector<int>进行快速排序

    #include <iostream>#include <string>#include <vector>using namespace std;void Quic ...

  9. yum源的搭建

    1.光盘的挂载 2.先创建一个文件 /aaa 然后挂载mount /dev/cdrom /aaa 进入 /aaa   ls 查看是否挂载OK 3.进入yum文件夹.将除Media以外的所有文件名改为X ...

  10. mysql 导出导入数据库

    导入mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 < db.all.sql导出 mysqldum ...