Servlet 初识

Posted 一朵花花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet 初识相关的知识,希望对你有一定的参考价值。

Servlet

Servlet 是什么?

第一个 Servlet 程序: Hello World

1.创建项目

使用 IDEA 创建一个 Maven 项目

  1. 新建项目 → Maven

  1. 输入项目名称,并且选择项目要存放的目录

项目创建完毕,检查

  1. Maven 项目内容有无标红

  1. 有无 properties

2.引入依赖

Maven 项目创建完毕后,会自动生成一个 pom.xml 文件;我们需要在 pom.xml 中引入 Servlet API 依赖的 jar 包

  1. 首先,在 中央仓库 搜索 servlet:

  1. 选择版本,一般使用 3.1.0 版本

Servlet 的版本要和 Tomcat 匹配.
如果我们使用 Tomcat 8.5,那么就需要使用 Servlet 3.1.0 点击查询版本对应关系

  1. 把中央仓库中提供的 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: 表示测试代码的根目录

除开以上自动生成的目录,我们还需要创建一些新的目录 / 文件:

  1. 创建 webapp 目录

在 main 目录下,和 java 目录并列,创建一个 webapp 目录 (注意不是 webapps)


  1. 创建 web.xml 文件

然后在 webapp 目录内部创建一个 WEB-INF 目录,并在其目录下创建一个 web.xml 文件


  1. 编写 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 来处理请求 和返回响应

  1. WebServlet 表示当前类是一个 Servlet类,需要处理请求和响应
  2. 如何知道 某个请求是需要当前这个 servlet类 来处理? 请求行(请求方法, URL):
    访问路径: 定义在 @WebServlet中 (将路径写在之后就可以知道 每个路径是由当前这个 servlet类,这个程序来进行处理)
    注意: 路径是 / 开头,否则会报错;定义了一个虚拟的路径(可能这个路径没有对应的文件)
  3. 继承 HttpServlet: 处理 Http 协议的
  4. 重写 父类的 doXXX 方法: XXX 就是提供的服务方法 (请求的时候,也需要使用相同的方法)
  5. HttpServletResponse 表示 HTTP 响应,代码中把响应对象构造好 (构造响应的状态码,header,body 等)
  6. resp.getWriter() 会获取到一个流对象,通过这个流对象就可以写入一些数据,写入的数据会被
    构造成一个 HTTP 响应的 body 部分,Tomcat 会把整个响应转成字符串,通过 socket 写回给浏览器

上述代码虽然只有几行,但是包含的信息量是巨大的:

  1. 代码不再是通过 main 方法作为入口了,main 方法已经被包含在 Tomcat 里,我们写的代码会
    被 Tomcat 在合适的时机调用起来,此时我们写的代码并不是一个完整的程序,而是 Tomcat 这个程序的一小部分逻辑
  2. 思考: 随便写个类都能被 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 插件

  1. 打开 settings

  1. 选择 Plugins,选择 Marketplace,搜索 “tomcat”,点击 “Install”

注意: 安装过程必须要联网

  1. 安装完毕后,重启 IDEA 即可

配置 Smart Tomcat 插件

  1. 点击右上角的 "Add Configuration"

  1. 选择左侧的 "Smart Tomcat"

  1. 在 Name 这一栏填写一个名字
    在 Tomcat Server 这一栏选择 Tomcat 所在的目录. 其他的选项不必做出修改


  1. 点击 OK 之后,右上角就变成


点击绿色的,IDEA 就会自动进行编译,部署,启动 Tomcat 的过程

此时 Tomcat 日志就会输出在 IDEA 的控制台中,可以看到现在就不再乱码:
.

  1. 访问页面
    可以点击这个蓝色网址直接跳转


不过,出现的是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 初识的主要内容,如果未能解决你的问题,请参考以下文章

初识Servlet

JavaWeb学习笔记-05初识servlet

初识Servlet

Servlet 初识

Servlet 初识

Servlet 初识