Http协议和Servlet(详细)

Tomcat目录

1、bin目录:这个文件夹包含的是启动/关闭tomcat的脚本,里面有startup.sh(Linux环境下启动tomcat脚本)和startup.bat(Windows环境下启动tomcat脚本),还有其他平台的启动和关闭命令脚本,还有很多环境变量的设置都在这里,例如可以设置JDK,Tomcat的路径,如果修改catalina文件的话可以修改Tomcat的内存,不过总结一下,bin目录里面大多数还是平台启动/关闭Tomcat的脚本。

2、conf目录:主要是用来存放一些Tomcat的配置文件,都是一些.xml部署文件,其中比较重要的有:

server.xml:是Tomcat的主要配置文件,主要完成两件事情:1.提供Tomcat初始组件的配置 2.说明Tomcat的结构,含义,是的Tomcat通过实例化组件完成自身的启动和构建,对了,如果做项目轮有传值中文乱码的现象,就可以在这里设置一下,解决。

web.xml:有默认欢迎文件的设置:在<welcome-fiel-list>标签对中,有报错文件设置:在<error-page>标签对中,有会话超时的设置:在<session-config>标签对中,还有过滤器的设置:这个注意:<filter></filter><filter-mapping></filter-mapping>是一个过滤器,他们两个标签对共同作用才能起到过滤的作用

context.xml:在tomcat5.5之前是没有context这个配置文件的,这个context.xml原来是配置在Service.xml中的Host里的Context元素的,它由Context接口实现定义,每个<Context />元素,代表了运行在虚拟主机上的单个Web应用,这个配置文件主要是用来配置数据源之类的作用

tomcat-users.xml:见名知意,这个是关于用户的角色,管理员的信息配置都在这个文件里面

Catalina目录:这里面可以设置默认加载的项目,但是我认为把项目发布在conf/Catalina/localhost里,是最佳的选择,因为这样对tomcat的入侵性最小,只需要新增一个配置文件,不需要修改原有的配置,而且支持动态解析,具体配置还得要去找度娘啦。

3、lib目录:主要是存放一些应用的jar包,我记得最常用的一个就是servlet-api.jar

4、logs目录:存放日志的目录,要注意如果是在做大项目需要上线测试的话,需要首先看一下日志文件,是否有其他的工程在启动状态,然后再关掉tomcat,清空logs里面的文件不会对tomcat的启动造成影响

5、temp目录:是tomcat暂时存放文件的地方,清空也不会对tomcat的运行产生影响

6、webapps目录:在这里面你会发现你已经编译的项目,没错,这个就是web应用的发布目录,在这里你可以直接的启动tomcat,直接访问,不需要经过IDE,不过有的时候我们很有可能会找不到webapps这个目录,然后所有的项目在一个wtpwebapps的目录中webapps和wtpwebapps都是存放的编译后的文件,功能差不多,不过要是需要将项目路径改到webapps下面的话,

7、work目录:存放的是由各种jsp生成的 servlet的地方,每次如果项目上线,需要测试的话,可以删除work这个文件夹,就是清楚缓存了~~

使用 Servlet+JDBC 实现员工列表.

request.setCharacterEncoding("UTF-8");
​
//设置response字符流默认使用的码表
    //response.setCharacterEncoding("UTF-8");
​
    /* 1.设置response的字符流使用的码表
       2.通知浏览器使用指定的码表去解码,在向浏览器输出字符流之前
    */
    response.setContentType("text/html;charset=utf-8");
​
​
连接数据库URL后 + &characterEncoding=UTF-8
​
创建表时设置编码格式   ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
​
​
tomcat8以后默认编码格式是utf-8;7之前的都是iso8859-1
​
 
​
如果默认情况下,tomcat使用的的编码方式:iso8859-1
​
 
​
修改tomcat下的conf/server.xml文件
​
找到如下代码:    
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
这段代码规定了Tomcat监听HTTP请求的端口号等信息。
​
可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。
​
修改完成后:
​
<Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
​
 
​

##

#Http协议

  • 什么是协议

双方在交互、通讯的时候, 遵守的一种规范、规则。

  • http协议 B/S C/S 数据交换的格式 json a:1

针对网络上的客户端 与 服务器端在执行http请求的时候,遵守的一种规范。 其实就是规定了客户端在访问服务器端的时候,要带上哪些东西, 服务器端返回数据的时候,也要带上什么东西。

  • 版本

    1.0

        请求数据,服务器返回后, 将会断开连接

    1.1

    请求数据,服务器返回后, 连接还会保持着。超时 除非服务器 | 客户端 关掉。 有一定的时间限制,如果都空着这个连接,那么后面会自己断掉。

