先来简单说说MVC架构设计,在MVC架构中,Servlet作为前端中枢控制器(Controller),负责接收客户端发送过来的请求,在Servlet中只包含控制逻辑和简单的前端处理。Struts2就起了这样一个作用,为了最大程度的将Model、View和Controller这三部分进行解耦,从而提高应用的可扩展性及可维护性,struts2在这个当中占据着关键的Controller的位置,它就好比整个应用的指挥官,井井有条的打理着整个应用的运行。
对于基于struts2开发Java Web应用,我们就必须知道Struts2的工作流程,运行轨迹;对于此,先看一副图:
- 用户通过浏览器访问Java Web应用
- 用户的请求到达服务器以后,被配置在web.xml中的Struts2的核心Filter所拦截:
<filter>
<filter-name>action2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>action2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
由于Web应用都是基于请求—响应架构的应用,所以不管哪个MVC WEB框架,都需要在web.xml中配置该框架的核心Servlet或Filter,这样才可以让该框架介入Web应用中。
- 定义处理用户请求的Action类;这一步是非常重要的,这里定义的Action类就是MVC中的“C”,就是所谓的控制器,该控制器负责调用Model里的方法来处理请求,对于一些非常简单的请求可以在Action中直接处理。
Struts2根据对应的请求,在struts.xml中找到对应的Action处理类:
<action name="loginAction" class="cc.xxxxx.service.Login">
<result name="ok">/index.jsp</result>
<result name="err">/login.jsp</result>
</action>
- Action根据业务返回结果,返回对应的逻辑视图名,例如下列代码中的return ok和return err:
public String execute() throws Exception {
if ("user1".equals(user.getName()) && "pwd1".equals(user.getPwd())){
return "ok";
}
return "err";
}
- Struts2根据Action返回的逻辑视图名,在配置文件中对应物理视图资源,例如:
<action name="loginAction" class="cc.xxxxx.service.Login">
<result name="ok">/index.jsp</result>
<result name="err">/login.jsp</result>
</action>
当Action控制器返回ok字符串时,则进入/index.jsp页面;当返回err字符串时,则进入/login.jsp页面;就是通过这种方法,将View和Controller进行解耦。
- 服务器将对应的页面响应给用户,从而完成一次请求—响应。这就是关于Struts2的整体开发流程。