SSH之IDEA2017整合Struts2+Spring+Hibernate

摘要

IDEA无疑是Java编程的利器,在下面我们将介绍如何使用IDEA来整合SSH(Struts2 + Spring + Hibernate);介绍將分为三个部分来讲,分别是新建工程,Spring引入并测试, Hibernate引入并测试,Struts2引入并测试; 下面使用的IDEA的版本是2017.1

以下的代码和流程大体参考了 SSH只是完善了些细节和修改了部分代码

所有代码均可在 github 下载

另外相关整合还可以参考  maven搭建项目 使用maven可以省去手动解决依赖的问题。

零,预备工作

1) 安装IDEA 

2) 安装MySQL

3) 安装tomcat 参考

4) 建MySQL数据库和表

  1. 建数据库: mysqladmin -u root -p create TESTDB
  2. 建表
    1. CREATE TABLE addresslist (  
    2.     id INT NOT NULL AUTO_INCREMENT,  
    3.     name VARCHAR(40) NOT NULL,  
    4.     phone VARCHAR(40) NOT NULL,  
    5.     PRIMARY KEY ( id )  
    6. );  


一,新建工程

新建工程时,要选择我们使用的框架还有服务器

  1. 点击左侧的Spring
  2. Additional Libraries and Framework里面选择Spring,Web Application, Struts2, Application Server(选择tomcat就可以了),Hibernate;
  3. 点击Next,输入项目名称;完成后等待IDEA下载依赖包

SSH之IDEA2017整合Struts2+Spring+Hibernate


二,Spring的引入和测试

新建完成工程后,为了测试我们的Spring是否引入成功,我们要对IOC进行测试

1. 在src目录下新建一个test包(src->New->package)
2. 在test包下面新建一个TestService.java,代码如下

  1. package test;  
  2.   
  3. /** 
  4.  * Created by kinthon on 17-3-31. 
  5.  */  
  6. public class TestService {  
  7.     private String name;  
  8.   
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.   
  13.     public String getName() {  
  14.   
  15.         return name;  
  16.     }  
  17.   
  18.     public void hello()  
  19.     {  
  20.         System.out.println("hello "+ getName());  
  21.     }  
  22. }  

3,在web/Web-INF目录下新建spring的配置文件applicationContext.xml文件(Web-INF右击->New->XML configuration file->Spring config),然后配置内容如下

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  5.   
  6.        <bean class="test.TestService" id="testService">  
  7.               <property name="name" value="spring"></property>  
  8.        </bean>  
  9. </beans>  

4,在前面的步骤我们已经新建了java类,同时建了bean,接下来我们就是要试试能否通过引用到这个新建的bean.在test包下面我们再建一个文件 test.java,代码如下

  1. package test;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  5.   
  6. /** 
  7.  * Created by kinthon on 17-3-31. 
  8.  */  
  9. public class Test {  
  10.     public static void main(String[] args)  
  11.     {  
  12.         ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");  
  13.         TestService ts = (TestService)ac.getBean("testService");  
  14.         ts.hello();  
  15.     }  
  16. }  

接下来就是直接测试Test的main函数,操作是右击编辑区,点击Run "Test.main()",正常的话,应该会出现如下效果

SSH之IDEA2017整合Struts2+Spring+Hibernate

三,Hibernate引入与测试

1) 使用Hibernate我们还要额外引入一些依赖,要引入的包有mysql-connector-java-5.1.26还有commons-dbcp2-2.1和commons-pool2-2.4.1;引入这些包我们可以直接使用IDEA的maven功能下载依赖包,然后直接引入;操作为 File->project Structure->Libraries->点击右侧的加号->From maven; 然后输入对应的包名就可以了;对于这两个包我们可以直接打勾Download to,它们没有过多的依赖包下载,截图如下

SSH之IDEA2017整合Struts2+Spring+Hibernate

2) 在src下创建bean包,然后建立持久化类.这里主要是使用了IDEA的persistence下的OR映射功能;

a) 建立数据库, 点击 IDEA最左下角的一个按钮,会弹出一些选项,然后选择Database,点击加号,选择Data Source -> MySQL, 进入后进行数据库的信息配置,以你自己的机器为主; 相关截图如下

