zoukankan      html  css  js  c++  java
  • Java Web总结五HTTp、Servlet

    一、HTTP协议

      1、客户端->服务端(请求request)有三部分:

        1)一个请求行

        2)若干请求头

        3)请求的内容,如果没有,就是空白字符

      2、服务端->客户端(响应response)有三部分:

        1)一个响应行

        2)若干响应头

        3)响应的内容,如果没有,就是空白字符

    二、HTTP请求头和响应头含义

      1、请求request:

        GET(请求的方式) /books/java.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号)

        Accept: */*(客户端能接收的资源类型)

        Accept-Language: en-us(客户端接收的语言类型)

        Connection: Keep-Alive(维护客户端和服务端的连接关系)

        Host: localhost:8080(连接的目标主机和端口号)

        Referer: http://localhost/links.asp(来自于哪里)

        User-Agent: Mozilla/4.0(客户端版本号的名字)

        Accept-Encoding: gzip, deflate(客户端能接收的压缩数据的类型)

        If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(缓存时间) 

        Cookie(客户端暂存服务端的信息)

        Date: Tue, 11 Jul 2000 18:23:51 GMT(客户端请求服务端的时间)

      2、响应Response:

        HTTP/1.1(响应采用的协议和版本号) 200(状态码) OK(描述信息)

        302(客户端请求服务端,但服务端没有对应的资源,服务端要客户端再次请求找其它的服务端,即客户端二次请求,重定向)

        307(客户端请求服务端,但服务端没有对应的资源,服务端自行再次请求找其它的服务端,即客户端一次请求,转发)

        304(客户端请求服务端,此时客户端缓存中有,无需再从服务端下载新的内容,服务端叫客户端自行找缓存,优化)

        500(客户端请求的资源,服务端存在,但在执行时出错)

        Location: http://www.baidu.com(服务端需要客户端访问的页面路径)

          Server:apache tomcat(服务端的Web服务端名)

        Content-Encoding: gzip(服务端能够发送压缩编码类型) 

        Content-Length: 80(服务端发送的压缩数据的长度)

        Content-Language: zh-cn(服务端发送的语言类型) 

        Content-Type: text/html; charset=GB2312(服务端发送的类型及采用的编码方式)

        Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服务端对该资源最后修改的时间)

        Refresh: 1;url=http://www.it315.org(服务端要求客户端1秒钟后,刷新,然后访问指定的页面路径)

        Content-Disposition: attachment; filename=aaa.zip(服务端要求客户端以下载文件的方式打开该文件)

        Transfer-Encoding: chunked(分块传递数据到客户端) 

        Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务端发送到客户端的暂存数据)

        Expires: -1//3种(服务端禁止客户端缓存页面数据)

        Cache-Control: no-cache(服务端禁止客户端缓存页面数据)  

        Pragma: no-cache(服务端禁止客户端缓存页面数据) 

        Connection: close(1.0)/(1.1)Keep-Alive(维护客户端和服务端的连接关系) 

        Date: Tue, 11 Jul 2000 18:23:51 GMT(服务端响应客户端的时间)

    三、Servlet开发的三种方法

      1、类实现Servlet接口 + 在web.xml中配置    

        <servlet>
            <servlet-name>Demo1</servlet-name>
            <servlet-class>com.gnnuit.servlet.Demo1</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>Demo1</servlet-name>
            <url-pattern>/demo1</url-pattern>
        </servlet-mapping>

       2、类 扩展 GenericServlet + 在web.xml中配置

        如果需要输出中文,需要在Servlet中进行如下设置:

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

      3、类 扩展 HttpServlet + 在web.xml中配置

        HttpServlet已经覆写service()方法,程序员无需再次覆写,只需覆写doXxxx()方法。

    四、Servlet工作原理和生命周期

      1、当浏览器第一次访问Servlet时,服务器会根据浏览器访问的路径,例如/Demo2,在web.xml文件中找到该Servlet的全路径,进行反射。

      2、调用init()为Servlet作初始化工作。

      3、调用doXxxxx()为浏览器响应。

      4、如果浏览器再次访问相同的Servlet,直实现从服务端维护的Servlet实例集合中取得对应的实现,为浏览器响应。

      5、同一个Servlet实例,在服务端只有一个。

      6、服务器在决定销毁Servlet实例之前,调用destory()方法,每个Servlet实例只会调用一次,在重新部署情况下。

      Servlet重要的四个生命周期方法:

        1)构造方法:创建Servlet对象的时候调用。默认情况下,第一次访问Servlet的时候创建Servlet对象。只创建1次,Servlet对象在Tomcat是单例的。

        2)init方法:创建完Servlet对象的时候调用。只调用1次。

        3)service方法:每次发出请求时调用。会调用n次。

        4)destroy方法:销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

    五、Servlet细节

      1、浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头。

      2、一个Servlet的url-pattern可以是1个或多个,有二种形式:

        1)*.xx

        2)/xx/*

        注意:/*不能一起直接使用

      3、/*和*.do的映射关系,*.do最后。

      4、程序员编写的Servlet其实是由tomcat容器中的Servlet引擎来处理的,引擎会产生对应的HttpServletRequest和HttpServletResponse对应传入到Servlet的doXxxx()方法中。

      5、通过在web.xml文件中配置代码,让Servlet在部署时就创建:    

        <servlet>
          <servlet-name>Demo21</servlet-name>
          <servlet-class>com.gnnuit.web.servlet.Demo21</servlet-class>
          <load-on-startup>1</load-on-startup>
        </servlet>

        数字小的先加载,数据大的后加载,最小为0,如果为负数和没有设置一样,需要在浏览器第一次访问时创建。

      6、url-pattern为/的servlet是一个缺省的servlet,用于处理当前web应用下,访问路径错误的请求。任何web服务端都有一个缺省的servlet来处理。

      7、每个线程会共享同一个Servlet的实例变量,所以要对敏感数据加锁。

        产生线程安全条件如下:    

          a)单例
            &&
          b)实例变量
            &&
          c)实例变量进行修改操作
        通过加锁的方式,对敏感数据块进行代码同步。

        如果你实现SingleThreadModel来解决线程安全有二个不足之处:
          a)SingleThreadModel接口的值与web服务器最多接收的线程数有关,可能会出现大值变小值的情况。
          b)SingleThreadModel接口如果发现某个线程正在占用该Servlet实例,会自动创建一个新的Servlet实例为浏览器服务,这就违背了Servlet单例的原则。

      8、ServletConfig对象   

        1)想让当前Servlet读取一些在web.xml文件配置的初始化参数,可以使用ServletConfig对象,它是Servlet运行时的配置对象
        2)init(ServletConfig)方法由Web容器调用,调用时,会传入与容器相关的ServletConfig接口的实现

  • 相关阅读:
    nginx 命令 以及普通搭建图片服务
    安卓开发自定义View流程
    01-flask虚拟环境
    vscode切换虚拟环境报错无法加载文件 E:Python_projectshop_envScriptsActivate.ps1,因为在此系统上禁止运行 脚本。
    01-flask旅行网系统功能设计
    10-Python文件操作
    09-Python异常
    08-Python面对对象进阶
    06-Python元组,列表,字典,集合数据结构
    05-Python模块
  • 原文地址:https://www.cnblogs.com/FlySheep/p/3619592.html
Copyright © 2011-2022 走看看