Struts2,Spring3,Hibernate学习笔记
看的李刚的《轻量级JavaEE实战》
-----------Struts2----------
1.Struts2在项目中的配置:首先,web.xml中配置Filter<filter><filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter>,还有<filter-mapping><filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping>(让Struts2的核心Filter拦截所有请求)。其次在类加载路径下配置struts.xml配置文件。
2.StrutsPrepareAndExecutFilter和XxxAction共同构成Struts2的控制器,前者为核心控制器,后者为业务控制器。
3.Struts2的请求-响应开发流程:浏览器发送请求给核心控制器,控制器调用execute方法送给业务控制器,业务控制器访问model层组件返回带逻辑视图名的业务结果,返回到该逻辑视图层,逻辑视图发出响应到核心控制器,最后控制器输出响应回浏览器。
4.Struts2中的属性配置:第一种,Struts.xml中常量设置<constant name="" value="">。第二种,web.xml的filter中配置<init-param><param-name> <param-value></init-parm>。
5.Struts2的标签库:OGNL表达式语言操作:eg.#对象.属性。类似JSTL的标签库。
6.Struts2的类型转换:第一种,字符串到普通常见类型的转换无需处理,Struts2自行转换。第二种,转换复合对象(eg.user.name),需提供(eg.User的无参构造器和name的getter,setter)。第三种,需要自定义转换器(eg.字符串转化为user对象),自定义类继承DefaultTypeConverter类重写convertValue方法。
7.Struts2的输入校验。首先,使用Struts2标签的form表单做输入填写。然后,新建校验配置文件,命名为Action名字-validation.xml,添加校验文件根元素<validators>。
8.输入校验的注解形式:eg.name域的setter/getter前添加@RequiredStringValidator(key="name.requried",message="")和 @RegexFieldValidator(expression="\\w{4,25}",key="name.regex",message="") 即必填和正则两个校验规则。
9.自定义输入校验:重写ActionSupport类的validate()/validateXxx()(XxxAction类)方法。
10.Struts2文件上传:首先,前端在Struts标签添加的form表单里添加属性enctype="multipart/form-data",file name="上传文件名"。其次,继承ActionSupport的Action类添加File的对象file和String声明的uploadFileName,uploadContentType属性,封装文件,文件名和文件类型。最后在Action类中重写execute()方法完成上传步骤。
11.Struts2的内建拦截器机制:首先,StrutsPrepareAndExecuteFilter拦截用户强求后。只要Action继承了struts-default包,Struts2默认启动大量通用功能的拦截器。eg.params拦截器解析HTTP参数并设置Action的属性;servlet-config拦截器将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action;fileUpload拦截器解析请求参数中的文件域并设置成Action的三个属性。
12.Struts的XML配置中配置拦截器:在<package>包的<action>中配置<interceptor-ref name="系统的或自定义的拦截器">。
13.拦截器除了能拦截Action类外,可通过继承MethodFilterInterceptor抽象类拦截方法。
-----------Hibernate----------
1.ORM:对象/关系数据库映射,完成面向对象语言到关系数据库的映射,是应用程序和数据库的桥梁。程序员以面向对象的方式操作持久化对象,ORM框架负责转换成对应的SQL操作。
2.Hibernate推荐使用数据源管理数据库连接而不是DriverManager。
3.使用Hibernate进行持久化操作步骤:开发持久化类,有POJO加映射文件组成。获取Configuration(加载Hibernate配置文件),获取SssionFactory。获取Session,打开事务。用面向对象的方式操作数据库。关闭事务,关闭Session。
4.Hibernate需要properties文件配置和数据库的连接信息,还需要XML映射文件确定持久化类和数据包、之间的对应关系。、
5.SessionFactory:Hibernat的关键对象,是单个数据库映射关系经过编译后的内存镜像,是线程安全的。是生成Session的工厂,本身需要依赖于ConnectionProvider。底层封装DataSource。
6.Session:应用程序与持久储存层之间交互操作的一个单线程对象,是Hibernate持久化操作的关键对象,所有的持久化对象必须在Session管理下进行持久化操作。底层封装了JDBC连接。是Transaction的工厂。
7.持久化对象PO:系统创建的POJO实例,一旦与Session关联并与对应数据表的指定记录,该对象就处于持久化状态。
8.事务Transaction:代表一次原子操作。所有持久化操作在事务管理下进行。
9.事务工厂TransactionFactory:生成Transaction对象实例的工厂。无须应用程序直接访问,负责对底层具体事务实现进行封装、将底层具体事务抽象成Hibernate事务。
10.建立映射文件:映射文件Xxx.hbm.xml下的<hibernate-mapping>,下的<class name="PO中的类">,下配置<id name="PO类中主键名">,属性<property name="PO类中属性" column="数据库中属性名">,集合属性<list cascade="哪些持久化操作会从主表记录级联到子表记录"> <set cascade="哪些持久化操作会从主表记录级联到子表记录">等一对多表类型做级联操作,<many-to-one >多对一级联操作。
11.在映射文件中创建、删除触发器、存储过程等数据库对象:<database-object>。
12.映射自定义类组件属性:<component class="自定义类">(<property>下的属性只能是基本类型)。
13.映射复合主键:第一种:<conposite-id class="主键生成的类" key-property name="主键类下各属性">。第二种:多列直接做主键,条件是实现序列化并重写equals()和hashCode()方法,再<conposite-id key-property name="主键类下各属性">。
14.对于关联实体而言,Hibernate默认不会启用级联操作,须在配置关联映射时通过cascade属性来指定。
15.持久化类有继承关系:采用subclass元素的继承映射。首先,<class>下增加<discriminator>来区分每行记录到底是哪个类的实例,称为辨别者列。同时,使用<subclass>(相当于又建了一个<class>)来映射子持久化类。
16.Hibernate批量处理:通过循环i,达到一定值session.flush(),session.clear(),清空Session缓存。
17.HQL语言与SQL语言区别。可使用HQL语句进行分页查询。
18.联系数据库:第一种,DAO中用HQL语言调用。第二种:配置文件中配置SQL查询<sql-query/insert等>
19.过滤器产生SQL中where功能。
20.二级缓存:首先开启,在配置中设置<property name="hibernate.cache.use_second_level_cache">true</property>。再设置二级缓存的实现类,同样在属性添加<property name="hibernate.cache.provider_class">org.hibernat.cache.EhcacheProvider</property>。然后添加二级缓存jar包。最后配置ehcache.xml的配置文件。
21.Hibernate的拦截器及事件机制。
-----------Spring----------
一。SpringIOC
1.Spring IOC(解耦):1.面向接口解耦 2.spring容器通过反射实例化 3.spring通过注解或XML创建实例
二。Spring对Bean的管理
2.Spring核心接口ApplicationContext:BeanFactory和ApplicationContext(ApplicationContext是BeanFactory的子接口),都可代表Spring容器。Spring中所有组件都被当做Bean处理,包括数据源、Hibernate的sessionFactory、事务管理器等。Web应用启动时自动加载ApplicationContext实例。ApplicationContext容器初始化完成后,容器中所有singleton Bean也实例化完成(可通过设置取消懒加载模式取消)。ApplicationContextmessageSource的bean支持国际化,即被调用可完成翻译。ApplicationEvent和ApplicationListener接口实现ApplicationContext的事件处理,基于观察者设计模式实现。
3.开发者只要在web.xml中配置一个Listener,就会初始化Spring容器,前端MVC框架可以直接使用spring容器。
4.ApplicationContextAware让bean有了直接访问容器的能力,污染了代码,导致代码和Spring接口耦合。
5.Spring创建bean默认使用singleton模式。prototype(原型模式)为每次创建新对象。request和session模式需在web.xml中listener或filtr配置;若采用SpringMVC即用DispatcherPortlet拦截用户请求,无须做配置。
6.Bean自动装配设置property:by name:bean中成员名和property名同。不鼓励自动装配:导致bean和bean之间耦合度降低到代码层次,不利于高层次解耦。
7.bean中factory-method设置设置静态方法:class属性不再是Bean实例的实现类,而是生成bean实例的静态工厂,使用factory-method="静态方法名"指定生成bean实例的静态工厂方法。
8.bean中factory-method设置设置实例方法:不加class属性,因为spring容器不再直接实例化该bean,仅仅调用实例工厂的工厂方法,工厂方法创建bean实例。加factory-bean制定方法所在类。
9.两种工厂区别:调用实例工厂方法创建bean须将实例工厂配置成bean实例,静态工厂不用。
10.Spring中bean的继承是实例之间的关系,因此主要表现为参数值的延续;java中继承是类之间的关系,主要表现为方法、属性的延续。
11.协调作用域不同步的bean:eg.A类(singleton)依赖B类(prototype),则在A类代码中声明返回值为new B()的抽象方法,并在边属性中加上<lookup-method name="抽象方法名" bean="获取的新B类对象">。
12.PropereyPathFactoryBean类:class="它",可返回已经配置的bean的某属性。相反的,要将基本类型数据属性值定义为bean实例,则<property name="targetBeanName" value="来自哪个bean的属性"> <property name="propertyPath" value="目标bean的哪个属性(可采用属性.属性的复合属性形式)">。
13.FactoryBean是特殊的bean(后缀带这个),返回值不一定是bean的实例,可以是要求的某个类型的值。
14.FieldRetrevingFactoryBean:将其他bean的Field值注入其他bean或者定义成新的bean。
15.MethodInvokingFactoryBean:指定方法返回值注入成目标bean的属性值或者定义成新的bean。
三。Schema配置
16.p名称空间:代替property属性。
17.Schema由Springjar包中spring-XXX-版本号xsd配置。Schema里的属性可用来包装成bean。
四。SPEL语法
18.SPEL:XML和Annotation中可使用,用法为在表达式或对象外增加#{}。使用SPEL可以在配置文件中调用方法,创建对象(代替嵌套bean)。
19.SPEL提供特殊运算符:T(),用于将该运算符内字符串当成类处理。
20.SPEL特殊语法:XXX.?xx:只有XXX非null才调用xx。
21.SPEL特殊语法:XXX.!xx:对xx做迭加。
五。Spring的注解配置
22.类注解:@Component(所有类型bean),@Repository(DAO),@Services(service),@Controller(controller)
23.自动扫描:(有schema/context为条件)<context:component-scan base-package="bean类">,
可添加<include-filter>和<exclude-filter>属性判断是否被扫描。<context:property-placeholder location="classpath:XXX.properties">引入属性参数文件,只能一次加载配置。
24.注解指定作用域:@Scope。
25.@Component声明的bean中配置依赖:@Resource。
26.注解声明周期行为:@PostConstruct:init-method指定bean的初始化方法,@Destroy-method指定bean销毁之前的方法
27.@DependsOn:强制初始化其他bean。@Lazy:取消预初始化。、
28.@Autowired:自动搜索容器中其他bean实例,并将其设置成该bean的Field值。使用@Qualifier("bean名")精确装配。
六。配置路径
29.Resource接口的实现类获取XML配置信息。
30.classpath*:前缀来指定XML配置,系统将搜索src下所有与文件名匹配的文件,分别装载配置,最后合并成一个ApplicationContext。
31.“file:bean.xml”:相对路径下的配置;“file:/bean.xml”:绝对路径下的配置。
七。SpringAOP
32.AOP:切面(Aspect):业务流程运行某个特定步骤;连接点(Joinpoint):方法的调用或异常的抛出;增强处理(Advice):切入点执行的增强处理,有around,before,after类型;切入点(Pointcut):插入增强处理的连接点
33.spring下操作三部分:定义普通业务组件,定义切入点(横切多个业务组件),定义增强处理。
34.AOP处理对象的方法=增强处理+被代理对象的方法。
35.自定义切面类:首先在配置文件开启@AspectJ支持(<aop:aspectj-autoproxy/>)(注意不要和<aop:config/>同时用)和自动搜索<context>,使用@Aspect标注Java类作为切面bean,使用@before(pointcut="execution(* com.roren.service.impl.*.*(..))")等。
36.访问目标方法参数:第一种:将第一个形参定义为JoinPoint类型,方法内通过getXXX()返回目标方法信息。第二种:eg.@before(pointcut="execution(* com.roren.service.impl.*.*(..))" && args(msg1,msg2)),在切面方法中通过形参限定两个msg。
37.@Before,@Around,@AfterReturning,@After四种增强处理中都可访问被增强的目标对象,目标方法和方法参数,但只有Around可以改变方法参数。
38.四种增强优先级(高的后执行):由低到高是Before,Around,AfterReturning,After。
39.execution开头的切点修饰符格式:execution(方法修饰符 方法所在类 指定方法名 (方法声明中的形参列表) 方法声明抛出的异常),实际就跟声明方法格式一样。都支持通配符*,行参列表支持两个通配符:“*”和“..”,后者代表零个或多个任意类型参数。
40.XML中配置AOP:<aop:config>
41.config中配置切面:<aop:aspect>,属性为id,ref(引用bean作为切面bean),order(指定优先级),<aop:after等 pointcut=execution表达式 and args(形参们) method="前面中增强处理方法">。
42.config中配置切入点:<aop:pointcutid="",expression="execution表达式">,这样在切面的增强处理可写pointcut-ref="该切点"。
八。Spring事务管理与AOP的结合
43.Spring事务管理模式:策略模式(PlatformTransactionManager代表事务管理接口,但spring不知道底层如何管理,它只要求事务管理需要提供开始事务(getTransaction()),提交事务(commit()),回滚事务(rollback())三个方法,具体实现交给实现类完成)。
44.配置JDBC数据源的事务管理器,该class类实现PlatformTransactionManager。eg.<bean id="transactionManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" <property name="dataSource" ref="ds">>(之前配置ds为数据源bean)。
45.Spring事务管理总结为两种方式:直接获取PlatformTransactionManager接口实例作为transactionManager Bean或通过TransactionTemplate类完成;自定义书写AOP配置事务代理。
46.Spring 1.X的局部事务管理(某个bean的需要):eg.<bean id="" class="org.springframework.transaction.interceptor.transactionPorxyFactoryBean" <property name="transactionManager" ref="transactionManager"> <property name="target" ref="要管理的bean"> <property name="transactionAttributes" <pro key="*">PROPAGATION_REQUIRED<prop/>(指定事务属性)>>。
47.事务传播规则(即事务属性):由transactionAttributes属性指定,主要有REQUIRED(要求在事务环境中执行当前方法,如果当前执行线程已处于事务中,则直接调用,不处于则启动新的事务后执行该方法),SUPPORTS(如果当前执行线程处于事务中,则使用当前事务,否则不使用事务)。
48.Spring 2.X的局部事务管理:XML Schema提供了tx命名空间配置,直接使用<tx:advisor.../>启动自动代理,advisor相当于AOP中Aspect切面。eg.<tx:advice id="txAdvice" transaction-manager="transactionManager"(之前配置了装配dataSource的PlatformTransactionManager实现类) <tx:attributes (配置详细事务语义)>>,然后配置AOP<aop:config <aop:pointcut expression="execution表达式"> <aop:advisor advice-ref="txAdvice"(上边的tx配置)> pointcut-ref="">
49.配置<tx:advice.../>元素时除了需要一个transaction-manager属性外,需要配置一个<attributes.../>,该元素包含多个<method.../>元素,修饰事务语义,包括事务传播属性、隔离属性、超时属性、只读事务等。配置属性为:name(与该事务语义关联的方法名,例如“get*”),propagation(与上事务传播同),roll-for(触发事务回滚的异常类)
50.事务管理的注解形式:先<tx:annotation-driven transaction-manager=""/>声明注解,再在需要处理的component的方法前添加@Transactionl(propagation等)。
九。Spring在项目中的配置
51.Spring框架的配置:web.xml中配置Listener <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>。
52.配置文件的载入:第一种:<context-parm <param-name>contextConfigLocation</param-name>(必须指定为这个名字) <param-value>一个或多个配置文件的路径<param-value>>。第二种:没有使用contextConfigLocation指定配置文件,则Spring自动查找applicationContext.xml配置。
53。控制器Action层如何访问到Spring容器中的业务逻辑组件:第一种,Spring容器管理控制器Action,并依赖注入为控制器注入业务逻辑组件。第二种,利用Spring的自动装配,Action自动从Spring获取所需业务逻辑组件。
十。Spring整合Struts
54.Spring整个Struts的控制器Action,使用49点的第一种方法,在Struts中配置的控制器只是伪控制器,对应于Spring容器中的bean实例。即当使用Spring容器团里系统的Action时,struts.xml配置的action的class属性并不是指向该Action的实现类,而是指定了Spring容器中的Action实例的id。因此,除了在Struts.xml中配置action之外,还应该在Spring容器中配置Action实例,将业务逻辑组件注入到Action实例中。当Spring管理Struts2的Action时,一定要配置scope属性,因为Action里包含了请求的状态信息,所以必须为每个请求对应一个Action,所以不能将Action实例配置成单例模式。
十一。Spring整合Hibernate
55.就Hibernate的持久层访问技术而言,Spring提供了三个工具类或接口来支持DAO组件的实现:HibernateDaoSupport,HibernateTemplate,HibernateCal
lback。
56.Spring配置Hibernate:利用IOC配置SessionFactory Bean一旦DAO的bean组件获得该bean的引用,就可以完成实际的数据库访问。
57.利用HibernateTemplate的实例对象完成增删改查等基本操作。
58.继承HibernateDaoSupport类,借助HibernateTemplate的模板访问方式,使DAO组件代码简洁,且无须理会Session管理。
59.为业务逻辑组件Service层添加事务步骤:针对不同事务策略配置对应事务管理器。使用<tx:advice>配置事务增强处理Bean,配置事务增强处理Bean时使用<method>子元素为不同方法指定相应的事务语义。在<aop:config>元素中使用<aop:advisor>元素配置自动事务代理。