课程内容

1.       面向接口(抽象)编程的概念与好处

2.       IOC/DI的概念与好处

a)       inversion of control

b)       dependency injection

3.       AOP的概念与好处

4.       Spring简介

5.       Spring应用IOC/DI(重要)

a)       xml

b)       annotation

6.       Spring应用AOP(重要)

a)       xml

b)       annotation

7.       Struts2.1.6 + Spring2.5.6 +Hibernate3.3.2整合(重要)

a)       opensessionInviewfilter(记住,解决什么问题,怎么解决)

8.       Spring JDBC

面向接口编程(面向抽象编程)

1.       场景:用户添加

2.       Spring_0100_AbstractOrientedProgramming

a)       不是AOP:Aspect Oriented Programming

3.       好处:灵活

什么是IOC(DI),有什么好处

1.       把自己new的东西改为由容器提供

a)       初始化具体值

b)       装配

2.       好处:灵活装配

Spring简介

1.       项目名称:Spring_0200_IOC_Introduction

2.       环境搭建

a)       只用IOC

i.             spring.jar , jarkata-commons/commons-loggin.jar

3.       IOC容器

a)       实例化具体bean

b)       动态装配

4.       AOP支持

a)       安全检查

b)       管理transaction

Spring IOC配置与应用

1.       FAQ:不给提示:

a)       window – preferences – myeclipse – xml – xml catalog

b)       User Specified Entries – add

i.             Location:       D:\share\0900_Spring\soft\spring-framework-2.5.6\dist\resources\spring-beans-2.5.xsd

ii.             URI:             file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd

iii.             KeyType:      Schema Location

iv.             Key:              http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

2.       注入类型

a)       Spring_0300_IOC_Injection_Type

b)       setter(重要)

c)       构造方法(可以忘记)

d)      接口注入(可以忘记)

3.       id vs. name

a)       Spring_0400_IOC_Id_Name

b)       name可以用特殊字符

4.       简单属性的注入

a)       Spring_0500_IOC_SimpleProperty

b)       <property name=… value=….>

5.       <bean 中的scope属性

a)       Spring_0600_IOC_Bean_Scope

b)       singleton 单例

c)       proptotype 每次创建新的对象

6.       集合注入

a)       Spring_0700_IOC_Collections

b)       很少用,不重要!参考程序

7.       自动装配

a)       Spring_0800_IOC_AutoWire

b)       byName

c)       byType

d)       如果所有的bean都用同一种,可以使用beans的属性:default-autowire

8.       生命周期

a)       Spring_0900_IOC_Life_Cycle

b)       lazy-init (不重要)

c)       init-method destroy-methd 不要和prototype一起用(了解)

9.       Annotation第一步:

a)       修改xml文件,参考文档<context:annotation-config />

10.   @Autowired

a)       默认按类型by type

b)       如果想用byName,使用@Qulifier

c)       写在private field(第三种注入形式)(不建议,破坏封装)

d)       如果写在set上,@qualifier需要写在参数上

11.   @Resource(重要)

a)       加入:j2ee/common-annotations.jar

b)       默认按名称,名称找不到,按类型

c)       可以指定特定名称

d)       推荐使用

e)       不足:如果没有源码,就无法运用annotation,只能使用xml

12.   @Component @Service @Controller @Repository

a)       初始化的名字默认为类名首字母小写

b)       可以指定初始化bean的名字

13.   @Scope

14.   @PostConstruct = init-method; @PreDestroy = destroy-method;

什么是AOP

1.       面向切面编程Aspect-Oriented-Programming

a)       是对面向对象的思维方式的有力补充

2.       Spring_1400_AOP_Introduction

3.       好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码

a)       Filter

b)       Struts2的interceptor

4.       概念:

a)      JoinPoint  释意:切面与原方法交接点 即 切入点

b)       PointCut  释意:切入点集合

c)       Aspect(切面)释意:可理解为代理类前说明

d)       Advice 释意:可理解为代理方法前说明例如@Before

e)       Target  释意:被代理对象 被织入对象

f)        Weave  释意:织入

Spring AOP配置与应用

1.       两种方式:

a)       使用Annotation

b)       使用xml

2.       Annotation

a)       加上对应的xsd文件spring-aop.xsd

b)       beans.xml <aop:aspectj-autoproxy />

c)       此时就可以解析对应的Annotation了

d)       建立我们的拦截类

e)       用@Aspect注解这个类

f)        建立处理方法

g)       用@Before来注解方法

h)       写明白切入点(execution …….)

i)        让spring对我们的拦截器类进行管理@Component

3.       常见的Annotation:

a)       @Pointcut  切入点声明以供其他方法使用 , 例子如下:

@Aspect

@Component

publicclass LogInterceptor {

   

@Pointcut("execution(public * com.bjsxt.dao..*.*(..))")

publicvoid myMethod(){}

@Around("myMethod()")

publicvoidbefore(ProceedingJoinPoint pjp) throws Throwable{

System.out.println("method before");

pjp.proceed();

}

@AfterReturning("myMethod()")

publicvoid afterReturning() throws Throwable{

System.out.println("method afterReturning");

}

@After("myMethod()")

publicvoid afterFinily() throws Throwable{

System.out.println("method end");

}

}

b)       @Before 发放执行之前织入

c)       @AfterReturning 方法正常执行完返回之后织入(无异常)

