文档章节

Servlet简介与Servlet和HttpServlet运行的流程

architect刘源源
 architect刘源源
发布于 2018/09/09 19:59
字数 2701
阅读 41
收藏 6

1.Servlet 

    [1] Servlet简介

        > Server + let

        > 意为:运行在服务器端的小程序。

        > Servlet实际上就是一个接口。

            - 狭义上的Servlet,指的就是Servlet接口

            - 广义上的我们认为凡是实现Servlet接口的类,我们都称他是一个Servlet *****

        > Servlet的作用:

            1.接收用户发送的请求

            2.调用其他的java程序来处理请求

            3.根据处理结果,返回给用户一个页面

 

        > Servlet的HelloWorld

            1.创建一个类并实现Servlet接口

            2.在web.xml文件中对Servlet进行配置

                <servlet>

                    <servlet-name>别名</servlet-name>

                    <servlet-class>全类名</servlet-class>

                </servlet>

                <servlet-mapping>

                    <servlet-name>别名</servlet-name>

                    <url-pattern>需要servlet处理的请求地址</url-pattern>

                </servlet-mapping>

 

        > Servlet的三个名字:

            <servlet-name>

                - Servlet的别名,程序员通过别名对Servlet进行配置

            <servlet-class>

                - Servlet的全类名,服务器通过全类名来创建Servlet的实例

            <url-pattern>

                - Servlet映射的请求地址,用户通过该地址访问Servlet

 

    [2] Servlet的生命周期

        > Servlet的生命周期,指Servlet的对象从被创建到被销毁的过程。

        > Servlet的生命周期方法:

            1.构造器:

                - Servlet第一次处理请求时,会调用构造器,来创建Servlet实例。

                - 只会调用一次,Servlet是单例模式,他是以多线程的方式调用service()方法.

                - Servlet不是线程安全,所以尽量不要再service()方法中操作全局变量。

 

            2.init()方法:

                - 构造器调用之后马上被调用,用来初始化Servlet,只会调用一次。

 

            3.service()方法:

                - Servlet每次处理请求时都会调用service()方法,用来处理请求,会调用多次。

 

            4.destroy()方法:

                - Servlet对象销毁前(WEB项目卸载时)调用,用来做一些收尾工作,释放资源。

 

    [3] 相关接口

        ①ServletConfig

            代表:当前Servlet的配置信息,每一个Servlet都有其唯一对应的ServletConfig。

                <servlet>

                    <servlet-name>AServlet</servlet-name>

                    <servlet-class>com.atguigu.servlet.AServlet</servlet-class>

                    <init-param>

                        <param-name>user</param-name>

                        <param-value>root</param-value>

                    </init-param>

                    <init-param>

                        <param-name>password</param-name>

                        <param-value>123123</param-value>

                    </init-param>

                </servlet>

 

            获取:由Tomcat服务器创建,最终作为参数传递到init()方法中,我们可以在init()方法直接使用。

                    当我们通过继承HttpServlet创建Servlet时,由于父类已经实现ServletConfig接口,

                        所以我们可以在Servlet中直接调用ServletConfig的方法。

 

            功能:

                【1】 获取Servlet的别名

                【2】 获取当前Servlet的初始化参数。

                        <init-param>

                            <param-name>user</param-name>

                            <param-value>root</param-value>

                        </init-param>

                        <init-param>

                            <param-name>password</param-name>

                            <param-value>123123</param-value>

                        </init-param>

                【3】 获取当前WEB应用的ServletContext对象。

 

        ②ServletContext

            代表:当前的WEB应用,一个WEB应用对应一个唯一的ServletContext对象,

                  ServletContext对象在项目启动时创建,在项目卸载时销毁。

 

            获取:通过ServletConfig的getServletContext()方法获取。

 

            功能:

                【1】 可以获取整个WEB应用的初始化参数

                    <context-param>

                        <param-name>phone</param-name>

                        <param-value>1388888888</param-value>

                    </context-param>

                【2】 可以获取资源的真实路径(物理路径),主要在文件的上传和下载时使用。

                【3】 可以作为一个域对象在不同的web资源之间共享数据。(下回分解)

 

    [4] GenericServlet

        - 通用Servlet的父类

        - 相比Servlet接口GenericServlet更加简单一些,但是我们最终实际上使用的HttpServlet

 

    [5] HttpServlet

        - HttpServlet继承了GenericServlet,而GenericServlet实现Servlet接口

        - 所以我们可以同构继承HttpServlet来创建一个Servlet。

        - HttpServlet重写service()方法:

            1.在该方法中先将ServletRequest和ServletResponse

                强转为了HttpServletRequest和HttpServletResponse。

            2.然调用重载的service()方法,并将刚刚强转得到对象传递到重载的方法中。

        - 重载service(HttpServletRequest request , HttpServletResponse response)

            1.在方法中获取请求的方式(get或post)

            2.在根据不同的请求方式去调用不同的方法:

                如果是GET请求,则调用doGet(HttpServletRequest request , HttpServletResponse response)

                如果是post请求,则调用doPost(HttpServletRequest request , HttpServletResponse response)

        - 结论:

            当通过继承HttpServlet来创建一个Servlet时,我们只需要根据要处理的请求的类型,来重写不同的方法。

                处理get请求,则重写doGet()

                处理post请求,则重写doPost()

 

 

 

    [6] HttpServletRequest 

        代表:浏览器发送给服务器的请求报文。

        获取:该对象由Tomcat服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用。

        功能:

            【1】获取用户发送的请求参数

                request.getParameter("username");

            【2】获取项目的名字(用来设置绝对路径)

                request.getContextPath();

            【3】作为一个域对象,在不同的WEB资源之间共享数据。

            【4】请求的转发

                request.getRequestDispatcher("target.html").forward(request, response);

 

 

    [7] HttpServletResponse

        代表:服务器发送给浏览器的响应报文。

        获取:该对象由Tomcat服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用。

        功能:

            【1】响应给浏览器一个网页或者是网页片段(设置的是响应报文的响应体)

                response.getWriter("");

            【2】请求的重定向

                response.sendRedirect("target.html");

 

    转发和重定向:(掌握)

 

                            转发                重定向

        请求的次数:          1                      2

        发生的位置            服务器内部            浏览器

        浏览器地址栏        不改变                改变

        浏览器的感知        不知道                知道   

 

 

    [8] 字符编码

        > 当用户通过表单向Servlet发送中文请求参数时,Servlet获取到内容会产生乱码,

            当Servlet向浏览器响应中文内容时,也会产生乱码。

        > 浏览器和服务器之间通信时,中文内容时不能直接发送的,需要对中文进行编码。

        > 编码:

            - 将字符转换为二进制码的过程叫编码。

        > 解码:

            - 将二进制码转换为普通字符的过程叫解码。

        > 编码和解码所采用的规则我们称为字符集。

 

        > 产生乱码问题的根本原因:

            编码和解码所采用的字符集不同。

 

        > 解决方法:

            统一编码和解码的字符集为UTF-8。

 

        > 常见字符集:

            1.ASCII

            2.ISO8859-1

            3.GBK

            4.GB2312

            5.UTF-8

 

        > 请求编码

            - 请求是浏览器发送给服务器的。

            - 浏览器 --> 服务器

            - 浏览器 编码

                > 浏览器的会自动使用网页的字符集对参数进行编码

                  UTF-8的张三:%E5%BC%A0%E4%B8%89

                  GBK的张三:%D5%C5%C8%FD

 

                > 所以我们只需要统一网页的字符集为UTF-8即可。

 

            - 服务器 解码

                post请求

                    > request解码时默认字符集时iso8859-1,但是iso压根就不支持中文

                    > post请求在servlet中解码,所以我们只需要指定request的字符集即可。

                    > 我们可以通过如下方法,来设置request的字符集:

                        request.setCharacterEncoding("utf-8");

                    > 注意:

                        该方法要在request.getParameter()第一次调用之前调用

 

                get请求

                    > get请求是通过url地址传递请求参数,url中的请求参数将会被Tomcat服务器自动解码。

                    > Tomcat的默认编码是iso8859-1,但是iso压根就不支持中文,所以必然乱码。

                    > 只需要修改Tomcat的解码的默认字符集,修改配置文件server.xml

                    > 在server.xml的Connector标签中(改端口号的那个标签)添加如下属性:

                        URIEncoding="utf-8"

                    > 修改完配置文件以后,get请求的编码就不用再处理的,但是post请求还是老样子。

 

        > 响应编码

            - 响应是服务器发送给浏览器

            - 服务器 --> 浏览器

            - 服务器 编码

                > 指定服务器的编码字符集为UTF-8。

                > 指定response的字符集

                    response.setCharacterEncoding("utf-8");

                > 虽然我们已经指定了response的字符集为utf-8,但是浏览器并不是用utf-8解码。

                    浏览器默认使用gb2312解码的,所以依然乱码,只不过没有那么乱。

 

            - 浏览器 解码

                > 浏览器的解码字符集可以通过浏览器来设置(不靠谱)

                > 我们可以通过服务器来告诉浏览器,我们的内容的编码格式为utf-8

                > 我们可以通过一个响应头来告诉浏览器,内容的编码格式:

                    Content-Type:text/html;charset=utf-8

                > 通过response的方法,来设置响应头:

                    response.setHeader("Content-Type", "text/html;charset=utf-8");

 

            解决方案:

                1.设置响应头

                    response.setHeader("Content-Type", "text/html;charset=utf-8");

                2.设置response的编码格式

                    response.setCharacterEncoding("utf-8");

 

                > 当我们设置Content-Type这个响应头时,服务器会自动使用响应头中的字符集为内容编码。

 

                > 最终方案:

                    response.setContentType("text/html;charset=utf-8");

 

        总结:

            post请求:

                - 在request.getParameter()方法第一次调用之前,调用如下代码:

                    request.setCharacterEncoding("utf-8");

            get请求:

                - 修改server.xml配置文件

                - <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

 

            响应:

                - 设置一个Content-Type响应头

                    response.setContentType("text/html;charset=utf-8");

 

 

 

 

    [9] 路径问题

        > URI和URL

            - URL是URI的一种实现,也是URI最常见的实现方式。

            - URI有两种实现方式URL和URN,URN用的很少

            - 我们说URL和URI实际上可以理解为一个意思

 

        > URL地址的格式

            http://主机名:端口号/项目名/资源路径/资源名

 

        ①相对路径和绝对路径

            > 相对路径

            - 之前我们使用的路径全都是相对路径:

                - 所谓的相对路径指相对于当前资源所在路径:

                    http://主机名:端口号/项目名/资源路径/

            - 由于转发的出现,相对路径会经常发生变化,容易出现错误的链接

                所以在开发中我们一般不使用相对路径,而是使用绝对路径。

 

            > 绝对路径

            - 绝对路径使用/开头   

            - 由浏览器解析的绝对路径中的/代表的是服务器的根目录:

                http://主机名:端口号/

                注意:需要加上项目名

 

            - 由服务器解析的绝对路径中的/代表的项目的根目录:

                http://主机名:端口号/项目名/

                注意:不要加项目名

 

            - 转发的路径由服务器解析,设置绝对路径时不需要加项目名

            - 重定向的路径由浏览器解析,设置绝对路径时需要加上项目名

 

 

        ②常见的路径:

            url-pattern:

            转发的路径:

                - url-pattern和转发中的路径都是由服务器解析的,

                    根目录是项目的根目录:

                        http://主机名:端口号/项目名/

                - 所以这两个路径不需要加项目名

 

            重定向的路径:

            页面中的路径:

                - 重定向和页面中的路径(HTML标签中的路径),由浏览器解析的,

                    根目录是服务器的根目录:

                        http://主机名:端口号/

                - 所以这个两个路径必须加上项目名

 

 

 

 

