Struts2详解
Struts2是一种基于MVC的web应用框架,致力于组件化和代码重用的JEE Web框架。
优点:
- Struts2基于MVC架构,框架结构清晰,一目了然;
- Struts2提供了丰富的拦截器,内置30多种拦截器;
- Struts2的可扩展性高,可以自定义拦截器,Result以及对外部插件的整合(使用json插件);
- Struts2拥有丰富的标签库,大大提高了开发效率;
- Struts2拥有强大的OGNL表达式,可以访问request、session、application各个域中的数据
缺点:
- Struts2存在两个高危漏洞,影响安全性;
- Struts2的架构设计过于复杂,使用过程中效率较低;
- Struts2学习难度高,需要处处注意才能写出较好的代码
Struts2的运行过程:
- 客户端浏览器发出HTTP请求
- 根据web.xml配置文件,请求被FilterDispatcher拦截,并传给struts.xml
- 根据struts.xml配置文件,找到要调用的Action类和方法,并通过IOC方式,把值注入到Action
- Action执行完后,根据struts.xml文件找到返回结果result,并跳转页面
- 返回HTTP响应到客户端浏览器
Struts2的核心控制器
核心控制器:FilterDispatcher
FilterDispatcher 负责拦截所有用户的请求,如果用户请求以action结尾,该请求将被转到Struts2框架中处理,否则将被过滤掉。
Struts2框架获得了*.action请求后,根据请求前面的部分,调用指定的Action类中的方法。Action都被定义在struts.xml文件中,定义了Action的name属性和class属性,其中name属性决定了Action处理哪个用户的请求,class属性决定了Action的实现类。
拦截器和过滤器的区别:
- 拦截器是基于java反射机制的,过滤器是基于函数回调的
- 拦截器不依赖于servlet容器,过滤器依赖servlet容器
- 拦截器只对action请求起作用,过滤器对所有的请求都起作用
- 拦截器可以访问action上下文和值栈中的数据,过滤器不能访问
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化的时候被调用一次
值栈的原理和生命周期:
值栈ValueStack在struts2框架设计架构中用于数据存储,传输。ValueStack贯穿整个Action的生命周期,保存在request域中。ValueStack的生命周期和request的生命周期一样。
当struts2接受一个请求时,会迅速创建ActionContext、Action、ValueStack,然后把Action存放到ValueStack中,Action中的实例变量可以被OGNL表达式访问。
请求进来时,Action、ValueStack的生命周期开始,请求结束时,生命周期结束。
Struts2的默认拦截器:
ParamsInterceptor:字段驱动方式收集参数的拦截器
ModelDrivenInterceptor:模型驱动方式收集参数的拦截器
FileUploadInterceptor:文件上传的拦截器
ValidationInterceptor:校验拦截器
I18nInterceptor:处理国际化操作的拦截器
Struts2如何调用Action控制器的方法:
- *.action直接调用Action的默认方法
- *!method.action调用Action指定的method方法(方法的动态调用)
- *_method.action调用Action指定的method方法(通配符的动态调用)
- 为Action指定不同的别名
在项目中使用Struts2遇到的问题:
1.收集表单日期类型封装到Timestamp中,转型失败
a)自定义一个日期类型的转换类,将Date类型转换成Timestamp类型,并设置为全局转换类
2.经常遇到返回input校验失败页面
a)OGNL自动转型中,类型不匹配导致的问题