d)       @AfterThrowing 方法抛出异常后织入

e)       @After 类似异常的finally

f)        @Around 环绕类似filter , 如需继续往下执行则需要像filter中执行FilterChain.doFilter(..)对象一样 执行 ProceedingJoinPoint.proceed()方可,例子如下:

@Around("execution(* com.bjsxt.dao..*.*(..))")

publicvoidbefore(ProceedingJoinPoint pjp) throws Throwable{

System.out.println("method start");

pjp.proceed();//类似FilterChain.doFilter(..)告诉jvm继续向下执行

}

4.       织入点语法

a)       void !void

b)       参考文档(* ..)

如果execution(* com.bjsxt.dao..*.*(..))中声明的方法不是接口实现则无法使用AOP实现动态代理,此时可引入包” cglib-nodep-2.1_3.jar” 后有spring自动将普通类在jvm中编译为接口实现类,从而打到可正常使用AOP的目的.

5.       xml配置AOP

a)       把interceptor对象初始化

b)       <aop:config

i.             <aop:aspect …..

1.       <aop:pointcut

2.       <aop:before

例子:

<bean id="logInterceptor" class="com.bjsxt.aop.LogInterceptor"></bean>

<aop:config>

<!-- 配置一个切面 -->

<aop:aspect id="point" ref="logInterceptor">

<!-- 配置切入点,指定切入点表达式 -->

<!-- 此句也可放到 aop:aspect标签外依然有效-->

<aop:pointcut

expression=

"execution(public* com.bjsxt.service..*.*(..))"

id="myMethod"/>

<!-- 应用前置通知 -->

<aop:before method="before"pointcut-ref="myMethod" />

<!-- 应用环绕通知需指定向下进行 -->

<aop:around method="around"pointcut-ref="myMethod" />

<!-- 应用后通知 -->

<aop:after-returning method="afterReturning"

pointcut-ref="myMethod"/>

<!-- 应用抛出异常后通知 -->

<aop:after-throwing method="afterThrowing"

pointcut-ref="myMethod"/>

<!-- 应用最终通知  -->

<aop:after method="afterFinily"

pointcut="execution(public* om.bjsxt.service..*.*(..))" />

</aop:aspect>

</aop:config>

Spring整合Hibernate

1.       Spring 指定datasource

a)       参考文档,找dbcp.BasicDataSource

i.             c3p0

ii.             dbcp

iii.             proxool

b)       在DAO或者Service中注入dataSource

c)       在Spring中可以使用PropertyPlaceHolderConfigure来读取Properties文件的内容

2.       Spring整合Hibernate

a)       <bean .. AnnotationSessionFactoryBean>

i.             <property dataSource

ii.             <annotatedClasses

b)       引入hibernate 系列jar包

c)       User上加Annotation

d)       UserDAO或者UserServie 注入SessionFactory

e)       jar包问题一个一个解决

3.       声明式的事务管理

a)       事务加在DAO层还是Service层?

b)       annotation

i.             加入annotation.xsd

ii.             加入txManager bean

iii.             <tx:annotation-driven

例如: <bean id="transactionManager"                   class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<propertyname="sessionFactory">

<refbean="sessionFactory" />

</property>

</bean>

<tx:annotation-driventransaction-manager="transactionManager"/>

iv.             在需要事务的方法上加:@Transactional

v.             需要注意,Hibernate获得session时要使用SessionFactory.getCurrentSession不能使用OpenSession

c)       @Transactional详解

i.             什么时候rollback

1.       运行期异常,非运行期异常不会触发rollback

2.       必须uncheck (没有catch)

3.       不管什么异常,只要你catch了,spring就会放弃管理

4.       事务传播特性:propagation_required

例如:@Transactional(propagation=Propagation.REQUIRED)等同于(@Transactional)

作用,一个方法声明了@Transactional事务后,其内再调用的方法不需要再声明@Transactional.

5.       read_only

例如:@Transactional(propagation=Propagation.REQUIRED,readOnly=true)

当方法声明readOnly=true时,该方法及其调用的方法内都不执行insert update等

d)       xml(推荐,可以同时配置好多方法)

i.             <bean txmanager

ii.             <aop:config

1.       <aop:pointcut

2.       <aop:advisor pointcut-ref advice-ref

iii.             <tx:advice: idtransaction-manager =

iv.             <propertyname="packagesToScan">  可定义扫描目标包下所有实体类

例如: <bean id="sessionFactory"

class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="dataSource"ref="dataSource" />

<propertyname="hibernateProperties">

<props>

<propkey="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>

<propkey="hibernate.show_sql">true</prop>

</props>

</property>

<!--

<propertyname="annotatedClasses">

<list>

<value>com.bjsxt.model.TestUser</value>

<value>com.bjsxt.model.Log</value>

</list>

</property>

-->

<!-- 将参数名称设为packagesToScan 可定义扫描目标包下所有实体类-->

<propertyname="packagesToScan">

<list>

<value>com.bjsxt.model</value>

</list>

</property>

</bean>

//事务管理@transactional的注入

<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<propertyname="sessionFactory">

<refbean="sessionFactory" />

</property>

</bean>

//定义字符串“execution()”为一个变量名,简化

<aop:config>

<aop:pointcut

expression="execution(public* com.bjsxt.service..*.*(..))"

id="myServiceMethod"/>

<aop:advisor pointcut-ref="myServiceMethod"advice-ref="txAdvice"/>

