Struts 2的流程
一.Struts 2 的开发步骤:
- 在web.xml中定义核心的Filter来拦截用户的请求。
由于Web应用时基于请求/响应架构的应用,所以不管哪个MVC Web框架,都需要在web.xml中配置该框架的核心Servlet和Filter,这样才可以让框架介入到Web应用中。
开发Struts 2应用的第一步就是在web.xml中配置如下片段:
<!--定义Struts2的核心Filter--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>Struts2版本为2.5以上时这样写 </filter> <!--让Struts2的核心拦截所有的请求--> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.如果需要使用POST方法来提交请求,则定义包含表单数据的JSP页面,如果仅仅只是以GET方法发送请求,则无需定义这一步
3.定义用户请求的Action类
这一步时MVC框架中必不可少的,因为这个Action就是MVC中的C,也就是控制器,该控制器负责调用Mode里的方法来处理请求上一节只是介绍Struts2的用法,并未使用Model来处理用户的请求,而是使用Action对用户的请求做了简单的处理。
Actions是怎样处理用户的请求呢?
MVC底层的机制是:核心的Servlet和Filter接受到用户的请求后,就会对用户的请求进行简单的预处理,如解析,封装参数等,然后通过反射来创建Action实例,并调用Action的指定方法(Struts1通常是execute方法,Struts2可以是任何方法)来处理用户的请求。
当Servlet或者Filter拦截用户的请求后是如何知道创建哪个Action实例呢?
* 利用配置文件:例如我们可以配置login.action对应使用LoginAction类,这就可以让MVC 框架知道创建哪个Action实例了。
* 利用约定: 可以约定xxx.action对应XxxAction类,如果核心控制器收到regist.action请求后就会调用RegistAction类来处理用户的请求
由上可知,在MVC框架中,控制器实际上是由2个部分组成,既拦截所有用户请求,处理请求的通用代码都是由核心控制器来组成,而实际上的业务控制是由Action来处理的。
4.配置Action
对于Java领域的大部分MVC框架而言,都非常喜欢使用xml来配置管理,配置哪个Action就使用哪个Action来处理,从而让核心控制器根据改配置来创建合适的Avtion实例,并调用该实例的业务逻辑方法。例如,我们通常用如下代码片段来配置Action
<action name="login" class="com.strtus2.action.DemoLog">
</action>
如果用户请求的URL是login,则使用com.struts2.action.DemoLog来处理。
5.配置处理结果和物理视图资源之间的对应关系。
当Action处理了用户的请求后,通常换返回一个处理结果(这个结果通常是使用一个简单的字符串来表示)我们可以认为这个结果就是逻辑视图名,但是这个逻辑视图名必须要与指定的物理视图资源关联才有价值,所以我们还需要配置处理结果之间的对应关系。
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.strtus2.action.DemoLog">
<result name="success">/Helloword.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
上面的红色字体指定了三个处理结果和三个物理视图之间的映射关系,当com.struts2.action.DemoLog返回success时,就进入HelloWord.jsp页面,当返回error时,就进入到error.jsp页面。
6.编写视图资源
二.Struts2的流程
图中的StrutsPrepareAndExecuteFilter和XxxAction共同组成了Struts2的控制器,常常把 StrutsPrepareAndExecuteFilter称为核心控制器,把XxxAction称为业务控制器。
业务控制器通常并不与物理视图关联,这样做法提供了很好的解耦,业务逻辑控制器只返回处理结果,而处理结果与什么样的物理视图关联,依然由StrutsPrepareAndExecuteFilter来决定,这样做的好处是:如果有一天,需要将某个视图名映射到不同的视图资源上,这就无需修改XxxAction的代码,而是只需修改配置文件即可。
这里还可以看出,在Struts2的控制下,用户请求不再项JSP页面发送,而是由核心控制器StrutsPrepareAndExecuteFilter来调用JSP页面来生成响应,此处的调用不是直接调用,而是将请求forward到指定的JSP页面。