struts2简介

来源:互联网 发布:火星哥在美国地位 知乎 编辑:程序博客网 时间:2024/06/05 13:36

什么是Struts2 ?

Struts2是一个优秀、开源、免费的MVC的框架。

Struts2框架结构

1、视图-即JSP页,负责界面呈现,原则上无业务逻辑编码。

2、模型-由JavaBean或EJB实现,封装业务数据和业务逻辑。

3、控制器-Struts2的控制器由以下几部分组成

    (1)FilterDispatcher类-Struts2框架提供的一个Filter,是核心控制器,起全 局控制作用。

    (2)业务Action类-由开发人员编码实现,负责调用模型、数据传递和视图转向。

    (3)struts.xml-用于描述控制、转向关系等。

    (4)拦截器-负责通用功能调用

Struts2工作原理



一个请求在Struts2框架中的处理大概分为以下几个步骤 

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action,FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。

5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类,这里,我们一般是从struts.xml配置中读取。

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截(Intercepter)的调用。

下面我们来看看ActionInvocation是如何工作的:

ActionInvocation是Xworks中Action 调度的核心。而对Interceptor 的调度,也正是ActionInvocation负责。ActionInvocation 是一个接口,而DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。

Interceptor的调度流程大致如下:

  1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。

  2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。

  Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

Struts2优点

1)实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现。

2)丰富的标签库,大大提高了开发的效率。

3)Struts2提供丰富的拦截器实现。

4)通过配置文件,就可以掌握整个系统各个部分之间的关系。

5)异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理。

6)Struts2的可扩展性高。Struts2的核心jar包中由一个struts-default.xml文件,在该文件中设置了一些默认的bean,resultType类型,默认拦截器栈等,所有这些默认设置,用户都可以利用配置文件更改,可以更改为自己开发的beanresulttype等。因此用户开发了插件的话只要很简单的配置就可以很容易的和Struts2框架融合,这实现了框架对插件的可插拔的特性。

7)面向切面编程的思想在Strut2中也有了很好的体现。最重要的体现就是拦截器的使用,拦截器就是一个一个的小功能单位,用户可以将这些拦截器合并成一个大的拦截器,这个合成的拦截器就像单独的拦截器一样,只要将它配置到一个、Action中就可以。

Struts2缺点

(1)Struts2中Action中取得从jsp中传过来的参数时还是有点麻烦。可以为Struts2的Action中的属性配置上Getter和Setter方法,通过默认拦截器,就可以将请求参数设置到这些属性中。如果用这种方式,当请求参数很多时,Action类就会被这些表单属性弄的很臃肿,让人感觉会很乱。还有Action中的属性不但可以用来获得请求参数还可以输出

到Jsp中,这样就会更乱。假设从JSP1中获得了参数money=100000,但是这个Action还要输出到JSP2中,但是输出的格式却不同,money=100,000,这样这个Action中的money中的值就变了。

(2)校验还是感觉比较繁琐,感觉太烦乱,也太细化了,如果校验出错的只能给用户提示一些信息。如果有多个字段,每个字段出错时返回到不同的画面,这个功能在Strut2框架下借助框架提供的校验逻辑就不容易实现。
(3)安全性有待提高。Struts2曝出2个高危安全漏洞,一个是使用缩写的导航参数前缀时的远程代码执行漏洞,另一个是使用缩写的重定向参数前缀时的开放式重定向漏洞。这些漏洞可使黑客取得网站服务器的“最高权限”,从而使企业服务器变成黑客手中的“肉鸡”。

0 0
原创粉丝点击