最近有需求要搭建一個(gè)服務(wù)器,該服務(wù)器可以接收J(rèn)son并返回Json。再此之前從未接觸過(guò)服務(wù)器搭建的我,開(kāi)始了瞎折騰。
一、瞎折騰第一步
安裝Ubuntu系統(tǒng)。這一步不需要多做解釋吧。我安裝的系統(tǒng)是Ubuntu 18.04。如果不會(huì)安裝Ubuntu系統(tǒng),可自行查閱資料(其實(shí)就是去百度)。
二、瞎折騰第二步
安裝Tomcat。
這一步折騰了我4個(gè)小時(shí)!
1.下載Tomcat
因?yàn)閷?duì)于Ubuntu系統(tǒng)不熟悉,我是通過(guò)Windows下載之后,復(fù)制到Ubuntu中的。版本是9.0.11。
下載鏈接:(此鏈接為2018-08-30記錄,可能會(huì)失效,如果失效請(qǐng)到tomcat官網(wǎng)下載新的版本)
Apache Tomcat 9.0.11
2.解壓Tomcat
下載后的文件名為apache-tomcat-9.0.11.tar.gz,復(fù)制到的文件路徑在《/home/"Ubuntu當(dāng)前登陸用戶的用戶名"》下。使用《Ctrl + Alt + T》快捷鍵打開(kāi)《Terminal》命令輸入終端。進(jìn)入終端時(shí),默認(rèn)的當(dāng)前路徑就是上述路徑。輸入指令進(jìn)行解壓。
tar -zxvf apache-tomcat-9.0.11.tar.gz
解壓后,會(huì)在當(dāng)前目錄多出一個(gè)叫做 apache-tomcat-9.0.11 的文件夾
3.下載JDK
因?yàn)槭窃诰W(wǎng)上找的教程,所以沒(méi)仔細(xì)看,到這一步之后才發(fā)現(xiàn)Tomcat需要安裝JDK才能正常使用,所以又下載了JDK。(jdk 1.8.0_181)
下載鏈接:(此鏈接為2018-08-30記錄,可能會(huì)失效,如果失效請(qǐng)到JDK官網(wǎng)下載新的版本)
jdk 1.8.0_181
4.解壓JDK
把jdk下載之后同樣放到跟上述Tomcat文件的解壓路徑,輸入命令開(kāi)始解壓。下載后的jdk文件名為:jdk-8u181-linux-x64.tar.gz
tar -zxvf jdk-8u181-linux-x64.tar.gz
5.配置環(huán)境變量
跟Windows一樣,安裝好java還要配置環(huán)境變量,同時(shí)Tomcat也要配置環(huán)境變量。所以我就一起說(shuō)了。
在終端中輸入指令:
sudo vim /etc/profile
在打開(kāi)的文件的最后加入環(huán)境變量配置:
將下方的"Ubuntu當(dāng)前登陸用戶的用戶名"替換成你系統(tǒng)上真實(shí)的用戶名。
這里我在配置java環(huán)境變量的同時(shí)也配置了tomcat的環(huán)境變量
#set jdk environment(配置JDK環(huán)境變量)
export JAVA_HOME=/home/"Ubuntu當(dāng)前登陸用戶的用戶名"/jdk1.8.0_181
export CLASSPATH=.:$JAVA_HOME/lib
#set tomcat environment(配置tomcat 環(huán)境變量)
export CATALINA_HOME=/home/"Ubuntu當(dāng)前登陸用戶的用戶名"/apache-tomcat-9.0.11
export PATH=$JAVA_HOME/bin:$CATALINA_HOME:$PATH
保存并退出編輯器。在這里有一點(diǎn)一定要注意,每一行最后一定不能有空格,等號(hào)的兩邊已不能有空格,唯一有空格的地方只有export后面。
立刻使環(huán)境變量生效
source /etc/profile
測(cè)試java環(huán)境
java -version
如果有
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
顯示,則證明Java環(huán)境變量成功配置。
6.啟動(dòng)tomcat
回到終端初始目錄使用指令《cd ~》。注意:這里的波浪線也是命令的一部分,表示終端初始目錄
cd ~
進(jìn)入tomcat目錄
cd apache-tomcat-9.0.11
運(yùn)行tomcat目錄下,bin文件夾中的startup.sh腳本文件,啟動(dòng)tomcat
sudo ./bin/startup.sh
為了方便之后對(duì)tomcat的更改,需要先設(shè)置tomcat文件夾的權(quán)限
sudo chmod -R 775 ./*
輸入ifconfig查看當(dāng)前系統(tǒng)的IP地址
ifconfig
可以看到我當(dāng)前系統(tǒng)的IP地址是192.168.0.61,打開(kāi)局域網(wǎng)中的Windows電腦的瀏覽器,在網(wǎng)址欄輸入192.168.0.61:8080,如果有網(wǎng)頁(yè)呈現(xiàn),說(shuō)明tomcat安裝成功。
因?yàn)槟J(rèn)使用的是http協(xié)議,谷歌瀏覽器提示不安全。不過(guò)完全不用管這個(gè)問(wèn)題。
下面才是重頭戲。
三、Tomcat的基本配置
1.進(jìn)入tomcat的配置文件的目錄
cd ~/apache-tomcat-9.0.11/conf
打開(kāi)服務(wù)器配置文件
sudo vim server.xml
找到如下內(nèi)容所在行
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
最中間的”Connector“后面的port等號(hào)后的值就是端口,如果想要更改端口,在此處更改即可。
2.基本web服務(wù)器配置及使用。
這一步講的是僅僅將tomcat環(huán)境作為web服務(wù)器的使用方式。在tomcat中,默認(rèn)的網(wǎng)絡(luò)請(qǐng)求根目錄為webapps。所以可以在webapps目錄下建一個(gè)我們自己的目錄來(lái)存放自己的網(wǎng)頁(yè)。
進(jìn)入webapps目錄
cd ~/apache-tomcat-9.0.11/webapps
創(chuàng)建自己的文件夾,用于存放自己的網(wǎng)頁(yè)。
sudo mkdir myweb
上面的指令創(chuàng)建了一個(gè)叫做myweb的文件夾,進(jìn)入該文件夾,并創(chuàng)建一個(gè)html文件。
cd myweb
sudo vim index.html
接下來(lái)就是編輯該文件,并寫(xiě)入相關(guān)的html內(nèi)容,使其能被解析并顯示出網(wǎng)頁(yè)來(lái)。我這里用于演示,就只寫(xiě)了個(gè)簡(jiǎn)單的HTML5網(wǎng)頁(yè)。
<html lang="zh-CN">
<head>
<meta charset="UTF-8"/>
<title>成功</title>
</head>
<body>
<h1>這是我的網(wǎng)頁(yè)</h1>
</body>
</html>
保存之后,在瀏覽器中輸入192.168.0.61:8080/myweb/即可成功顯示網(wǎng)頁(yè)。
如果只是進(jìn)行web服務(wù)器搭建,到此處就已經(jīng)結(jié)束了。
通過(guò)這種方法,就能建立自己想要進(jìn)行的網(wǎng)頁(yè)了。tomcat不僅僅支持html文件,還支持htm及jsp文件。
如果還想進(jìn)行Servlet的聯(lián)合配置以進(jìn)行更多處理,請(qǐng)繼續(xù)往下看。
四、Servlet的配置
通過(guò)上述已經(jīng)知道tomcat的根目錄是webapps。所以重新再新建一個(gè)目錄用于使用Servlet。
cd ~/apache-tomcat-9.0.11/webapps
sudo mkdir myservlet
進(jìn)入剛剛創(chuàng)建的目錄
cd myservlet
根據(jù)我?guī)讉€(gè)小時(shí)的研究以及官方文檔的說(shuō)明,使用Servlet必須要新建一個(gè)文件夾"WEB-INF",所以,進(jìn)入這個(gè)目錄后,新建該目錄并進(jìn)入該目錄(這里的-是英文的短橫線,也叫中劃線)
sudo mkdir WEB-INF
cd WEB-INF
在目錄下新建兩個(gè)必須的文件夾
sudo mkdir classes
sudo mkdir lib
classes文件夾用來(lái)存放java文件(主要是servlet的java文件以及在servlet中進(jìn)行的操作需要用到的其他java文件)。
lib文件夾是用來(lái)存放java代碼中用到的第三方庫(kù)jar包之類的。
復(fù)制webapp/ROOT/WEB_INF目錄下的web.xml文件到當(dāng)前目錄
cp ../../ROOT/WEB-INF/web.xml ./
web.xml是用于配置Servlet的關(guān)鍵文件,如果沒(méi)有這個(gè)文件,則無(wú)法使用Servlet。而復(fù)制webapp/ROOT/WEB_INF目錄下的web.xml文件的原因也很簡(jiǎn)單,這個(gè)目錄下的web.xml沒(méi)有配置任何Servlet數(shù)據(jù)參數(shù),但又有標(biāo)準(zhǔn)框架已經(jīng)被搭建好了,非常方便自己進(jìn)行Servlet的添加配置。
文件目錄已經(jīng)創(chuàng)建好了,剩下的就是Servlet的編寫(xiě)與配置了。
以下是我的Servlet的java源碼的文件內(nèi)容。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用于測(cè)試的HttpServlet
*/
/**
* @author 噬神蒼龍
*
*/
public class TestMyHttpServlet extends HttpServlet {
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doDelete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doDelete...");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Hello</title></head><body><h1>request by Delete</h1></body></html>");
out.flush();
out.close();
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet...");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Hello</title></head><body><h1>request by Get</h1></body></html>");
out.flush();
out.close();
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doHead(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doHead...");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Hello</title></head><body><h1>request by Head</h1></body></html>");
out.flush();
out.close();
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doOptions(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doOptions...");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Hello</title></head><body><h1>request by Options</h1></body></html>");
out.flush();
out.close();
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost...");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Hello</title></head><body><h1>request by Post</h1></body></html>");
out.flush();
out.close();
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPut(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPut...");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Hello</title></head><body><h1>request by Put</h1></body></html>");
out.flush();
out.close();
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doTrace(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doTrace...");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Hello</title></head><body><h1>request by Trace</h1></body></html>");
out.flush();
out.close();
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#getLastModified(javax.servlet.http.HttpServletRequest)
*/
@Override
protected long getLastModified(HttpServletRequest req) {
System.out.println("getLastModified...");
return super.getLastModified(req);
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service(HttpServletRequest req, HttpServletResponse resp)...");
super.service(req, resp);
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service(ServletRequest req, ServletResponse res)...");
super.service(req, res);
}
}
將這個(gè)java文件編譯生成class文件,并將其復(fù)制到剛才創(chuàng)建的classes目錄下。
注意了,這里不是復(fù)制java文件,而是復(fù)制其編譯后的class文件。
sudo cp ~/TestMyHttpServlet.class ~/apache-tomcat-9.0.11/webapps/myservlet/WEB_INF/classes/
編輯WEB-INF 目錄中的web.xml文件,將servlet配置到tomcat
sudo vim web.xml
在如下內(nèi)容
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
//在此處加入下方內(nèi)容
</web-app>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>TestMyHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
配置數(shù)據(jù)解釋:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>TestMyHttpServlet</servlet-class>
</servlet>
在這里表示配置一個(gè)servlet,name中的文本可以隨便填主要用于之后引用,class中的名字要跟java文件名一致。
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
在這里表示將一個(gè)servlet加入所有的servlet表中,name和上方配置的servlet要一致。也就是將之前配置為test的Servlet引用到這里進(jìn)行請(qǐng)求處理。pattern中包含的文本表示在這個(gè)Servlet要監(jiān)聽(tīng)的請(qǐng)求路徑。
按上方的內(nèi)容配置完成后,Servlet的訪問(wèn)路徑就是:
192.168.0.61:8080/myservlet/test
第一個(gè)/myservlet是我們?cè)趙ebapps下新建的文件夾名,第二個(gè)/test就是配置的時(shí)候分配的pattern路徑。
如果想監(jiān)聽(tīng)/myservlet下所有的請(qǐng)求路徑, <url-pattern>中只需要寫(xiě)一個(gè)"/"即可。
如下圖所示:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>TestMyHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
完成后最終效果如圖:
從此之后,所有服務(wù)器的請(qǐng)求處理都可以先在servlet的Java文件中寫(xiě)好,編譯成class之后,把class文件復(fù)制過(guò)來(lái)重新替換,新的功能就可以使用了。