Servlet&HTTP

之前看了一些Servlet的视频,但总感觉云里雾里不踏实,索性买本书看看,《Head First Servlet&JSP》,看漫画一样的了解一下吧。以下是对第一章的小总结。

什么是HTTP协议

HTTP是TCP/IP的上层协议。TCP负责确保从一个网络节点向另一个网络节点发送的文件能作为一个完整的文件到达目的地,尽管在传送过程中这个文件可能会分解为小块传输。IP是一个底层协议,负责把数据块(数据包)沿路移动/路由到目的地。HTTP则是 另一个网络协议,有一些web特定的特性,不过它要依赖于TCP/IP从一处向另一处完整的传送请求和响应。HTTP会话的结构是一个简单地请求/响应序列:浏览器发出请求,服务器做出响应。

请求流的关键要素

1.HTTP方法(要完成的动作)。
2.要访问的页面(URL)。
3.表单参数(如方法参数)。

响应流的关键要素

1.状态码(表明请求是否成功)。
2.内容类型(,也就是响应首部中的Content-Type,它的值称为MIME类型,包括文本、图片、HTML等)。
3.内容(具体的HTML、图片等,HTTP会在这些内容前面增加首部信息(状态码和内容类型就属于HTTP响应首部),HTML浏览器使用首部信息来帮助处理HTML页面)。

HTTP请求消息数据格式

请求消息数据格式

  • 请求行

  • 格式:请求方式/请求URL 请求协议/版本

  • 例:GET/login.html HTTP/1.1

  • 请求方式:

    • http常用的两种请求方式
      • GET:
        1.请求参数在请求行中,在URL后。
        2.请求的URL长度有限制
        3.不太安全
      • POST:
        1.请求参数在请求体中
        2.请求的URL长度没有限制
        3.相对安全
  • 请求头(也叫请求首部):客户端浏览器告诉服务器的一些信息

    • 格式:请求头名称:请求头值
    • 常见的请求头:
      1.User-Agent:浏览器告诉服务器,我访问你使用的浏览器信息
      可以在服务器端获取该头的信息,解决浏览器的兼容性问题
      2.Referer:告诉服务器,我(当前请求)从哪里来
      作用:
      1.防盗链
      2.统计工作
      3.请求空行:空行,用于分割POST请求的请求头和请求体
      4.请求体
      封装POST请求消息的请求参数
      GET没有请求体

HTTP响应消息数据格式

响应消息:服务器端发送给客户端的消息
数据格式:

  • 响应行

    • 组成:协议/版本 响应状态码 状态码描述
    • 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
      1. 状态码都是三位数字
      2. 分类:
        1. 1xx:服务器接收客户端消息但没有接收完成,等待一段时间后,发送1xx(一百多)的状态码
        2. 2xx:成功。代表:200
        3. 3xx:重定向。代表:302(重定向),304(访问缓存)
        4. 4xx:客户端错误。代表:
          1. 404:请求路径没有对应的资源
          2. 405:请求方式没有对应的doxxx方法(doPost()或doGet())
        5. 5xx:服务器端错误:代表500:服务器内部出现异常
  • 响应头(也叫响应首部)

    1. 格式:
      头名称:值
    2. 常见的响应头:
      1. Content-Type:服务器告诉客户端本次相应的数据格式以及编码格式。如:Content-Type:text/htmlhtml;charset=UTF-8
      2. Content-disposition:服务器端告诉客户端以什么格式打开响应体数
        1. 值:
          • in-line:默认值,在当前页面内打开
          • attachment;filename=xxx:以附件的形式打开响应体,文件下载
  • 响应空行

  • 响应体(传输的数据)

GET 和POST

GET是一个简单地请求,POST可以发送用户数据

GET的主要任务就是从服务器拿些东西回来(当然GET也可以发送一点数据),POST在请求某个东西的同时可以向服务器发送表单数据。

注意:

1.GET中的总字符数是有限的(取决于服务器)。比如,如果用户在搜索框里键入了很长一段文字,GET方法可能无法正常工作。
2.用GET发送的数据会追加到URL后面,在浏览器地址栏中显示出来。

***GET请求中的参数必须放在请求行上,追加到URL后面,以?和URL分隔,各参数之间用&分隔。
POST请求发回给服务器的数据成为“消息体”或“负载”,这个消息体可以非常大,参数放在消息体(负载)中。

端口

TCP端口只是一个数字而已。
端口是一个十六位数(2的16次方),标识服务器硬件上一个特定的软件程序

可以把端口看作是唯一的标识符。端口标识与服务器硬件上运行的一个特定软件的逻辑连接,也就是相当于这个软件的“IP地址”。所以,端口并不表示一个可以插入物理设备的位置。另外,服务器上有65536个端口(0~65535)

注意,从0到1023的TCP端口已经保留,由一些众所周知的服务使用,所以自己定制的服务器程序不要使用这些端口。

为什么要用Servlet

之前的动态网页是由html标记和大量的业务处理逻辑组成的,很明显这样不合理,为了解决这个问题,便有了CGI(公共网关接口)和Servlet,现在的web服务器有两件事不做:一个是动态内容,一个是在服务器上保存数据,它只擅长提供静态页面,业务处理逻辑服务器不做。

Servlet入门

以下是看视频时的笔记,当时还不熟悉Markdown,有点乱。。。

 Servlet :server applet
概念:运行在服务器端的小程序
 1.创建JavaEE项目
    2.定义一个类,实现servelet接口
    3.实现接口中的抽象方法
    4.配置servelet:
        在web.xml中配置:(第二章有更详细说明)
        <!--配置servelet-->
        <servlet>
            <servlet-name>demo1</servlet-name>
            <servlet-class>cn.shangxiaoying.web.servelet.serveletDemo1</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>demo1</servlet-name>
            <url-pattern>/demo1</url-pattern>
        </servlet-mapping>
    *执行原理:
        1.当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的servelet的资源路径
        2.查找web.xml文件,是否有对应的<url-pattern>标签体内容。
        3.如果有,则再找到对应的<servelet-class>全类名。
        4.Tomcat会将字节码文件加载进内存,并且创建其对象。
        5.调用其方法
    *servelet的生命周期:
        1.被创建:执行init方法,只执行一次
            *默认情况下,第一次被访问时,servelet被创建
            *可以配置servelet的创建时机。
                *在<servelet>标签下配置
                    1.第一次被访问时创建
                        *<load-on-startup>的值为负数,如:<load-on-startup>-5</load-on-startup>(默认值为-1)
                    2.在服务器启动时创建
                        *<load-on-startup>的值为0或正整数
            *servelet的init方法,只执行一次,说明一个servelet在内存中只存在一个对象,servelet是单例多线程的
                *多个用户同时访问时,可能存在线程安全问题。
                *解决:尽量不要在servelet中定义成员变量。即使定义了成员变量,也不要修改值
        2.提供服务:执行service方法,执行多次
            *每次访问servelet时,service方法都会被调用一次
        3.被销毁:执行destroy方法,只执行一次(在服务器正常关闭时调用)
            *destroy方法在servelet被销毁之前执行,一般用于释放资源
*servel3.0:
    *好处:
        支持注解配置,可以不需要web.xml。
    *步骤:
        1.创建JavaEE项目,选择servelet版本为3.0以上,可以不创建web.xml
        2.定义一个类,实现servelet接口
        3.复写方法
        4.在类上使用注解,进行配置
            @WebServlet(urlPatterns = "资源路径")
            @WebServlet("资源路径") 

代码书写世界,吉他演奏生活