一、struts2知识点
1.拦截器和过滤器的区别
1)拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2)过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3)拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。(在struts2中是Action请求,在SpringMVC中是Controller请求)
4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5)在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
2.struts1与struts2的比较
1)Action 类:
Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
Struts2 的Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
2)线程模式:
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
3)Servlet 依赖:
Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
Struts2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
4)可测性:
测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
5)捕获输入:
Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。
Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。
6)表达式语言:
Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言-- “Object Graph Notation Language ” (OGNL).
7)绑定值到页面(view):
Struts 1使用标准JSP机制把对象绑定到页面中来访问。
Struts 2 使用 “ValueStack “技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
8)类型转换:
Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
9)校验:
Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
10)Action执行的控制:
Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
二、Spring
1. Spring框架有哪些模块?
Spring框架由七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,如下所示:
(1) Spring 核心容器——IOC容器
(2) Spring AOP
(3) Spring ORM
(4) Spring DAO
(5) Spring WEB
(6) Spring上下文(Context)
(7) Spring MVC
2.为什么要使用Spring框架,它有什么优点?
**为什么用Spring:
1)简单的实现单例
2)实现复杂的事务操作
3)实现aop的功能(面向切面的编程)
4)实现web应用各层间的松耦合
依赖具体的类是紧耦合
依赖抽象的类(接口(好)或抽象类)是松耦合
Connection
Statement
ResultSet
好处就是便于程序的扩展和维护
如:web中的Servlet中使用的HttpServletRequest和
HttpServletResponse都是接口,这样如果更换
web服务器的话我们的Servlet是不需要修改的
jdbc中使用的都是接口,Connection,Statement
都是接口,如果更换数据库的话,我们的jdbc
代码需要修改的编码会很少
5)提供了IOC(控制反转)/DI(依赖注入)的实现
实现由Spring容器将依赖的对象动态的注入到我们的组件中,
如:service依赖于dao,之前我们是硬编码实现的如果
使用Spring的话,这些代码都不需要了
6)提供了对其它框架的集成
集成MyBatis hibernate struts2 springMVC
集成后可以更加简便的实现框架的功能**
(1) 轻量级的框架
(2) 非侵入性的
(3) 可以整合其它的框架,比如Struts, Hibernate等
(4) 可以提供事务管理
3.Spring框架的工作机制是什么?
(1) Spring MVC将所有的请求都提交给DispatcherServlet,它会委托应用系统的其它模块负责对请求进行真正的处理工作。
(2) DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller。
(3) DispatcherServlet将请求提交到目标Controller。
(4) Controller进行业务逻辑处理后,会返回一个ModelAndView。
(5) Dispathcher查询一个或多个ViewResolver(视图解析器),找到ModelAndView对象指定的视图对象。
(6) 视图对象负责将结果返回给客户端。
4.IOC和DI
(1)IOC控制反转(inverstion of control)
依赖对象的注入由我们手动实现改为spring容器帮我们注入的
过程就是控制反转
如:依赖name属性是由spring容器帮我们注入的
(2)DI依赖注入(depentency injection)
依赖的对象由spring容器帮我们注入的过程就是依赖注入
依赖注入更能准确的描述这个过程
5.bean的生命周期
bean的生命周期是由IOC容器负责管理的
生命周期包括以下部分:
1)创建bean对象
2)注入依赖的对象(如service依赖dao)
3)初始化
4)使用bean(调用bean的方法)
5)当关闭容器后,销毁bean对象
6.事务的四个属性:
ACID:
A:原子性
事务是不可再分割的,要么全都成功,要么全都不成功
C:一致性
事务实现后必须保证业务规则的一致性,比如转账
I:隔离线
事务之间不能发生干扰,是相互隔离的
如两个事务同时操作表的同一条数据,要有一个先后顺序
D:持久性
事务提交后,数据永久的保存到文件中
7.怎么使用Spring配置事务 ?
Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略。
声明式事务管理的配置方式,通常有以下4种:
(1) 使用TransactionProxyFactoryBean为目标Bean生成事务代理的配置。此方式是最传统、配置文件最臃肿、最难以阅读的方式。
(2) 采用Bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。
(3) 采用BeanNameAutoProxyCreator,根据Bean Name自动生成事务代理的方式。这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。
8.请你谈谈SSH整合
SSH整合:
(1)Struts(表示层)+ Spring(业务层)+ Hibernate(持久层)
(2)Struts:
Struts是一个表示层框架,主要作用是界面展示、接收请求和分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。
View:沿用 JSP,HTTP,Form,Tag,Resourse;
Controller:ActionServlet,struts-config.xml,Action。
(3)Hibernate:
Hibernate是一个持久层框架,它只负责与关系数据库的操作。
(4)Spring:
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。
9.在Spring框架中如何配置数据库驱动?
使用org.springframework.jdbc.datasource.DriverManagerDataSource数据源来配置数据库驱动。
示例:
<bean id=”dataSource”>
<property name=”driverClassName”> <value>org.hsqldb.jdbcDriver</value> </property>
<property name=”url”><value>jdbc:hsqldb:db/appfuse</value></property>
<property name=”username”><value>sa</value></property>
<property name=”password”><value></value></property>
</bean>
10.在Spring框架中applicationContext.xml文件能不能改成其它文件名?
ContextLoaderListener是一个ServletContextListener,在启动Tomcat应用服务器时,它会读取WEB-INF目录下的applicationContext.xml文件,初始化Spring配置。
如果你想改变applicationContext.xml文件的名字或改变它的存储位置,可以通过在web.xml文件中定义一个元素来解决这个问题。
示例:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/xyz.xml</param-value>
</context-param>
</listener-class>
</listener>
11.如何在Web应用里配置Spring?
在/WEB-INF/web.xml文件中,加入如下内容:
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
在启动Web应用服务器(Tomcat)时,将加载/WEB-INF/applicationContext.xml文件中的内容。
在应用程序中,可以通过如下方式获取ApplicationContext实例
WebApplicationContextUtils.getWebApplicationContext
12.Spring中的BeanFactory与ApplicationContext的作用有哪些?
(1) BeanFactory负责读取Bean配置文档,管理Bean的加载和实例化,维护Bean之间的依赖关系,负责Bean的生命周期。
(2) ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
a. 国际化支持
b. 资源访问:
Resource rs = ctx. getResource(”classpath:config.properties”);
c. 事件传递:通过实现ApplicationContextAware接口
(3) 常用的获取ApplicationContext的方法:
FileSystemXmlApplicationContext:从文件系统或者URL指定的xml配置文件创建,参数为配置文件名或文件名数组
ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件。
WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者 servlet来实现
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这两种方式都默认配置文件为WEB-INF/applicationContext.xml,也可使用context-param指定配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml
</param-value>
</context-param>
13.Spring中的核心类有那些,各有什么作用?
BeanFactory:产生一个新的实例,可以实现单例模式。
BeanWrapper:提供统一的get及set方法。
ApplicationContext:提供Spring框架的实现,包括BeanFactory的所有功能。
14. 什么是AOP,AOP的作用是什么?
面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。
除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。
Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP,提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。
允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强。
15. AOP里面几个重要名词概念的解释
(1) 切面(Aspect)
一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解来实现。
(2) 连接点(Joinpoint)
在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点总是代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
(3) 通知(Advice)
在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。
(4) 切入点(Pointcut)
匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
(5)引入(Introduction)
也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。 例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
(6) 目标对象(Target Object)
被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。
(7) AOP代理(AOP Proxy)
AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
(8) 织入(Weaving)
把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其它纯Java AOP框架一样,在运行时完成织入。
三、SpringMVC
1.springMVC的执行流程
(1)客户请求中央控制器DispatcherServlet
(2)前端控制器调用处理器映射器handlerMapping来寻找与
url匹配的Controller(后端控制器),
handlerMapping将找到的Controller对象返回给
DispatcherServlet
(3)DispatcherServlet调用处理器适配器handlerAdapter,
由handlerAdapter去调用Controller对象
(4)执行Controller对象的方法
(5)Controller执行后返回ModelAndView对象交给
DispatcherServelt
(6)DispatcherServelt将ModelAndView传给视图解析器
(ViewResolver),ViewResolver解析后返回View
(7)将数据显示到View对应的视图中
(8)发送视图响应信息到客户端
本文详细对比了Struts2与Struts1的区别,包括Action类、线程模式、Servlet依赖等方面,并介绍了Spring框架的各个模块及其优势。此外,还探讨了Spring MVC的工作机制和配置方法。
451

被折叠的 条评论
为什么被折叠?



