Tomcat给程序员提供了一组API,让程序员更方便的去创建HTTP — servlet
servlet 创建过程
- 创建maven项目 。(针对pom.xml进行修改)
- 引入依赖 。在maven中servlet(servlet API对应的jar包)在pom.xml中新增
<dependencies>
,引入maven的dependency,也把这一段配置称为该依赖在maven仓库的坐标
- 创建目录
web.xml 文件的作用时让tomcat能够识别当前的代码为webapp,并进行加载。
在web.xml中添加代码
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
- 编写代码
自己创建个类,继承自servlet提供的HttpServlet 类。
(这里继承的主要目的是为了对HttpServlet 进行功能扩展–使用方法重写)
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp);
//必须注释,这里的父类方法只是返回一个错误页面
}
}
这里的doGet方法,表示处理一个GET请求,并不需要手动的调用,而是当服务器收到GET请求之后,由tomcat自动调用。
doGet的作用:通过请求计算响应。这里的req是tomcat针对请求,解析构造好的。resp是一个空的对象(不是null,只是new了一个对象,里面的各种属性没设置)
需要我们在doGet内部,根据自己定义的业务逻辑,根据请求计算响应。
resp相当于一个输出型参数。
注解是Java中特殊的类,Java专门定义了一种 语法糖 实现注解。
一个 servlet 程序中,可以有多个 servlet 类,每个 servlet 都可以关联到不同的路径(对应不同的资源),这样多个 servlet 就实现了不同的功能。路径和 servlet 类之间是一一对应的关系
@WebServlet("/hello") //添加注解
//作用:把当前类和HTTP请求的路径关联起来。
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp);
//在服务器的控制台里打印
System.out.println("hello world");
//返回到客户端
resp.getWriter().write("hello world");
//此处的writer对象是从属于resp对象的,此时进行的write操作其实是往resp的body部分进行写入
//字符流:Reader Writer
//字节流:InputStream OutputStream
}
}
- 打包程序
把程序编译好,【得到一些.class文件】,再把这些.class打成一个压缩包。
jar就是一种.class构成的压缩包,但此处要打的是war包,
jar只是一个普通的Java程序,war则是tomcat专属用来描述描述webapp的程序。
一个war让就是一个webapp。
打包过程:
双击或右键package
默认生成的是jar包,我们在pom.xml中修改配置
添加包类型
添加包名称
打包成功
-
部署
把刚才打包好的war拷贝到tomcat的webapps目录中即可。【无论tomcat在同一个电脑还是不同电脑,都是这样copy】
实际工作,tomcat基本都在Linux上运行。 -
验证
打开浏览器,输入URL,验证。
一定要启动tomcat!!!
第一级路径【context path / application path】这个目录就代表一个webapp,网站。hello_servlet
打包时给的名字。
第二级路径 代表注解中的路径。@WebServlet("/hello")
刚才在浏览器地址栏中输入url之后,浏览器就i构造了对应的HTTP GET请求,发给了tomcat。
tomcat就根据第一级路径,确定了具体的webapp,根据第二级路径,确定了调用哪个类。
然后再通过GET/POST方法确定调用HelloServlet中的哪个方法。(doGet,doPost)
使用IDEA的tomcat插件,把tomcat集成到idea,省去了手动打包,手动部署的过程【5,6两步】,只需要按下运行,就可以自动打包部署。
基于tomcat插件的自动打包部署,适用于开发阶段,频繁修改代码,频繁验证
手动打包手动部署,适用于上线阶段,发布程序。
tomcat的工作原理:
tomcat不是说自动的把war包拷贝了,而是通过另一种方式来启动tomcat。
tomcat支持启动的时候显示指定一个特定的webapp目录,相当于是让tomcat加载单个webapp运行。
idea直接调用tomcat,让tomcat加载当前项目中的目录,这个过程你中没有打war包,没有拷贝,没有解压缩的过程。
此时程序可以正常运行,但是像之前webapps下的一些已有的内容(比如欢迎页面),就没有了。
手动部署和使用插件部署,是两种tomcat的运行方式,这两种方式对于 context path 的理解不同。
如果直接拷贝war包的方式部署, context path 就是war包名(目录名)
如果是使用smart tomcat方式部署, context path 可以在smart tomcat中配置,默认是项目名。
出错情况
出现404
- 路径错误
- url是否和代码中的配置一致
- context path 是否正确
- servlet path 是否正确
- webapp没有正确被部署
- web.xml内容出错
- 文件名出错
- 文件路径出错
- 文件位置出错
出现405
- 浏览器发送了GET请求,但是代码中没有写doGet方法,就会出现405。
- doGet方法中的super.doGet() 没有被注释掉。super.doGet() 里的代码就是返回405
出现500
本质上是代码抛出了异常。
出现500错误时,日志会明确指出异常调用栈,指出哪一行代码出现了异常。
出现空白页面
代码中没有写resp.getWriter.write()
出现无法访问此网站
tomcat没有启动。
看看有没有start up success in xxx ms.
如果启动失败,翻日志查看异常,很有可能是端口冲突。