SSH框架整合
Posted Sky.宾桀锋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH框架整合相关的知识,希望对你有一定的参考价值。
学习搭建框架有得于对框架的理解,排错也比较有思路。这次文章介绍使用eclipse详细整合Spring、Struts2和Hibernate的过程。
需求:使用SSH框架对用户信息保存到数据库中。
做的过程中会遇到很多问题,一步一步慢慢来,整合完Struts2和Spring后先运行项目测试一下有没有问题再继续。问题比较多的是jar包版本和冲突问题,遇到问题很正常,要耐心查看异常慢慢解决,耐心!!
1. 加入jar包
(1)struts2
(2)hibernate
(3)spring
IOC:spring-beans、spring-context、spring-core、spring-expression、log4j、commons-logging
AOP:spring-aop、spring-aspects、aopalliance、aspectj.weaver
事务管理的包:spring-tx、spring-jdbc
整合Hibernate的包:spring-orm
整合Web项目的包:spring-web
整合Junit单元测试的包:spring-test
连接池:c3p0
(4)日志记录包、数据库连接包、C3P0包
2. 配置文件
(1)struts2: web.xml、struts.xml
(2)hibernate: hibernate.cfg.xml(核心文件)、XX.hbm.xml(映射文件)。其中hibernate.cfg.xml文件在SSH整合中可以被省略。
(3)spring: applicationContext.xml、web.xml(配置核心监听器)
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SSH</display-name> <!-- struts2的框架核心过滤器配置 --> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Spring框架的核心监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> </web-app>
3. 创建包结构和实体类。
(1)包结构有4个:action、service、dao、entity。这个顺序也是调用的顺序,action调用service, service调用dao...
(2)在entity包中创建用户实体类: User.java
package com.jmu.ssh.entity; /** * 实体类:用户 * * @author Sky * @date 2017年3月10日 下午10:07:16 */ public class User { private String name; private String password; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
4. Struts2整合Spring框架
编写UserAction、UserService、UserDao的类,并在applicationContext.xml中配置bean。因为在类中有提供setter方法,所以配置的bean可以按名称自动完成注入。
UserAction.java
package com.jmu.ssh.action; import com.jmu.ssh.entity.User; import com.jmu.ssh.service.UserService; import com.opensymphony.xwork2.ActionSupport; /** * action层注入service类 * * @author Sky * @date 2017年3月11日 下午8:06:07 */ public class UserAction extends ActionSupport { private static final long serialVersionUID = 1L; private User user; //前台传过来的对象 private UserService userService; /* * 按名称来完成注入UserService */ public void setUserService(UserService userService) { this.userService = userService; } @Override public String execute(){ userService.saveUser(user); System.out.println("UserAction中的execute执行了..."); return null; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
UserSerivce.java
package com.jmu.ssh.service; import com.jmu.ssh.dao.UserDao; import com.jmu.ssh.entity.User; /** * UserService类,调用UserDao * service层注入dao类 * * @author Sky * @date 2017年3月11日 下午8:02:26 */ public class UserService { private UserDao userDao; /* * 提供setter方法来注入UserDao */ public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void saveUser(User user) { System.out.println("UserService中的create方法执行了..."); userDao.saveUser(user); } }
UserDao.java
package com.jmu.ssh.dao; import com.jmu.ssh.entity.User; public class UserDao { public void saveUser(User user) { System.out.println("Dao中的saveUser方法执行了..."); } }
前台addUser.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>保存用户页面</title> </head> <body> <form action="userAction" method="post"> 用户名:<input name="name" type="text"/> 密码:<input name="password" type="password"/> 邮箱:<input name="email" type="text"/> <button>提交</button> </form> </body> </html>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置Action的类,把action交给spring管理 --> <bean id="userAction" class="com.jmu.ssh.action.UserAction" scope="prototype"> <!-- 手动注入Service --> <property name="userService" ref="userService"></property> </bean> <!-- 配置Service的类 --> <bean id="userService" class="com.jmu.ssh.service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <!-- 配置Dao类 --> <bean id="userDao" class="com.jmu.ssh.dao.UserDao"> </bean> </beans>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="ssh" namespace="/" extends="struts-default"> <!-- action的类由Struts2自身来创建 <action name="userAction" class="com.jmu.ssh.action.UserAction" method="execute"> --> <!-- action的类交给Spring框架来创建,方便aop操作 --> <action name="userAction" class="userAction" method="execute"> </action> </package> </struts>
Struts2和Spring有两种整合方式:
(1)action的类由Struts2自身来创建
在struts.xml中的action的class要写全类名(包括包名),在applicationContext.xml中不需要配置action的bean。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="ssh" namespace="/" extends="struts-default"> <!-- action的类由Struts2自身来创建 --> <action name="userAction" class="com.jmu.ssh.action.UserAction" method="execute"> </action> </package> </struts>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置Service的类 --> <bean id="userService" class="com.jmu.ssh.service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <!-- 配置Dao类 --> <bean id="userDao" class="com.jmu.ssh.dao.UserDao"> </bean> </beans>
(2)action的类交给Spring框架来创建(建议使用,方便aop操作)
在struts.xml中的action的class写applicationContext.xml中配置的action类bean即可。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="ssh" namespace="/" extends="struts-default"> <!-- action的类交给Spring框架来创建,方法aop操作 --> <action name="userAction" class="userAction" method="execute"> </action> </package> </struts>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置Action的类,把action交给spring管理 --> <bean id="userAction" class="com.jmu.ssh.action.UserAction" scope="prototype"> <!-- 手动注入Service --> <property name="userService" ref="userService"></property> </bean> <!-- 配置Service的类 --> <bean id="userService" class="com.jmu.ssh.service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <!-- 配置Dao类 --> <bean id="userDao" class="com.jmu.ssh.dao.UserDao"> </bean> </beans>
可以启动服务器查看方法是否都执行
5. Spring整合Hibernate
(1)创建映射文件.hbm.xml
在entity包中创建对应的映射文件: User.hbm.xml(小技巧:选中实体类User.java再右键创建时会自动生成约束和内容)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2017-3-10 22:15:16 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.jmu.ssh.entity.User" table="USER1"> <id name="name" type="java.lang.String"> <column name="NAME" /> <generator class="assigned" /> </id> <property name="password" type="java.lang.String"> <column name="PASSWORD" /> </property> <property name="email" type="java.lang.String"> <column name="EMAIL" /> </property> </class> </hibernate-mapping>
(2)创建jdbc.properties文件(数据库连接的基本信息)。单独使用Hibernate的时候,数据库连接的基本信息是放在hibernate.cfg.xml中,和Spring整合不再需要hibernate.cfg.xml文件。
jdbc.properties
jdbc.driverClass=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
jdbc.username=binjf
jdbc.password=123456
(3)Spring配置(applicationContext.xml)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 引入外部的属性文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!-- 配置Hibernate的相关属性,需要spring-orm.jar包 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 注入连接池 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置Hibernate的属性,配置hibernate 的基本信息 --> <property name="hibernateProperties"> <props> <!-- hibernate 所使用的数据库方言 --> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> <!-- 执行操作时是否在控制台打印SQL --> <prop key="hibernate.show_sql">true</prop> <!-- 是否对SQL 进行格式化 --> <prop key="hibernate.format_sql">true</prop> <!-- 指定自动生成数据表的策略。update:数据库中有该表就使用,没表就创建 --> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <!-- 加载Hibernate中的映射文件 --> <property name="mappingResources"> <list> <!-- .hbm.xml的全路径,包名用"/"隔开而不是用"." --> <value>com/jmu/ssh/entity/User.hbm.xml</value> </list> </property> </bean> <!-- 配置Action的类,把action交给spring管理 --> <bean id="userAction" class="com.jmu.ssh.action.UserAction" scope="prototype"> <!-- 手动注入Service --> <property name="userService" ref="userService"></property> </bean> <!-- 配置Service的类 --> <bean id="userService" class="com.jmu.ssh.service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <!-- 配置Dao类 --> <bean id="userDao" class="com.jmu.ssh.dao.UserDao"> </bean> </beans>
此时,可以启动项目验证是否已经在数据库中自动创建表。因为User可以为Oracle数据库的关键字,如果在User.hbm.xml中的table="user"是无法创建的,改为table="user1"即可(或其他名字)。
6. 编写Dao中的代码来操作数据库
package com.jmu.ssh.dao; import org.springframework.orm.hibernate4.support.HibernateDaoSupport; import com.jmu.ssh.entity.User; /** * 继承HibernateDaoSupport可以不用写SessionFactory就可以注入,直接使用Hibernate提供的模板。 * * @author Sky * @date 2017年3月12日 下午12:33:57 */ public class UserDao extends HibernateDaoSupport { /*private SessionFactory sessionFactory; public void setSessionfactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; }*/ SSH 框架整合(maven版本 xml配置方式)SpringMVC+hibernate框架整合源码SSH Dubbo,ZooKeeper