Tomcat食用教程

发布于 2018-11-24  2 次阅读


Tomcat

tomcat是一个为java提供容器的web服务,这里我们用来开发servlet接口

本篇笔记参考文章:

CentOS 7 Tomcat服务的安装与配置

一、web环境简介

linux + apache + php + mysql --lamp环境 php环境
linux + nginx + php + mysql --lnmp环境 php环境
linux + tomcat + jsp + mysql --ljtm环境 java环境

二、安装与配置

环境:centos 7

1、首先需要安装java和jdk

这个步骤就略过了,记住安装路径即可,一般为了方便,设置为/usr/local/java路径

注意在Oracle官网下载的tar.gz压缩包使用 tar -xvf命令即可解压

2、下载tomcat

官网

下载链接(清华源)

这里区分一下tomcat的deploy和core两个版本

core:部署版本,一般下载这个就行,linux直接下载不带后缀的压缩文件即可

deploy:这个看介绍讲是一个用于动态发布的软件,不是tomcat的本体

3、解压

以上面链接下载的文件为例

tar -xvf apache-tomcat-9.0.13.tar.gz -C /usr/local/

-C命令是配置解压目录

4、Tomcat的目录结构

|--bin --启动命令目录
|--conf --配置文件目录 重点
|--lib --库文件目录
|--logs --日志文件目录 重点
|--temp --临时缓存文件
|--webapps --web应用目录 重点
|--work --工作缓存目录

5、修改Tomcat环境变量

Tomcat是需要jdk才能运行,上面解压安装后,还需要在tomcat里配置jdk的目录

修改tomcat环境变量有三种方法:
第一种:定义在全局里;如果装有多个JDK的话,定义全局会冲突,不建议

[root@Tomcat ~]# vim /etc/profile

第二种:写用户家目录下的环境变量文件.bash_profile

第三种:是定义在单个tomcat的启动和关闭程序里,建议使用这种

[root@Tomcat ~]# vim /usr/local/tomcat/bin/startup.sh       --tomcat的启动程序
[root@Tomcat ~]# vim /usr/local/tomcat/bin/shutdown.sh      --tomcat的关闭程序

把startup.sh和shutdown.sh这两个脚本里的最前面加上下面一段:

export JAVA_HOME=/usr/local/java
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CLASS_PATH=JAVA_HOME/bin/lib:JAVA_HOME/jre/lib:JAVA_HOME/lib/tool.jar
export PATH=PATH:/usr/local/java/bin:/usr/local/tomcat/bin

classpath是指定你在程序中所使用的类(.class)文件所在的位置。
path是系统用来指定可执行文件的完整路径。

6、启动Tomcat

前面安装和配置好后,下面就可以启动了,启动时会有下面这一段输出。

[root@Tomcat ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

查看端口,tomcat默认是8080端口

[root@Tomcat ~]# lsof -i:8080
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    31259 root   49u  IPv6 465528      0t0  TCP *:webcache (LISTEN)

关闭tomcat方法

[root@Tomcat ~]# /usr/local/tomcat/bin/shutdown.sh

使用浏览器打开测试,如果能看到tomcat的主页则证明配置成功

7、配置Tomcat端口IP供远程访问

修改server.xml的端口和监听IP地址

[root@Tomcat ~]# vim /usr/local/tomcat/conf/server.xml
<Connector port="18880" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443" />
 <Host name="0.0.0.0"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
 <Engine name="Catalina" defaultHost="0.0.0.0">

8、Centos巨坑记录

按照上面的做法启动完tomcat后,终端输出Tomcat started. 但是无法访问首页,同时使用shutdown.sh时会提示错误

SEVERE: Catalina.stop:
java.net.ConnectException: Connection refused (Connection refused)

刚开始我以为是端口或者别的问题,一开始使用netstat -lntup查看PID然后通过kill来杀掉进程,但是再启动还是没有用。

使用telnet尝试了一下,确实无法访问8005,也就是shutdown的端口。所以原因应该是Tomcat就没有启动成功。

这个坑当然也有前人遇到了,不然可能一时半会还解决不了。

下面说原因跟解决方法:

这个是jdk的一个bug,具体看这篇文章

大体就是java为centos提供的一个随机数,会导致tomcat卡住。

解决方法是修改默认的随机方法,进入java目录找到java.security文件

vim java/jre/lib/security/java.security

将securerandom.source这个设置项,修改为

securerandom.source=file:/dev/./urandom

urandom即伪随机数,安全性没有random高,但是不会让tomcat卡掉。

至此重新启动tomcat,可以成功访问主页,同时也可以想shutdown就shutdown了。

三、创建一个Tomcat Web App

其实进入tomcat 的主页,已经给出了很多示例的连接,可以点击example进去下载一个sample.war文件,使用jar -xvf sample.war命令解压,就是一个完整的web工程文件。目录介绍如下:

|--META-INF 项目信息目录
|--|--MANIFEST.MF 项目信息
|--WEB-INF web应用配置目录
|--|--web.xml 应用配置文件,Servlet的配置就在这里
|--|--classes Servlet的类文件,如果有包则将包一并拖入此目录
|--|--|--包名 Servlet的包
|--|--|--|--*.class Servlet的类
|--images 图片目录
*.jsp jsp文件
*.html html文件

其中比较重要的是web.xml文件

1、先编写servlet类

首先下载 servlet-api.jar,这个是tomcat的servlet库

编写示例代码如下

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("</body>");
        out.println("</html>");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        this.doGet(request, response);
    }

}

这里主要是doGet方法,一般的http请求都是这个,比如浏览器直接访问;

其次是doPost,一般是提交数据用。

这里注意一下,我们写的类是跑在tomcat的容器内,作为一个应用,是通过doGet方法和doPost方法来执行我们的业务逻辑,不会通过main函数入口,如果有main函数会出错。这一点只要了解Servlet的生命周期就不会疑惑了。

Servlet的生命周期为 init()->service()->destroy()

其中service方法是web容器,也就是tomcat来进行调用,然后容器会根据协议类型来调用我们实现的doGet和doPost方法。

编写完成后,我们将.java文件编译成.class文件,需要刚刚下载的servlet-api.jar文件

javac -classpath servlet-api.jar HelloServlet.java

执行完成后生成的class文件不要丢,经过下一步放入项目部署目录就可以用了

2、web.xml文件配置

web.xml文件中,比较重要的是<web-app>标签

<servlet>标签是配置Servlet的类名和包名

<servlet-mapping>标签是配置Servlet的访问地址

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <display-name>Hello, World Application</display-name>
    <description>
        This is a simple web application with a source code organization
        based on the recommendations of the Application Developer's Guide.
    </description>

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>

如上,在这个配置文件中,我们指定了Servlet类为HelloServlet 没有包名,并设置其访问地址为/hello

3、部署到服务器上

我们将这个文件放到一个文件夹下,文件夹命名为helloservlet,这就是我们的测试工程目录了

找到配置tomcat应用的目录 /usr/local/tomcat/webapps,将helloservlet目录放入

4、访问测试

servlet的访问URL是 tomcat地址/项目目录/web.xml中配置的servlet地址

假定tomcat的访问地址是 localhost:8080

那么我们应用的servlet访问地址则是 localhost:8080/helloservlet/hello

Comments


来自像素世界的代码家,创造第九艺术!