常用的Java Web框架Struts,Webwork,Struts2,Spring MVC等,它们虽然各有千秋,但均具有着相同的设计原则---前端控制器模式。
理解前端控制器模式前先了解下原始的MVC模式,原始的MVC存在于GUI应用中,原始的MVC寻求一种模式将应用程序分为3 个部分,并且详细定义这3个部分之间的交互,从而降低它们之间的耦合度,让每一部分都专注于自己职责,无须担心其他部分。
原 始的MVC中,用户与View直接交互,将信息交付给View,然后View将用户提交的信息推送给Controller,Controller在根据 View传递过来的信息对Model操作,最终导致Model的更新,最后将更新的Model通过Controller返回View,View接受更新的 Model后更新自身显示给用户。三层之间交互通过注册事件监听器来触发。
但 是在Java Web应用中,Model 和Controller在服务器端,而View则在客户端,它们通过遵循Http协议的Http request请求建立通信交互联系。这时候的View不支持自己更新,它只能重新生成新的View,原始的MVC就不适用Java Web应用了。
Java Web应用的MVC通过一个前端控制器模式来实现,在 View和Controller之间增加一个Dispatcher分发器(一般由Servlet实现),根据用户不同的URL,Dispatcher分发 器会根据用户的配置信息转发到不同的Controller,Controller再更新Model,最终会返回一个码值(逻辑视 图),Dispatcher分发器再根据这个码值(逻辑视图)映射到相应的View返回给用户。另外View为了更好的显示视图,一般会使用标签库。
以 Struts为例,用户通过JSP视图发出请求,首先Web服务器根据请求的映射路径是否符合Struts的核心控制器ActionServlet的请求 后缀(.do / .action),决定是否交由ActionServlet处理,ActionServlet会检查struts-config.xml是否有用户对应的 请求,如果有匹配的请求则转向到相应的Action控制器,控制器再去调用Service和DAO层最终和Model交互,改变Model的状 态,Action控制器最终返回一个ActionForward(码值),ActionServlet会再去struts-config.xml中取检查 控制器内的ActionForward有没有和返回的那个匹配,如果匹配成功,最终生成一个新的JSP视图给用户。
MVC框架的Dispatcher分发器一般配置在WEB-INF/web.xml中,同时配置相应的url-mapping,分发器随着Java Web应用启动而开启。
主流Java Web 的 MVC框架和相应的Dispatcher分发器:
Struts --- ActionServlet
Webwork --- ServletDispatcher
Struts2 --- FilterDispatcher / StrutsPrepareAndExecuteFilter
Spring MVC --- DispatcherServlet
注意:
1. Struts2的分发器不是Servlet,而是Filter;
2. Spring MVC的码值是ModelAndView对象,同时也支持纯String的码值。
参考:
《Webwork in action 中文版》