基于Ubuntu的服务器搭建教程(Tomcat + Servlet组合)

最近有需求要搭建一个服务器,该服务器可以接收Json并返回Json。再此之前从未接触过服务器搭建的我,开始了瞎折腾。

一、瞎折腾第一步

安装Ubuntu系统。这一步不需要多做解释吧。我安装的系统是Ubuntu 18.04。如果不会安装Ubuntu系统,可自行查阅资料(其实就是去百度)。

二、瞎折腾第二步

安装Tomcat。
这一步折腾了我4个小时!

1.下载Tomcat

因为对于Ubuntu系统不熟悉,我是通过Windows下载之后,复制到Ubuntu中的。版本是9.0.11。
下载链接:(此链接为2018-08-30记录,可能会失效,如果失效请到tomcat官网下载新的版本)
Apache Tomcat 9.0.11

2.解压Tomcat

下载后的文件名为apache-tomcat-9.0.11.tar.gz,复制到的文件路径在《/home/"Ubuntu当前登陆用户的用户名"》下。使用《Ctrl + Alt + T》快捷键打开《Terminal》命令输入终端。进入终端时,默认的当前路径就是上述路径。输入指令进行解压。

tar -zxvf apache-tomcat-9.0.11.tar.gz

解压后,会在当前目录多出一个叫做 apache-tomcat-9.0.11 的文件夹

3.下载JDK

因为是在网上找的教程,所以没仔细看,到这一步之后才发现Tomcat需要安装JDK才能正常使用,所以又下载了JDK。(jdk 1.8.0_181)
下载链接:(此链接为2018-08-30记录,可能会失效,如果失效请到JDK官网下载新的版本)
jdk 1.8.0_181

4.解压JDK

把jdk下载之后同样放到跟上述Tomcat文件的解压路径,输入命令开始解压。下载后的jdk文件名为:jdk-8u181-linux-x64.tar.gz

tar -zxvf jdk-8u181-linux-x64.tar.gz

5.配置环境变量

跟Windows一样,安装好java还要配置环境变量,同时Tomcat也要配置环境变量。所以我就一起说了。
在终端中输入指令:

sudo vim /etc/profile

在打开的文件的最后加入环境变量配置:
将下方的"Ubuntu当前登陆用户的用户名"替换成你系统上真实的用户名。
这里我在配置java环境变量的同时也配置了tomcat的环境变量

#set jdk environment(配置JDK环境变量)
export JAVA_HOME=/home/"Ubuntu当前登陆用户的用户名"/jdk1.8.0_181
export CLASSPATH=.:$JAVA_HOME/lib
#set tomcat environment(配置tomcat 环境变量)
export CATALINA_HOME=/home/"Ubuntu当前登陆用户的用户名"/apache-tomcat-9.0.11
export PATH=$JAVA_HOME/bin:$CATALINA_HOME:$PATH

保存并退出编辑器。在这里有一点一定要注意,每一行最后一定不能有空格,等号的两边已不能有空格,唯一有空格的地方只有export后面。
立刻使环境变量生效

source /etc/profile

测试java环境

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环境变量成功配置。

6.启动tomcat

回到终端初始目录使用指令《cd ~》。注意:这里的波浪线也是命令的一部分,表示终端初始目录

cd ~

进入tomcat目录

cd apache-tomcat-9.0.11

运行tomcat目录下,bin文件夹中的startup.sh脚本文件,启动tomcat

sudo ./bin/startup.sh

为了方便之后对tomcat的更改,需要先设置tomcat文件夹的权限