###演示客户端 如何 与服务器端通讯。

在地址栏中键入网络地址 回车 或者是平常注册的时候,点击了注册按钮 , 浏览器都能显示出来一些东西。那么背地里到底浏览器和服务器是怎么通讯。 它们都传输了哪些数据。

  1. 安装抓包工具 HttpWatch (IE插件)

  2. 打开tomcat. 输入localhost:8080/应用名/请求地址 打开首页

  3. 在首页上找到Example 字样

6.x 和 7.x 的文档页面有所不同,但是只要找到example就能够找到例子工程

  1. 选择 servlet 例子 ---> Request Parameter

接着点击Request Parameters 的 Execute超链接

执行tomcat的例子,然后查看浏览器和 tomcat服务器的对接细节

###Http请求数据解释

请求的数据里面包含三个部分内容 : 请求行 、 请求头 、请求体

  • 请求行

    GET /GuiMeiShopping2/index.jsp HTTP/1.1

    GET : 请求方式 ,以GET去提交数据
        
    /GuiMeiShopping2/index.jsp
    请求的地址路径 , 就是要访问哪个地方。
    ​
    HTTP/1.1 协议版本

​ ​

  • 请求头

    Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, / Accept-Language: zh-CN Cache-Control: no-cache UA-CPU: AMD64 Accept-Encoding: gzip, deflate User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko Host: localhost:8090 Connection: Keep-Alive Cookie: JSESSIONID=FFFB40795359CA1EC55AC6DAE720EDDC

    Accept: 客户端向服务器端表示,我能支持什么类型的数据。 
    Referer : 真正请求的地址路径,全路径
    Accept-Language: 支持语言格式
    User-Agent: 用户代理 向服务器表明,当前来访的客户端信息。 
    Content-Type: 提交的数据类型。经过urlencoding编码的form表单的数据
    Accept-Encoding: gzip, deflate : 压缩算法 。 
    Host : 主机地址
    Content-Length: 数据长度
    Connection : Keep-Alive 保持连接
    Cache-Control : 对缓存的操作
  • 请求体

浏览器真正发送给服务器的数据

    发送的数据呈现的是key=value ,如果存在多个数据,那么使用 &
​
    firstname=zhang&lastname=sansan

###Http响应数据解析

