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

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]运行的流程html

 

[11]HttpServletjava

 

 

 

 

转载请注明出处!程序员

http://www.cnblogs.com/libingbin/web

感谢您的阅读。若是文章对您有用,那么请轻轻点个赞,以资鼓励。小程序

相关文章
相关标签/搜索