一、什么是Servlet?
Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app
1.1 Servlet能干什么?
- 🚕允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类中的一些代码
- 🚕帮助程序猿解析 HTTP 请求, 把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象.
- 🚕帮助程序猿构造 HTTP 响应. 程序猿只要给指定的 HttpResponse 对象填写一些属性字段, Servlet
- 🚕就会自动的安装 HTTP 协议的方式构造出一个 HTTP 响应字符串, 并通过 Socket 写回给客户端
二、第一个Servlet程序
2.1 创建项目(Maven)
使用 IDEA 创建一个 Maven 项目
2.2 引入依赖(Servlet)
在 pom.xml 中引入 Servlet API 依赖的 jar 包:
🚓在中央仓库 https://mvnrepository.com/ 中搜索 "servlet", 一般第一个结果就是
🚓选择匹配的版本(可以在 http://tomcat.apache.org/whichversion.html 查询版本对应关系)
🚓把中央仓库中提供的 xml 复制到项目的 pom.xml 中
2.3 创建目录(webapp)
在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录
在 webapp 目录内部创建一个 WEB-INF 目录, 并创建一个 web.xml 文件
在web.xml中拷入以下代码
2.4 编写代码(HelloServlet)
在 java 目录中创建一个类 HelloServlet, 代码如下:
java
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Hello world");
resp.getWriter().write("Hello world");
}
}
🚓在这个类上方加上 @WebServlet("/hello")
注解, 表示 Tomcat 收到的请求中, 路径为 /hello 的请求才会调用 HelloServlet 这个类的代码. (这个路径未包含 Context Path)
🚓重写 doGet
方法. doGet
的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发
🚓HttpServletRequest
表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest
对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取.
🚓HttpServletResponse
表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header, body 等)
🚓resp.getWriter()
会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器
2.5 打包代码(war)
首先知道什么是war包: war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片, 以及其他的 jar 包. 打成 war 包格式才能被 Tomcat 识别
在 pom.xml 中新增一个 packing
标签, 表示打包的方式是打一个 war 包,再新增一个 build
标签, 内置一个 finalName
标签, 表示打出的 war 包的名字是 HelloServlet
双击package
成功打包:
2.6 部署
把打包好的war包拷贝到tomcat的webapps目录中
启动 Tomcat , Tomcat 就会自动把 war 包解压缩
看到这个日志说明 Tomcat 已经正确识别了 ServletHelloWorld 这个 webapp
2.7 验证程序
通过浏览器访问 http://127.0.0.1:8080/hello_servlet/hello
注意:
🚙不是tomcat
一启动,我们写的doGet
就能执行,而是要收到路径匹配的GET
请求才能执行!!
🚙URL 中的路径分成两个部分, 其中hello_servlet
为 Context Path,标识了一个webapp, hello
为 Servlet Path,标识当前请求要调用哪个Servlet类的doGet
方法
三、更便捷的部署方式
手动拷贝 war 包到 Tomcat 的过程比较麻烦. 我们还有更方便的办法.
此处我们使用 IDEA 中的 Smart Tomcat
插件完成这个工作
下载smart Tomcat
配置 Smart Tomcat
插件
点击运行:
idea下方显示tomcat的日志