Struts2运行机制
1.从客服端浏览器输入的url后,客服端通过http协议发送一个请求到服务器(tomcat),Tomcat收到这个请求之后,它会查看你请求的是哪一个web application(一般是一个项目),接着将请求交给对应的web application处理;
2.web application的处理过程:首先读取web.xml文件,通过filter过滤url,然后调用filter-class对应的类StrutsPrepareAndExecuteFilter; 3 接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问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 框架中继承的标签。
我们要探讨任何的运行流程,一定是从
这个位置开始探讨,这里有一个客户端 在浏览器里面输入了一个URL 地址,当他输入这个URL地址之后,这个URL 地址的请求会通过Http协议发送给我们的 Tomcat,Tomcat收到这个请求之后,它一看你请求的是哪一个web application了,是 Struts2_0100_Introduction 这个web application,所以他就把这个交给对应的程序去处理,既然是这个 web application,它就当然要读这个web application里面对应的web.xml文件来看起内部是如何配置的,这时候它就发现了里面的配置,这里面的配置是一个filter,当Tomcat收到一个请求之后,它会发现在 Struts2_0100_Introduction这个 web application 里面的web.xml里面配置了一个filter,而这个filter它会过滤所有的URL 地址,所以当我们在地址栏敲 hell的时候,这个地址就会被 filter的
这个处理类接收到,接收到它会做什么样的处理了?它会首先看你的namespace,我们的这种访问方式它对应的namespace是,我们说过 namespace是和我们的访问的路径一一对应,http://localhost:8080/Struts2_0100_Introduction/hell 这种访问方式,它会从struts.xml配置文件里面去查,这里面有一个 namespace 叫 斜杠(/) ,就查到
这部分配置了,查到这部分操作
之后了,在这个斜杠里面的后半部分是hell ,接下来它就会去查,在这个斜杠里面有没有一个action 叫做 hell的,如果有,它就会去找了吗对应的result是谁,这样就找到了 Hello.jsp 页面了,就把Hello.jsp的结果反馈给大家了。这就是它的执行的过程。
执行过程是这样的,我们有一个客户端,也就是我们的浏览器,客户端,它会敲一个地址,http://xxx/webappname/xx.action 它会输入这个地址,当它敲这个地址的时候,我们的浏览器就会把这个请求发给Tomcat,发送请求,实际上这个应该是要求对方有一个反馈,我就不写这一步了,Tomcat接收到这个请求之后了它会查是交给哪一个 web application 去处理,它会发现时交给webappname这个 web application 去处理,当找到该 web application 之后,它又会去参考里面的一个配置文件,这个配置文件就是 web.xml 文件, 这个配置文件里面写了一个filter,所以他会把这个请求交给我们的Struts 2的filter去处理,交给这个filter去处理的时候,会调用它的doFilter()方法,在doFilter()内部它是怎么处理的了,它也会参考一个文件,它参考的这个文件叫做 struts.xml ,在它参考的过程当中了,首先第一步 ,它会参考它的namespace,这种画法了实际上是方法调用,这里只是举例说明是什么意思,所以了不要太拘泥于这种画法,找到 了namespace还会找对应的action,找到了对应的action之后了,还会找对应的result,当它终于找到了这个result的时候,它又会做什么了?它会把这个请求forward给对应的JSP文件,即我们的 /Hello.jsp 页面,当然这个JSP文件了就会把内容反馈给我们的客户端了。
客户端交给 Tomcat ,Tomcat找到对应的filter,这个filter会参考一个文件叫做struts.xml ,根据这个xml它会找到对应的结果,最后把这个结果反馈给我们的客户端。
我们以前学过了设计模式,设计模式有一个特点,就是一定要把简单的东西给复杂化,那么它为什么复杂化,它复杂化之后带来的好处是什么?设计模式带来的好处最重要的就是可扩展性,它能够扩展了,能够灵活了。这个的好处也一样,它为什么要搞的这么麻烦了,中间要经过一次中转,我的请求来了,中间要经过filter的中转,我才能够拿到我请求之后的展现,也就是请求之后的结果,它的好处就是,可以把我的请求,和我的最后的结果,也叫做视图,将其分开,而不是像原来那样直接写死了。
分开的好处就是,如果我要是想换成别的试图,只需要在strut.xml配置文件里面配置一下,修改一下就可以,所以这样就会更灵活了,这就是它的好处。所以Struts 解决的问题是 ,把客户端的请求和展现分开,就是解决的这个问题,你别管他是叫什么模式,叫MVC ,不管它叫什么,它其实最后处理的问题的本质就是 把你的请求 和你最后的结果给分开,这就是Struts 2 最核心的内容。