聊天App—服務(wù)端的準(zhǔn)備(SSH的學(xué)習(xí))

經(jīng)過十一周兩場考試和電子實(shí)訓(xùn)后矾利,學(xué)習(xí)也進(jìn)入了新的階段衬鱼,突發(fā)奇想想嘗試做一個簡易的聊天app項(xiàng)目,以后在朋友間使用也是一件挺有趣的事情姨俩。
首先先從服務(wù)端的搭建開始,服務(wù)端最主要的就是進(jìn)行數(shù)據(jù)的處理和數(shù)據(jù)庫的連接师郑。我目前學(xué)習(xí)的有了jdbc連接數(shù)據(jù)庫+MVC開發(fā)模式环葵、使用MyBatis搭建,雖然用以有的知識也能搞定但學(xué)多的知識總有好處宝冕,所以我選擇了最經(jīng)典的Struts2+Spring+Hibernate(SSH)來搭建服務(wù)端张遭。
由于這次是直接使用ssh框架對每一個組成的框架我只是有一個大概了解,以后有時間再深入學(xué)習(xí)地梨。

一菊卷、SSH所需開發(fā)包

剛學(xué)習(xí)SSH遇到的第一個困難就是導(dǎo)包,因?yàn)閷?shí)在是太多太多了宝剖,畢竟我還是一只菜雞沒見過什么大工程= =洁闰。

  • spring所需的jar包
spring.png
  • struts2所需jar包
struts.png
  • Hibernate所需jar包
hibernate.png

項(xiàng)目使用MySql數(shù)據(jù)庫,所以還有一個MySql的驅(qū)動包總共的jar包應(yīng)該有41個万细,接下來對一些重要jar包做一下解釋扑眉。

  • struts2-convention-plugin-2.3.15.3.jar -struts注解開發(fā)包

  • struts2-spring-plugin-2.3.15.3.jar -struts整合spring的jar包

  • 事務(wù)管理jar包
    spring-tx-3.2.0.RELEASE.jar
    spring-jdbc-3.2.0.RELEASE.jar

  • spring-orm-3.2.0.RELEASE.jar -spring整合hibernate的jar包

  • spring-web-3.2.0.RELEASE.jar -spring整合web項(xiàng)目的jar包

  • spring-test-3.2.0.RELEASE.jar Junit測試單元

  • com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar c3p0連接池jar包

二、引入配置文件
  1. struts配置文件
  • web.xml
  • struts.xml
  1. spring配置文件
  • web.xml
  • applicationContext.xml

在ssh整合框架中不需要Hibernate的配置文件因此不用引入

三赖钞、配置文件的配置

因?yàn)閮?nèi)容有些多而且不好解釋直接上代碼

  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
   <!-- spring核心監(jiān)聽器 -->
  <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> 
  <!-- struts核心過濾器的配置 -->
  <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> 
  <display-name></display-name> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
  • 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:aop="http://www.springframework.org/schema/aop"   
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:context="http://www.springframework.org/schema/context"
    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">  
    
    
    
    <!-- 配置事務(wù)管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean> 
    <!-- 開啟注解事務(wù) -->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>  
</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" extends="struts-default" namespace="/">

    </package>
   
</struts>

這里需要萬分注意的是Spring核心監(jiān)聽器的配置即

  <!-- spring核心監(jiān)聽器 -->
  <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>
ContextLoaderListener中有一個參數(shù)腰素,他默認(rèn)是加載WEB-INF目錄下的applicationContext.xml,但我們需要加載的是classes目錄下的applicationContext.xml仁烹,所以在這里邊我們需要配置一個全局觸發(fā)參數(shù)耸弄。

首先引入源代碼:
ctrl+左擊點(diǎn)擊org.springframework.web.context.ContextLoaderListener進(jìn)入如下頁面


ContextLoaderListener.png

然后點(diǎn)擊AttachSource

引入源碼.png

此部很重要因此在此詳細(xì)說明,還有就是配置文件都應(yīng)該放在src目錄下

三卓缰、創(chuàng)建包結(jié)構(gòu)

使用SSH框架在不知不覺中以使用了MVC開發(fā)模式计呈,此包結(jié)構(gòu)僅當(dāng)參考

包結(jié)構(gòu)的創(chuàng)建.png
四、Struts整合Spring-編寫Action/Service/
public class EmployeeAction extends ActionSupport implements ModelDriven<Employee>{
    //模型驅(qū)動
    private Employee employee=new Employee();
    public Employee getModel() {
        // TODO Auto-generated method stub
        return employee;
    }
    
    //注入業(yè)務(wù)層
    private EmployeeService employeeService;
    
    public void setEmployeeService(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }
}

在Spring中只要有set方法就可以完成自動注入征唬,Service提供set方法注入Dao

public class EmployeeServiceImpl implements EmployeeService {

    private EmployeeDao employeeDao;

    /**
     * @param employeeDao the employeeDao to set
     */
    public void setEmployeeDao(EmployeeDao employeeDao) {
        this.employeeDao = employeeDao;
    }
}
五捌显、Struts整合Spring-在配置文件中配置Action/Service/