SSH之IDEA2017整合Struts2+Spring+Hibernate

SSH之IDEA2017整合Struts2+Spring+Hibernate

b) 为了可以使用Persistence的sessionFactory进行生成持久化映射,需要先配置applicationContext.xml,让其接管Hibernate的配置;操作如下,在applicationContext.xml里面加入如下的内容(password的值根据自己的数据库进行配置)如果没有进行这一步的话,在Persistence界面是不会出现sessionFactory的。

  1. <!-- data connection -->  
  2. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">  
  3.     <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>  
  4.     <property name="url" value="jdbc:mysql://localhost:3306/TESTDB"></property>  
  5.     <property name="username" value="root"/>  
  6.     <property name="password" value="××××"/>  
  7. </bean>  
  8.   
  9.   
  10. <!-- session factory -->  
  11. <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
  12.     <property name="dataSource" ref="dataSource"></property>  
  13.     <property name="hibernateProperties">  
  14.         <props>  
  15.             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
  16.             <prop key="hibernate.show_sql">true</prop>  
  17.             <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/TESTDB</prop>  
  18.             <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>  
  19.         </props>  
  20.     </property>  
  21. </bean>  

c) 进行持久化类生成,点击左下角的按钮, 选择Persistence; 在Persistence界面,选择下拉,右击sessionFactory->Generate Persistence Mapping; 相关截图如下;如果没有出现sessionFactory的话,可以下载查看下:http://download.****.net/download/sysushui/9872596

SSH之IDEA2017整合Struts2+Spring+Hibernate

c) 在Generate Persistence Mapping界面, "Choose Data Source"选择我们一开始新建的TESTDB数据库, "Package"选择bean; "Database Schema Mapping"点击我们 建立的addresslist表, 相关截图如下

SSH之IDEA2017整合Struts2+Spring+Hibernate

d)建Service层,在src目录下建service包,在service包下新建一个接口类Address.java和实现类AddressImpl,代码如下

Address.java

  1. package Service;  
  2.   
  3. import bean.Addresslist;  
  4.   
  5. /** 
  6.  * Created by kinthon on 17-3-31. 
  7.  */  
  8. public interface Address {  
  9.     public void add(Addresslist al);  
  10. }  

AddressImpl.java

  1. package Service;  
  2.   
  3.   
  4. import bean.Addresslist;  
  5. import org.hibernate.Session;  
  6. import org.hibernate.SessionFactory;  
  7. import org.hibernate.Transaction;  
  8. import org.springframework.beans.factory.annotation.Autowired;  
  9. import org.springframework.beans.factory.annotation.Qualifier;  
  10.   
  11.   
  12. /** 
  13.  * Created by kinthon on 17-3-31. 
  14.  */  
  15. public class AddressImpl implements Address {  
  16.   
  17.     @Qualifier("sessionFactory")  
  18.     @Autowired  
  19.     private SessionFactory sessionFactory;  
  20.   
  21.     @Override  
  22.     public void add(Addresslist al) {  
  23.         Session s = sessionFactory.openSession();  
  24.         Transaction tx= s.beginTransaction();  
  25.         s.save(al);  
  26.         tx.commit();  
  27.     }  
  28.   
  29.     public void setSessionFactory(SessionFactory sessionFactory) {  
  30.         this.sessionFactory = sessionFactory;  
  31.     }  
  32. }  

