介绍
前面介绍了Web的基础知识,最后引出了Web前端和Web后端,Web服务器、Web容器和Servlet容器等概念。Web前端的开发主要涉及HTML、CSS和JavaScript;Web后端的开发那就有很多语言了,C/C++、PHP、Python、Java和新贵语言Go等等。
Java在Web开发的主要技术就是Servlet,它最初是有Sun公司的某个大牛用Java开发Web服务器的产物,最后形成规范、标准,就叫Java Servlet Specification,简称JSS。Tomcat也是由该大牛开发出来的(其实就是用Java开发的),后来贡献给了Apache软件基金会。
所以,Tomcat首先是一个Web服务器,同时也是一个Servlet容器,当然它也是一个JSP容器(本质上,JSP也是Servlet)。容器也可以叫引擎。既然叫容器,那么它肯定就是能够装某些东西,什么东西呢?当然就是Servlet了,那Servlet又是什么东西呢?它既然是Java提供的技术,在Java世界里一切都是类和对象,所以Servlet其实就是某种类而已,只不过它遵循某些规范(可以想象为某种格式)来供Servlet容器装载并执行。
Servlet技术咱暂且不细说,既然我们要用Servlet技术来开发Web应用程序,一个Servlet容器就必然是需要的,我们就选择Tomcat吧。
下载和安装
因为我使用的是Windows系统作为开发平台,在Windows系统下Tomcat的安装有两种,一种是使用安装器(就是Installer),一种是直接解压Tomcat二进制发行包。安装器可以把Tomcat安装为一个Windows服务。但这里,我采用跟Eclipse类似的方式,直接解压安装法。
当然,当你开发完你的Web应用程序之后,需要放到Tomcat服务器上,所以在你的部署机器上也需要安装Tomcat。
先到Tomcat官网下载最新版的Tomcat。
我们就选择红色箭头所指的版本Tomcat 9.0.16.Released,点击下面的Download,将出现:
大家根据自己的系统来选择就可以了,我选择的是64-bit Windows zip。下载完毕之后,直接解压缩到合适的目录下。OK,这样就算安装完毕了,进入到解压出来的目录去看看都有哪些内容:
- bin目录:主要存放各种脚本,包括启动和停止等脚本;
- conf目录:存放配置文件,包括server.xml等配置文件;
- lib目录:存放各种JAR包,包括servlet-api.jar、jsp-api.jar等,我们的web应用程序就需要引用这些JAR包中的类或接口等。
- logs目录:顾名思义,就是存放Tomcat的日志文件的,目前是空的;
- temp目录:Tomcat临时文件的存放目录,暂时不需要理会,目前是空的;
- webapps目录:这里就是存放你的Web应用程序的地方了,你需要把你的Web应用程序拷贝到这,然后Tomcat就能加载它,这就是所谓的部署你的应用。当然,还有其他的部署方式。这个目录里面已经带有一些Tomcat的示例Web应用程序。
- work目录:这个是Tomcat的工作目录,目前是空的。
- 剩下的:就是些说明文件、授权文件等,无须理会。
这里要说明的是,Tomcat把这些个目录分成三类:
- 可以修改其中的文件的目录:conf、logs、webapps、work这四个目录。这类目录的存放位置其实可以用环境变量CATALINA_BASE设置,其值默认是安装目录;
- 只能读其中的文件的目录:bin、lib这两个目录,可以用环境变量CATALINA_HOME设置,其值默认是安装目录;
- 临时文件目录:temp目录,可以用环境变量CATALINA_TMPDIR设置,其值默认是CATALINA_HOME/temp。
为什么要这样分呢?这是为了启动多个Tomcat实例而拥有各自的定制特性和日志等(就放在自己设置的CATALINA_BASE目录下),或者避免升级Tomcat带来的文件覆盖。
启动和停止
既然这就算安装成功了,那咱就启动一下Tomcat来验证一下。打开Windows命令行工具,并进入到Tomcat的安装目录,我的机器上是:E:\csdn\apache-tomcat-9.0.16,然后输入:
bin\startup.bat
这就是执行bin目录下的tomcat启动脚本,一般情况下会执行成功,同时弹出Tomcat的控制台窗口:
从最后一句日志信息中可以看出Tomcat已经成功启动,但问题是出现了很多乱码,这是怎么回事?猜想是Tomcat打印日志的字符集和这个控制台显示信息的字符集有问题吧。于是网上搜了半天,在Tomcat控制台的标题栏右击弹出菜单,点击属性弹出属性对话框:
显示Tomcat控制台窗口的字符集是GBK。于是想只要把Tomcat日志打印的字符集改为GBK就可以了吧。日志打印的字符集配置在哪呢?当然是先到conf目录下找找看啊,可以找到一个logging.properties文件,用文本编辑器打开看看:
可以看到这个文件里有一项是配置日志打印字符集的,那就把它修改为GBK试试,结果真的成功了。
好,现在已经把Tomcat成功启动了,实际上我们就可以在浏览器地址栏输入:
http://localhost:8080/
按回车键可以看到:
这其实就是Tomcat自带的一个示例Web应用程序,只不过它也可以用来配置、管理和监控该Tomcat运行实例,这也说明Tomcat确实已经运行起来了,而且是监听在8080端口上,当然,这都是可配置的。
停止Tomcat有几种方法:
- 直接点击Tomcat控制台窗口标题栏的关闭按钮;
- 在Tomcat控制台窗口时,使用快捷键Ctrl + C;
- 在另外一个命令行窗口执行Tomcat停止脚本:
bin\shutdown.bat
配置
这里先暂时不用理会,等需要用到的时候再讨论,所谓契约优先原则就是我们尽量使用默认的配置,尽量让默认的配置够用,这样就可以减少我们的工作量。试想一下,如果一个软件的使用需要很多很繁复的配置,那用户将会多么沮丧,这样的软件将是失败的。实际上,我们设计出的软件也应该尽量遵循这个原则。
Tomcat自带的示例Web应用程序
上面提到的webapps目录就是部署Web应用程序的目录,Tomcat安装包里面已经自带有几个示例Web应用。我们可以尝试着访问它们。
启动Tomcat,打开浏览器,先在地址栏输入:
http://localhost:8080/docs/
在浏览器上可以看到下面这个页面:
说明这个Web应用可以访问,它是Tomcat的使用文档,如果英文熟练的话,我们完全就可以通过这个应用来研究Tomcat的使用。没错,这就是Web应用,看起来用户体验不错吧。
在地址栏输入:
http://localhost:8080/examples/
在浏览器上可以看到下面这个页面:
说明这个Web应用也可以访问,它真的是Tomcat的示例Web应用,我们可以进一步点击上面三个链接中的每一个,看看里面都有什么内容,每一个页面又有链接,继续点击访问即可,反正鼠标可以到处尝试着点击,看页面会有什么反应。这里给出的例子还是比较丰富的,甚至有聊天工具、贪吃蛇游戏、画板等应用。
我点击上面的Servlets examples,页面显示:
再点击红色箭头所指的HelloWorld这个Servlet的源代码,让我们来看看Servlet的庐山真面目:
可以看到,Servlet的庐山真面目就是一个Java类:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld 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>");
}
}
上面代码熟悉吧,就是前面Java基础里面介绍的Java类的定义,只不过类定义里面有个extends关键字,以及方法doGet里面有个throws关键字,这两个我们还未曾介绍。剩下的要么就是导入其他包里面的类(import语句)、其他类的名称(HttpServlet、HttpServletRequest、HttpServletResponse、IOException、ServletException、PrintWriter 等)、对象的引用变量、通过对象引用调用方法。这些我们都已经介绍过。可见,一个Servlet就是一个Java类,只不过它继承了某个特殊的类而已,这里是继承 HttpServlet。我们后面就介绍何为继承。
再在地址栏输入:
http://localhost:8080/host-manager/
或
http://localhost:8080/manager/
可以看到这两个web应用可以访问,但是需要用户名和密码登录后才能继续使用。
最后在地址栏输入:
http://localhost:8080/Root
这时页面显示HTTP Status 404错误,之前介绍HTTP协议的时候提到过,它表示服务器上没有所要请求的资源,可见Root这个目录这不是一个Web应用。
总结
- Tomcat是一个既是Web服务器,又是Servlet容器;
- Servlet其实就是一个特殊的类,遵循Servlet规范,当然Servlet规范可不仅仅包含Servlet这个类而已;
- 遇到乱码的问题,一般都是字符集冲突的原因造成的;
- 我们设计出的软件最好也遵循契约优先原则。