sudo chmod -R 775 ./*

输入ifconfig查看当前系统的IP地址

ifconfig
image.png

可以看到我当前系统的IP地址是192.168.0.61,打开局域网中的Windows电脑的浏览器,在网址栏输入192.168.0.61:8080,如果有网页呈现,说明tomcat安装成功。


image.png

因为默认使用的是http协议,谷歌浏览器提示不安全。不过完全不用管这个问题。
下面才是重头戏。

三、Tomcat的基本配置

1.进入tomcat的配置文件的目录

cd ~/apache-tomcat-9.0.11/conf

打开服务器配置文件

sudo vim server.xml

找到如下内容所在行

 <!-- 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等号后的值就是端口,如果想要更改端口,在此处更改即可。

2.基本web服务器配置及使用。

这一步讲的是仅仅将tomcat环境作为web服务器的使用方式。在tomcat中,默认的网络请求根目录为webapps。所以可以在webapps目录下建一个我们自己的目录来存放自己的网页。

进入webapps目录

cd ~/apache-tomcat-9.0.11/webapps

创建自己的文件夹,用于存放自己的网页。

sudo mkdir myweb

上面的指令创建了一个叫做myweb的文件夹,进入该文件夹,并创建一个html文件。

cd myweb
sudo vim index.html

接下来就是编辑该文件,并写入相关的html内容,使其能被解析并显示出网页来。我这里用于演示,就只写了个简单的HTML5网页。

<html lang="zh-CN">
        <head>
                <meta charset="UTF-8"/>
                <title>成功</title>
        </head>
        <body>
                <h1>这是我的网页</h1>
        </body>
</html>

保存之后,在浏览器中输入192.168.0.61:8080/myweb/即可成功显示网页。


image.png

如果只是进行web服务器搭建,到此处就已经结束了。
通过这种方法,就能建立自己想要进行的网页了。tomcat不仅仅支持html文件,还支持htm及jsp文件。

如果还想进行Servlet的联合配置以进行更多处理,请继续往下看。

四、Servlet的配置

通过上述已经知道tomcat的根目录是webapps。所以重新再新建一个目录用于使用Servlet。

cd ~/apache-tomcat-9.0.11/webapps
sudo mkdir myservlet

进入刚刚创建的目录

cd myservlet

根据我几个小时的研究以及官方文档的说明,使用Servlet必须要新建一个文件夹"WEB-INF",所以,进入这个目录后,新建该目录并进入该目录(这里的-是英文的短横线,也叫中划线)

sudo mkdir WEB-INF
cd WEB-INF

在目录下新建两个必须的文件夹

sudo mkdir classes
sudo mkdir lib

classes文件夹用来存放java文件(主要是servlet的java文件以及在servlet中进行的操作需要用到的其他java文件)。
lib文件夹是用来存放java代码中用到的第三方库jar包之类的。
复制webapp/ROOT/WEB_INF目录下的web.xml文件到当前目录

cp ../../ROOT/WEB-INF/web.xml ./

web.xml是用于配置Servlet的关键文件,如果没有这个文件,则无法使用Servlet。而复制webapp/ROOT/WEB_INF目录下的web.xml文件的原因也很简单,这个目录下的web.xml没有配置任何Servlet数据参数,但又有标准框架已经被搭建好了,非常方便自己进行Servlet的添加配置。

文件目录已经创建好了,剩下的就是Servlet的编写与配置了。
以下是我的Servlet的java源码的文件内容。

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;

/**
 * 用于测试的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);
    }
}

将这个java文件编译生成class文件,并将其复制到刚才创建的classes目录下。
注意了,这里不是复制java文件,而是复制其编译后的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

在如下内容

<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>
  //在此处加入下方内容
</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>

配置数据解释:

  <servlet>
      <servlet-name>test</servlet-name>
      <servlet-class>TestMyHttpServlet</servlet-class>
  </servlet>

在这里表示配置一个servlet,name中的文本可以随便填主要用于之后引用,class中的名字要跟java文件名一致。

<servlet-mapping>
      <servlet-name>test</servlet-name>
      <url-pattern>/test</url-pattern>
  </servlet-mapping>

在这里表示将一个servlet加入所有的servlet表中,name和上方配置的servlet要一致。也就是将之前配置为test的Servlet引用到这里进行请求处理。pattern中包含的文本表示在这个Servlet要监听的请求路径。
按上方的内容配置完成后,Servlet的访问路径就是:

192.168.0.61:8080/myservlet/test

第一个/myservlet是我们在webapps下新建的文件夹名,第二个/test就是配置的时候分配的pattern路径。
如果想监听/myservlet下所有的请求路径, <url-pattern>中只需要写一个"/"即可。

如下图所示:

<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>

完成后最终效果如图:


image.png

从此之后,所有服务器的请求处理都可以先在servlet的Java文件中写好,编译成class之后,把class文件复制过来重新替换,新的功能就可以使用了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341