请求的数据里面包含三个部分内容 : 响应行 、 响应头 、响应体

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 971
Date: Thu, 20 Feb 2020 02:39:32 GMT
​
...这里还有很多数据...
  • 响应行

    HTTP/1.1 200 OK

    协议版本  
    ​
    状态码 
    ​
        咱们这次交互到底是什么样结果的一个code. 
    ​
        200 : 成功,正常处理,得到数据。
    ​
        403  : for bidden  拒绝
        404 : Not Found  没有找到资源
        500 : 服务器异常  代码写错了
    ​
    OK
    ​
        对应前面的状态码  
        http状态返回代码 1xx(临时响应)
    表示临时响应并需要请求者继续执行操作的状态代码。
    http状态返回代码 代码   说明
    100   (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 
    101   (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
    http状态返回代码 2xx (成功)
    表示成功处理了请求的状态代码。
    http状态返回代码 代码   说明
    200   (成功)  服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
    201   (已创建)  请求成功并且服务器创建了新的资源。
    202   (已接受)  服务器已接受请求,但尚未处理。
    203   (非授权信息)  服务器已成功处理了请求,但返回的信息可能来自另一来源。
    204   (无内容)  服务器成功处理了请求,但没有返回任何内容。
    205   (重置内容) 服务器成功处理了请求,但没有返回任何内容。
    206   (部分内容)  服务器成功处理了部分 GET 请求。
    http状态返回代码 3xx (重定向)
    表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
    http状态返回代码 代码   说明
    300   (多种选择)  针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
    301   (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
    302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
    303   (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
    304   (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
    305   (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
    307   (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 
    http状态返回代码 4xx(请求错误)
    这些状态代码表示请求可能出错,妨碍了服务器的处理。
    http状态返回代码 代码   说明
    400   (错误请求) 服务器不理解请求的语法。
    401   (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
    403   (禁止) 服务器拒绝请求。
    404   (未找到) 服务器找不到请求的网页。
    405   (方法禁用) 禁用请求中指定的方法。
    406   (不接受) 无法使用请求的内容特性响应请求的网页。
    407   (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
    408   (请求超时)  服务器等候请求时发生超时。
    409   (冲突)  服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
    410   (已删除)  如果请求的资源已永久删除,服务器就会返回此响应。
    411   (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
    412   (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
    413   (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
    414   (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
    415   (不支持的媒体类型) 请求的格式不受请求页面的支持。
    416   (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
    417   (未满足期望值) 服务器未满足"期望"请求标头字段的要求。
    http状态返回代码 5xx(服务器错误)
    这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
    http状态返回代码 代码   说明
    500   (服务器内部错误)  服务器遇到错误,无法完成请求。
    501   (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
    502   (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
    503   (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
    504   (网关超时)  服务器作为网关或代理,但是没有及时从上游服务器收到请求。
    505   (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。 
    一些常见的http状态返回代码为:
    200 - 服务器成功返回网页
    404 - 请求的网页不存在
    503 - 服务不可用

​ ​

  • 响应头

  • Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=UTF-8
    Content-Length: 971
    Date: Thu, 20 Feb 2020 02:39:32 GMT
    ​
    ...这里还有很多数据...

  • Server: 服务器是哪一种类型。 Tomcat

    Content-Type : 服务器返回给客户端你的内容类型
    ​
    Content-Length : 返回的数据长度
    ​
    Date : 通讯的日期,响应的时间      

##Get 和 Post请求区别

  • post

    1. 数据是以流的方式写过去,不会在地址栏上面显示。 现在一般提交数据到服务器使用的都是POST

      1. 以流的方式写数据,所以数据没有大小限制。

  • get 数据不敏感的时候可以使用

    1. 会在地址栏后面拼接数据,所以有安全隐患。 一般从服务器获取数据,并且客户端也不用提交上面数据的时候,可以使用GET

    2. 能够带的数据有限,原因在于浏览器 对get请求会有数据大小的限制

请求方式 GET 请求指定的页面信息,并返回实体主体。 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 PUT 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE 请求服务器删除指定的页面。 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 OPTIONS 允许客户端查看服务器的性能。 TRACE 回显服务器收到的请求,主要用于测试或诊断。

  1. Get方法长度限制

    Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。 如:IE对URL长度的限制是2083字节(2K+35)。 下面就是对各种浏览器和服务器的最大处理能力做一些说明. Microsoft Internet Explorer (Browser) IE浏览器对URL的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。 Firefox (Browser) 对于Firefox浏览器URL的长度限制为65,536个字符。 Safari (Browser) URL最大长度限制为 80,000个字符。 Opera (Browser) URL最大长度限制为190,000个字符。 Google (chrome) URL最大长度限制为8182个字符。 Apache (Server) 能接受最大url长度为8,192个字符。 Microsoft Internet Information Server(IIS) 能接受最大url的长度为16,384个字符。 通过上面的数据可知,为了让所有的用户都能正常浏览, URL最好不要超过IE的最大长度限制(2083个字符),当然,如果URL不直接提供给用户,而是提供给程序调用,这时的长度就只受Web服务器影响了。 注:对于中文的传递,最终会为urlencode后的编码形式进行传递,如果浏览器的编码为UTF8的话,一个汉字最终编码后的字符长度为9个字符。 因此如果使用的 GET 方法,最大长度等于URL最大长度减去实际路径中的字符数。

    2. POST方法长度限制

    理论上讲,POST是没有大小限制的。HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力。 ​ 如:在Tomcat下取消POST大小的限制(Tomcat默认2M); ​ 打开tomcat目录下的conf目录,打开server.xml 文件,修改 ​

    debug="0"
    acceptCount="100"
    connectionTimeout="20000"
    disableUploadTimeout="true"
    port="8080"
    redirectPort="8443"
    enableLookups="false"
    minSpareThreads="25"
    maxSpareThreads="75"
    maxThreads="150"
    maxPostSize="0"
    URIEncoding="GBK"
    > 
     
    增加红色字体部分 maxPostSize="0" (设为0是取消POST的大小限制)

    ​ ​ ​ 刚看到群里又有同学在说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过

###Web资源

在http协议当中,规定了请求和响应双方, 客户端和服务器端。与web相关的资源。

有两种分类

  • 静态资源

    html 、 js、 css

  • 动态资源

    servlet/jsp

##Servlet

什么是servlet :

  • servlet是什么?

其实就是一个java程序,运行在我们的web服务器上,用于接收和响应 客户端的http请求。

更多的是配合动态资源来做。 当然静态资源也需要使用到servlet,只不过是Tomcat里面已经定义好了一个 DefaultServlet

###Hello Servlet

  1. 得写一个Web工程 , 要有一个服务器。

  2. 测试运行Web工程

    1. 新建一个类, 实现Servlet接口
    ​
    2. 配置Servlet , 用意: 告诉服务器,我们的应用有这么些个servlet。
    ​
        在webContent/WEB-INF/web.xml里面写上以下内容。
      <!-- 向tomcat报告, 我这个应用里面有这个servlet, 名字叫做HelloServlet , 具体的路径是com..servlet.HelloServlet -->
      <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.buka.servlet.HelloServlet</servlet-class>
      </servlet>
      
      <!-- 注册servlet的映射。  servletName : 找到上面注册的具体servlet,  url-pattern: 在地址栏上的path 一定要以/打头 -->
      <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/a</url-pattern>
      </servlet-mapping>
​
    3. 在地址栏上输入 http://localhost:8080/项目名称/a

###Servlet执行过程

###Servlet的通用写法

    Servlet (接口)
        |
        |
    GenericServlet
        |
        |
    HttpServlet (用于处理http的请求)
  1. 定义一个类,继承HttpServlet 复写doGet 和 doPost

##Servlet的生命周期

  • 生命周期 初始化 init-- service方法 --destroy方法

从创建到销毁的一段时间

  • 生命周期方法

从创建到销毁,所调用的那些方法。

  • init方法 初始化的方法

    在创建该servlet的实例时,就执行该方法。
    一个servlet只会初始化一次, init方法只会执行一次
    默认情况下是 : (请求来了的时候)初次访问该servlet,才会创建实例。 
  • service方法

    只要客户端来了一个请求,那么就执行这个方法了。
     该方法可以被执行很多次。 一次请求,对应一次service方法的调用
  • destroy方法 servlet销毁的时候,就会执行该方法

    1. 该项目从tomcat的里面移除。
            2. 正常关闭tomcat就会执行 shutdown.bat

doGet 和 doPost不算生命周期方法,所谓的生命周期方法是指,从对象的创建到销毁一定会执行的方法, 但是这两个方法,不一定会执行。

servlet生命周期是  初始化init  ---service 方法-----destroy方法
​
请求来了以后先调用service方法--service方法回根据请求得类型来调用对应得doget   doPost
如果我们没有重写service方法  那么会调用HttpServlet得service方法
这个方法再根据请求得类型来调用相对应得get  post方法

###让Servlet创建实例的时机 提前。

  1. 默认情况下,只有在初次访问servlet的时候,才会执行init方法。 有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑。

  2. 那么这个时候,初次访问,可能会在init方法中逗留太久的时间。 那么有没有方法可以让这个初始化的时机提前一点。

  3. 在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。 一般不写负数, 从2开始即可。

    <servlet>
        <servlet-name>HelloServlet04</servlet-name>
        <servlet-class>com.buka.servlet.HelloServlet04</servlet-class>
        <load-on-startup>2</load-on-startup>
      </servlet>

##ServletConfig

Servlet的配置,通过这个对象,可以获取servlet在配置的时候一些信息

先说 , 在写怎么用, 最后说有什么用。

    //1. 得到servlet配置对象 专门用于在配置servlet的信息
    ServletConfig config = getServletConfig();
    
    //获取到的是配置servlet里面servlet-name 的文本内容
    String servletName = config.getServletName();
    System.out.println("servletName="+servletName);

​ //2、。 可以获取具体的某一个参数。 ​ String address = config.getInitParameter("address"); ​ System.out.println("address="+address);

    //3.获取所有的参数名称
    Enumeration<String> names = config.getInitParameterNames();
    //遍历取出所有的参数名称
    while (names.hasMoreElements()) {
        String key = (String) names.nextElement();
        String value = config.getInitParameter(key);
        System.out.println("key==="+key + "   value="+value);
        
    }

###为什么需要有这个ServletConfig

  1. 未来我们自己开发的一些应用,使用到了一些技术,或者一些代码,我们不会。 但是有人写出来了。它的代码放置在了自己的servlet类里面。

  2. 刚好这个servlet 里面需要一个数字或者叫做变量值。 但是这个值不能是固定了。 所以要求使用到这个servlet的公司,在注册servlet的时候,必须要在web.xml里面,声明init-params

在开发当中比较少用。

刚才的这个实验, 希望基础好或者感兴趣的同学,回去自己做一下。

##总结

  • Http协议

    1. 使用HttpWacht 抓包看一看http请求背后的细节。 
    ​
    2. 基本了解 请求和响应的数据内容
    ​
            请求行、 请求头 、请求体
            响应行、响应头、响应体
    ​
    3. Get和Post的区别
  • Servlet【重点】

  • 1. 会使用简单的servlet

        1.写一个类,实现接口Servlet
        2. 配置Servlet
        3. 会访问Setvlet

    2. Servlet的生命周期

        init 一次 创建对象 默认初次访问就会调用或者可以通过配置,让它提前 load-on-startup
        service    多次,一次请求对应一次service
        destory 一次 销毁的时候 从服务器移除 或者 正常关闭服务器

    3. ServletConfig

        获取配置的信息, params

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值