</aop:config>

<tx:adviceid="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="save*" propagation="REQUIRED"/>

<tx:method name="add*" propagation="REQUIRED"/>

<tx:method name="update*" propagation="REQUIRED"/>

<tx:method name="del*"propagation="REQUIRED" />

<tx:method name="cancel*" propagation="REQUIRED"/>

<tx:method name="*" read-only="true" />

</tx:attributes>

</tx:advice>

e)       HibernateTemplate、HibernateCallback、HibernateDaoSupport(不重要)介绍

i.             设计模式:TemplateMethod(模板方法)

ii.             Callback:回调/钩子函数

iii.             第一种:(建议)

1.       在spring中初始化HibernateTemplate,注入sessionFactory

<bean id="hibernateTemplate"

class="org.springframework.orm.hibernate3.HibernateTemplate">

<property name="sessionFactory"ref="sessionFactory" />

</bean>

2.       DAO里注入HibernateTemplate

private HibernateTemplate hibernateTemplate;

@Resource

public void setHibernateTemplate(HibernateTemplatehibernateTemplate) {

this.hibernateTemplate= hibernateTemplate;

}

3.       save写getHibernateTemplate.save();

public void save(TestUser testUser) {

hibernateTemplate.save(testUser);

}

iv.             第二种:

1.       从HibernateDaoSupport继承(此方法不好用可忽略)

2.       必须写在xml文件中,无法使用Annotation,因为set方法在父类中,而且是final的

例如:

首先,新建SuperDAOImpl类(使用Annotation注入--@Component):

@Component

public class SuperDAOImpl {

privateHibernateTemplate hibernateTemplate; //此处定义由spring注入管理

publicHibernateTemplate getHibernateTemplate() {

returnhibernateTemplate;

}

@Resource

public voidsetHibernateTemplate(HibernateTemplate hibernateTemplate) {

this.hibernateTemplate= hibernateTemplate;

}

}

此时,xml中必须要有:

<bean id="hibernateTemplate"

class="org.springframework.orm.hibernate3.HibernateTemplate">

<propertyname="sessionFactory" ref="sessionFactory" />

</bean>

或者,SuperDAOImpl类写成下面代码:

@Component

public class SuperDAOImpl extends HibernateDaoSupport {

@Resource(name="sessionFactory")

public voidsetSuperHibernateTemplate(SessionFactory sessionFactory) {

super.setSessionFactory(sessionFactory);

}

}

对应的xml中则可省略

<bean id="hibernateTemplate"………部分

只要包含

<bean id="sessionFactory"……..部分即可

最后,其他类继承SuperDaoImpl类后便可直接使用HibernateTemplate

@Component("u")

public class UserDAOImpl extends SuperDAOImpl implementsUserDAO {

public voidsave(TestUser testUser) {

this.getHibernateTemplate().save(testUser);

}

}

f)        spring整合hibernate的时候使用packagesToScan属性,可以让spring自动扫描对应包下面的实体类

Struts2.1.6 + Spring2.5.6 +Hibernate3.3.2

1.       需要的jar包列表

jar包名称

所在位置

说明

antlr-2.7.6.jar

hibernate/lib/required

解析HQL

aspectjrt

spring/lib/aspectj

AOP

aspectjweaver

..

AOP

cglib-nodep-2.1_3.jar

spring/lib/cglib

代理,二进制增强

common-annotations.jar

spring/lib/j2ee

@Resource

commons-collections-3.1.jar

hibernate/lib/required

集合框架

commons-fileupload-1.2.1.jar

struts/lib

struts

commons-io-1.3.2

struts/lib

struts

commons-logging-1.1.1

单独下载,删除1.0.4(struts/lib)

struts

spring

dom4j-1.6.1.jar

hibernate/required

解析xml

ejb3-persistence

hibernate-annotation/lib

@Entity

freemarker-2.3.13

struts/lib

struts

hibernate3.jar

hibernate

hibernate-annotations

hibernate-annotation/

hibernate-common-annotations

hibernate-annotation/lib

javassist-3.9.0.GA.jar

hiberante/lib/required

hibernate

jta-1.1.jar

..

hibernate transaction

junit4.5

mysql-

ognl-2.6.11.jar

struts/lib

slf4j-api-1.5.8.jar

hibernate/lib/required

hibernate-log

slf4j-nop-1.5.8.jar

hibernate/lib/required

spring.jar

spring/dist

struts2-core-2.1.6.jar

struts/lib

xwork-2.1.2.jar

struts/lib

struts2

commons-dbcp

spring/lib/jarkata-commons

commons-pool.jar

..

struts2-spring-plugin-2.1.6.jar

struts/lib

2.       BestPractice:

a)       将这些所有的jar包保存到一个位置,使用的时候直接copy

3.       步骤

a)       加入jar包

b)       首先整合Spring + Hibernate

i.             建立对应的package

1.       dao / dao.impl / model / service / service.impl/ test

ii.             建立对应的接口与类框架

1.       S2SH_01

iii.             建立spring的配置文件(建议自己保留一份经常使用的配置文件,以后用到的时候直接copy改)

iv.             建立数据库

v.             加入Hibernate注解

1.       在实体类上加相应注解@Entity @Id等

在字段属性的get方法上加--@Column(name = "表字段名")

2.       在beans配置文件配置对应的实体类,使之受管

vi.             写dao service的实现

