zoukankan      html  css  js  c++  java
  • Servlet简介与Servlet和HttpServlet运行的流程

    注:本文转载自:http://www.cnblogs.com/libingbin/
    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

  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/tidhy/p/6658673.html
Copyright © 2011-2022 走看看