最近開始接觸後端開發,原本在Python跟Java之間徘徊,之所以不選擇其他語言,主要是這兩個語言都有點基礎,尤其是Java用了幾年,用起來個跟順手些,雖然Java也一年多沒用了,不過接觸幾天之後,感覺就又都回來了。
這篇文章做科普是一個目的,當然最重要的,是爲自己做個存檔,因爲現在所有的環境搭建,日後自己都會再搭建一次(電腦會換,雲服務器也只買了一年),其中踩了不少坑,所以做個記錄,方便他人更方便自己!
IntelliJ IDEA環境搭建
爲什麼會選擇IntelliJ IDEA,因爲好用!
前幾年Java開發基本用的都是Eclipse(大學學的時候用的就是Eclipse),後面做android開發又用了as,體驗就是AS比eclipse好用太多(當然也不排除我喜新厭舊的風格~),這次用的idea也是同樣好用,就跟他的名字一樣,智能!
首先配置Java環境,可以終端輸入java --version查看java版本
如果java下載配置,可以參考這篇文章
https://www.jianshu.com/p/fe6b68295479
再下載idea
https://www.jetbrains.com/idea/download/#section=mac
下載之後安裝,完成
Tomcat跟MySQL配置
下面分兩部分分別來說下怎麼配置tomcat跟mysql,本地跟雲服務器
本地配置
tomcat安裝可以參考這篇文章,很簡單,沒什麼能遇到的坑
https://www.jianshu.com/p/db08d23049ce
mysql安裝可以參考下面文章,在配合可視化工具使用時候使用有一個坑,後面會說
https://www.jianshu.com/p/07a9826898c0
安裝完成之後,配上可視化工具使用將會方便很多,尤其在早期調試,增刪改查數據時候,也會一目瞭然
在這邊推薦一個工具Navicat Premium,下面是我當初的下載地方
百度雲:https://pan.baidu.com/s/1bcJVyIvFneiEoMZPU-oIbA#list/path=/密碼: qps3
安裝打開之後,點擊左上角的Connection,輸入本地配置,如下
鏈接之後,可能會遇到這個問題
2059 - Authentication plugin ‘caching_sha2_password’ cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found
後來查了下,是最新版本的mysql不支持root直接登錄,需要額外設置下,如下
解決辦法:
1:命令行鍵入數據庫:
mysql -uroot -p
2:鍵入密碼後,執行:
ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY '密碼';
密碼更改爲自己數據庫的密碼;
然後就可以自己登錄配置了,順便說下,Navicat Premium還可以登錄遠程的mysql,後面的雲服務器配置好了之後也可以用它來登錄,如下
雲服務器配置
接下來說怎麼配置雲服務器的tomcat跟mysql
首先,需要介紹一個工具:Yummy FTP
這軟件可以幫你把本地的文件上傳到雲服務器,雖然雲服務器裏面也可以下,不過本地下網速更快,畢竟雲服務器寬帶高的費用也高。
首先,也是要配置java環境,其中jdk我選的是rpm安裝包,gzip安裝包一直下不下來,停留在99.9%。
https://www.cnblogs.com/yjhkhnuje/p/9975307.html
tomcat安裝可以參考
https://www.jianshu.com/p/6a9fa018b506
mysql安裝可以參考
https://www.cnblogs.com/dadadechengzi/p/6723686.html?tdsourcetag=s_pcqq_aiomsg
mysql的安裝我饒了很多彎,網上的幾個火的教程都有點問題。這篇我照着做下來沒啥問題,所以推薦!
記得要在雲服務器防火牆打開8080(tomcat)跟3306(mysql)端口,然後用瀏覽器測試下tomcat鏈接情況跟用Navicat Premium測試下mysql遠程登錄看下就差不多了。
IDEA跟Tomcat,Mysql配合運行簡單的服務端接口
下面來說本地環境怎麼配合運行簡單的接口
下面會寫一個簡單的例子,測試一下數據庫增刪改查,模擬用戶註冊,登錄,修改用戶信息等功能。
1,首先新建一個web工程,如下
2,在web的WEB-INF的目錄下創建classes和lib目錄
3,將classes目錄作爲輸出目錄,將lib作爲Dependencies的目錄,如下圖
4,導入數據鏈接庫,這裏用的是c3p0和dbutils進行數據庫鏈接
下載地址:https://pan.baidu.com/s/184HFVJCcNisitRFEya4ngw 提取碼: 6tpe
5,在src根目錄下創建c3p0-config.xml文件,進行數據庫配置
<c3p0-config> <!-- 默認配置,c3p0框架默認加載這段默認配置 --> <default-config> <!-- 配置JDBC 四個基本屬性 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/fistTestDatabase</property> <property name="user">root</property> <property name="password">test123</property> </default-config> <!-- This app is massive! --> </c3p0-config>
目錄結構如下:
6,在src目錄下創建servlet目錄並創建UserLogin繼承HttpServlet,測試代碼如下
import model.UserBean; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import utils.JDBCUtils; import utils.UserDBUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; public class UserLogin extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doGet(req, resp); String account = req.getParameter("account"); String password = req.getParameter("password"); System.out.println("account:" + account + "\npassword:" + password); // 打印出來看一看 String result = "數據庫讀取異常!"; if (account.isEmpty()){ result = "用戶名不能爲空!"; }else if (password.isEmpty()){ result = "密碼不能爲空!"; }else{ QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource()); try { UserBean userBean = UserDBUtils.userLogin(runner,account,new BeanHandler<UserBean>(UserBean.class)); System.out.println(userBean); if (userBean == null) { result = "用戶不存在"; }else{ if (account.equals(userBean.getUserName()) && password.equals(userBean.getUserPwd())){ result = account+"登錄成功!"; }else { result = "密碼錯誤!"; } } } catch (SQLException e) { e.printStackTrace(); } } resp.setContentType("text/html;charset=utf-8"); // 設置響應報文的編碼格式 PrintWriter pw = resp.getWriter(); // 獲取 response 的輸出流 pw.println(result); // 通過輸出流把業務邏輯的結果輸出 pw.flush(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doPost(req, resp); doGet(req,resp); } }
7,編輯web/WEB-INF/web.xml文件,將UserLogin進行註冊
<servlet> <servlet-name>userLogin</servlet-name> <servlet-class>servlet.UserLogin</servlet-class> </servlet>
<servlet-mapping> <servlet-name>userLogin</servlet-name> <url-pattern>/userLogin</url-pattern> </servlet-mapping>
8,打開Navicat Premium,建立一個表,寫入一條用戶登錄數據
9,一條可以登錄的請求就這樣誕生了,用postman或者瀏覽器,直接請求,如下
http://localhost:8080/testServlet_2/userLogin?account=pppp&password=1233&phoneNum=1580523134
請求結果如下
截圖上方是請求,下方是日誌
測試完整代碼已經上傳到github:https://github.com/wocalage/ServletDemo
部署項目到雲服務器上
首先我們把項目打包成war格式
1,如下配置好artifacts,要確保庫都被引用到裏面了,如下
點擊OK
2,編譯成artifacts,如下圖
選擇build artifacts
3,編譯完成後,有個war文件,在out文件夾中,如下圖
這個war文件就是打包後的可部署的文件
通過Yummy FTP將war包上傳到雲服務器上,放到Tomcat目錄webapps中,重啓tomcat就行了!
可能遇到的問題:
1,怎麼看日誌信息
啓動tomcat之後,直接ip:8080無法訪問,請求也請求不了,這時候大概率是無頭緒的,如果在本地,有日誌輸出可以調試查看原因,如果在雲服務器怎麼辦呢?
也是有辦法的,進入到tomcat的log目錄,如下
輸入命令
tail -f catalina.out
就能查看實時日誌信息了!
2,重啓或者關閉tomcat遇到錯誤怎麼辦?
錯誤信息我忘記截圖,內容大概是
這個問題主要的原因是內存不足,具體解決辦法是進入到tomcat的bin目錄,打開catalina.sh文件
在最上面加上下面這行
JAVA_OPTS="-Xms512m -Xmx1024m -Xss2048K -XX:PermSize=256m -XX:MaxPermSize=512m"
如下:
3,jdk跟tomcat版本問題
在我接入過程中,因爲jdk的版本問題,也遇到了一點麻煩,具體表現爲
本機jdk版本是11,雲服務器上一開始安裝的是jdk8,遇到了雲服務器無法運行本地編譯出來war包的問題。
後來將雲服務器上改爲了12,又遇到一個沒生效的問題,糾結了很久,最後發現還是之前安裝8殘留的jre路徑不對,導致tomcat還是使用之前的jre來運行,但是由於之前的jre沒有了,所以用了缺省的
順便說下,jdk11以上就沒有jre的文件夾了,在tomcat裏面設置jdk文件夾就行。
4,‘java.net.UnknownHostException:主機名: 主機名: 未知的名稱或服務’問題
在看tomcat日誌的時候,發現一個問題,具體如下
首先,看下hostname,再ping下hostname,如下
可知,是由於無法解析hostname導致的。
編輯下/etc/hosts文件
加入ip hostname就行
如:
10.2.100.5 vm10-0-0-9