vii.             加入Spring注解

1.       在对应Service及DAO实现中加入@Component,让spring对其初始化

2.       在Service上加入@Transactional或者使用xml方式(此处建议后者,因为更简单)

3.       在DAO中注入sessionFactory

4.       在Service中注入DAO

5.       写DAO与Service的实现

viii.             写测试

c)       整合Struts2

i.             结合点:Struts2的Action由Spring产生

ii.             步骤:

1.       修改web.xml加入 struts的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>

2.       再加入spring的listener,这样的话,webapp一旦启动,spring容器就初始化了

如下:

<!-- 指定由spring初始化加载xml配置文件 spring与struts结合必备 -->

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

<!-- 默认寻找xml路径:WEB-INF/applicationContext.xml-->

</listener-class>

</listener>

<!--整个应用的参数服务启动时读取.

可指定spring初始化文件路径位置 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

classpath*:spring/*applicationContext.xml

</param-value>

</context-param>

3.       规划struts的action和jsp展现

4.       加入struts.xml

a)      修改配置,由spring替代struts产生Action对象

5.       修改action配置

a)      把类名改为bean对象的名称,这个时候就可以使用首字母小写了

b)      @Scope(“prototype”)不要忘记

iii.             struts的读常量:

1.       struts-default.xml

2.       struts-plugin.xml

3.       struts.xml

4.       struts.properties

5.       web.xml

iv.             中文问题:

1.       Struts2.1.8已经修正,只需要改i18n.encoding = gbk

2.       使用spring的characterencoding

例:

<!-- 过滤器相关配置 ======== 字符编码过滤======== -->

<filter>

<filter-name>CharacterEncodingFilter</filter-name>

<filter-class>

org.springframework.web.filter.CharacterEncodingFilter

</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

3.       需要严格注意filter的顺序

4.       需要加到Struts2的filter前面

v.             LazyInitializationException

1.       OpenSessionInViewFilter

2.       需要严格顺序问题

3.       需要加到struts2的filter前面

附:

1.

@Autowired 与@Resource 都可以用来装配bean.  都可以写在属性定义上,或写在set方法上

@Autowired (srping提供的) 默认按类型装配

@Resource ( j2ee提供的 ) 默认按名称装配,当找不到(不写name属性)名称匹配的bean再按类型装配.

可以通过@Resource(name="beanName") 指定被注入的bean的名称, 要是指定了name属性, 就用字段名去做name属性值,一般不用写name属性.

@Resource(name="beanName")指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了.

@Autowired 与@Resource可作用在属性定义上,  就不用写set方法了(此方法不提倡);

2.

a.

Action类前加@Component,则Action可由spring来管理,例子如下:

Action中写:

@Component("u") //spring管理注解

@Scope("prototype") //多态

public class UserAction extends ActionSupportimplements ModelDriven{

//内部属性需要有get/set方法且需要set方法前加@Resource或@Autowired

}

Struts2配置文件中写

<action name="u"class="u">

Jsp中

<form method="post"action="u.do" >

b.

Action中也可不加@Component,Action由struts2-spring-plugin管理。此时,如果Action中定义的属性有set方法则@Autowired 与@Resource也可不写,但是如果没有set方法,则需要在属性前加上@Autowired 或@Resource才能生效。

3.

Hibernate如果使用load来查询数据,例如:

Service中:

public User loadById(int id) {

returnthis.userDao.loadById(id);

}

DAO中:

public User loadById(int id) {

return(User)this.hibernateTemplate.load(User.class, id);

}

此时,session(应该说的是Hibernate的session)在事物结束(通常是service调用完)后自动关闭。由于使用的是load获取数据,在jsp页面申请取得数据时才真正的执行sql,而此时session已经关闭,故报错。

Session关闭解决方法:

在web.xml中增加filter—openSessionInView,用于延长session在jsp调用完后再关闭

如下所示:

注意:filter–openSessionInView 一定要在 filter—struts2之前调用

Filter顺序—先进后出!

<filter>

<filter-name>OpenSessionInViewFilter</filter-name>

<filter-class>

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

</filter-class>

<init-param>

<param-name>sessionFactoryBeanName</param-name>

<param-value>sf</param-value>(此处默认指定的sessionFactory应为” sessionFactory” 默认可省略此行如果shring配置文件中配置的sessionFactory为”sf” 则此处需要写sf  一般用不到)

</init-param>

</filter>

<filter-mapping>

<filter-name>OpenSessionInViewFilter </filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<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>

1、导入29个JAR包

JAR包名称

作用

Struts2.1.6(7个)

 

struts2-core-2.1.6.jar

struts2开发的核心类库

freemarker-2.3.13.jar

struts2的UI标签的模板使用freemarker编写

commons-logging-1.0.4.jar

ASF出的日志包,支持Log4J和JDK的日志记录

ognl-2.6.11.jar

对象图导航语言,通过它来读写对象属性

xwork-2.1.2.jar

xwork类库,struts2在其上进行构建

commons-fileupload-1.2.1.jar

文件上传组件,2.1.6版本后必须加入此jar包

commons-io-1.3.2.jar

以后文件上传下载需要

Hibernate3.3.2(13个)

hibernate3.jar

hibernate3开发的核心类库

antlr-2.7.6.jar

解析HQL

commons-collections-3.1.jar

集合框架

dom4j-1.6.1.jar

解析xml

javassist-3.9.0.GA.jar

jta-1.1.jar

junit-4.8.1.jar

Junit test 包

ejb3-persistence.jar

@Entity

Hibernate-annotations.jar

Hibernate-commons-annotations.jar

log4j-1.2.15.jar

是log4j实现类

slf4j-api-1.5.8.jar

标准接口

slf4j-log4j12-1.5.8.jar

是slf4j转换log4j的中间接口

Spring 2.5.6(8个)

spring.jar

Spring核心文件

common-annotations.jar

IOC支持, 例如@resource

aspectjrt.jar

AOP支持:aspectj运行时候需要的

aspectjweaver.jar 

AOP支持:织入

cglib-nodep-2.1_3.jar

动态生成字节码

Commons-dbcp.jar

数据源

commons-po ol.jar

数据源

struts2-spring-plugin-2.1.6.jar

Struts2和Spring结合所需包

commons-logging-1.0.4.jar

Struts2加入了就不需要导入

log4j-1.2.15.jar

Hibernate加入了就不需要导入

数据库包(1个)

mysql-connector-java-3.1.10-bin.jar

MySql的驱动程序

 

2、导入框架的配置文件

SRC目录下的配置文件

log4j.properties

log4j的配置文件,放到SRC根目录下

hibernate.cfg.xml

Hibernate的配置文件

beans.xml

Spring的配置文件

struts.xml

Struts的配置文件

 

WEB-INF下配置文件

web.xml

Struts2和Spring的结合配置

PS:如果需要使用JSTL标签需要导入2个包

   jstl.jar

    standard.jar

3、建立对应的package和对应的接口与类框架

hibernate.cfg.xml

Xml代码

<?xml version='1.0' encoding='GBK'?>

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5. <session-factory>
  6. <!-- MySQL数据库连接设置.端口号不用改。只需修改XXXX-->
  7. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  8. <property name="connection.url">jdbc:mysql://localhost:3306/ssh</property>
  9. <property name="connection.username">root</property>
  10. <property name="connection.password">lee</property>
  11. <!-- 一般不用HIBERNATE的连接池
  12. <property name="connection.pool_size">1</property>
  13. -->
  14. <!--  指定用哪种数据库语言,查文档搜索dialect -->
  15. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  16. <!--<property name="dialect">org.hibernate.dialect.SQLServerDialect</property> -->
  17. <!-- 当前SESSION运行环境的上下文getCurrentSession对应的配置-thread线程。JTA是分布式管理,例如多个数据库-->
  18. <property name="current_session_context_class">thread</property>
  19. <!-- Disable the second-level cache  -->
  20. <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
  21. <!-- 打印自动生成的SQL语句-->
  22. <property name="show_sql">true</property>
  23. <!-- 格式化SQL语句
  24. <property name="format_sql">true</property>-->
  25. <!-- 如果不存在表,自动在数据库里生成,常用的是create,update-->
  26. <property name="hbm2ddl.auto">update</property>
  27. <!-- 定义需要映射的路径
  28. <mapping class="ssh.model.User"/>
  29. -->
  30. </session-factory>
  31. </hibernate-configuration>

beans:xml

Xml代码

  1. <?xml version="1.0" encoding="GBK"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-2.5.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  15. <!--使用Annotation-->
  16. <context:annotation-config />
  17. <!--自动扫描com.bjsxt包下所有写了@Component的类注入进来-->
  18. <context:component-scan base-package="ssh" />
  19. <!--AOP:扫描上面定义自动扫描的路径com.bjsxt目录下的文件,就可以用@Aspect定义切入类-->
  20. <aop:aspectj-autoproxy />
  21. <!--==========================定义数据源==========================-->
  22. <bean id="dataSource"    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  23. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  24. <property name="url" value="jdbc:mysql://localhost:3306/ssh" />
  25. <property name="username" value="root" />
  26. <property name="password" value="lee" />
  27. </bean>
  28. <!--=======================定义sessionFactory====================-->
  29. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  30. <property name="dataSource" ref="dataSource" />
  31. <!-- 将参数名称设为packagesToScan 可定义扫描目标包下所有实体类,告诉sessionFactory哪些类被Entity和注解了 -->
  32. <property name="packagesToScan">
  33. <list>
  34. <value>ssh.model</value>
  35. </list>
  36. </property>
  37. <!--直接导入Hibernate的配置文件。这样才能自动建立数据库表和显示DDL语句。如果上面的配置只能先手动建立数据表然后更新。不能自动创建表-->
  38. <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
  39. </bean>
  40. <!--====================定义Hibernate事务管理器===================-->
  41. <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  42. <property name="sessionFactory" ref="sessionFactory" />
  43. </bean>
  44. <!--<aop:advisor 是
    定义事务的建议,pointcut-ref是上面pointcut的ID,advice-ref是单独的advice,是下面定义
    的 <tx:advice id="txAdvice" -->
  45. <aop:config>
  46. <aop:pointcut id="myServiceMethod" expression="execution(public * ssh.service..*.*(..))"  />
  47. <aop:advisor pointcut-ref="myServiceMethod" advice-ref="txAdvice"/>
  48. </aop:config>
  49. <!--
    定义建议(事务),供<aop:advisor的advice-ref引用,transaction-manager=" txManager "
    引用的是上面定义的事务管理器<bean id="txManager"。   propagation="REQUIRED"可以省略,默认是这
    个-->
  50. <tx:advice id="txAdvice" transaction-manager="txManager">
  51. <tx:attributes>
  52. <tx:method name="add*" propagation="REQUIRED"/>
  53. <!--
  54. <tx:method name="exists" read-only="true" />
  55. -->
  56. </tx:attributes>
  57. </tx:advice>
  58. <!--=========================定义HibernateTemplate===================-->
  59. <!--
    定义后在DAO里注入HibernateTemplate(private HibernateTemplate hibernateTemplate;
    在其Set方法上加@Resource注入),hibernateTemplate里面直接由save、update、delete、load等方法,可
    以直接hibernateTemplate.save(testUser);-->
  60. <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  61. <property name="sessionFactory" ref="sessionFactory"></property>
  62. </bean>
  63. </beans>

struts.xml

Xml代码

  1. <?xml version="1.0" encoding="GBK" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <constant name="struts.devMode" value="true" />
  7. <package name="default" namespace="/" extends="struts-default">
  8. <action name="index" class="mstx.action.UserAction">
  9. <result name="success">/index.jsp</result>
  10. </action>
  11. <action name="user" class="mstx.action.UserAction" method="save">
  12. <result name="success">/success.jsp</result>
  13. </action>
  14. </package>
  15. </struts>
<?xml version="1.0" encoding="GBK" ?>  
<!DOCTYPE struts PUBLIC   
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   
    "http://struts.apache.org/dtds/struts-2.0.dtd">  
  
<struts>  
     <constant name="struts.devMode" value="true" />                     
     <package name="default" namespace="/" extends="struts-default">
        <action name="index" class="mstx.action.UserAction">  
            <result name="success">/index.jsp</result>                     
        </action>  
        <action name="user" class="mstx.action.UserAction" method="save">  
            <result name="success">/success.jsp</result>                      
        </action>  
           
    </package>  
  
</struts>  

web.xml

Xml代码

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <welcome-file-list>
  7. <welcome-file>index.jsp</welcome-file>
  8. </welcome-file-list>
  9. <listener>
  10. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  11. <!-- default: /WEB-INF/applicationContext.xml -->
  12. </listener>
  13. <context-param>
  14. <param-name>contextConfigLocation</param-name>
  15. <!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>  -->
  16. <param-value>classpath:beans.xml</param-value>
  17. </context-param>
  18. <!--中文问题
  19. 1.  Struts2.1.8已经修正,只需要改Struts.xml的i18n.encoding = gbk
  20. 2.  使用spring的characterencoding
  21. -->
  22. <filter>
  23. <filter-name>encodingFilter</filter-name>
  24. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  25. <init-param>
  26. <param-name>encoding</param-name>
  27. <param-value>GBK</param-value>
  28. </init-param>
  29. </filter>
  30. <filter-mapping>
  31. <filter-name>encodingFilter</filter-name>
  32. <url-pattern>/*</url-pattern>
  33. </filter-mapping>
  34. <!--openSessionInView
  35. 此 时,session(应该说的是Hibernate的session)在事物结束(通常是service调用完)后自动关闭。由于使用的是load获取数 据,在jsp页面申请取得数据时才真正的执行sql,而此时session已经关闭,故报错。
  36. Session关闭解决方法:
  37. 在web.xml中增加filter—openSessionInView,用于延长session在jsp调用完后再关闭
  38. -->
  39. <filter>
  40. <filter-name>openSessionInView</filter-name>
  41. <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  42. </filter>
  43. <filter-mapping>
  44. <filter-name>openSessionInView</filter-name>
  45. <url-pattern>/*</url-pattern>
  46. </filter-mapping>
  47. <filter>
  48. <filter-name>struts2</filter-name>
  49. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  50. </filter>
  51. <filter-mapping>
  52. <filter-name>struts2</filter-name>
  53. <url-pattern>/*</url-pattern>
  54. </filter-mapping>
  55. </web-app>
<?xml version="1.0" encoding="UTF-8"?>   
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">   
    <welcome-file-list>   
        <welcome-file>index.jsp</welcome-file>   
    </welcome-file-list>   
  
    <listener>   
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
        <!-- default: /WEB-INF/applicationContext.xml -->   
    </listener>   
  
    <context-param>   
        <param-name>contextConfigLocation</param-name>   
        <!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>  -->   
        <param-value>classpath:beans.xml</param-value>   
    </context-param>   
       
       
    <!--中文问题   
        1.  Struts2.1.8已经修正,只需要改Struts.xml的i18n.encoding = gbk   
        2.  使用spring的characterencoding   
    -->   
    <filter>   
        <filter-name>encodingFilter</filter-name>   
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>   
        <init-param>   
            <param-name>encoding</param-name>   
            <param-value>GBK</param-value>   
        </init-param>   
    </filter>   
       
    <filter-mapping>   
        <filter-name>encodingFilter</filter-name>   
        <url-pattern>/*</url-pattern>   
    </filter-mapping>   
  
  
    <!--openSessionInView   
        此时,session(应该说的是Hibernate的session)在事物结束(通常是service调用完)后自动关闭。由于使用的是load获取数据,在jsp页面申请取得数据时才真正的执行sql,而此时session已经关闭,故报错。   
        Session关闭解决方法:   
        在web.xml中增加filter—openSessionInView,用于延长session在jsp调用完后再关闭   
  
    -->   
    <filter>   
        <filter-name>openSessionInView</filter-name>   
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>   
    </filter>   
       
    <filter-mapping>   
        <filter-name>openSessionInView</filter-name>   
        <url-pattern>/*</url-pattern>   
    </filter-mapping>   
       
    <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>   
       
</web-app> 

4、建立实体类,并加入Hibernate的注解

  1)在实体类上加相应注解@Entity @Id等

2)在字段属性的get方法上加--@Column(name= "表字段名")

User.java

5、定义工具类

1)定义查询返回结果

QueryResult.java

Java代码

  1. package ssh.utils;
  2. import java.util.List;
  3. /*
  4. * 定义查询返回的结果,泛型定义在类上
  5. */
  6. public class QueryResult<T> {
  7. private List<T> resultlist;       //记录查询的结果
  8. private long totalrecord;       //记录查询得到的总条数
  9. public List<T> getResultlist() {
  10. return resultlist;
  11. }
  12. public void setResultlist(List<T> resultlist) {
  13. this.resultlist = resultlist;
  14. }
  15. public long getTotalrecord() {
  16. return totalrecord;
  17. }
  18. public void setTotalrecord(long totalrecord) {
  19. this.totalrecord = totalrecord;
  20. }
  21. }
