• 1. 一、开始spring之旅理解反向控制(IOC) 依赖注入(di):比IOC更好的名字。获得依赖对象的方式反转了。 IOC应用 理解AOP ioc或者说di,还可以达到解耦的目的,我们举一个案例来说明!(字母大小写转换 )
  • 2. 二、装配Bean2.1容纳你的bean bean工厂:最简单的容器,提供了基础的依赖 注入支持。创建各种类型的Bean. 应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务。 singleton: 单例 默认值 prototype: 原型 request: 一次请求有效( java web开发中) session: session级有效(java web开发中)
  • 3. 二、装配Bean2.1 容纳你的bean 2.1.1 bean工厂介绍 工厂设计模式,创建分发各种bean。配置好它们之 间的写作关系,参与bean的生命周期。 BeanFactory factory = new XmlBeanFactory( new ClassPathResource("applicationContext.xml")); bean工厂只把bean的定义信息载进来,用到的时候 才实例化。 factory.getBean("mybean");就可得到一个 bean。
  • 4. 二、装配Bean2.1 容纳你的bean 2.1.2 使用应用上下文 ApplicationCotext,spring更加高级的容器。功能 强大: 1.提供文本信息解析工具,包括对国际化支持。 2.提供载入文件资源的通用方法,如图片。 3.可以向注册为监听器的bean发送事件。 在很少的情况下,使用BeanFactory,如在移动设 备。
  • 5. 二、装配Bean2.1 容纳你的bean 2.1.2 使用应用上下文(续) 三种经常用到的实现: 1.ClassPathXmlApplicationContext:从类路径中加载。 2.FileSystemXmlApplicationContext:从文件系统加载。 3.XmlWebApplicationContext:从web系统中加载。
  • 6. 二、装配Bean2.1 容纳你的bean 2.1.2 使用应用上下文(续) ApplicationContext context = new FileSystemXmlApplicationContext(" c:\foo.xml"); ApplicationContext context = new ClassPathXmlApplicationContext(" foo.xml");
  • 7. 二、装配Bean2.1 容纳你的bean 2.1.2 使用应用上下文(续) 除了应用上下文提供的附加功能外,应用上下文 与bean工厂的另一个重要区别是关于单例bean 如何被加载。 bean工厂延迟加载所有bean,直到getBean() 方法被调用。 应用上下文会(applicationContext)在启动后预载入所有单例bean.这样可确保应用不需要等待他们被创建。
  • 8. 二、装配Bean2.1 容纳你的bean 2.1.3 bean的生命周期 bean被载入到容器中时,他的生命周期就开始了。: 1.容器寻找bean的定义信息并实例化。 2.使用依赖注入,spring按bean定义信息配置bean的所有属性。 3.若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName ()方法传递bean的ID。 4.若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory() 方法传入工厂自身。 5.若BeanPostProcessor(bean后置处理器)和bean关联,则它们的 postProcessBeforeInitialization()方法被调用。 [过滤器举例理解] 6.若bean指定了ini-method方法、,它将被调用。 7.最后,若有BeanPostProcessor和bean关联,则它们的 postProcessAfterInitialization()方法被调用、。
  • 9. 二、装配Bean2.1 容纳你的bean 2.1.3 bean的生命周期(续) 将bean从工厂中删掉有两种方法: 1.若bean实现了DisposableBean接口, distroy()方法被调用。 2.如果指定了定制的销毁方法,就调用这个方法。
  • 10. 二、装配Bean2.1 容纳你的bean 2.1.3 bean的生命周期(续)实例化设置属性值调用BeanNameAware的 setBeanName()方法调用BeanFactoryAware的 setBeanFactory()方法调用BeanPostProcessor的 预初始化方法(before>调用InitializingBean的 afterPropertiesSet()方法调用调用定制的初始化方法调用BeanPostProcessor的 后初始化方法(after) Bean可以使用了 容器关闭调用DisposableBean的 destory()方法调用定制的销毁方法Bean在Spring Bean应用上下文中的生命周期调用ApplicationContextAware 方法setApplicationContext()方法
  • 11. 二、装配Bean2.1 容纳你的bean 2.1.3 bean的生命周期(续)实例化设置属性值调用BeanNameAware的 setBeanName()方法调用BeanFactoryAware的 setBeanFactory()方法调用InitializingBean的 afterPropertiesSet()方法调用调用定制的初始化方法 Bean可以使用了 容器关闭调用DisposableBean的 destory()方法调用定制的销毁方法Bean在Spring Bean工厂中的生命周期
  • 12. 二、装配Bean2.2 基本装配 在spring容器内拼凑bean叫做装配。装 配bean的时候,需要告诉容器哪些bean 以及容器如何使用依赖注入将它们配合在 一起。
  • 13. 二、装配Bean2.2 基本装配 2.2.1 使用XML装配 xml是最常见的spring应用系统配置源。 几种spring容器都支持使用xml装配bean,包括: 1.XmlBeanFactory:调用ClassPathResource载入上下文 定义文件(比如applicationContext.xml)。 2.ClassPathXmlApplicationContext:从类路径载 入上下文定义文件。 3.XmlWebApplicationContext:从web应用上下文 中载入定义文件。
  • 14. 二、装配Bean2.2 基本装配 2.2.1 使用XML装配(续) 上下文定义文件的根元素是.有多 个子元素。每个元素定义了一个 bean如何被装配到spring容器中。
  • 15. 二、装配Bean2.2 基本装配 2.2.2 添加一个bean 对bean的最基本的配置包括bean的ID和他的 全称类名。 bean的id是foo。
  • 16. 二、装配Bean2.2 基本装配-scope prototype、singleton、request 、session、global-session spring中的bean缺省情况下是单例模式。始终返回一个实 例。若想返回不同的实例的话需要定义成原型模式。 bean的singleton属性告诉上下文该bean是否为单例的。缺 省为true。若为false的话,为原型bean。
  • 17. 二、装配Bean2.2 基本装配 2.2.2 添加一个bean(续) 使用原型bean会对性能产生影响,尽量不要设置为prototype,除非有必要。
  • 18. 二、装配Bean2.2 基本装配 2.2.2 添加一个bean(续) 实例化与销毁 spring实例化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。 @PostConstruct public void ini(){…} @PreDestroy public void destroy(){…}
  • 19. 二、装配Bean2.2 基本装配 2.2.2 添加一个bean(续) spring也提供了两个接口来实现相同的功能: InitializingBean和DisposableBean. InitializingBean接口提供了一个afterPropertiesSet()方法。 DisposableBean接口提供了destroy(). 不推荐使用该接口,它将你的bean和springAPI邦定在一起。
  • 20. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖 元素的< property >子元素指明了使用它们的set方法来注入。可以注入任何东西,从基本类型到集合类,甚至是应用系统的bean。
  • 21. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) 简单bean配置 配置bean的简单属性,基本数据类型和string。 tom
  • 22. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) 引用其它bean
  • 23. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) 内部bean 这种方式的缺点是你无法在其它地方重用这个bar实 例,原因是它是专门为foo而用。
  • 24. 二、装配Bean2.2 基本装配 继承 继承配置 覆盖父 Bean配置 可以设置 的abstract 属性为 true, Spring 不会实例化该Bean
  • 25. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) 装配集合 若bean的属性是集合类型,按如下处理: 装配List和数组: bar1
  • 26. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) 装配集合 装配set: set使用方法和list一样,不同的是对象被装配到set 中,而list是装配到List或数组中装配
  • 27. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) 装配map: key值必须是string的,key-ref可以是其他bean
  • 28. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) 装配Properties: bar1 bar2
  • 29. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) 若bean的属性是集合类型,按如下处理: 设置null:
  • 30. 二、装配Bean2.2 基本装配 2.2.3 通过set方法注入依赖(续) Set注入的替代: set注入是一种直接方式,也可通过构造函数设置一些属性值。
  • 31. 二、装配Bean2.2 基本装配 2.2.4 通过构造函数注入依赖 set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选 的,构造注入的优势是通过构造强制依赖关系,不可能实例化不 完全的或无法使用的bean。☞ :如果属性是类类型,则使用 ref=“”
  • 32. 二、装配Bean2.3 自动装配 有四种自动装配类型: 1.byName寻找和属性名相同的bean,若找不到,则装不上。 2.byType:寻找和属性类型相同的bean,找不到,装不上,找到多个抛异常。 3.constructor:查找和bean的构造参数一致的一个或 多个bean,若找不到或找到多个,抛异常。按照参数的类型装配 4.autodetect: (3)和(2)之间选一个方式。不确定 性的处理与(3)和(2)一致。 5.defualt : 这个需要在 6.no : 不自动装配,这是autowrite的默认值. ☞ 说明: 不推荐使用,但是作为授课,我们还是要了解这些知识,面试用的上.
  • 33. 二、装配Bean2.3 自动装配 2.3.1 处理自动装配的不确定性 使用byType和constructor自动装配时,若找到多个符合条件的bean,会报异常,因此最好的方式是不用自动组装。
  • 34. 二、装配Bean2.3 自动装配 2.3.2 混合使用手动和自动组装
  • 35. 二、装配Beanspring2.5 spring2.5提供了配置. 该配置可激活在类中探测到的各种注解,@Required @Autowire @PostConstrct @PreDestroy @Resource @EJB @PersistenceContext @WebServiceRef等等, 也可以选择为这些注解激活单独的后处理器. 例如:AutowiredAnnotationBeanPostProcessor(处理自动装配) CommonAnnotationBeanPostProcessor(生命周期等) 注意:该标记不能激活事务处理.需要使用tx:annotation-driven 这个知识点很有用,在项目中,我们再具体使用。
  • 36. 二、装配Bean2.3 自动装配 2.3.3 缺省自动组装 默认不是自动组装。 通过 可将bean设置为自动组装。
  • 37. 二、装配Bean2.4 使用spring的特殊bean 让spring特殊对待这些bean。使它们可以: 1.通过配置后加工bean,涉及到Bean和Bean工厂生命 周期。 2.改变依赖注入,将字符串转换成其它类型。 3.从属性文本装载信息,包括信息国际化。 4.监听并处理其它bean及spring发布的系统消息。 5.知道自己在spring中的唯一表识。
  • 38. 二、装配Bean2.4 使用spring的特殊bean 2.4.1 对bean进行后处理 BeanPostProcessor接口提供机会来修改bean。 public interface BeanPostProcessor{ //Bean初始化(调用afterPropertiesSet()以及Bean的指 //定initmethod方法)之前被调用。 Object postProcessorBeforeInitialation(…); //在初始化之后马上调用 Object postProcessorAfterInitialization(…); }
  • 39. 二、装配Bean2.4 使用spring的特殊bean 2.4.1 对bean进行后处理(续) 注册后处理Bean 如果使用的是Bean工厂,需要调用工厂的addBeanPostProcessor()来注册. factory.addBeanPostProcessor(…); 如果使用的是上下文同其他Bean一样:
  • 40. 二、装配Bean2.4 使用spring的特殊bean 2.4.2 对bean工厂进行后处理  BeanPostProcessor在bean载入后,对bean进行一些后处理工作。而BeanFactoryPostProcessor在bean工厂载入所有bean的定义后,实例化bean之前,对Bean工厂做一些后处理工作。   public interface BeanFactoryPostProcessor{ public void postProcessorBeanFactory(…); } 如果使用的是应用上下文不需要将他注册为Bean工厂后处理器。上下文会自动注册它。按照正常的Bean声明即可。
  • 41. 二、装配Bean2.4 使用spring的特殊bean 2.4.3 分散配置(有两种方式引入文件) 将配置文件分成几个分散的配置文件。如数据源。 xx/yy/db.properties xx/yy/db2.properties
  • 42. 二、装配Bean2.4 使用spring的特殊bean 2.4.3 分散配置(续) jdbc.properties database.url= database.driver= datebase.username= datebase.password=
  • 43. 二、装配Bean2.4 使用spring的特殊bean 2.4.3 分散配置(续) 使用占位符变量代替bean装配文件中的硬编码配置。占位符采 ${variable}形式。 ${database.url} ......
  • 44. 二、装配Bean2.4 使用spring的特殊bean 2.4.8 感知其他bean 运行在spring容器中的bean不知道自己的注册名,运行在哪里。实现以下三个接口: BeanNameAware:知道自己的名字。 BeanFactoryAware:所处的bean工厂。 ApplicationContextAware:所在上下文
  • 45. 二、装配Bean2.4 使用spring的特殊bean 2.4.8 感知其他bean(续) 知道你是谁 实现BeanNameAware接口。无需为该接口的setBeanName()方法作任何处理,bean被载入时,容器会自动调用该方法,为其设置id或name的值。
  • 46. 二、装配Bean2.4 使用spring的特殊bean 2.4.8 感知其他bean(续) 知道你在哪里 实现BeanFactoryAware(感知)或ApplicationContextAware接口。分别定义了setBeanFactory()和setApplicationContext()方法。
  • 47. 三、创建切面3.1 AOP介绍CourseServiceCourseServiceCourseService安 全事 务其 他
  • 48. aop原理图+案例
  • 49. aop原理图+案例
  • 50. (本页无文本内容)
  • 51. 三、创建切面3.1 AOP介绍 3.1.1 定义AOP术语 1.切面(aspect):要实现的交叉功能,是系统模块化的一个切面或领域。如日志记录。 2.连接点:应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出,或者要修改的 字段。 3.通知:切面的实际实现,他通知系统新的行为。如在日志通知包含了实 现日志功能的代码,如向日志文件写日志。通知在连接点插入到应用系统中。 4.切入点:定义了通知应该应用在哪些连接点,通知可以应用到AOP框架支持的任何连接点。 5.引入:为类添加新方法和属性。 6.目标对象:被通知的对象。既可以是你编写的类也可以是第三方类。 7.代理:将通知应用到目标对象后创建的对象,应用系统的其他部分不用为了支持代理对象而 改变。 8.织入:将切面应用到目标对象从而创建一个新代理对象的过程。织入发生在目标 对象生命周期的多个点上: 编译期:切面在目标对象编译时织入.这需要一个特殊的编译器. 类装载期:切面在目标对象被载入JVM时织入.这需要一个特殊的类载入器. 运行期:切面在应用系统运行时织入.通知程序执行切 入连接点通知切 入
  • 52. 三、创建切面3.1 AOP介绍 3.1.2 SpringAOP实现 用java编写spring通知 在spring中所有的通知都是以java类的形式编写的。切入点定义在配置文件中编写,所以切面代码和配置文件对我们来说都很熟悉。 对于其他框架(Aspectj),需要特定的语法编写,如果使用的话,还需学习新的语言。
  • 53. 三、创建切面3.1 AOP介绍 3.1.2 SpringAOP实现(续) spring的运行时通知对象 spring在运行期创建代理,不需要特殊的编译器. spring有两种代理方式: 1.若目标对象实现了若干接口,spring使用JDK的 java.lang.reflect.Proxy类代理。该类让spring动态产生 一个新类,它实现了所需的接口,织入了通知,并且代理对 目标对象的所有请求。 2.若目标对象没有实现任何接口,spring使用 CGLIB库生成目标对象的子类。使用该方式时需要注意: 1.对接口创建代理优于对类创建代理,因为会产生更加松耦合的系统。 对类代理是让遗留系统或无法实现接口的第三方类库同样可以得到通知, 这种方式应该是备用方案。 2.标记为final的方法不能够被通知。spring是为目标类产生子类。任何需要 被通知的方法都被复写,将通知织入。final方法是不允许重写的。 spring实现了aop联盟接口。 spring只支持方法连接点:不提供属性接入点,spring的观点是属性拦截破坏了 封装。面向对象的概念是对象自己处理工作,其他对象只能通过方法调用的得到的 结果。
  • 54. 三、创建切面3.2 创建通知通知类型接口描述Aroundorg.aopalliance.intercept. MethodInterceptor拦截对目标方法调用BeforeOrg.springframework.aop. MethodBeforeAdvice在目标方法调用前调用AfterOrg.springframework.aop. AfterReturningAdvice在目标方法调用后调用ThrowsOrg.springframework.aop. ThrowsAdvice当目标方法抛出异常时调用
  • 55. 三、创建切面3.2 创建通知 3.2.1 前置通知 public interface MethodBeforeAdvice{ void before(Method m,Object[] os ,Object target){ } } 该接口提供了获得目标方法、参数和目标对象的机会。不能够改变运行时参数,即不能替换参数对象和目标对象。 注意在方法结束后不返回任何值东西。原因是该接口返回后,目标方法将会被调用,应该返回目标对象的返回值。该接口唯一能 阻止目标方法被调用的途径是抛出异常或(System.exit())。
  • 56. 三、创建切面3.2 创建通知 3.2.1 前置通知(续)public class WelcomeAdvice implements MethodBeforeAdvice{ public void before(Method m,Object[] os,Object target){ Customer c = (Customer)arg[0]; System.out.println(c.getName()); } } --------------------------------------------- //创建目标代理对象 ……KwikEMart welcomeAdvice
  • 57. 三、创建切面3.2 创建通知 3.2.1 前置通知(续) ProxyFactoryBean是一个在BeanFactory中显式创建代理对象的中心类,可以给它一个 要实现的接口、一个要代理的目标对象、一个 要织入的通知,并且他将创建一个崭新的代理 对象。
  • 58. 三、创建切面3.2 创建通知 3.2.2 后置通知 同前置通知类似。 public interface AfterReturningAdvice{ public void afterReturning(Object returnValue,Method m,Object[] os,Object target); }
  • 59. 三、创建切面3.2 创建通知 3.2.3 环绕通知 public interface MethodInterceptor extends Interceptor{ Object invoke(MethodInvocation invocation); } 该接口同前两种通知有两个重要区别:1.该通知能够控制目标方法 是否真的被调用。通过invocation.proceed()方法来调用。 2.该通知可以控制返回的对象。可以返回一个与proceed()方法返回对象完全不同的对象。但要谨慎使用。
  • 60. 三、创建切面3.2 创建通知 3.2.4 异常通知 public interface ThrowsAdvice{ } 该接口为标识性接口,没有任何方法,但实现该接口的类必须要有如下形 式的方法: void afterThrowing(Throwable throwable); void afterThrowing(Method m,Object[] os,Object target,Exception throwable); 第一个方法只接受一个参数:需要抛出的异常。 第二个方法接受异常、被调用的方法、参数以及目标对象。
  • 61. 三、创建切面3.2 创建通知 3.2.5 引入通知 以前定义的通知类型是在目标对象的方法被调用 的周围织入。引入通知给目标对象添加新的方法 和属性。
  • 62. 三、创建切面3.3 定义切入点 如果不能表达在应用系统的什么地方应用 通知的话,通知将毫无用处,这就是切入点的用处。切入点决定了一个特定的类的特定方法是否满足一定的规则。若符合,通知就应用到该方法上。
  • 63. 三、创建切面3.3 定义切入点 3.3.3 使用spring的切入点(续) order* ……xxxService xxxAdvisor
  • 64. 三、创建切面3.3 定义切入点 3.3.3 使用spring的静态切入点(续) 正则表达式切入点 RegexpMethodPointcut符号描述示例匹配不匹配.匹配任何单个字符setFoo.setFooB setFoo setFooBar+匹配前一个字符一次或多次setFoo.+setFooBar setFooBsetFoo*匹配前一个字符0次或多次setFoo.*setFoo setFooB, setFooBar\匹配任何正则表达式符号\.setFoo.bar.setFoosetFoo
  • 65. Spring2.5+Hibernate3.3+Struts1.3整合开发hibernate核心安装包下的: hibernate3.jar lib\required\*.jar lib\optional\ehcache-1.2.3.jar hibernate 注解安装包下的 lib\test\slf4j-log4j12.jar Spring安装包下的 dist\spring.jar dist\modules\spring-webmvc-struts.jar lib\jakarta-commons\commons-logging.jar、commons-dbcp.jar、commons-pool.jar lib\aspectj\aspectjweaver.jar、aspectjrt.jar lib\cglib\cglib-nodep-2.1_3.jar lib\j2ee\common-annotations.jar lib\log4j\log4j-1.2.15.jar Struts 下载struts-1.3.8-lib.zip,需要使用到解压目录下的所有jar,建议把jstl-1.0.2.jar和standard-1.0.2.jar更换为1.1版本。Spring中已经存在一个antlr-2.7.6.jar,所以把struts中的antlr-2.7.2.jar删除,避免jar冲突。 数据库驱动jar
  • 66. Spring2.5+Hibernate3.3+Struts1.3整合开发 * 引入hibernate开发jar包
  • 67. Spring2.5+Hibernate3.3+Struts1.3整合开发 ..... 略 cn/xxx/bean/Person.hbm.xml hibernate.dialect=org.hibernate.dialect.OracleDialect hibernate.hbm2ddl.auto=update hibernate.show_sql=false hibernate.format_sql=false
  • 68. Spring2.5+Hibernate3.3+Struts1.3整合开发实体bean配置模版xxx.hbm.xml
  • 69. Spring2.5+Hibernate3.3+Struts1.3整合开发Hibernate二级缓存的配置 cn/xxx/bean/Person.hbm.xml hibernate.dialect=org.hibernate.dialect.OracleDialect hibernate.hbm2ddl.auto=update hibernate.show_sql=true hibernate.format_sql=false hibernate.cache.use_second_level_cache=true hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider hibernate.generate_statistics=true
  • 70. Spring2.5+Hibernate3.3+Struts1.3整合开发在需要缓存的实体bean配置文件中加入缓存配置项 usage说明了缓存的策略,region指定缓存的区域名
  • 71. Spring2.5+Hibernate3.3+Struts1.3整合开发Ehcache默认的配置文件ehcache.xml(放在类路径下 src目录下即可) defaultCache节点为缺省的缓存策略 maxElementsInMemory 内存中最大允许存在的对象数量 eternal 设置缓存中的对象是否永远不过期 overflowToDisk 把溢出的对象存放到硬盘上 timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉 timeToLiveSeconds 指定缓存对象总的存活时间 diskPersistent 当jvm结束是是否持久化对象 diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
  • 72. Spring2.5+Hibernate3.3+Struts1.3整合开发继续集成struts 1.3 ① 把struts 包引入到项目中 ② 在web-inf 目录下创建 struts-config.xml 文件
  • 73. Spring2.5+Hibernate3.3+Struts1.3整合开发③在web容器中配置struts, struts org.apache.struts.action.ActionServlet config /WEB-INF/struts-config.xml 0 struts *.do
  • 74. Spring2.5+Hibernate3.3+Struts1.3整合开发 ④ 开发相应的action 和 表单.(actionform) ⑤ 完成 struts-config.xml的配置工作
  • 75. Spring2.5+Hibernate3.3+Struts1.3整合开发 ⑥在web容器中实例化spring容器, contextConfigLocation classpath:beans.xml org.springframework.web.context.ContextLoaderListener
  • 76. Spring2.5+Hibernate3.3+Struts1.3整合开发如果action没有交给spring管理时,我们通过下面语句获取spring容器实例 WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext()); 把action交给spring管理后,我们可以使用依赖注入在action中注入业务层的bean。确保action的path属性值与bean的名称相同。 Spring 配置: 在struts配置文件中添加进spring的请求控制器,该请法语控制器会先根据action的path属性值到spring容器中寻找跟该属性值同名的bean。如果寻找到即使用该bean处理用户请求
  • 77. Spring2.5+Hibernate3.3+Struts1.3整合开发org.springframework.web.struts.DelegatingRequestProcessor 的处理过程。 假设用户请求的路径为:/login.do ActionServletDelegatingRequestProcessor请求处理器Spring容器 Action交给了容器管理
  • 78. Spring2.5+Hibernate3.3+Struts1.3整合开发使用spring解决struts1.3乱码问题。 encoding org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 encoding /*
  • 79. Spring2.5+Hibernate3.3+Struts1.3整合开发使用spring解决hibernate因session关闭导致的延迟加载例外问题。 OpenSessionInViewFilter org.springframework.orm.hibernate3.support.OpenSessionInViewFilter OpenSessionInViewFilter /* 启用注解扫描: