struts2 | 基本原理

Posted 数据与共享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2 | 基本原理相关的知识,希望对你有一定的参考价值。

Apache Struts is a free, open-source, MVC framework for creating elegant, modern Java web applications. It favors convention over configuration, is extensible using a plugin architecture, and ships with plugins to support REST, AJAX and JSON.


上述文字来源与Struts的官网首页。即:Apache Struts是一个免费的开源MVC框架,用于创建优雅的现代Java Web应用程序。 它支持约定优于配置,可以使用插件体系结构进行扩展,并附带支持REST,AJAX和JSON的插件。



01



什么是MVC框架?


1.MVC是项目的分层或者设计思想,是一种软件设计典范。MVC(Model View Controller 模型-视图-控制器)。

Model:表示应用程序核心(比如数据库记录列表)

View:显示数据(数据库记录)。

Controller:处理输入(写入数据库记录)。

2.MVC模式的某种框架,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet + javabean的模式。



02




Struts2的原理?


  • Struts2的工作原理图如下:

1.FilterDispatcher

客户端向服务端发出请求。请求提交的过程要经过一系列的Servlet过滤器过滤。过滤器有图中三种。其中:FilterDispatcher,是Struts2中的核心,是必须使用的过滤器,在Struts2的API中已经定义,必须在web.xml中进行配置,如下图:

struts2 | 基本原理

2.ActionMapper

FilterDispatcher调用ActionMapper,ActionMapper判断该请求是否需要调用某个Action。并反馈结果给FilterDispatcher。

3.ActionProxy

FilterDispatcher发命令给ActionProxy,ActionProxy通过Configuration Manager解析框架的配置文件struts.xml,找到需要调用的Action类。

4. ActionProxy创建一个ActionInvocation实例。

5.ActionInvocation实例使用命令模式回调Action中的execute方法,Action调用业务逻辑完成业务逻辑。在调用Action的前后,将调用该Action涉及的相关拦截器。

6.Action执行完毕,根据Struts.xml中的配置文件找到对应的Result,跳转到对应的页面。例如:jsp ,FreeMarker。



03




Struts2的优点?


1.Struts2基于MVC架构,框架结构清晰。

2.struts2使用JSTL,也支持更灵活的OGNL(对象图形符号语言)。

3.struts1的核心是个servlet ,与servlet API严重耦合,难于测试,而且还是单例,就造成了一定的限制。资源必须为线程安全或者同步。而struts2的核心是个过滤器,为每一个请求实例化一个对象,所以没有线程安全的问题。

4.Result 方式的页面导航,通过 Result 标签很方便的实现重定向和页面跳转;

5.拦截器强大,采用面向切面的编程思想,易于扩展。

6.拥有简单的插件,只需要放入响应的 jar 包,任何人都可以扩展 Struts2 框架,比如 自定义拦截器、自定义结果类型、自定义标签等,为 Struts2 定制需要的功能,不需要什么特殊的配置,并且可以发布给其他人使用。



04




Struts2和SpringMVC对比?


这是我很早之前画的SpringMVC实现原理图:

1.拦截级别:

Struts2是类级别的拦截, 一个类对应一个request上下文。

SpringMVC是方法级别的拦截,一个方法对应一个request上下文。

2.内存占用:

由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。

3.配置文件:

Struts2有以自己的interceptor机制。SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。

4.ajax

SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

5.验证

SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。

6.与Spring配套使用

Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。

7.设计思想

Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

8.开发效率

SpringMVC开发效率和性能高于Struts2。

9.SpringMVC可以认为已经100%零配置。




说明:本篇文章的内容来源于书籍和百度。而且对有些内容我也没有亲自验证,大家有什么问题,可以随时留言,我们一起探讨。



以上是关于struts2 | 基本原理的主要内容,如果未能解决你的问题,请参考以下文章

《Java从入门到放弃》入门篇:Struts2的基本访问方式

《Java从入门到放弃》入门篇:Struts2的基本访问方式

Spring框架的基本原理

Web上传文件的原理及实现

Struts2系列:(14)Struts2验证

对ognl表达式的简单实现(Ognl.getValue(express,root)),帮助理解ognl表达式的基本原理