SSH搭建
来源:互联网 发布:明治天皇 知乎 编辑:程序博客网 时间:2024/05/21 12:23
前言
SSH分别代表Struts,Spring,Hibernate.
Struts用来响应用户的action,对应到相应的类进行处理。需要struts对应的包。
hibernate:用来把实体类对应到数据库。提供增删改查的基本操作实现。需要hibernate对应的包以及mysql的jdbc驱动包。
spring:
- 管理struts:在xml配置文件中为struts的action进行值注入。
- 管理hibernate:在xml配置文件中配置hibernate的配置信息(dataSource,sessionFactory),即不需要原来的hibernate的xml文件。为hibernate的dao操作注入sessionfactory属性值。
Spring整合Struts2
Spring容器创建
首先需要创建Spring容器,在web应用中创建spring容器有两种方式:
- 直接在web.xml文件中配置spring
- 利用第三方MVC框架的扩展点,创建Spring容器。
第一种方法最常见,为了让Spring容器随web应用的启动而启动,需要借助ServletContextListener监听器完成,该监听器在web应用启动时回调自定义方法来启动spring容器。
spring提供ContextLoaderListener监听类,该类实现ServletContextListener接口,在创建时自动查找WEB-INF下的applicationContext.xml配置文件。
如果只有一个配置文件,在web.xml里如下添加配置代码:
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
如需要指定多个配置文件,或更改配置文件路径,需使用
Spring工厂模式
web应用中,用户请求向控制器发送,控制器拦截到用户请求后,需要调用业务逻辑组件来处理用户请求。而控制器该如何获取业务逻辑组件呢?
过去的策略是,直接通过new关键字创建业务逻辑组件,然后调用逻辑组件的方法,通过其返回值确定结果。这样做降低了代码耦合性,并由于控制器创建组件,会造成控制器与业务逻辑组件分工不明,等。
现在,我们采用工厂模式。将控制器与业务逻辑组件分开,由Spring担任工厂,负责业务逻辑组件的创建与生产。控制器只从spring中获取业务组件。
控制器访问Spring容器中业务逻辑组件的两种策略:
- Spring容器负责管理控制器Action,并利用依赖注入为控制器注入业务逻辑组件。
- 利用Spring的自动装配,Action自动从Spring容器中获取所需的业务逻辑组件。
下面分别介绍两种策略:
1.Spring管理控制器
在这之前,我们需要现在web.xml中配置一下Struts2:
<!-- STR1.定义Struts2核心Filter,说明使用struts过滤器拦截web请求,默认查找src下的struts.xml配置文件 --> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> <!-- 下面的配置信息用来说明:程序中运行的action放置在哪个包下面,对于list.action的请求,它会自动在这个包下面寻找ListAction.class的类 如果没有这句话,那么所有的action请求只能在struts.xml中进行配置。 --> <!-- <init-param> <param-name>actionPackages</param-name> <param-value> com.action </param-value> </init-param>--> </filter> <!-- STR2.下面的配置表示对于所有请求都交给struts来处理。 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Struts2的核心控制器首先拦截用户请求,然后将请求转发给对应的Action处理,在此过程中,Struts2将负责创建Action实例,并调用其execute()方法。而,我们需要将Action实例交给Spring容器管理,不由Struts2产生,这个改变需要由Struts2提供的Spring插件(
struts2-spring-plugin-2.2.1.jar)完成。
Spring插件提供一个伪Action,当我们在struts.xml文件中配置Action时,需要指定其class属性,过去是指定Action实例的实现类。但现在我们需指定为Spring容器中的Bean ID,这样Struts通过Spring容器获取Action对象。
所以,struts配置文件struts.xml为:
<!-- 配置文件根元素 --><struts> <!-- 指定Web应用的默认编码集。该属性对于处理中文请求参数非常有用, 对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312 当设置该参数为GBK时, 相当于调用HttpServletRequest的setCharacterEncoding方法 --> <constant name="struts.i18n.encoding" value="utf-8" /> <!-- 开发模式,如若“false”则为产品模式 --> <constant name="struts.devMode" value="true" /> <!-- 代表了每一个独立的模块 --> <package name="default" namespace="/" extends="struts-default"> <!-- 定义用户请求Action --> <!-- 方法一:Spring管理控制器,class名loginAction为伪控制器,对应spring容器中的Bean实例 --> <action name="loginPor" class="loginAction"> <!-- 逻辑视图配置逻辑页面 --> <result name="error">/error.jsp</result> <result name="success">/success.jsp</result> </action> </package></struts>
在applicationContext.xml中需配置上文Action实例,并将业务逻辑组件注入到实例中:
<!-- 方法一:Spring管理控制器.定义业务逻辑组件,实现类MyServiceImpl --><bean id="myService" class="com.hqs.ssh.service.imp.MyServiceImpl" /><!-- 让Spting管理的Action实例,,,scope变量范围,prototype表示每次对该bean的实例请求都会导致一个新的实例创建 --><bean id="loginAction" class="com.hqs.ssh.action.LoginAction" scope="prototype"> <!-- 依赖注入业务逻辑组件 --> <property name="ms" ref="myService"/></bean>
2.自动装配
该策略下,Action还是Spring插件创建,Spring插件在创建Action实例时,利用自动装配策略,将对应业务逻辑组件注入Action实例。
struts.xml配置:
<!-- 方法二:自动装配,class为Action实现类,与不整合spring配置相同 --> <action name="loginPor" class="com.hqs.ssh.action.LoginAction">
applicationContext.xml配置:
<!-- 方法二:自动装配,id与为所需的业务组件名(即xxxaction.java方法中定义的业务组件名)。缺点:可读性差,不利于解耦 --><bean id="ms" class="com.hqs.ssh.service.imp.MyServiceImpl" />
2015/10/2 10:15:49
Spring整合Hibernate
现在,很少使用JDBC的方式来访问持久层,大部分时候以ORM框架来访问持久层,Hibernate是比较优秀的ORM框架。
DAO模式:所有数据库访问,都通过DAO组件完成,DAO组件封装数据库的增、删、改等操作。
Spring提供如下三个工具类(或接口)来支持DAO组件实现:
- HibenateDaoSupport
- HibernateTemplate
- HibernateCallback
Hibernate配置
当通过Hibernate进行持久层访问时,必须先获得SessionFactory对象,它是单个数据库映射关系编译后的内存镜像。
Hibernate SessionFactory配置示范
<!-- Hibernate整合。HIB1.定义数据源Bean,使用C3P0数据源实现 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- 指定连接数据库的驱动 --> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!-- 指定连接数据库的URL --> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/> <!-- 指定连接数据库的用户名 --> <property name="user" value="root"/> <!-- 指定连接数据库的密码 --> <property name="password" value="root"/> <!-- 指定连接数据库连接池的最大连接数 --> <property name="maxPoolSize" value="40"/> <!-- 指定连接数据库连接池的最小连接数 --> <property name="minPoolSize" value="1"/> <!-- 指定连接数据库连接池的初始化连接数 --> <property name="initialPoolSize" value="1"/> <!-- 指定连接数据库连接池的连接的最大空闲时间 --> <property name="maxIdleTime" value="20"/></bean><!-- HIB2.定义SessionFactory --><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 依赖注入数据源,注入正是上面定义的dataSource --> <property name="dataSource" ref="dataSource"/> <!-- mappingResouces属性用来列出全部映射文件 --> <property name="mappingResources"> <list> <!-- 以下用来列出Hibernate映射文件 --> <value>com/hqs/ssh/domain/User.hbm.xml</value> </list> </property> <!-- HIB3.定义SessionFactory的属性 --> <property name="hibernateProperties"> <!-- 配置Hibernate属性 --> <value> hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect hibernate.hbm2ddl.auto=update hibernate.show_sql=true hibernate.format_sql=true; </value> </property></bean>
在Spring的IoC容器中配置了SessionFactory Bean后,它将随应用启动而加载,并可以将其注入到其他Bean,如DAO组件。一旦DAO组件获取了SessionFactory Bean的引用,就可以访问数据库。
<!-- HIB4.定义DAO Bean--><bean id="userDao" class="com.hqs.ssh.dao.impl.UserDaoImpl"> <!-- 注入持久化操作所需的SessionFactory --> <property name="sessionFactory" ref="sessionFactory"/></bean>
HibernateTemplate
HibernateTemplate提供持久化访问模板化,只需要提供一个SessionFactory的引用,就可以执行持久化操作。
DAO组件的实现基于HibernateTemplate:
public class UserDaoImpl implements UserDao{ //定义一个HibernateTemplate对象,用于执行持久化操作 private HibernateTemplate ht = null; //Hibernate持久化操作所需的SessionFactory private SessionFactory sessionFactory; //依赖注入SessionFactory的setter方法 public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } //初始化HibernateTemplate的方法,执行持久化操作 private HibernateTemplate getHibernateTemplate() { if (ht == null) { ht = new HibernateTemplate(sessionFactory); } return ht; } /** * 加载User实例 * @param id 需要加载的User实例的标识属性值 * @return 指定id对应的User实例 */ public User get(Integer id) { return getHibernateTemplate() .get(User.class, id); } /** * 保存User实例 * @param User 需要保存的User实例 * @return 刚刚保存的User实例的标识属性值 */ public Integer save(User user) { return (Integer)getHibernateTemplate() .save(user); } /** * 修改User实例 * @param User 需要修改的User实例 */ public void update(User user) { getHibernateTemplate().update(user); } /** * 删除User实例 * @param User 需要删除的User实例 */ public void delete(User user) { getHibernateTemplate().delete(user); }}
2015/10/2 10:16:10
参考自:轻量级javaee企业应用实战
- ssh搭建
- 【SSH】搭建
- ssh 搭建
- ssh 搭建
- SSH搭建
- ssh搭建
- ssh 搭建
- SSH搭建
- SSH搭建
- SSH搭建
- SSH搭建
- SSH搭建
- 搭建ssh
- SSH框架搭建
- maven搭建ssh
- ssh框架搭建问题解决
- ssh框架搭建
- 快速搭建ssh框架
- Let the Balloon Rise
- Android视图坐标体系总结
- 二叉树问题总结(一)
- Linux内核:工作队列
- 继承
- SSH搭建
- if语句和循环语句
- 07-图4 哈利·波特的考试
- 面向对象
- 07-图5 Saving James Bond - Hard Version
- PreparedStatement executeBatch()的返回值的问题(转)
- poj3321 树状数组
- SQL连接(内连接、外连接、交叉连接)
- 启动图与app图设置