1. 程式人生 > >IM後臺搭建(一)

IM後臺搭建(一)

一、新建專案以及Intellij的一些操作。
1.需要配置gradle
匯入的時候作為Gradle專案匯入即可


新建類配置自定義註釋語句:
Settings–>搜尋template–>File and Code Template

2.配置Tomcat,如果EditConfiguation裡面沒有,需要進入初始頁面新增;
這裡寫圖片描述
這裡寫圖片描述
配置tomcat
這裡寫圖片描述
這裡Type也要注意一下,忘了標了:
這裡寫圖片描述
把本專案的webapp路徑新增進去,這個是重點
這裡寫圖片描述
這裡寫圖片描述
然後一步一步走就好了。
這樣就不會報404了。。。但是如果新增路徑還會報錯!!!搞了一天,終於搞出來了,一切以底下為主!!!:
這裡寫圖片描述


這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡顯示這個war檔案是最重要的!
這裡寫圖片描述
這裡寫圖片描述
二、連線資料庫
1.右側database按鈕–>datasource–>mysql,輸入使用者名稱,密碼,對了,還有初次進入的時候左下角提示下載檔案才可以測,這個別忘了。
這裡寫圖片描述
三、配置Gradle

  // Gson json
    compile 'com.google.code.gson:gson:2.8.0'
    // Guava java 類封裝
    compile 'com.google.guava:guava:21.0'

    // Jersey 輕量級Restful介面框架
    compile 'org.glassfish.jersey.core:jersey-client:2.26-b03'
    compile 'org.glassfish.jersey.core:jersey-server:2.26-b03'
    compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.26-b03'
    // 也是一個 Json 解析庫
    compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.26-b03'

    // 資料庫操作框架
    // https://mvnrepository.com/artifact/org.hibernate/hibernate-core
    compile 'org.hibernate:hibernate-core:5.2.9.Final'
    // https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager
    compile 'org.hibernate:hibernate-entitymanager:5.2.9.Final'
    // https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0
    compile 'org.hibernate:hibernate-c3p0:5.2.9.Final'

    // MySQL 驅動庫
    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
    compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'
    testCompile group: 'junit', name: 'junit', version: '4.12'

新增完發現關鍵字都是灰色的說明沒同步,點選右側Gradle,展開的視窗中點選同步按鈕即可。
四、連線資料庫
1.在resource資料夾下新建一個檔案:hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!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="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <!--連結地址使用者名稱密碼 -->
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/DB_I_T_PUSH?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <!--<property name="connection.url">jdbc:mysql://qiujuer.net:6968/DB_I_T_PUSH?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</property>-->


        <!-- JDBC 連結池大小 -->
        <property name="connection.pool_size">5</property>

        <!-- SQL 方言 -->
        <property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>

        <!-- Hibernate session 上下文為執行緒級別 -->
        <property name="current_session_context_class">thread</property>

        <!-- 配置C3P0快取連結池  -->
        <property name="cache.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
        <!--在連線池中可用資料庫連線的最小數目-->
        <property name="c3p0.min_size">6</property>
        <!--在連線池中所有資料庫連線的最大數目-->
        <property name="c3p0.max_size">50</property>
        <!--設定資料庫連線的超時時間-->
        <!--<property name="c3p0.time_out">1800</property>-->
        <property name="c3p0.timeout">100</property>
        <!--可以被快取的PreparedStatement的最大數目-->
        <property name="c3p0.max_statement">50</property>
        <!-- 當連線池裡面的連線用完的時候,C3P0一下獲取的新的連線數 -->
        <property name="c3p0.acquire_increment">1</property>
        <!-- 連線物件因該多長時間被自動校驗的時間段,以秒為單位-->
        <property name="c3p0.idle_test_period">100</property> <!-- seconds -->
        <!--最多可以建立Statements物件的個數. . 就是可以執行SQL語句的物件的個數-->
        <property name="c3p0.max_statements">0</property>

        <!-- SQL語句輸出 -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <!-- 自動更新資料庫的級別 -->
        <property name="hbm2ddl.auto">update</property>
        <!--
        create:表示啟動的時候先drop,再create
        create-drop: 也表示建立,只不過再系統關閉前執行一下drop
        update: 這個操作啟動的時候會去檢查schema是否一致,如果不一致會做scheme更新
        validate: 啟動時驗證現有schema與你配置的hibernate是否一致,如果不一致就丟擲異常,並不做更新
        -->


        <!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
        <!--class="net.qiujuer.web.italker.push.bean.db.Group"/>-->
        <!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
        <!--class="net.qiujuer.web.italker.push.bean.db.GroupMember"/>-->
        <!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
        <!--class="net.qiujuer.web.italker.push.bean.db.User"/>-->
        <!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
        <!--class="net.qiujuer.web.italker.push.bean.db.UserFollow"/>-->
        <!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
        <!--class="net.qiujuer.web.italker.push.bean.db.Message"/>-->
        <!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
        <!--class="net.qiujuer.web.italker.push.bean.db.PushHistory"/>-->
        <!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
        <!--class="net.qiujuer.web.italker.push.bean.db.Apply"/>-->

    </session-factory>
