花了半天的时间再把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代替