Servlet 初识
Posted 一朵花花
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet 初识相关的知识,希望对你有一定的参考价值。
Servlet
Servlet 是什么?
第一个 Servlet 程序: Hello World
1.创建项目
使用 IDEA 创建一个 Maven 项目
- 新建项目 → Maven
- 输入项目名称,并且选择项目要存放的目录
项目创建完毕,检查
- Maven 项目内容有无标红
- 有无 properties
2.引入依赖
Maven 项目创建完毕后,会自动生成一个 pom.xml 文件;我们需要在 pom.xml 中引入 Servlet API 依赖的 jar 包
- 首先,在 中央仓库 搜索 servlet:
- 选择版本,一般使用 3.1.0 版本
Servlet 的版本要和 Tomcat 匹配.
如果我们使用 Tomcat 8.5,那么就需要使用 Servlet 3.1.0 点击查询版本对应关系
- 把中央仓库中提供的 xml 复制到项目的 pom.xml 中
此处要注意 xml 需要粘贴在 dependencies 标签内
修改后,即:
<?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-Study</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
若 “javax.servlet-api”,“3.1.0” 标红,打开右侧 Maven,点击刷新,下边显示依赖成功即可
修改了 pom.xml 后,一定要刷新 Maven 面板才能生效
3.创建目录
我们发现,当项目创建好了之后,IDEA 会帮我们自动创建出一些目录:
解释:
src: 表示源代码所在的目录
main/java: 表示源代码的根目录,后续创建 .java 文件就放到这个目录中
main/resources: 表示项目的一些资源文件所在的目录
test/java: 表示测试代码的根目录
除开以上自动生成的目录,我们还需要创建一些新的目录 / 文件:
- 创建 webapp 目录
在 main 目录下,和 java 目录并列,创建一个 webapp 目录 (注意不是 webapps)
- 创建 web.xml 文件
然后在 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>
以上,web 项目的环境就配置好了,可以进行 servlet 的开发了
4.编写代码
在 java 目录中创建一个类 HelloServle
以重写 doGET 为例:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
// super.doGet(req, resp); 这段代码要删掉,否则会报错
Servlet开发 是通过标准的 Servlet 标准的 api 来处理请求 和返回响应
- WebServlet 表示当前类是一个 Servlet类,需要处理请求和响应
- 如何知道 某个请求是需要当前这个 servlet类 来处理? 请求行(请求方法, URL):
访问路径: 定义在 @WebServlet中 (将路径写在之后就可以知道 每个路径是由当前这个 servlet类,这个程序来进行处理)
注意: 路径是 / 开头,否则会报错;定义了一个虚拟的路径(可能这个路径没有对应的文件) - 继承 HttpServlet: 处理 Http 协议的
- 重写 父类的 doXXX 方法: XXX 就是提供的服务方法 (请求的时候,也需要使用相同的方法)
- HttpServletResponse 表示 HTTP 响应,代码中把响应对象构造好 (构造响应的状态码,header,body 等)
- resp.getWriter() 会获取到一个流对象,通过这个流对象就可以写入一些数据,写入的数据会被
构造成一个 HTTP 响应的 body 部分,Tomcat 会把整个响应转成字符串,通过 socket 写回给浏览器
上述代码虽然只有几行,但是包含的信息量是巨大的:
- 代码不再是通过 main 方法作为入口了,main 方法已经被包含在 Tomcat 里,我们写的代码会
被 Tomcat 在合适的时机调用起来,此时我们写的代码并不是一个完整的程序,而是 Tomcat 这个程序的一小部分逻辑 - 思考: 随便写个类都能被 Tomcat 调用嘛? 满足什么条件才能被调用呢?
主要满足以下三个条件:
a) 创建的类需要继承自 HttpServlet
b) 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
c) 这个类需要实现 doXXX 方法
当这三个条件都满足之后,Tomcat 就可以找到这个类,并且在合适的时机进行调用
5.打包程序
使用 Maven 进行打包,打开 Maven 窗口,展开 Lifecycle,双击 package 即可进行打包
打包成功:
打包成功后,可以看到在 target 目录下,生成了一个 jar 包:
上述 jar 包并不是我们需要的,Tomcat 需要识别的是另外一种 war 包格式;除此之外,该 jar 包的名字太复杂了,希望将名字改的简单一点
war 包和 jar 包的区别:
.
jar 包是普通的 java 程序打包的结果,里面会包含一些 .class 文件
war 包是 java web 的程序,里面除了会包含 .class 文件之外,还会包含 html,CSS,javascript,图片,以及其他的 jar 包;打成 war 包格式才能被 Tomcat 识别
jar 包 名字的由来: (Servlet-Study-1.0-SNAPSHOT.jar)
相当于把 artifactId 和 version 拼接起来 (默认打包的文件名比较长,是 产品名-版本号)
如何打 war 包??
在 pom.xml 中新增一个 packing 标签,表示打包的方式是打一个 war 包
此时双击 package,打 war 包:
如何更改 war 包名字??
在 pom.xml 中再新增一个 build 标签,内置一个 finalName 标签,表示打出的 war 包的名字是HelloServlet
此时再打开 Maven 面板,先 clean,再重新双击 package 打包:
附完整 pom.xml 代码:
<?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-Study</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- servlet依赖包: 官方提供的标准 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 开发编译时需要这个依赖包,运行时不需要 -->
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>HelloServlet</finalName>
</build>
</project>
6.部署程序
将 web应用 打包为一个 war 的压缩文件,然后把 war 包复制到 Tomcat 的 webapps 目录下
然后启动 Tomcat,Tomcat 就会自动把 war 包解压缩:
7.验证程序
此时通过浏览器访问 http://127.0.0.1:8080/ServletHello/hello,即可看到结果:
注意: URL 中的 PATH 分成两个部分;其中 HelloServlet 为 Context Path, hello 为 Servlet Path
通过 fiddler 抓包查看:
简化部署方式
上述的部署防暑比较繁琐,我们可以通过安装、配置插件来简化部署方式
安装 Smart Tomcat 插件
- 打开 settings
- 选择 Plugins,选择 Marketplace,搜索 “tomcat”,点击 “Install”
注意: 安装过程必须要联网
- 安装完毕后,重启 IDEA 即可
配置 Smart Tomcat 插件
- 点击右上角的 "Add Configuration"
- 选择左侧的 "Smart Tomcat"
- 在 Name 这一栏填写一个名字
在 Tomcat Server 这一栏选择 Tomcat 所在的目录. 其他的选项不必做出修改
- 点击 OK 之后,右上角就变成
点击绿色的▲,IDEA 就会自动进行编译,部署,启动 Tomcat 的过程
此时 Tomcat 日志就会输出在 IDEA 的控制台中,可以看到现在就不再乱码:
.
- 访问页面
可以点击这个蓝色网址直接跳转
不过,出现的是404,因为访问 / 的资源不存在:
手动添加要访问的具体路径后:
此处要注意访问路径
访问出错情况
404
404 表示用户访问的资源不存在,大概率是 URL 的路径写的不正确
错误实例1: 少写了 Context Path,通过 /hello 访问服务器
错误实例2: 少写了 Servlet Path,通过 /HelloServlet 访问服务器
405
405 表示方法不支持 (对应的 HTTP 请求方法没有实现)
错误实例: 没有实现 doGet 方法
@WebServlet("/post")
public class postServlet extends HttpServlet
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
resp.getWriter().println("post");
重启 Tomcat 服务器,在浏览器中访问,可以看到:
(浏览器地址栏的访问方式默认是 GET)
在浏览器地址栏直接输入 URL,会发送一个 HTTP GET 请求;此时就会根据 /Servlet-Study/post 这个路径找到 postServlet 类. 并且尝试调用 postServlet 的 doGet 方法; 但是若没有实现 doGet 方法, 就会出现上述现象
500
往往是 Servlet 代码中抛出异常导致的
错误实例:
@WebServlet("/error")
public class ErrorServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
int i = 1;
int k = i / 0;
resp.getWriter().println("error");
重启 Tomcat 服务器,重新访问页面,可以看到:
在页面上已经有具体的异常调用栈
异常信息里已经提示了出现异常的代码是 ErrorServlet.java 的第 13 行.
- int k = i / 0;
空白页面
错误实例:
@WebServlet("/empty")
public class EmptyServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
System.out.println("empty");
重启 Tomcat 服务器,重新访问页面,可以看到:
可以使用 fiddler 抓包查看,响应 body 中的内容就是 “空数据”
无法访问此网站
一般是 Tomcat 启动就失败了
错误实例: Servlet Path 写错
@WebServlet("empty")
public class EmptyServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
System.out.println("empty");
重启 Tomcat 服务器,重新访问页面,可以看到:
访问网页:
注意: 一点要检查,启动 Tomcat 时,有没有报错
Servlet 路径,必须是 / 开头,/ 前边有空格也会报错;一个 webapp 中,Servlet 的路径必须是唯一的
以上是关于Servlet 初识的主要内容,如果未能解决你的问题,请参考以下文章