[10]运行的流程

 

[11]HttpServlet

© 著作权归作者所有

上一篇: Ant design
architect刘源源

architect刘源源

粉丝 177
博文 564
码字总数 941209
作品 0
浦东
程序员
私信 提问
Servlet生命周期与工作原理

Servlet生命周期分为三个阶段:   1,初始化阶段 调用init()方法   2,响应客户请求阶段  调用service()方法   3,终止阶段  调用destroy()方法 Servlet初始化阶段:   在下列时...

№贪↗恋♂
2012/08/08
159
0
Tomcat 容器与servlet的交互原理

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器...

watermelon11
02/25
174
0
Servlet 生命周期、工作原理

Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。 init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet 对象。可以配...

ArlenXu
2015/01/24
144
0
Servlet基础

Servlet简介:Servlet是sun公司提供的一门用于开发动态web资源的技术,sun公司在API中提供了一个Servlet接口,用户若想完成一个动态web资源,需要完成以下两个步骤: ----1、编写一个Java类,...

晨曦之光
2012/05/16
374
0
Java Web-Servlet

章节目录 什么是Servlet Servlet 、ServletContext、Servlet Container、web 容器之间的区别 Servlet、ServletConfig、GenericServlet、HttpServlet、自定义Servlet 之间的联系 HttpServlet ......

markfork
2018/06/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java常见异常处理

异常是Java程序中经常遇到的问题,一个异常就是一个Bug,就要花很多时间来定位异常。 Java异常 (1)Throwable是Java异常的顶级类,所有的异常都继承于这个类。 (2)Error,Exception是异常...

daxiongdi
20分钟前
4
0
Validator 常用注解

说明 Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的,等等。那么在spring boot怎么使用这么强大的校验框架呢。 常用 [@null](https:...

五彩的颜色
29分钟前
3
0
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。

#1 先把入栈顺序的第一数据入栈, #2 if 入栈的数据==等于出栈的数据,就循环一次看是否新建的栈的数据是否出栈 #3 返回新建的栈是否为空,就是要的结果 public class Solution { public boo...

winkwink
35分钟前
4
0
《JAVA核心知识》学习笔记 (19. 数据库)

19.1.1. 存储引擎 19.1.1.1. 概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、 更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧...

Shingfi
41分钟前
4
0
三分钟手操自己的yum源

本文章原创首发公众号:编程三分钟 上次就想手操yum源了,考虑到有的朋友没接触过,直接写成了yum源的科普,活活憋了我一个星期,现在我们快快开始。 什么情况下我们需要搭建一个仓库呢? 记...

编程三分钟
44分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部