重点(难点)
重点(难点)
SSH架构
用户登录
用户注册
SSH整合体验最不好的就是添加jar包,由于三个框架所依赖的jar包非常多,其中有一些jar包可能冲突,我们应该将冲突的jar包,保留高级版本的,删掉低级版本的。
实现步骤
分析
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
contextConfigLocation
classpath:spring.xml,classpath:springDao.xml
org.springframework.web.context.ContextLoaderListener
spring.xml配置
struts.xml配置
success.jsp
login.jsp
提示:
Spring为了避免Struts2中的乱码问题,给我们提供了一个默认的编码过滤器。
字符集过滤器
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
字符集编码
encoding
UTF-8
encodingFilter
/*
SpringDao中用到许多spring的特性,比如aop,tx,context等。所以需要导入schema头文件。
org.gjt.mm.mysql.Driver
root
jdbc:mysql://localhost:3306/test
root
org.hibernate.dialect.MySQL5Dialect
20
5
120
100
120
2
true
classpath:com/lxit/ssh/entities/mapper/*.hbm.xml
org.hibernate.dialect.MySQL5InnoDBDialect
true
true
update
classpath:com/znsd/ssh/bean/*.hbm.xml
org.hibernate.dialect.MySQL5InnoDBDialect
true
true
update
org.springframework.orm.hibernate4.SpringSessionContext
## jdbc 连接配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.41.10:3306/test
jdbc.user=znsd_test
jdbc.password=123456
## c3p0 数据源配置
c3p0.minPoolSize=15
c3p0.maxPoolSize=25
c3p0.acquireIncrement=15
c3p0.checkoutTimeout=10000
c3p0.initialPoolSize=20
c3p0.maxIdleTime=20
c3p0.idleConnectionTestPeriod=60000
属性 | 默认值 | 描述 |
---|---|---|
name(必选) | 必选,与事务关联的方法名,通配符()可以用来指定一批关联到相同的事务属性的方法,如"add"、"get*"、"select*"等。 | |
propagation | REQUIRED | 事务传播行为 |
isolation | DEFAULT | 事务隔离级别 |
timeout | -1 | 超时事件,单位为秒 |
read-only | false | 是否只读 |
事务传播行为类型 | 说明 |
---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。 |
数据库并发操作存在的异常情况:
数据库隔离级别:
public void addEmployee(Employee employee) {
Transaction tx = null;
try {
tx = HibernateUtil.getSession().beginTransaction();
HibernateUtil.getSession().save(employee);
tx.commit();
} catch(RuntimeException re) {
tx.rollback();
throw re;
} finally {
HibernateUtil.closeSession();
}
}
上面的流程化的代码仍显烦琐,可以改为一下代码,Spring的目标是使现有的Java EE技术更易用
public void addEmployee(Employee employee) {
this.getHibernateTemplate().save(employee);
}
常用方法:
(Teacher)this.hibernateTemplate.get(Teacher.class, id);
(List)this.hibernateTemplate().find("from Teacher t where t.age>?", new Integer(age));
this.hibernateTemplate.save(teacher);
实现步骤
问题
分析
OpenSessionInViewFilter
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
OpenSessionInViewFilter
*
org.springframework.web.util.IntrospectorCleanupListener
15
错误原因: 这是因为Spring默认将一个名为"readOnly"的属性设置成为true,导致只能对数据库进行“读”操作,不允许进行“写”操作。
解决: 可以使用hibernateTemplate来解决次问题,配置一个HibernateTemplate将检查读的操作属性(checkWriteOperations)设置为false
public List find(final int page, final int size) {
List result = getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery("from Employee");
query.setFirstResult((page - 1) * size);
query.setMaxResults(size);
return query.list();
}
}
);
return result;
}
public interface BaseDao {
public void add(T t);
public void delete(Serializable id);
public void uodate(T t);
public T load(Serializable id);
public T get(Serializable id);
public List list();
public List list(String hql, Object[] args);
}
public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao {
/**
* 实体类类型(由构造方法自动赋值)
*/
private Class> entityClass = null;
/**
* 构造方法,根据实例类自动获取实体类类型
*/
public BaseDaoImpl() {
entityClass = this.getSuperClassType(getClass());
}
/**
* 通过反射获取T的类型信息实例
*/
protected Class> getSuperClassType(Class> c) {
Type type = c.getGenericSuperclass();
if (type instanceof ParameterizedType) {
Type[] params = ((ParameterizedType) type).getActualTypeArguments();
if (!(params[0] instanceof Class)) {
return Object.class;
}
return (Class>) params[0];
}
return null;
}
@Override
public void add(T t) {
this.getHibernateTemplate().save(t);
}
@Override
public void delete(Serializable id) {
this.getHibernateTemplate().delete(this.load(id));
}
@Override
public void uodate(T t) {
this.getHibernateTemplate().update(t);
}
@Override
public T load(Serializable id) {
return (T) this.getHibernateTemplate().load(entityClass, id);
}
@Override
public List list() {
return createCriteria().list();
}
@Override
public List list(String hql, Object[] args) {
return (List) this.getHibernateTemplate().find(hql, args);
}
@Override
public T get(Serializable id) {
return (T) this.getHibernateTemplate().get(entityClass, id);
}
/**
* 创建与会话绑定的检索标准对象
*/
public Criteria createCriteria(Criterion... criterions) {
return this.createDetachedCriteria(criterions).getExecutableCriteria(this.currentSession());
}
/**
* 创建与会话无关的检索标准对象
*/
public DetachedCriteria createDetachedCriteria(Criterion... criterions) {
DetachedCriteria dc = DetachedCriteria.forClass(this.entityClass);
for (Criterion c : criterions) {
dc.add(c);
}
return dc;
}
}