package ssh.utils;
 
import java.util.List;
 
/*
 * 定义查询返回的结果,泛型定义在类上
 */
public class QueryResult<T> {
  private List<T> resultlist;    //记录查询的结果
  private long totalrecord;    //记录查询得到的总条数
  
  public List<T> getResultlist() {
    return resultlist;
  }
  public void setResultlist(List<T> resultlist) {
    this.resultlist = resultlist;
  }
  public long getTotalrecord() {
    return totalrecord;
  }
  public void setTotalrecord(long totalrecord) {
    this.totalrecord = totalrecord;
  }
}

2)定义分页工具类

PageView.java

Java代码

  1. package ssh.utils;
  2. import java.util.List;
  3. /**
  4. *  在Action里的调用方法
  5. //这里必须要构造新对象,不然刚打开没有currentPage参数传递过来,如果不新建也行,第一次打开必须传递currentPage参数过来
  6. private PageView<T>pageView=new PageView<T>();
  7. public PageView<T> getPageView() {
  8. return pageView;
  9. }
  10. public void setPageView(PageView<T> pageView) {
  11. this.pageView = pageView;
  12. }
  13. int maxresult=1;
  14. int firstindex=(pageView.getCurrentPage()-1)*maxresult;
  15. QueryResult<T> Service.getScrollData(firstindex,maxresult, null, null, null);
  16. pageView.setQueryResult(maxresult,qr);
  17. request.put("pageView", pageView);
  18. */
  19. public class PageView<T> {
  20. /** 分页数据 **/
  21. private List<T> records;
  22. /** 页码开始索引 ,例如显示第1 2 3 4 5 6 7 8 9 ,开始索引为1 **/
  23. private long startIndex;
  24. /** 页码结束索引 ,例如显示第1 2 3 4 5 6 7 8 9 ,结束索引为9 **/
  25. private long endIndex;
  26. /** 总页数 ,没有0页,所以设置默认值为1 **/
  27. private long totalPage = 1;
  28. /** 每页显示记录数 **/
  29. private int maxResult = 10;
  30. /** 当前页 **/
  31. private int currentPage = 1;
  32. /** 总记录数 **/
  33. private long totalRecord;
  34. /** 工具条上显示的页码数量 **/
  35. private int pageBarSize = 8;
  36. // 这只方法触发记录查询结果和总条数
  37. public void setQueryResult(int maxResult,QueryResult<T> qr) {
  38. this.maxResult = maxResult;
  39. this.records = qr.getResultlist();
  40. this.totalRecord = qr.getTotalrecord();
  41. this.totalPage = this.totalRecord % this.maxResult == 0 ? this.totalRecord/ this.maxResult : this.totalRecord / this.maxResult + 1;
  42. /*****************************************************/
  43. this.startIndex = currentPage - (pageBarSize % 2 == 0 ? pageBarSize / 2 - 1 : pageBarSize / 2);
  44. this.endIndex = currentPage + pageBarSize / 2;
  45. if (startIndex < 1) {
  46. startIndex = 1;
  47. if (totalPage >= pageBarSize)
  48. endIndex = pageBarSize;
  49. else
  50. endIndex = totalPage;
  51. }
  52. if (endIndex > totalPage) {
  53. endIndex = totalPage;
  54. if ((endIndex - pageBarSize) > 0)
  55. startIndex = endIndex - pageBarSize +1; //最后一页显示多小条页
  56. else
  57. startIndex = 1;
  58. }
  59. }
  60. public List<T> getRecords() {
  61. return records;
  62. }
  63. public void setRecords(List<T> records) {
  64. this.records = records;
  65. }
  66. public long getStartIndex() {
  67. return startIndex;
  68. }
  69. public void setStartIndex(long startIndex) {
  70. this.startIndex = startIndex;
  71. }
  72. public long getEndIndex() {
  73. return endIndex;
  74. }
  75. public void setEndIndex(long endIndex) {
  76. this.endIndex = endIndex;
  77. }
  78. public long getTotalPage() {
  79. return totalPage;
  80. }
  81. public void setTotalPage(long totalPage) {
  82. this.totalPage = totalPage;
  83. }
  84. public int getMaxResult() {
  85. return maxResult;
  86. }
  87. public void setMaxResult(int maxResult) {
  88. this.maxResult = maxResult;
  89. }
  90. public int getCurrentPage() {
  91. return currentPage;
  92. }
  93. public void setCurrentPage(int currentPage) {
  94. this.currentPage = currentPage<1?1:currentPage;  //如果当前页为0,则显示第一页
  95. }
  96. public long getTotalRecord() {
  97. return totalRecord;
  98. }
  99. public void setTotalRecord(long totalRecord) {
  100. this.totalRecord = totalRecord;
  101. }
  102. public int getPageBarSize() {
  103. return pageBarSize;
  104. }
  105. public void setPageBarSize(int pageBarSize) {
  106. this.pageBarSize = pageBarSize;
  107. }
  108. }

