Tomcat的安装与Maven依赖Servlet的使用
- 🍎一.Tomcat应用
-
- 🍒1.1什么是Tomcat
- 🍒1.2Tomcat下载安装
- 🍒1.3 IDEA插件Smart Tomcat
- 🍎二.Maven依赖Servlet应用
-
- 🍒2.1什么是Servlet
- 🍒2.2创建Servlet简单实现一个响应
-
- 🍉一.创建一个Maven文件
- 🍉二.引入依赖
- 🍉三创建目录
- 🍉四.编写代码
- 🍉五.打包/部署/运行
- 🍒2.3 Servlet程序运行常见错误
- 🍒2.4总结
🍎一.Tomcat应用
🍒1.1什么是Tomcat
Tomcat 是一个 HTTP 服务器.
前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式.
同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端.
HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实现的一个开源免费,也是被广泛使用的 HTTP 服务器.
🍒1.2Tomcat下载安装
下载地址
点击此处下载
选择其中的 zip 压缩包, 下载后解压缩即可
*解压缩的目录最好不要带 “中文” 或者 特殊符号
🍒1.3 IDEA插件Smart Tomcat
在File中点击Settings,搜索Smart Tomcat后点击下载
🍎二.Maven依赖Servlet应用
🍒2.1什么是Servlet
Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app
回顾 动态页面 vs 静态页面
静态页面也就是内容始终固定的页面. 即使 用户不同/时间不同/输入的参数不同 , 页面内容也不会发生变化. (除非网站的开发人员修改源代码, 否则页面内容始终不变).对应的, 动态页面指的就是 用户不同/时间不同/输入的参数不同, 页面内容会发生变化
构建动态页面的技术有很多, 每种语言都有一些相关的库/框架来做这件事.Servlet 就是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API, 来完成构建动态页面这个任务
Servlet 主要做的工作
●允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类中的一些代码.
●帮助程序猿解析 HTTP 请求, 把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象.
●帮助程序猿构造 HTTP 响应. 程序猿只要给指定的 HttpResponse 对象填写一些属性字段, Servlet就会自动的安装 HTTP 协议的方式构造出一个 HTTP 响应字符串, 并通过 Socket 写回给客户端.
当然, Servlet 还支持一些其他的辅助功能, 此处暂时先不介绍.简而言之, Servlet 是一组 Tomcat 提供的 API, 让程序猿自己写的代码能很好的和 Tomcat 配合起来, 从而更简单的实现一个 web app.而不必关注 Socket, HTTP协议格式, 多线程并发等技术细节, 降低了 web app 的开发门槛, 提高了开发效
率.
🍒2.2创建Servlet简单实现一个响应
🍉一.创建一个Maven文件
打开IDEA点击创建项目点击Maven,点击Next,后就正常创建即可
🍉二.引入依赖
创建好目录后,点击pom.xml引入Servlet依赖
点击复制资源:Servlet资源地址
输入 后将复制好的资源粘贴到里面,如果出现红色错误不要急,是第一次引入资源而且是外网所以需要一段时间才能下载好
?xml version="1.0" encoding="UTF-8"?>
project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
modelVersion>4.0.0/modelVersion>
groupId>org.example/groupId>
artifactId>Servlet/artifactId>
version>1.0-SNAPSHOT/version>
properties>
maven.compiler.source>8/maven.compiler.source>
maven.compiler.target>8/maven.compiler.target>
/properties>
dependencies>
!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
dependency>
groupId>javax.servlet/groupId>
artifactId>javax.servlet-api/artifactId>
version>3.1.0/version>
scope>provided/scope>
/dependency>
/dependencies>
/project>
点击右上角Maven进行刷新
🍉三创建目录
如下在main创建 webapp文件—-在创建WEB-INF文件—在创建web.xml文本
往 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>
webapp 目录就是未来部署到 Tomcat 中的一个重要的目录. 当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等.
在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理 webapp 中的动态资源
🍉四.编写代码
点击Java创建一个类
创建一个类 HelloServlet , 继承自 HttpServletAlt+Enter导入import javax.servlet.http.HttpServlet包
●在这个类上方加上 @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 写回给浏览器.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created with InteliJ IDEA.
* /Description:
* User:PANJIAPENG
* Date:2022-11-09
* Time:19:32
*/
@WebServlet("/hello")
public class ServletHello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello servlet");
resp.getWriter().write("hello Servlet");
}
}
这个代码虽然只有寥寥几行, 但是包含的信息量是巨大的
(1) 我们的代码不是通过 main 方法作为入口了. main 方法已经被包含在 Tomcat 里, 我们写的代码会被Tomcat 在合适的时机调用起来.
此时我们写的代码并不是一个完整的程序, 而是 Tomcat 这个程序的一小部分逻辑.
(2) 我们随便写个类都能被 Tomcat 调用嘛? 满足啥样条件才能被调用呢?
主要满足三个条件:
● 创建的类需要继承自 HTTP Servlet
● 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
● 这个类需要实现 doXXX
方法
当这三个条件都满足之后, Tomcat 就可以找到这个类, 并且在合适的时机进行调用
🍉五.打包/部署/运行
打包:
war 包和 jar 包的区别
●jar 包是普通的 java 程序打包的结果,也是默认打包格式. 里面会包含一些 .class 文件.
●war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片, 以及其他的 jar 包. 打成 war 包格式才能被 Tomcat 识别.
点击运行进行打包/部署
检验程序:
输入127.0.0.1:8080/Servlet/hello
注意:这是根据自己设置的文件路径进行查找的
🍒2.3 Servlet程序运行常见错误
出现 404
404 表示用户访问的资源不存在. 大概率是 URL 的路径写的不正确
●错误实例1: 少写了 Context Path
通过 /hello 访问服务器
●错误实例2: 少写了 Servlet Path
通过 /Servlet 访问服务器
●错误实例3: Servlet Path 写的和 URL 不匹配
修改 @WebServlet 注解的路径
●错误实例4: web.xml 写错了
清除 web.xml 中的内容
出现405
405 表示对应的 HTTP 请求方法没有实现.
错误实例: 没有实现 doGet 方法.
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
}
出现 500
往往是 Servlet 代码中抛出异常导致的
错误实例:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String s = null;
resp.getWriter().write(s.length());
}
}
出现 “空白页面”
错误实例:
修改代码, 去掉 resp.getWritter().write() 操作
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("hello");
}
}
出现 “无法访问此网站”
一般是 Tomcat 启动就失败了.
错误实例: Servlet Path 写错了又肯没有加”/”
🍒2.4总结
初学 Servlet, 遇到的这类问题会非常多. 我们不光要学习 Servlet 代码的基本写法, 也要学习排查错误的思路.
程序猿调试 BUG 如同医生诊病.
一个有经验的程序猿和一个新手程序猿相比, 最大的优势往往不是代码写的多好, 而是调试效率有多高. 同一个问题可能新手花了几天都无法解决的, 但是有经验的程序猿可能几分钟就搞定了.
你还觉得 “程序猿是吃青春饭” 嘛?
熟悉 HTTP 协议能够让我们调试问题事半功倍.
●4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及Servlet Path 是否一致.
●5xx 的状态码表示服务器出现错误,或者代码写错, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.
●出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误提示.
●空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.
●观察日志是调试程序的重要途径. Tomcat 的日志往往很多, 需要同学们耐心阅读, 经常阅读, 熟练了就能更快速的找到问题了.
舞台在大,你不登场,永远都是观众.平台再好,你不参加永远都是局外人.能力再大,你若不行动,没人能看到你的成功.我们一起加油屏幕前的陌生人!