</hibernate-configuration>

上面是基本配置,每個專案基本都差不多,現在不必深究,但這個還是得學的。
五、配置servlet
在webapp下新建資料夾WEB-INF ,資料夾裡放一個web.xml檔案,xml裡就是放置servlet配置語句:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>

    <display-name>iTalker</display-name>

    <servlet>
        <servlet-name>ITalkerApiServlet</servlet-name>
        <!--容器-->
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <!--對映的包名,用於搜尋處理類-->
            <param-value>net.qiujuer.web.italker.push.service</param-value>
        </init-param>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>net.qiujuer.web.italker.push.Application</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--對映-->
    <servlet-mapping>
        <servlet-name>ITalkerApiServlet</servlet-name>
        <!--訪問路徑-->
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

在java資料夾下新建一個service包,新建一個Application類,所有對映的處理都在service包裡
六,完成第一個restful介面請求

@Path("/account")//註冊路徑訪問,所有對映想走到本類,訪問路徑就為:
// 和web.xml最底下的對映路徑結合即為:127.0.0.1/api/account...
public class AccountService {
    //實際路徑 127.0.0.1/api/account/login
    @GET
    @Path("/login")
    public String get(){
        return  "You get the login";
    }
    @POST
    @Path("/login")
    @Consumes(MediaType.APPLICATION_JSON)//傳入json
    @Produces(MediaType.APPLICATION_JSON)//輸出json
    public User post(){
        User user=new User();
        user.setName("RyeCatcher");
        user.setSex("男");
        return user;
    }
}

//實際路徑為:http://localhost:8080/api/account/login,這裡的api是servlet中xml配置的。
如果想除錯post請求,用谷歌的DHC外掛即可。

接下來,就是建資料表了。稍候貼資料庫表結構原始碼,理一下相關邏輯。


1.現在先搞一下使用者註冊登入和資訊完善,在push包下,新建兩個包,provider和util包:

在這裡插入圖片描述
先解釋一下這四個類,GsonProvider用來替換Application中的Jackson解析器,因為Jackson解析器在處理布林變數時有些問題。
LocalDateTime是Java8裡新增的,該工具類主要是為了解決LocalDateTime與Json字串相互轉換的問題。
Hib是Hibernate的縮寫,一個常見的封裝類,TextUtil,對string進行md5,base64轉換等。
2,hibernate.cfg.xml,檢視一下資料庫名字,在mysql中建立相同名字的資料庫。
在這裡插入圖片描述

接下來開啟workbench新建資料庫:
在這裡插入圖片描述
表名是跟hibernate.cfg.xml中的表名保持一致,編碼格式也選上圖的兩個。如果沒有這種工具,可以在右側的dataSource中配置資料庫。
在這裡插入圖片描述
需要知道的是,我們資料庫的入口在hibernate.cfg.xml檔案中,我們需要在這個檔案中新增對映,將我們之間建的表跟資料庫一一對應。

        <mapping package="net.ryecatcher.web.italker.push.bean.db"
         class="net.ryecatcher.web.italker.push.bean.db.User"/>
        <mapping package="net.ryecatcher.web.italker.push.bean.db"
         class="net.ryecatcher.web.italker.push.bean.db.UserFollow"/>
        <mapping package="net.ryecatcher.web.italker.push.bean.db"
        class="net.ryecatcher.web.italker.push.bean.db.Group"/>
        <mapping package="net.ryecatcher.web.italker.push.bean.db"
        class="net.ryecatcher.web.italker.push.bean.db.GroupMember"/>
        <mapping package="net.ryecatcher.web.italker.push.bean.db"
        class="net.ryecatcher.web.italker.push.bean.db.Message"/>
        <mapping package="net.ryecatcher.web.italker.push.bean.db"
        class="net.ryecatcher.web.italker.push.bean.db.PushHistory"/>
        <mapping package="net.ryecatcher.web.italker.push.bean.db"
        class="net.ryecatcher.web.italker.push.bean.db.Apply"/>

這裡package不是必須的,只要類名路徑不錯就好。
所有service包下的檔案都是我們Http的入口!