Servlet(接口编程)

文章目录

  • 1 Servlet简介
    • 1.1 Servlet是什么?
    • 1.2 Servlet 工作
    • 1.3 Servlet 任务
  • 2 快速入门
    • 2.1 创建项目
    • 2.2 pom.xml
    • 2.3 web.xml
    • 2.4 编写java类
    • 2.5 填写web.xml映射
    • 2.6 配置Tomcat
  • 3 Servlet原理
    • 3.1 工作流程
    • 3.2 处理请求流程
    • 3.3 工作原理
    • 3.4 生命周期
  • 4 Mapping问题
    • 4.1 映射路径
    • 4.2 优先级问题


学习视频来自于:秦疆(遇见狂神说)Bilibili地址
他的自学网站:kuangstudy

我们缺乏的不是知识,而是学而不厌的态度


1 Servlet简介

1.1 Servlet是什么?

  • Servlet就是sun公司开发动态web的一门技术。
  • Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
  • Sun在这些APi中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤
    • 编写一个类,实现Serlet接口。
    • 把开发好java类部署到web服务器中。
  • 把实现了Servlet接口的Java程序叫做,Servlet。

1.2 Servlet 工作

Servlet(接口编程)_第1张图片

1.3 Servlet 任务

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

2 快速入门

2.1 创建项目

  1. IDEA新建maven项目。
  2. 选Maven Archetype 。
  3. Archetype选:org.apache.maven.archetypes:maven-archetype-webapp。
  4. 高级设置:组ID(com.公司名)、工件ID(项目名)、版本。
  5. 创建。

2.2 pom.xml

将JDK改为项目运行的版本,这里是jdk1.8。

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
    properties>

需要Servlet包,索性jsp包也导入,使用maven导入。


<dependency>
    <groupId>javax.servlet.jspgroupId>
    <artifactId>javax.servlet.jsp-apiartifactId>
    <version>2.3.1version>
    <scope>providedscope>
dependency>

<dependency>
    <groupId>javax.servletgroupId>
    <artifactId>javax.servlet-apiartifactId>
    <version>3.1.0version>
    <scope>providedscope>
dependency>

2.3 web.xml

  1. WEB-INF文件夹内。
  2. 表头直接到Tomcat文件夹-webapps找一个自带的文档项目复制web.xml的表头。

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="false">
web-app>

使用3.0.x以上servlet注解开发metadata-complete一定要设置false

web.xml文件中使用元素通知Web容器是否要寻找注解

true
将由部署描述符为Web应用程序提供所有的配置信息,无法扫描注解。
还有可能会出现jsp页面某些css或js文件的MIME格式指定不正确。

false或不写metadata-complete元素
部署期间,容器必须扫描注解和Web分片,为Web应用程序构建有效的元数据。

2.4 编写java类

  1. 在src–>main–>java右键创建软件包pers.tianyu.servlet–>创建HelloServlet.java类。
  2. HelloServlet 继承 HttpServlet 重写 doGet(HttpServletRequest req, HttpServletResponse resp)和 doPost(HttpServletRequest req, HttpServletResponse resp)方法。
// get和post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().println("hello servlet");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
}

2.5 填写web.xml映射

为什么要写:我们写的是java程序,但是通过浏览器访问,而浏览器需要连接web服务器,所以我们要web服务中注册我们写的Servlet,还需要给它一个浏览器能够访问的路径。

    <servlet> 
        <servlet-name>helloservlet-name> 
        <servlet-class>com.tianyu.servlet.HelloServletservlet-class> 
    servlet>
    <servlet-mapping>
        <servlet-name>helloservlet-name> 
        <url-pattern>/hellourl-pattern> 
    servlet-mapping>

2.6 配置Tomcat

  1. IDEA左上角–> 编辑配置 -->点+(添加新配置Tomcat)。

Servlet(接口编程)_第2张图片

Servlet(接口编程)_第3张图片

  1. 设置名称、选择应用服务器、配置打开浏览器、URL。

Servlet(接口编程)_第4张图片

  1. 配置jre地址。

Servlet(接口编程)_第5张图片

  1. 部署–>点击+(把要运行的项目放入)。

Servlet(接口编程)_第6张图片

  1. 浏览器访问:http://localhost:8080/项目名/程序名。

http://localhost:8080/module06/helloservlet

