【 初识 Servlet 并完成第一个servlet程序 】

一、Servlet 是什么

Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容,Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器,因为servlet接口定义的是一套处理网络请求的规范

二、工作模式

  1. 允许程序猿注册一个类, 在 Tomcat 收到某个特定 HTTP 请求的时候, 执行这个类中的些代码.
  2. 帮助程序猿解析 HTTP 请求, 把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象.
  3. 帮助程序猿构造 HTTP 响应. 程序猿只要给指定的 HttpResponse 对象填写一些属性字段, Servlet就会自动的以 HTTP 协议的方式构造出一个 HTTP 响应字符串, 并通过 Socket 写回给客户端

简而言之, Servlet 是一组 Tomcat 提供的 API, 让程序猿自己写的代码能很好的和 Tomcat 配合起来, 接受请求并做出响应,从而更简单的实现一个 web app.而不必关注 Socket, HTTP协议格式, 多线程并发等技术细节, 降低了 web app 的开发门槛, 提高了开发效率

三、使用方法

Servlet技术的核心是Servlet,它是所有Servlet类必须直接或者间接实现的一个接口. 在编写实现Servlet的Servlet类时,直接实现它,在扩展实现这个这个接口的类时,间接实现它。如下

在这里插入图片描述

通过源码分析,这个Servlet 类逐步实现了Servlet接口

四、第一个 Servlet 程序

4.1 创建项目

  1. 使用 IDEA 创建一个 Maven 项目. 菜单 -> 文件 -> 新建项目 -> Maven
  2. 选择项目要存放的目录

上述步骤与之前 maven 博客中一样,不清楚的大家自行参考


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

  1. 在中央仓库 https://mvnrepository.com/ 中搜索 “servlet”, 一般第一个结果就是
    在这里插入图片描述

  2. 选择版本. 一般我们使用 3.1.0 版本
    注意: Servlet 的版本要和 Tomcat 匹配
    在这里插入图片描述

  3. 把中央仓库中提供的 xml 复制到项目的 pom.xml 中


4.3 创建目录
当项目创建好了之后, IDEA 会帮我们自动创建出一些目录. 形如:

在这里插入图片描述

但是这些目录还不够, 我们还需要创建一些新的目录/文件

  1. 创建 webapp 目录
    在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录 (注意, 不是 webapps)
  1. 创建 web.xml
    然后在 webapp 目录内部创建一个 WEB-INF 目录, 并创建一个 web.xml 文件

创建如下:

在这里插入图片描述

  1. 编写 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 中的动态资源


4.4 编写代码
在 java 目录中创建一个类 HelloServlet, 代码如下

//将当前这个 HelloServlet类 和 http请求中URL中的路径中带有/hellodoGet 的请求关联起来
@WebServlet("/hellodoGet")
public class doGetMethod extends HttpServlet {
    
    
    //doGet:当tomcat收到一个http GET请求时,这个方法会被自动调用(回调函数)
    //HttpServletRequest req:已经将http请求解析成了一个 对象req
    //HttpServletResponse resp:代表http响应(此时resp是一个空的响应,需要在代码中给这个对象设置一些属性)
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        // 不能调用父类的 doGet !!!要自己实现一个
        // super.doGet(req, resp);

        // 这个是让服务器在自己的控制台里打印
        System.out.println("hello world");
        // 把 hello world 字符串, 放到 http 响应的 body 中. 浏览器就会把 body 的内容显示到页面上了,如果不给响应对象中设置任何内容, 这个时候就会出现 空白页面
        //resp:响应对象  write:真正写数据的方法
        //getWriter:返回一个Writer对象(字符流对象),此时Writer是往http响应的body中写入数据
        resp.getWriter().write("hello world");
    }
}
  1. 创建一个类 HelloServlet , 继承自 HttpServlet
  2. 在这个类上方加上 @WebServlet(“/hellodoGet”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hellodoGet的请求才会调用 HelloServlet 这个类的代码. (这个路径未包含 Context Path)
  3. 重写 doGet 方法. doGet 的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发
  4. 参数1为HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取.
  5. 参数2为HttpServletResponse 表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header,body 等)
  6. resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被
    构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器

注意:

  1. 单单上面一个servlet程序就能运行吗?是不行的,还要配合 tomcat !

此时我们写的代码并不是一个完整的程序, 而是 Tomcat 这个程序的一小部分逻辑.我们的代码不是通过 main 方法作为入口了. main 方法已经被包含在 Tomcat 里, 我们写的代码会被Tomcat 在合适的时机调用起来

  1. 我们随便写个类都能被 Tomcat 调用嘛? 满足啥样条件才能被调用呢?

主要满足三个条件:
a) 创建的类需要继承自 HttpServlet
b) 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
c) 这个类需要实现 doXXX 方法.
当这三个条件都满足之后, Tomcat 就可以找到这个类, 并且在合适的时机进行调用


