花了半天的时间再把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. PHPExcel读取Excel文件的实现代码

    <?php require_once 'PHPExcel.php'; /**对excel里的日期进行格式转化*/ function GetData($val){ $jd = GregorianT ...

  2. Eclipse+Maven创建webapp项目

    Eclipse+Maven创建webapp项目<一> 1.开启eclipse,右键new-->other,如下图找到maven project 2.选择maven project,显 ...

  3. 简单研究Android View绘制三 布局过程

    2015-07-28 17:29:19 这一篇主要看看布局过程 一.布局过程肯定要不可避免的涉及到layout()和onLayout()方法,这两个方法都是定义在View.java中,源码如下: /* ...

  4. Intellij IDEA 创建Web项目并在Tomcat中部署运行(不使用maven)【转载】

    原文链接:http://www.thinksaas.cn/topics/0/350/350000.html 一.创建Web项目 1.File -> New Module,进入创建项目窗口 2.选 ...

  5. 扩展django的User的部分方法

    这做项目时发现django自带的User中的字段不够用,默认的auth_user表总共只有11个字段,如果需要更多的字段该怎么办,在网上搜了一下,有这么几种方法. 1. 直接修改django 源码,修 ...

  6. 第一章 JavaScript简史

    JavaScript:  一种使网页具有交互能力的程序设计语言. BOM: 浏览器对象模型,指通过JS用来调整Web浏览器的高度.宽度和位置属性的办法. DHTML: 1.利用HTML标记各种元素   ...

  7. Python的平凡之路(17)

    一.认识jQuery       jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设 ...

  8. Type.GetType()反射另外项目中的类时返回null的解决方法

    项目1:ProjectA namespace ProjectA { public class paa { .... } } Type.GetType("paa")返回null Ty ...

  9. MyBatis中出现Mapped Statements collection does not contain value

    引用csdn上一大神的解决方法: 经过排查,解决上述异常的过程如下: 1.确定xml文件中<mapper namespace=""/>中的namespace是否路径正确 ...

  10. 利用SegmentedControl切换控制器的view

    #import "ViewController.h" #import "OneViewController.h" #import "TwoViewCo ...