Servlet(接口编程)_第7张图片

3 Servlet原理

servlet 入门详解

3.1 工作流程

Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:

Servlet(接口编程)_第8张图片

  1. Web Client 向Servlet容器(Tomcat)发出Http请求。
  2. Servlet容器接收Web Client的请求。
  3. Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。
  4. Servlet容器创建一个HttpResponse对象。
  5. Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet 对象。
  6. HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息。
  7. HttpServlet调用HttpResponse对象的有关方法,生成响应数据。
  8. Servlet容器把HttpServlet的响应结果传给Web Client。

3.2 处理请求流程

  1. 用户点击一个链接,指向了一个servlet而不是一个静态页面。
  2. 容器“看出”这个请求是一个Servlet,所以它创建了两个对象HttpServletRequest和HttpServletResponse。
  3. 容器根据请求中的URL找到正确的Servlet,为这个请求创建或分配一个线程,并把请求和响应对象传递给这个Servlet线程。
  4. doGet()方法生成动态页面,并把这个页面“塞到”响应对象里,需要注意的是,容器还有响应对象的一个引用!
  5. 线程结束,容器把响应对象转换为一个HTTP响应,并把它发回给客户,然后删除请求和响应对象。

3.3 工作原理

  1. 首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet、doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet()、doPost()等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。
  2. 每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),**destroy()**方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。
  3. Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、ServletResponse 强转为HttpRequest 和 HttpResponse。

3.4 生命周期

1. 加载和实例化
如果Servlet容器还没实例化一个Servlet对象,此时容器装载和实例化一个 Servlet。创建出该 Servlet 类的一个实例。如果已经存在一个Servlet对象,此时不再创建新实例。

2. 初始化
在产生 Servlet 实例后,容器负责调用该 Servlet 实例的 init() 方法,在处理用户请求之前,来做一些额外的初始化工作。

3. 处理请求
当 Servlet 容器接收到一个 Servlet 请求时,便运行与之对应的 Servlet 实例的 service() 方法,service() 方法根据用户的请求调用相对应的doGet或doPost 方法来处理用户请求。然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。

4. 销毁
当 Servlet 容器决定将一个 Servlet 从服务器中移除时 ( 如 Servlet 文件被更新 ),便调用该 Servlet 实例的 destroy() 方法,在销毁该 Servlet 实例之前,来做一些其他的工作。

注意:(1)(2)(4) 在Servlet的整个生命周期中只会被执行一次,(3)可以被浏览器反复请求。

4 Mapping问题

4.1 映射路径

  1. 一个Servlet可以指定一个映射路径
<servlet-mapping>
    <servlet-name>helloservlet-name> 
    <url-pattern>/hellourl-pattern> 
servlet-mapping>
  1. 一个Servlet可以指定多个映射路径
<servlet-mapping>
    <servlet-name>helloservlet-name> 
    <url-pattern>/hello1url-pattern> 
servlet-mapping>
<servlet-mapping>
    <servlet-name>helloservlet-name> 
    <url-pattern>/hello2url-pattern> 
servlet-mapping>
<servlet-mapping>
    <servlet-name>helloservlet-name> 
    <url-pattern>/hello3url-pattern> 
servlet-mapping>
<servlet-mapping>
    <servlet-name>helloservlet-name> 
    <url-pattern>/hello4url-pattern> 
servlet-mapping>

  1. 一个Servlet可以指定通用映射路径
<servlet-mapping>
    <servlet-name>helloservlet-name> 
    <url-pattern>/hello/*url-pattern> 
servlet-mapping>
  1. 默认请求路径

<servlet-mapping>
    <servlet-name>helloservlet-name> 
    <url-pattern>/*url-pattern> 
servlet-mapping>
  1. 指定一些后缀或者前缀等等…

 <servlet-mapping>
    <servlet-name>helloservlet-name> 
    <url-pattern>*.tianyuurl-pattern> 
servlet-mapping>

4.2 优先级问题

指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。


<servlet>
    <servlet-name>errorservlet-name> 
    <servlet-class>com.tianyu.servlet.ErrorServletservlet-class> 
servlet>
<servlet-mapping>
    <servlet-name>errorservlet-name> 
    <url-pattern>/*url-pattern> 
servlet-mapping>

你可能感兴趣的:(JavaEE,servlet,java,intellij-idea)