Tomcat
tomcat是一个为java提供容器的web服务,这里我们用来开发servlet接口
本篇笔记参考文章:
一、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 | NOTHING