Maven、IDEA構建SSH基本項目結構

寫在前面

最近在學習Java SSH,SSH相信學過Java的應該都知道吧,SSH是目前比較流行的一種Java Web應用程序開源框架,主要包括Spring、Struts2和Hibernate三個框架,這三個框架既可以單獨使用,也可以整合在一起使用。Spring主要對應web開發中的service層,Struts2主要對應web層,Hibernate主要對應dao層。關于這三個框架的詳細介紹我會在其他的博客文章中介紹,本文主要是在IntelliJ IDEA中,使用maven進行項目管理,搭建SSH基本項目結構。

主要軟件版本

  • IntelliJ IDEA: 2016.2.4
  • Apache Maven: 3.3.3
  • Java version: 1.8.0_60
  • Spring: 4.2.4.RELEASE
  • Struts2: 2.3.24
  • Hibernate: 5.0.7.Final

創建Maven項目

new project
new maven project

點擊next,接著填一些信息,創建一個新的web項目,項目的目錄結構如下圖所示:


code_structure_1

我們發現沒有代碼目錄和測試代碼目錄,我們需要手動創建,在main下創建java目錄,并讓目錄為源代碼目錄,在src下創建test目錄,并在test目錄下創建java目錄,把這個java目錄作為測試代碼目錄,創建后項目目錄結構如下:


code_structure_2

之后我們在main/java寫項目源代碼,在test/java下寫測試代碼。

接下來我們在pom.xml中引入項目依賴,這些我都經過測試,中途也有缺少依賴導致項目運行報錯,我都一一解決了,最終的pom.xml如下,直接復制即可:

編寫pom.xml及web.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>io.cutoutsy</groupId>
  <artifactId>ssh</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>ssh Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
      <!-- struts2-->
      <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-core</artifactId>
          <version>2.3.24</version>
      </dependency>
      
      <!-- Hibernate -->
      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-core</artifactId>
          <version>5.0.7.Final</version>
      </dependency>

      <!-- spring -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</artifactId>
          <version>4.2.4.RELEASE</version>
      </dependency>

      <!-- mysql lib-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.38</version>
      </dependency>

      <dependency>
          <groupId>com.mchange</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.2.1</version>
      </dependency>

      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>4.2.4.RELEASE</version>
      </dependency>

      <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-spring-plugin</artifactId>
          <version>2.3.24</version>
      </dependency>

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-entitymanager</artifactId>
          <version>5.0.7.Final</version>
      </dependency>

  </dependencies>
  <build>
    <finalName>ssh</finalName>
  </build>
</project>

接下來我們需要配置webapp/WEB-INF/web.xml,

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>ssh</display-name>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
    <!-- 配置struts2過濾器 -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
    <!-- 配置監聽器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

這個配置文件中,除了我們平時熟悉的配置struts2的過濾器外,我還配置了監聽器,指定spring配置文件位置,這樣在項目啟動的時候,服務器就會創建sessionFactory以及其他對象,這樣網站初始訪問時候就不會存在速度慢的情況了。

編寫代碼

接著我們來編寫項目基本測試代碼,在編寫測試代碼前,由于我們使用Hibernate,所以肯定會用到數據庫,我們在數據庫里面創建一個名為ssh的數據庫,方便后面使用。我們首先在main/java/下創建4個包,分別為action、dao、entity、service。在entity下創建User.java類,代碼如下:

package entity;

public class User {
    private int id;
    private String name;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }
}

同時我們在這個目錄下,編寫User的關系映射文件User.hbm.xml,內容如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="entity.User" table="t_user">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>

        <property name="name" column="name"></property>
        <property name="password" column="password"></property>
    </class>
</hibernate-mapping>

在dao下面創建接口UserDao,代碼如下:

package dao;

import entity.User;

public interface UserDao {
    public String addUser(User user);
}

同時在這個目錄下,編寫它的實現類,先創建impl的包,然后創建UserDaoImpl類,代碼如下,

package dao.impl;

import dao.UserDao;
import entity.User;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

public class UserDaoImpl extends HibernateDaoSupport implements UserDao{

    public String addUser(User user) {
        getHibernateTemplate().save(user);
        return "success";
    }
}

在service下創建UserService類,代碼如下:

package service;

import dao.UserDao;
import entity.User;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public class UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public String addUser(User user){
        return userDao.addUser(user);
    }
}

在action下創建UserAction類,代碼如下:

package action;

import com.opensymphony.xwork2.ActionSupport;
import entity.User;
import service.UserService;

public class UserAction extends ActionSupport{
    private UserService userService;
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public String add(){
        User user = new User();
        user.setName("bob");
        user.setPassword("12345");
        userService.addUser(user);
        return "success";
    }
}

現在,我們代碼部分已經編寫完了,接下來就是三個框架的配置文件,關于struts2和spring整合主要是把struts2里面action對象的創建交給Spring進行管理,而hibernate和spring進行整合是把數據庫信息配置到Spring中,且把Hibernate中sessionFactory的創建也交給Spring進行管理,同時讓項目啟動的時候由服務器進行創建,按照上述的原則,在resource下編寫配置文件如下:

structs.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="demo1" extends="struts-default" namespace="/">
        <action name="user_*" class="userAction" method="{1}">
            <result name="success">/success.html</result>
        </action>
    </package>

</struts>

hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">false</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="connection.useUnicode">true</property>
        <property name="connection.characterEncoding">utf8</property>

        <mapping resource="entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

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:aop="http://www.springframework.org/schema/aop"
       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/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 配置c3p0連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/ssh"></property>
        <property name="user" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>

    <!-- sessionfactory創建 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
    </bean>

    <!-- 事務管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean id="userDao" class="dao.impl.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <bean id="userService" class="service.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>

    <bean id="userAction" class="action.UserAction">
        <property name="userService" ref="userService"></property>
    </bean>
</beans>

上面的數據庫信息是我本地的數據庫信息,你要按照你的數據庫信息進行配置。至此我們的配置文件也編寫完成了,我們的測試代碼是向數據庫里面添加一條用戶記錄,添加成功則說明我們ssh整合配置沒有問題,在添加成功后添加到頁面success.html,所以我們需要在webapp下編寫success.html,代碼如下:

<html>
<body>
<h2>Add Success!</h2>
</body>
</html>

測試

接下來我們就來測試我們的框架搭建是否是成功的,我們需要給項目配置一個tomcat,如果不清楚怎么在IDEA中給web項目配置tomcat服務器的,可以自行查詢,或者在評論里面留言,這個不屬于本文的內容。配置好了之后我們啟動tomcat服務器,啟動的時候不要忘了開啟數據庫服務,否則會報錯,


tomcat_start

由于我們在服務器啟動的時候就會創建數據庫sessionFactory,所以這個時候,服務器應該已經幫我們創建好t_user這個表了,到數據庫里面看下


mysql_table

如果你的數據庫里面沒有這個表,請查看啟動的時候是否有報錯信息,然后我們去瀏覽器打開:http://localhost:8080/進行訪問

browser_index

接下來我們調用我們編寫的action,添加用戶,通過http://localhost:8080/user_add,成功結果如下:

browser_add

然后我們去數據庫里面查看用戶是否添加成功,


mysql_bob

可見,數據已經成功插入到數據庫中。

結束

到此,我們已經成功在IDEA中使用maven搭建了SSH整合框架。接下來我們就可以編寫我們的業務代碼了,當然還有用maven打包項目,但這不屬于本文要講的內容,可能在后面的博客中我會寫到。

更多文章請訪問我的博客

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容