打開applicationContext.xml

    <!-- 配置action -->
    <bean id="employeeAction" class="cn.crm.ssh.action.EmployeeAction" scope="prototype">
        <property name="employeeService" ref="employeeService"></property>
    </bean>
    <!-- 配置業(yè)務(wù)層 -->
    <bean id="employeeService" class="cn.crm.ssh.service.impl.EmployeeServiceImpl" >
        <property name="employeeDao" ref="employeeDao"></property>
    </bean>
    
    <!-- 配置DAO -->
    <bean id="employeeDao" class="cn.crm.ssh.dao.impl.EmployeeDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
六、Spring整合Hibernate-創(chuàng)建數(shù)據(jù)庫

手動創(chuàng)建好數(shù)據(jù)庫后总寒,交給hibernat會自動幫我們創(chuàng)立表
找到相應(yīng)的Bean并創(chuàng)建對應(yīng)映射文件扶歪。

  • Department.java
public class Department {
    private Integer did;
    private String  dname;
    private String  dinfo;
    
    //員工集合
    private Set<Employee> employee=new HashSet<Employee>(); 
    public Department() {
        
    }
    public Integer getDid() {
        return did;
    }   
    public void setDid(Integer did) {
        this.did = did;
    }   
    public String getDname() {
        return dname;
    }   
    public void setDname(String dname) {
        this.dname = dname;
    }
    public String getDinfo() {
        return dinfo;
    }   
    public void setDinfo(String dinfo) {
        this.dinfo = dinfo;
    }
    public Set<Employee> getEmployee() {
        return employee;
    }
    public void setEmployee(Set<Employee> employee) {
        this.employee = employee;
    }   
}

與之相對應(yīng)的xml

<?xml version="1.0" encoding="UTF-8"?>
<!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="cn.crm.ssh.bean.Department" table="department">
        <id name="did" column="did">
            <generator class="native"></generator>
        </id>
        <property name="dname" column="dname" length="20"></property>
        <property name="dinfo" column="dinfo" length="100"></property>
    <!-- 關(guān)系映射  一對多 -->
        <set name="employee">
            <key column="dno"/>
            <one-to-many class="cn.crm.ssh.bean.Employee"/>
        </set>
    </class>
</hibernate-mapping>

注意在配置相應(yīng)xml的時候要引入Hibernate的約束條件。約束條件在相應(yīng)hibernate的核心包下面的hibernate-mapping-3.0dtd中,將映射條件復(fù)制到我們數(shù)據(jù)庫映射文件下即可善镰。

七妹萨、spring整合hibernate配置文件

jdbc的配置文件

  • jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/good
jdbc.username=root
jdbc.password=12312313

jdbc配置文件要在applicationContext.xml中引入

 <!-- 引入外部屬性文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/> 
    <!-- 配置c3p0連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClass}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
<!-- 引入外部屬性文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- 配置c3p0連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClass}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
        <!-- 配置Hibernate -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!-- 注入連接池 -->
        <property name="dataSource" ref="dataSource"/>
        
        <!-- 配置Hibernate的屬性 -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                 <!-- update可以更新表結(jié)構(gòu)-->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <!-- 加載Hibernate中的映射文件 -->
        <property name="mappingResources">
            <list>
                <value>cn/crm/ssh/bean/xml/Department.hbn.xml</value>
                <value>cn/crm/ssh/bean/xml/Employee.hbn.xml</value>
            </list>
        </property>
總結(jié)

現(xiàn)在對SSH只是有一個基本了解,與之前學(xué)習(xí)最大的不同即是沒有了Servlet取而代之的是Action炫欺。數(shù)據(jù)庫不用手動去創(chuàng)建直接交給hibernate自動生成即可乎完,在使用SSH框架時不知不覺間已使用了MVC的開發(fā)模式,這對以后進(jìn)一步學(xué)習(xí)服務(wù)端搭建提供了很好的學(xué)習(xí)基礎(chǔ)品洛,最后希望這篇文章對你有用讓我們共同進(jìn)步树姨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市桥状,隨后出現(xiàn)的幾起案子帽揪,更是在濱河造成了極大的恐慌,老刑警劉巖辅斟,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件转晰,死亡現(xiàn)場離奇詭異,居然都是意外死亡砾肺,警方通過查閱死者的電腦和手機(jī)挽霉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來变汪,“玉大人侠坎,你說我怎么就攤上這事∪苟埽” “怎么了实胸?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長番官。 經(jīng)常有香客問我庐完,道長,這世上最難降的妖魔是什么徘熔? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任门躯,我火速辦了婚禮,結(jié)果婚禮上酷师,老公的妹妹穿的比我還像新娘讶凉。我一直安慰自己,他們只是感情好山孔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布懂讯。 她就那樣靜靜地躺著,像睡著了一般台颠。 火紅的嫁衣襯著肌膚如雪褐望。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音瘫里,去河邊找鬼实蔽。 笑死,一個胖子當(dāng)著我的面吹牛减宣,可吹牛的內(nèi)容都是我干的盐须。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼漆腌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阶冈?” 一聲冷哼從身側(cè)響起闷尿,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎女坑,沒想到半個月后填具,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匆骗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年劳景,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碉就。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡盟广,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓮钥,到底是詐尸還是另有隱情筋量,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布碉熄,位于F島的核電站桨武,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锈津。R本人自食惡果不足惜呀酸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琼梆。 院中可真熱鬧性誉,春花似錦、人聲如沸叮叹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛉顽。三九已至蝗砾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悼粮。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工闲勺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扣猫。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓菜循,卻偏偏與公主長得像,于是被迫代替她去往敵國和親申尤。 傳聞我的和親對象是個殘疾皇子癌幕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容