马士兵 spring 视频笔记的更多相关文章

  1. 尚学堂马士兵struts2 课堂笔记(一)

    06_尚学堂马士兵_Struts2_Struts2_HelloWorld_5 <constant name="struts.devMode" value="true ...

  2. 尚学堂马士兵struts2 课堂笔记(三)

    19-20 简单数据验证 例如 前台jsp 及struts.xml <a href="user/user!add?name=a" >添加用户</a> < ...

  3. 马哥教育视频笔记:01(Linux常用命令)

    1.查看缓存中使用的命令和命令路径 [wskwskwsk@localhost /]$ hash 命中 命令 /usr/bin/printenv /usr/bin/ls /usr/bin/clear 2 ...

  4. 尚学堂马士兵Oracle教程笔记

    检查Oracle安装 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba 然后,解除对scott用户的锁 alter user scott account ...

  5. 尚学堂马士兵struts2 课堂笔记(四)

    27 结果类型 主要就四种种 dispatch和rediret chain和drdirectaction <package name="resultTypes" namesp ...

  6. 尚学堂马士兵struts2 课堂笔记(二)

    14通配符问题 其实这个问题看一个例子就ok <package name="actions" extends="struts-default" names ...

  7. Hibernate 马士兵 学习笔记 (转)

    目录(?)[+] 第2课 Hibernate UML图 第3课 风格 第4课 资源 第5课 环境准备 第6课 第一个示例Hibernate HelloWorld 第7课 建立Annotation版本的 ...

  8. 马士兵hibernate(原始笔记)

    马士兵hibernate(原始笔记) 课程内容 1        HelloWorld a)   Xml b)   annotation 2        Hibernate原理模拟 - 什么是O/R ...

  9. 局域网聊天Chat(马士兵视频改进版)

    Github地址: https://github.com/BenDanChen/Chat Chat 小小的聊天系统,主要是跟着网上的马士兵老师的公开视频然后再自己反思有什么地方需要改进的地方,然后大体 ...

