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&useUnicode=true&characterEncoding=utf8&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&useUnicode=true&characterEncoding=utf8&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的入口!