本文介绍在基于Ubuntu 18.04的服务器中搭建Tomcat+Servlet组合。最近有需求要搭建一个Ubuntu服务器,该服务器可以接收Json并返回Json。
一、安装Ubuntu 18.04 安装Ubuntu系统。这一步不需要多做解释吧。我安装的系统是Ubuntu 18.04,参考安装Ubuntu 18.04 LTS服务器版详细步骤一文。
二、安装Tomcat 1.下载Tomcat 因为对于Ubuntu系统不熟悉,我是通过Windows下载之后,复制到Ubuntu中的。版本是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 3.下载JDK 到这一步之后才发现Tomcat需要安装JDK才能正常使用,所以又下载了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 gedit /etc/profile 在打开的文件的最后加入环境变量配置: #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:$TOMCAT_HOME:$PATH 保存并退出编辑器。在这里有一点一定要注意,每一行最后一定不能有空格,等号的两边已不能有空格,唯一有空格的地方只有export后面。 立刻使环境变量生效 sudo 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
可以看到我当前系统的IP地址是192.168.0.61,打开局域网中的Windows电脑的浏览器,在网址栏输入192.168.0.61:8080,如果有网页呈现,说明tomcat安装成功。
因为默认使用的是http协议,谷歌浏览器提示不安全。不过完全不用管这个问题。下面才是重头戏。
三、Tomcat的基本配置 1.进入tomcat的配置文件的目录 cd ~/apache-tomcat-9.0.11/conf 打开服务器配置文件 sudo gedit 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 AJPConnector: /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 到这里,临时创建了一个叫做index.html临时的文件。
接下来就是将这个文件保存在当前目录。请仔细看操作步骤: 1].按下Esc键。当按下这个键的时候可能什么反应都没有,这是正常现象。 2].确认当前输入法是英文,如果不是请切换成英文输入法。 3].输入英文的冒号,小写字母w,小写字母q。 4].输入完成之后,应该如同下图所示。
按下回车,回到正常命令模式就说明保存成功。接下来就是编辑该文件,并写入相关的html内容,使其能被解析并显示出网页来。 <html lang="zh-CN"> <head> <meta charset="UTF-8"/> <title>成功</title> </head> <body> <h1>这是我的网页</h1> </body> </html> 保存之后,在浏览器中输入192.168.0.61:8080/myweb/即可成功显示网页。
如果只是进行web服务器搭建,到此处就已经结束了。如果还想进行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文件内容 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); } } 在Servlet中我只对get方法进行了处理。(浏览器的请求方式为get)。 将这个java文件编译后的class文件复制到《/home/"Ubuntu当前登陆用户的用户名"》下,使用命令复制到刚才创建的classes目录下。 sudo cp ~/TestMyHttpServlet.class ~/apache-tomcat-9.0.11/webapps/myservlet/WEB_INF/classes/ 编辑web.xml文件,将servlet配置到tomcat sudo gedit 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文件名一致,java文件中的Servlet类名也要跟文件名一致。 <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> 在这里表示将一个servlet加入所有的servlet表中,name和上方配置的servlet要一致。pattern表示在服务器后方跟的路径。 配置完成只有,当前的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> 完成后最终效果如图:
注意 之后的所有服务器处理都可以在servlet的Java文件中写好,编译之后把class文件复制过来重新替换就,新的功能就可以使用了。
相关主题 |