SSH和SSM
来源:互联网 发布:银行软件开发必备知识 编辑:程序博客网 时间:2024/05/22 00:10
这段时间工作量不是太大,自己又是小白,所以赶紧就抽点时间看了看SSM,因为楼主项目所用的框架一直是SSH,所以将一些心得体会记录一下,有什么不足的地方也希望大家能提出并加以补充。那先从SSH说起吧。
SSH是什么?spring+struts+hibernate。
spring又是谁?
它是一个集成了许多第三方框架的东东,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程)。
IOC是做什么的?
我理解为IOC是一种编程思想,利用这种思想可以很好地实现模块之间的解耦。IOC也称为DI(Depency Injection),依赖注入。下面是其中的一种依赖工厂。
<!-- session工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="configLocation" value="classpath:hibernate.cfg.xml"/> <!-- 自动扫描注解方式配置的hibernate类文件 --> <property name="packagesToScan"> <list> <value>com.sh.entity</value> </list> </property> </bean>
AOP又是什么?
AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP。实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在,JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用CGLI B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,至少需要目标类和Advice类。spring提供了这种支持,只需要在spring配置文件中配置这两个元素即可实现代理和aop功能。
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置事务通知属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 定义事务传播属性 --> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="edit*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="new*" propagation="REQUIRED" /> <tx:method name="set*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="change*" propagation="REQUIRED" /> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="load*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" propagation="REQUIRED" read-only="false" /> </tx:attributes> </tx:advice> <!-- 配置事务切面 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* com.sh.service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" /> </aop:config>
说了这么多,spring最主要的地方就是管理事务,而它管理事务有两种方式:第一种是基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。(个人觉得注解的方式更加的方便些)。这是在controller
@Controller("payAction")@Scope(value="prototype")
这里面有个scop,这是表示spring的作用域,有singleton(单例) ,prototype(原型) ,request,session,globalsession这几种,大部分我们用prototype。
再说下struts……….
在没有用框架之前,我们知道servlet,而struts就是一个大大的servlet,我们把这个这个Servlet命名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理。
说一下struts的工作流程:Struts 2的工作流程与WebWork框架基本相同,所以说Struts2是WebWork的升级版本。
基本流程如下:1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。
Struts的工作流程
Struts 2的工作流程与WebWork框架基本相同,所以说Struts2是WebWork的升级版本。
基本简要流程如下:1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。
最后是hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,完成数据持久化的重任。
hibernate的工作原理流程:
原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory
为什么要用hibernate: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2.hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM(对象关系映射)实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
hibernate 在查询的时候是从实体类去查而不是表明。楼主在写项目的时候,习惯于将一些基本的关于hibernate的操作封装为basedao。
package com.sh.dao.impl;import java.io.Serializable;import java.util.List;import javax.annotation.Resource;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.stereotype.Repository;import com.sh.dao.inter.BaseDao;import com.sh.entity.PageBean;@Repository("baseDao")@SuppressWarnings("all")public class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } private Session getCurrentSession() { return sessionFactory.getCurrentSession(); } @Override public Serializable save(T o) { return this.getCurrentSession().save(o); } @Override public void delete(T o) { this.getCurrentSession().delete(o); } @Override public void update(T o) { this.getCurrentSession().update(o); } @Override public void saveOrUpdate(T o) { this.getCurrentSession().saveOrUpdate(o); } @Override public List<T> find(String hql) { return this.getCurrentSession().createQuery(hql).list(); } @Override public List<T> find(String hql, Object[] param) { Query q = this.getCurrentSession().createQuery(hql); if (param != null && param.length > 0) { for (int i = 0; i < param.length; i++) { q.setParameter(i, param[i]); } } return q.list(); } @Override public List<T> find(String hql, List<Object> param) { Query q = this.getCurrentSession().createQuery(hql); if (param != null && param.size() > 0) { for (int i = 0; i < param.size(); i++) { q.setParameter(i, param.get(i)); } } return q.list(); } @Override public List<T> find(String hql, Object[] param, PageBean pageBean) { Query q = this.getCurrentSession().createQuery(hql); if (param != null && param.length > 0) { for (int i = 0; i < param.length; i++) { q.setParameter(i, param[i]); } } return q.setFirstResult(pageBean.getStart()).setMaxResults(pageBean.getPageSize()).list(); } @Override public List<T> find(String hql, List<Object> param, PageBean pageBean) { Query q = this.getCurrentSession().createQuery(hql); if (param != null && param.size() > 0) { for (int i = 0; i < param.size(); i++) { q.setParameter(i, param.get(i)); } } return q.setFirstResult(pageBean.getStart()).setMaxResults(pageBean.getPageSize()).list(); } @Override public List<T> find(String hql, PageBean pageBean) { Query q = this.getCurrentSession().createQuery(hql); return q.setFirstResult(pageBean.getStart()).setMaxResults(pageBean.getPageSize()).list(); } @Override public T get(Class<T> c, Serializable id) { return (T) this.getCurrentSession().get(c, id); } @Override public T get(String hql, Object[] param) { List<T> l = this.find(hql, param); if (l != null && l.size() > 0) { return l.get(0); } else { return null; } } @Override public T get(String hql, List<Object> param) { List<T> l = this.find(hql, param); if (l != null && l.size() > 0) { return l.get(0); } else { return null; } } @Override public Long count(String hql) { return (Long) this.getCurrentSession().createQuery(hql).uniqueResult(); } @Override public Long count(String hql, Object[] param) { Query q = this.getCurrentSession().createQuery(hql); if (param != null && param.length > 0) { for (int i = 0; i < param.length; i++) { q.setParameter(i, param[i]); } } return (Long) q.uniqueResult(); } @Override public Long count(String hql, List<Object> param) { Query q = this.getCurrentSession().createQuery(hql); if (param != null && param.size() > 0) { for (int i = 0; i < param.size(); i++) { q.setParameter(i, param.get(i)); } } return (Long) q.uniqueResult(); } @Override public Integer executeHql(String hql) { return this.getCurrentSession().createQuery(hql).executeUpdate(); } @Override public Integer executeHql(String hql, Object[] param) { Query q = this.getCurrentSession().createQuery(hql); if (param != null && param.length > 0) { for (int i = 0; i < param.length; i++) { q.setParameter(i, param[i]); } } return q.executeUpdate(); } @Override public Integer executeHql(String hql, List<Object> param) { Query q = this.getCurrentSession().createQuery(hql); if (param != null && param.size() > 0) { for (int i = 0; i < param.size(); i++) { q.setParameter(i, param.get(i)); } } return q.executeUpdate(); } @Override public void merge(T o) { // TODO Auto-generated method stub this.getCurrentSession().merge(o); } @Override public Integer executeSql(String sql) { Query q = this.getCurrentSession().createSQLQuery(sql); return q.executeUpdate(); }}
这里包含了hibernate的三种查询方式,可以根据不同需求灵活的去操作。
ssh就简洁说到这里,ssm抽时间总结。希望大家能够补充提出说明。
- SSH和SSM对比
- SSH和SSM流程图
- SSH和SSM
- SSH和SSM对比总结
- SSH和SSM对比总结
- SSH和SSM对比总结
- ssm和ssh到底是什么?
- SSH和SSM对比总结
- SSH和SSM对比总结
- SSH和SSM对比总结
- SSH和SSM对比总结
- SSH和SSM的区别
- SSH和SSM对比总结
- ssh和ssm的对比
- SSH和SSM对比总结
- SSH和SSM对比总结
- SSH和SSM对比总结
- 泛泛谈SSM和SSH
- Linux(CentOS6.5)安装MySQL5.5
- 中文乱码问题解决方案
- 支付宝支付总结
- linux实验--添加硬盘
- 定时脚本任务列子(crontab)
- SSH和SSM
- UVA
- Drools安装傻瓜教程(含Java和Eclipse的安装)
- ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架
- 没有core dump文件如何定位问题
- 14. Longest Common Prefix
- LetNet5卷积参数理解
- C++中结构体与类的区别
- 史上最简单!冒泡、选择排序的Python实现及算法优化详解