e)让Spring接管Hibernate的配置文件,同时建立address服务的bean;目前applicationContext.xml配置如下

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  5.     <bean class="test.TestService" id="testService">  
  6.         <property name="name" value="spring"></property>  
  7.     </bean>  
  8.   
  9.     <!-- data connection -->  
  10.     <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">  
  11.         <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>  
  12.         <property name="url" value="jdbc:mysql://localhost:3306/TESTDB"></property>  
  13.         <property name="username" value="root"/>  
  14.         <property name="password" value="qinkai"/>  
  15.     </bean>  
  16.   
  17.   
  18.     <!-- session factory -->  
  19.     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
  20.         <property name="dataSource" ref="dataSource"></property>  
  21.         <property name="hibernateProperties">  
  22.             <props>  
  23.                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
  24.                 <prop key="hibernate.show_sql">true</prop>  
  25.                 <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/TESTDB</prop>  
  26.                 <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>  
  27.             </props>  
  28.         </property>  
  29.         <property name="mappingLocations">  
  30.             <list>  
  31.                 <value>classpath:bean/Addresslist.hbm.xml</value>  
  32.                 <value>classpath:bean/Addresslist.hbm.xml</value>  
  33.             </list>  
  34.         </property>  
  35.         <property name="annotatedClasses">  
  36.             <list>  
  37.                 <value>bean.Addresslist</value>  
  38.             </list>  
  39.         </property>  
  40.     </bean>  
  41.   
  42.   
  43.     <!--hibernate测试加入-->  
  44.     <bean id="address" class="Service.AddressImpl">  
  45.         <property name="sessionFactory" ref="sessionFactory"></property>  
  46.     </bean>  
  47.   
  48. </beans>  

f)进行测试,修改test包下的Test.java,代码如下

  1. package test;  
  2.   
  3. import Service.Address;  
  4. import Service.AddressImpl;  
  5. import bean.Addresslist;  
  6. import org.springframework.context.ApplicationContext;  
  7. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  8.   
  9. /** 
  10.  * Created by kinthon on 17-3-31. 
  11.  */  
  12. public class Test {  
  13.     public static void main(String[] args)  
  14.     {  
  15.         ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");  
  16.         Address ail = (AddressImpl)ac.getBean("address");  
  17.         Addresslist al = new Addresslist();  
  18.         al.setName("kaka");  
  19.         al.setPhone("123456123");  
  20.         ail.add(al);  
  21.     }  
  22. }  



右击编辑器,点击"Run Test.main()"进行测试,正常的话,会出现
SSH之IDEA2017整合Struts2+Spring+Hibernate

同时查看MySQL数据库,看看对应的TESTDB下的addresslist下有没有多一条name:kaka, phone:123456123的记录.

SSH之IDEA2017整合Struts2+Spring+Hibernate


四,struts2 引入并测试 .

1) 要引入struts2,要先引入两个依赖,一个是struts2-spring-plugin-2.3.24, spring-web-3.0.5和log4j-1.2.14.jar; 对应前两个我们一样使用IDEA的maven功能进行下载,但是不要直接入我们的lib目录下,因为它会下载比较多的依赖;我们选择手工加入;先如下下载好,"Download to "不要打勾

SSH之IDEA2017整合Struts2+Spring+Hibernate

下载struts2-spring-plugin-2.3.24会附带下载好spring-web-3.0.5; 下载完后查看下下载的目录, 只是查看下下载目录就可以了如下

SSH之IDEA2017整合Struts2+Spring+Hibernate

可以看到struts2-spring-plugin的下载目录在home目录下的.m2(隐藏文件夹,可以按ctrl+h来显示)下, spring-web也是一样,接下来就是直接复制这两个包,放到项目的lib文件下,之后右击一下lib下的刚引入的这两个jar包,"Add as Library"; 对于log4j-1.2.14就相对简单,直接打勾Download to 就可以了.相关截图如下

SSH之IDEA2017整合Struts2+Spring+Hibernate