随机推荐

  1. Android开发之自定义Toast(带详细注释)

    因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...

  2. 在电脑上查看小米手机连接wifi时保存的密码

    手机连接的wifi,想另一个手机也连上,密码忘了. 先备份手机的资料,然后将手机连上电脑,在SD卡上MIUI-backup-allbackup文件夹中, 找到刚才备份的文件夹 点进去找到WLAN设置. ...

  3. 解决 win 7 64 位 vs2010 调试silverlight项目无法加载,提示更新developer ,跟新报 消息 ID: 1517 已安装了 Silverlight 的 64 位版本

    出现上面的问题是我们安装的silverlight的版本和系统给的silverlight下载的版本冲突, 解决的方法是,首先卸载Silverlight runtime(也就是默认的silverlight ...

  4. PAT 1022 D进制的A+B (20)(20 分)

    输入两个非负10进制整数A和B(<=2^30^-1),输出A+B的D (1 < D <= 10)进制数. 输入格式: 输入在一行中依次给出3个整数A.B和D. 输出格式: 输出A+B ...

  5. phpstorm+xdebug调试代码

    1工具 #phpstorm 前面有文章介绍如何安装 #phpStudy 官网下的2018最新的安装包,php环境使用的也是最新的php7.0nts 2开启php Xdebug拓展 开启拓展,phpSt ...

  6. 洛谷1462(重题1951) 通往奥格瑞玛的道路(收费站_NOI导刊2009提高(2))

    1462原题链接 1951原题链接 显然答案有单调性,所以可以二分答案,用\(SPFA\)或\(dijkstra\)跑最短路来判断是否可行即可. 注意起点也要收费,\(1462\)数据较水,我一开始没 ...

  7. Ubuntu 双网卡设置

    闲话不多说,直接正题 因为chinanet信号不强,所以买了个usb无线网卡,平常又要做开发,要连着开发板,不知怎么回事,一旦自带无线网卡连上内网的无线路由,就不能访问外网了. 网上搜了好久,终于查到 ...

  8. spring colud 博客

    https://blog.csdn.net/forezp/article/details/70148833

  9. 原生js的dom操作

    父节点parentNode 第一个子节点 只会获取到元素节点 firstElementChild ★★★★★    ​ 第一个子节点 (如果有文本节点将会获取到文本节点) firstChild ​ 最 ...

  10. Python : locals and globals

    Python有两个内置的函数,locals() 和globals(),它们提供了基于字典的访问局部和全局变量的方式.Python使用叫做名字空间的东西来记录变量的轨迹.名字空间只是一个 字典,它的键字 ...