4.5 打包程序
使用 maven 进行打包. 打开 maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口, 如果看不到的话,可以通过 菜单 -> View -> Tool Window -> Maven 打开) 然后展开 Lifecycle , 双击 package 即可进行打包

在这里插入图片描述

打包成功后, 可以看到在 target 目录下, 生成了一个 jar 包
在这里插入图片描述

这样的 jar 包并不是我们需要的, Tomcat 需要识别的是另外一种 war 包格式.另外这个 jar 包的名字太复杂了, 我们也希望这个名字能更简单一点,所以需要修改,如下:

  1. 在 pom.xml 中新增一个 packing 标签, 表示打包的方式是打一个 war 包.
  2. 在 pom.xml 中再新增一个 build 标签, 内置一个 finalName 标签, 表示打出的 war 包的名字是
    ServletHelloWorld

代码如下:

<packaging>war</packaging>
    <build>
        <finalName>ServletHelloWorld</finalName>
    </build>

重新使用 maven 打包, 可以看到生成的新的 war 包的结果

在这里插入图片描述

扩展:

war 包和 jar 包的区别
jar 包是普通的 java 程序打包的结果. 里面会包含一些 .class 文件.war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片, 以及其他的 jar 包. 打成 war 包格式才能被 Tomcat 识别

ServletHelloWorld-1.0-SNAPSHOT.jar 的由来
在这里插入图片描述
相当于把 artifactId 和 version 拼接起来了


4.6 部署程序
把 war 包拷贝到 Tomcat 的 webapps 目录下,启动 Tomcat , Tomcat 就会自动把 war 包解压缩成一个目录
在这里插入图片描述

看到这个日志说明 Tomcat 已经正确识别了 ServletHelloWorld 这个 webapp

在这里插入图片描述

4.7 验证程序
此时通过浏览器访问 http://127.0.0.1:8080/ServletHelloWorld/hellodoGet
在这里插入图片描述

注意:

URL 中的 PATH 分成两个部分, 其中 ServletHelloWorld 为 Context Path, hellodoGet 为 Servlet Path

在这里插入图片描述

可以这么理解,一个 tomcat中可以部署很多个网站,而第一级 context路径 表示是哪一个网站,而第二级 Servlet路径 表示这个网站的哪个页面

五、smart-tomcat 插件

上述就是一个完整的 Servlet 程序步骤,可以看出是非常繁琐的。比如手动拷贝 war 包到 Tomcat 的过程比较麻烦,那我们是否有更方便的方法呢

此处我们使用 IDEA 中的 Smart Tomcat 插件完成这个工作

插件就是对程序的一些特定场景, 做出一些特定的功能的扩展

5.1 安装 Smart Tomcat 插件

  1. 菜单 -> 文件 -> Settings
    在这里插入图片描述

  2. 选择 Plugins, 选择 Marketplace, 搜索 “tomcat”, 点击 “Install”
    在这里插入图片描述

  3. 安装完毕之后, 会提示 “重启 IDEA”
    在这里插入图片描述

5.2 配置 Smart Tomcat 插件

  1. 点击右上角的 “Add Configuration”

  2. 选择左侧的 “Smart Tomcat”
    在这里插入图片描述

  3. 在 Name 这一栏填写一个名字(可以随便写)
    在 Tomcat Server 这一栏选择 Tomcat 所在的目录. 其他的选项不必做出修改
    在这里插入图片描述

  1. 完成上述修改后点击 OK 然后点击右上角绿色三角
    在这里插入图片描述

出现如下就说明部署成功

在这里插入图片描述

  1. 访问页面
    在这里插入图片描述

此时HelloWorldservlet 为 smart tomcat中设置的context-path


注意:

使用 Smart Tomcat 就相当于是将打包和部署合并了, 我们发现 Tomcat 的 webapps 内部并没有被拷贝一个 war 包,也没有看到解压缩的内容.Smart Tomcat 相当于是在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target 目录

六、总结

初次接触 Servlet 程序会非常繁琐,步骤非常多,稍不注意就会出现错误.我们不光要熟悉 Servlet代码的基本写法,也要学会排查错误的思路.结合之前所学的HTTP协议可以让我们有效的找出错误,让我们的调试事半功倍.

  1. 4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及Servlet Path 是否一致.
  2. 5xx 的状态码表示服务器出现错误, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.
  3. 出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误提示.观察日志是调试程序的重要途径. Tomcat 的日志往往很多, 需要耐心阅读, 经常阅读, 熟练了就能更快速的找到问题了
  4. 空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.

以上就是我们初识 Servlet 篇,也完成了我们第一个 Servlet 程序,后续我们还会学习 Servlet 与
tomcat 的关系,以及运行的原理


猜你喜欢

转载自blog.csdn.net/qq_64317046/article/details/129829520