标签:
1、Struts2与Struts1的区别
Action类
Struts1的Action必须继承
Struts2的Acton可以不继承
线程
Struts1单例的,存在线程安全问题,如果用actionform的话,ActionForm是多例的,所以可以保证线程安全
Struts2多例的,没有线程安全问题
(ps:struts2只能是多例的,struts1将action交给spring管理可以是多例的)
ActionForm
Struts1收集数据使用ActionForm,ActionForm需要继承。复用率低。
Struts2可以不用ActionForm,之间让Action来收集数据,采用ModelDriven支持Struts1的ActionForm方式。
表达式语言方面
Struts1中使用jstl
Struts2中使用ognl
类型转换
Struts1中对ActionForm的类型转换采用commons-beanutils工具,一个转换器对所有ActionForm起作用,不能针对单个配置。
Struts2使用OGNL进行类型转换,可以针对某个类型进行配置。
校验
Struts1采用覆盖ActionForm中的validate方法或采用验证框架commons validator验证
Struts2支持覆盖validate来完成验证,也支持验证框架xWork来验证
Action执行控制
Struts1固定不变
Struts2通过拦截器,可以改变执行流程,灵活配置
2、Struts1的流程
浏览器请求到ActionServlet类,该类将响应请求并进行分发到Action,Action调用Model。将请求返回给ActionServlet,ActionServlet将请求回的数据forward到jsp,并将jsp返回给浏览器。
3、Struts2的流程
客户端浏览器发起请求,请求先经过一系列的Filter(所以filter的生命周期)最先到达ActionContextCleanUp,再到其他的过滤器,之后到StrutsPrepareAndExecuteFilter过滤器,接着StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求需要调用的Action,如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求交给ActionProxy处理;Actionproxy通过Configuration Manager询问框架的配置文件,找到需要调用的action类。ActionProxy创建一个ActionInvocation实例。ActionInvocation实例使用命名模式来调用,在调用Action的过程前后都涉及到相关拦截器的调用,默认是18个拦截器。一旦Action执行完毕,ActionInvocation负责根据struts.xml中配置找到对应的返回结果。表示过程中可以使用struts2标签,需要Actionmapper。
4、Filter、Servlet、Interceptor、Listener区别?
项目 |
Servlet |
Listener |
Filter |
Interceptor |
包名 |
javax.servlet.http.HttpServlet |
javax.servlet.ServletContextListener |
javax.servlet.Filter |
com.opensymphony.xwork2.interceptor.AbstractInterceptor |
功能 |
生成响应内容并且将其传给服务器 |
做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。 |
Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。基于函数回调 |
基于java反射机制。面向切面编程。 |
生命周期 |
由容器控制,可以配置。无配置时默认在第一次调用前加载,容器关闭时销毁,当容器做内存回收时也可能被销毁。不能离开web容器 |
随web容器启动,只初始化一次,不能离开web容器。 |
Web容器启动时启动,初始化一次,不能离开web容器。在容器初始化时被调用一次 |
加载struts.xml后,初始化相应拦截器,服务器停止销毁拦截器。不依赖web容器,可以多次调用 |
配置位置 |
Web.xml中3.0后开始支持注解 |
Web.xml中 |
Web.xml中 |
Struts配置文件中 |
作用对象 |
url |
对象,如session的创建,session.setAttribute发生 |
url、action几乎所有对象 |
Action |
Web.xml加载顺序:context- param -> listener ->filter -> servlet.
执行流程图:
Servlet:
Filter:
Listener:
Interceptor:
5、struts.xml文件什么时候加载与特性
StrutsPreparedAndExecuteFilter的init方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。Struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户每次请求处理将使用内存中的数据,而不是每次都请求读取struts.xml文件。
6、struts2框架的核心过滤器?作用?
StrutsPrepareAndExecuteFilter。作用:拦截url-pattern指定的所有用户请求,当请求到达时,该filter会过滤用户请求。
7、值栈ValueStack的原理和生命周期?
保存在request域中和request的生命周期一样。每个action都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,action默认保存在栈顶。ValueStack本质上是ArrayList。
8、OGNL与JSTL与EL表达式?
Jstl:是jsp标签;ognl与el类似都是表达式语言。El与jstl联用,jstl用来取值,el用来展示。
产品 |
Struts2标签 |
Ognl |
Jstl |
El |
使用方式 |
引入:<%@ taglib uri="/struts-tags" prefix="s"%> 使用:<s:property value="#request.user1.realName"/>好多种取值方式 |
对象图形化导航语言,要结合struts标签使用。符号:#、$、%。 |
标签库,引入<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> |
${} |
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/kanglix1an/article/details/48142557