目录
1. 什么是 Servlet ?
2. 动态页面 VS 静态页面
1. 动态页面: 页面代码没有变化, 但是显示的内容可以随着 用户不同/时间不同/输入的参数不同 而发生改变的, 内容有一个动态的效果.
2. 静态页面: 页面内容是始终不变的, 无需经过服务器的编译, 直接加载到客户端浏览器上显示出来的, 不会因为 用户不同/时间不同/输入的参数不同 而导致页面发生变化.
Tomcat 的主页就是一个静态页面.
3. Servlet 的 Hello Word 程序
3.1 第一步: 创建项目
IDEA 创建一个 maven 项目. 由于 maven 的服务器在国外, 所以首次下载加载可能会非常慢, 如果下方进度条没动, 可以点击右边的 Maven ,然后点击刷新按钮.
3.2 第二步: 引入依赖
此处要引入的依赖是用来写 Servlet 程序所需要的依赖. (Servlet 的 jar 包), 可以从 maven 中央仓库下载 (https://mvnrepository.com/) :
1. 搜索 servlet ,点击第一个:
2. 选择 3.1 版本的:
3. 将依赖复制粘贴到 pom.xml 中. (有多个依赖的时候, 都可以放在 dependencies 标签里面, 如果没有下载, 像前面的步骤一样, 点击刷新即可)
3.3 第三步: 创建目录
1. 在 main 包下创建两个目录 webapp, WEB-INF, 和一个文件 web.xml, 必须要使用这些命名, 这是 Tomcat 做出的要求, 要想让我们写的程序能被 Tomcat 识别, 咱们就只能遵守.
2. 创建好的 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>
3.4 第四步: 编写代码
@WebServlet("/hello") // 注解, 约定 Http 请求的 URL 是什么 path, 才会调用到当前的这个 Servlet 类
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");
// 此处是吧 "hello world" 字符串作为响应报文的 body 了, 浏览器就会把这个 body 显示到压面中
resp.getWriter().write("hello world");
}
}
🍃1.我们在 java 包下创建一个类, 并继承 HttpServlet 类, 此处的 HttpServlet 类就是通过前面的 pom.xml, 基于 maven 从中央仓库下载的 jar 包来的.
🍃2. 重写父类的 doGet 方法, 让 doGet 方法执行到咱们自己写的代码.(记得删掉调用自动生成的调用父类的方法, 否则会出问题)
🍃3. 打印 hello world, 一个打印在服务器控制台, 一个显示到页面.
🍃4. 在类的最上方添加 @WebServlet("/hello") 注解, 这个注解约定了 HTTP 请求的 URL 是什么 path, 然后才会调用到当前这个 Servlet 类. (例如输入 URL: http://localhost:8080/hello_servlet/hello , hello_servlet 是项目名, hello 是注解里标明的 path).
分析 doGet 方法:
1. doGet 的两个参数, req (Request) , resp (Response), 这两对象分别代表着 HTTP 的请求和 HTTP 的响应, HTTP 协议格式中包含的信息, 就都在这两个对象中.
2. doGet 方法不是咱们手动调用的, 而是 Tomcat 自动调用的, Tomcat 会在合适的时机去调用 doGet 方法, 这个过程比较复杂, 但是我们能知道的是, 一定是由 GET 请求触发的.
3. doGet 做的工作, 就是 Tomcat 收到请求之后, 到返回响应之前, 中间的过程.
- doGet 参数中的 HttpServlet Request 就是 Tomcat 根据收到的 HTTP 请求生成的对象,
- doGet 里面根据当前的业务逻辑, 根据 HttpServletRequest 生成一个 HttpServletResponse,
- Tomcat 给 HttpServletRespnse 这个空对象填充数据, 构造成 HTTP 响应报文, 返回给客户端.
我们可以把 doGet 要做的工作理解为餐馆后厨要做的事情.
上述代码中没有 main 方法, main 方法在 Tomcat 里面, 所以需要将上述代码部署到 Tomcat 中, 再由 Tomcat 进行调用执行.
3.5 第五步: 打包
打包操作非常简单,我们可以借助 maven 一键式完成.
此处的 Lifecycle 指的是一个 maven 项目的生命周期, 这里我们只需要关注 package, 我们双击执行 package, 执行 package, 就相当于会执行 package 前面的所有动作, 在控制台看到 BUILD SUCCESS 的字样, 说明打包完成了, 最终会生成一个压缩包.
此处默认生成的是一个 jar 包, 但是 Tomcat 能识别的是一个 war 包, 所以需要修改 pom.xml ,使其生成一个 war 包.
1. 添加上图红框框的代码, <packaging>war</packaging> 这个 packaging 标签用来设置打包格式, 通过 build 标签中的 finalName 标签,设置生成包的名字, 为了把这个包的名字改简单点(可选的)
2. 做完上述步骤后, 再次双击 package 进行打包.就可以得到下图的 war 包.
3.6 第六步: 部署
1. 选中上图中的 war 包, 右击 open in, explorer, 在文件资源管理器中打开:
2. 直接把这个 war 包拷贝到 Tomcat 的 webapps 目录下, 然后启动 Tomcat. (点击 Tomcat 的 bin 目录下的 startup.bat 启动)
启动 Tomcat 的时候, 就能在它的日志中, 看到有一个提示,意思就是 Tomcat 发现了这个 war 包, 然后就会对这个 war 包进行解压缩和加载, 得到以下文件夹.
3.7 第七步: 验证
当前我们已经把程序部署到 Tomcat 上了, 但是要想运行 hello world 代码, 还需要让浏览器构造一个 HTTP GET 请求, 输入如下 URL ,就能正常打印 hello world 了:
此时页面上出现一个 hello world ,并且 Tomcat 服务器上也出现一个 hello world ;
此处的 hello_servlet 对应的是 tomcat 的 webapps 里面的目录, 这个目录的名字 hello_servlet 就是前面修改的 war 包的名字, 也叫作 Content Path, 而 hello 就对应注解中的 path ,也叫作的 Servlet path.
3. 8 七大步骤总结
后续针对代码进行了任何修改, 都需要重新进行 5 - 7 的步骤.
1-3 步,创建一个项目, 只要操作一次就好了 O(1), 而 4 - 5 步, 每修改一次代码,都需要进行更改 O(N), 此处的 4 和 7 是省不了的, 可以针对 5,6 进行简化操作, 就是用到 IDEA 的插件 smart tomcat.
4 安装并配置 Smart Tomcat 插件
首先下载 smart tomcat 插件:
第二步:点击红色地方
第三步:
第四步: 按照下图操作, 操作完成后, 点击 OK 即可.
第五步: 点击三角形, 就会进行编译, 打包, 部署程序, 并运行 Tomcat ,此时就不再是一个 黑框框了, 而是直接在 IDEA 里有一个窗口, 显示了 Tomcat 的日志. (Tomcat 已经跑起来了, 被集成在 IDEA 之中).
【总结】
上述几个步骤就可以简化前面七大步骤中的 "打包部署" 操作..
smart Tomcat 的工作原理和前面手动的打包部署, 不太一样, 所以此时打开 webapps 目录, 看不到你刚才搞的 war 包.
其实 Tomcat 的运行方式有很多种, smart Tomcat 是运行在 Tomcat 的时候, 通过其他手段, 让 Tomcat 直接加载了代码中的 webapps 目录, 这个时候就跳过了打包和拷贝的过程, 但也起到了部署的效果.
谢谢观看!!