2) 修改web/WEB-INF/web.xml文件,引入struts2,配置如下

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"  
  5.          version="3.1">  
  6.     <filter>  
  7.         <filter-name>struts2</filter-name>  
  8.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  9.     </filter>  
  10.     <filter-mapping>  
  11.         <filter-name>struts2</filter-name>  
  12.         <url-pattern>/*</url-pattern>  
  13.     </filter-mapping>  
  14.   
  15.     <!--struts2测试加入-->  
  16.     <listener>  
  17.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  18.     </listener>  
  19.   
  20.     <context-param>  
  21.         <param-name>contextConfigLocation</param-name>  
  22.         <param-value>WEB-INF/applicationContext.xml</param-value>  
  23.     </context-param>  
  24. </web-app>  

3) 建一个action, 在src下加一个action包,然后新建一个AddressAction.java文件,代码如下

  1. package action;  
  2.   
  3. import Service.AddressImpl;  
  4. import bean.Addresslist;  
  5. import com.opensymphony.xwork2.ActionSupport;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7.   
  8. /** 
  9.  * Created by kinthon on 17-3-31. 
  10.  */  
  11. public class AddressAction extends ActionSupport {  
  12.   
  13.     private String name;  
  14.     private String phone;  
  15.     @Autowired  
  16.     private AddressImpl address;  
  17.   
  18.   
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.   
  23.     public void setPhone(String phone) {  
  24.         this.phone = phone;  
  25.     }  
  26.   
  27.     public String getName() {  
  28.   
  29.         return name;  
  30.     }  
  31.   
  32.     public String getPhone() {  
  33.         return phone;  
  34.     }  
  35.   
  36.     public String add()  
  37.     {  
  38.         Addresslist al = new Addresslist();  
  39.         al.setName(getName());  
  40.         al.setPhone(getPhone());  
  41.         address.add(al);  
  42.         return SUCCESS;  
  43.     }  
  44.   
  45.     public void setAddress(AddressImpl address) {  
  46.         this.address = address;  
  47.     }  
  48. }  

4) 在web/WEB-INF下的applicationContext.xml下加入一个新的bean,内容如下

  1. <bean id="addressAction" class="action.AddressAction">  
  2.     <property name="address" ref="address"></property>  
  3. </bean>  

5) 在src下的struts.xml下进行如下修改,

  1. <span style="font-size: 18px;"><?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE struts PUBLIC  
  4.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  5.         "http://struts.apache.org/dtds/struts-2.3.dtd">  
  6.   
  7. <struts>  
  8.     <!-- struts的action配置文件 -->  
  9.     <!-- 将action托管给spring -->  
  10.     <constant name="struts.objectFactory" value="spring" />  
  11.   
  12.     <!-- 所有的action都应该放在对应的package下 -->  
  13.     <!--action的class属性不再是具体的类,而是spring配置文件配置的bean id-->  
  14.     <package name="addresslist" namespace="/addresslist" extends="struts-default">  
  15.         <action name="add" class="addressAction" method="add">  
  16.             <result name="success">/success.jsp</result>  
  17.         </action>  
  18.     </package>  
  19. </struts></span>  


6) 测试

a) 在web目录下加入index.jsp和success.jsp文件,

index.jsp

  1. <%--  
  2.   Created by IntelliJ IDEA.  
  3.   User: kinthon  
  4.   Date: 17-3-31  
  5.   Time: 下午1:22  
  6.   To change this template use File | Settings | File Templates.  
  7. --%>  
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  9. <html>  
  10.   <head>  
  11.     <title>$Title$</title>  
  12.   </head>  
  13.   <body>  
  14.   welcome  
  15.   </body>  
  16. </html>  


success.jsp
  1. <span style="font-size:18px;"><%--  
  2.   Created by IntelliJ IDEA.  
  3.   User: Administrator  
  4.   Date: 2016/5/17  
  5.   Time: 17:41  
  6.   To change this template use File | Settings | File Templates.  
  7. --%>  
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  9. <html>  
  10. <head>  
  11.     <title>$Title$</title>  
  12. </head>  
  13. <body>  
  14. success  
  15. </body>  
  16. </html></span>  

b) 特别注意:引入新的包的话,直接运行的话,可能会有包没有引入成功的问题,可以到File->Project Structure->Artifacts 查看,在右边的最下边如果出现一个fix 按钮的话,就点击,然后点击 add All

c) 如果正常的话,点击运行,相关截图如下,图的最右边的运行按钮,记得將对象从Test切换为Tomcat

SSH之IDEA2017整合Struts2+Spring+Hibernate

成功的话,可以直接在浏览器,输入 http://localhost:8080/addresslist/add?name=ssh&phone=18819453629  要是成功的话,浏览器会显示success,如下

SSH之IDEA2017整合Struts2+Spring+Hibernate

同时MySQL的TESTDB的addresslist会多一条记录name:ssh;phone:18819453629

SSH之IDEA2017整合Struts2+Spring+Hibernate

结语
如上就是使用IDEA2017.1整合SSH的整体教程了,个人新手,正积极学习ing。如果上述有任何问题,可以联系我。