zoukankan      html  css  js  c++  java
  • Http

    web入门

      1.web服务软件作用:把本地资源共享给外部访问

      2.tomcat服务器基本操作:

        启动:%tomcat%bin/startup.bat

        关闭:%tomcat%bin/shutdown.bat

        访问tomcat主页:

          http://localhost:8080

      3.web应用目录结构

        --------|WebRoot  根目录

           ----|静态资源(html+css+javascript+images+xml)  可以直接被浏览器访问到

        -----------|动态资源    不可以被浏览器直接访问到

        ----------------|-classes  存放class的字节码文件

        ----------------|lib  存放jar包文件 

        ----------------|web.xml  web应用的配置文件,配置servlet

     4.servlet技术:用java语言开发动态资源的技术

        开发一个servlet程序的步骤:

          1.创建一个java类,继承HttpServlet

          2.重写HttpServlet类的doGet方法

          3.把写好的servlet程序交给tomcat服务器运行

            3.1把编译好的servlet的class文件拷贝到tomcat的一个web应用中。(web应用的WEB-INF/classes目录下)

            3.2在当前web应用的web.xml文件中配置servlet

            

     1 <!--servlet配置-->
     2 <servlet>
     3     <servlet-name>HelloWorld</servlet-name>
     4     <servlet-class>类的全名</servlet-class>
     5 </servlet>
     6 <!--  servlet映射配置 -->
     7 <servlet-mapping>
     8     <servlet-name>HelloWorld</servlet-name>
     9     <url-pattern>/hello</url-pattern>
    10 </servlet-mapping>

            4.访问servlet

              http://localhost:8080/Project_name/hello

    HTTP协议  浏览器和服务器之间传递的什么信息,怎么传的,要搞明白

     1.什么是http协议?

       http协议:对浏览器客户端和服务器客户端之间数据传输的格式的规范

      

    开发者:用代码获得请求信息 

    全部的请求信息封装在HttpServletRequest对象中  服务器帮我们封装好了这个对象

    浏览器直接访问资源,默认为Get方式

    2.查看http协议的工具

      1.使用火狐的firebug插件

      2.使用谷歌的审查元素

      3.使用系统自带的telnet工具

    http协议内容:

     Responses  Headers  响应

    1. Content-Type:
      text/html;charset=UTF-8
    2. Date:
      Thu, 09 Mar 2017 14:27:51 GMT
    3. Server:
      Apache-Coyote/1.1
    4. Transfer-Encoding:
      chunked

    Request   Headers    请求 (一个完整的请求包括四个部分)

    {此处为请求行}GET/day/helloHTTP/1.1

    请求头:多个key-value对象

    1. Accept:
      text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    2. Accept-Encoding:
      gzip, deflate, sdch
    3. Accept-Language:
      zh-CN,zh;q=0.8
    4. Cache-Control:
      max-age=0
    5. Connection:
      keep-alive
    6. Host:
      localhost:8080
    7. Upgrade-Insecure-Requests:
      1
    8. User-Agent:
      Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0

     一个空行

    name=eric&password=123456  实体内容(可选)


    3.1请求行

      GET/day09/hello HTTP/1.1  (由右向左看)

      #http协议版本

        http1.0:当前浏览器客户端与服务器客户端建立连接之后,只能发送一次请求,一次请求之后,链接关闭

        http1.1 :当前浏览器客户端与服务器客户端建立连接之后,可以在一次链接之中发送多次请求(基本上都是用1.1,效率高)

    问题:一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器的这个页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求?

    答案:4次请求

        在页面中找另外一个资源,则发出一个请求(一次请求会占用一个资源)

        若是3张一样的图片,依然是发四次请求,只不过后面两次,浏览器将请求进行了拦截,将第一次加载的图片资源反还给后面的请求(利用浏览器的缓存来提高页面的加载效率)

       #请求资源

        URL:统一的资源定位符  http://localhost:8080/noe/index.jsp  只能定位互联网的资源  是uri的子集

        URI:统一的资源标记符 /noe/index  用于标记任何资源。可以是本地文件系统,局域网的资源,可以是互联网。

     #请求的方式

      常见的请求方式:GET   POST  HEAD  TRACE  PUT  CONNECT  DELETE

      常用的请求方式: GET  POST

      表单提交:

        <form action="提交地址" method="GET/POST">

        

        </form> 

       GET VS POST

      1.GET方式提交

        1.地址栏(URI)会跟上表单的参数数据,即在后台解析数据的时候会看到uri后边带着参数和数据

        2.GET提交数据的参数数据有限制,不超过1kb

        3.GET方式不适合提交敏感的数据,如密码

      2.POST方式提交

        1.参数不会跟在URI后面   (跟在请求的实体内容里面) 但是参数和数据在请求行的后面即在实体内容的位置   没有?开头,多个参数之间是以&分割

        2.post提交的参数数据没有限制

         3.POST方式提交敏感数据


    3.2请求头

      

    1. Accept:
      text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8      浏览器可以接受的数据类型
    2. Accept-Charset:IOS-8859-1  浏览器可以接受的编码格式
    3. Accept-Encoding:      浏览器可以接受的压缩格式
      gzip, deflate, sdch  
    4. If-Modified-Since :  Tue,11 Jul 2000 18:23:51  GMT   浏览器最后缓存的时间
    5. Accept-Language:      浏览器接受的语言
      zh-CN,zh;q=0.8
    6. Referer:http://www.baidu.com/index.jsp     当前请求来自与哪里
    7. Cache-Control:    
      max-age=0
    8. Connection:    浏览器跟服务器的连接状态  另外一个值为close(链接关闭)
      keep-alive
    9. Host:         (必须的)当前这次请求返回的主机地址
      localhost:8080
    10. cookie:name=nanami
    11. Date:Tue,11 Jul 2000 18:23:51  GMT
    12. Upgrade-Insecure-Requests:
      1
    13. User-Agent:     浏览器的类型
      Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0

    3.3 实体内容

      只有POST提交的参数会放到实体内容中


    3.4 HttpServletRequest对象

      作用:用于获取请求的数据

      核心的API:

        请求行:

          request.getMethod()    提交方式

          request.getRequestURI()    /request.getRequestURL()

          request.getProtocol()  请求http协议版本

        请求头:

          request.getHeader("名称")   根据请求头获取请求值

          request.getHeaderNames()  获取所有的请求头名称

        实体内容:

          request.getInputStream()   获取实体内容数据


    3.5传递的请求参数如何获取

      GET方式:参数放在URI后面

      POST方式:参数放在实体内容中

      获取GET方式参数:

        request.getQueryString();

      获取POST方式参数:

        request.getInputStream();

      问题是:以上两种方式不通用,而且获取到的参数还需要进一步的解析

      所以可以使用统一方便的获取方式:

        request.getParameter("参数名");根据参数名获取参数值(但是注意,这种方法只能获取一个值的参数)

        request.getParameterValue("参数名");根据参数名获取参数值(可以获取多个值的参数)

        request.getParameterNames();获取所有参数名称列表

    在获得页面的参数的时候,如果页面传过来中文,页面一般使用UTF-8进行编码,而服务器这边使用的是ISO-8859-1编码,所以会出现乱码

        手动重新解码:

          1.name 字节  utf-8

          2.name = request.getParameter(xxx)  字符iso-8859-1

          3.name=new String (name.getBytes("iso-8859-1"),"utf-8")  

                        编码           解码

    由字符变为字节:编码      由字节变为字符:解码

        全局设置编码:

          在调用request.getParameter()方法之前,设置查询的码表:

            request.setCharacterEncoding("UTF-8");

    4.Http响应:

      HTTP/1.1 200 OK   响应行

      server:Apache-Coyote/1.1  响应头(key-value)

      Content-length:24

      Date:Fir,30 Jan 2015 01:54:57  GMT

                          一个空行

                          实体内容

      4.1响应行

        #http 协议版本

        #状态码:服务器处理请求的结果(状态)

          100~199  表示成功接受请求,要求客户端继续提交下一次请求才能完成整个处理过程

          200~299  表示成功接受请求并已完成整个处理过程,常用200

          300~399  为完成请求,客户端需进一步细化请求。例如,请求的资源已移动一个新地址,常用302、307、和304

          400~499  客户端的请求有错误,常用404

          500~599  服务器端出现错误,常用500

          常见状态:

            200:表示请求处理完成并完美返回

            302:表示请求需要进一步细化

            404:表示客户访问的资源找不到

            500:表示服务器的资源发送错误(服务器内部错误)

        #状态描述

    4.2常见的响应头

    Location:http://www.it315.org/index.jsp  表示重定向的地址,该头和302的状态码一起使用

    Server:apache tomcat      表示服务器类型

    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  表示一个定时的刷新

    Content-Disposition:attachment;filename=aaa.zip  表示告诉浏览器以下载的方式打开资源(下载文件时用

    Transfer-Enconding:chunked

    Set-Cookie:SS=Q0=5Lb_nQ;path=/search  表示服务器发送给浏览器的cookie(会话管理的时候会用到)

    Expires:-1        表示通知浏览器不进行缓存

    Cache-Control:no-cache

    Pragma:no-cache

    Connection:close/Keep-Alive  表示服务器和浏览器链接的状态

    对于开发者来说,需要设置响应的信息

      4.3httpServletResponse

        httpServletResponse对象修改响应的信息:

          响应的行:

            response.setStatus()  设置响应的状态码

          响应头:

            response.setHeader(name,value);  设置响应头

            请求重定向一共向服务器发了两次请求

     1 package com.http.response;
     2 
     3 import java.io.IOException;
     4 import javax.servlet.ServletException;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 /**
    10  * 请求重定向
    11  * (相当于超链接跳转页面)
    12  * Servlet implementation class response_location
    13  */
    14 public class response_location extends HttpServlet {
    15     private static final long serialVersionUID = 1L;
    16        
    17     /**
    18      * @see HttpServlet#HttpServlet()
    19      */
    20     public response_location() {
    21         super();
    22         // TODO Auto-generated constructor stub
    23     }
    24 
    25     /**
    26      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    27      */
    28     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    29         
    30         /**
    31          * 需求:跳转到adv.html
    32          * 使用请求重定向:发送一个302状态码+location的响应头
    33          * 浏览器认识302状态码,当浏览器得到302码之后,会再次向服务器发出一个请求,
    34          * 请求的地址就是location的value的值
    35          * 
    36          */
    37         
    38         response.setStatus(302);
    39         response.setHeader("location", "/Http/adv.html");
    40         response.sendRedirect("/Http/adv.html");
    41         
    42 //        response.getWriter().append("Served at: ").append(request.getContextPath());
    43     }
    44 
    45     /**
    46      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    47      */
    48     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    49         
    50         doGet(request, response);
    51     }
    52 
    53 }

          实体内容:

            response.getWrite().write("content");  发送字符实体内容

            response.getOutputStream.writer();  发送字节实体内容

        4.4案例:重定向

            定时刷新(refresh):response.setHeader("refresh", "1");

              原理:浏览器认识refresh头,得到refresh头重新请求

            隔n秒后跳转到其他页面:response.setHeader("refresh","3;url=http://localhost:8080/Http/adv.html");

            contentType作用:告诉浏览器要发送的内容类型

      

     1 package com.http.response;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.IOException;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 /**
    12  * Servlet implementation class response_contentType
    13  */
    14 public class response_contentType extends HttpServlet {
    15     private static final long serialVersionUID = 1L;
    16        
    17     /**
    18      * @see HttpServlet#HttpServlet()
    19      */
    20     public response_contentType() {
    21         super();
    22         // TODO Auto-generated constructor stub
    23     }
    24 
    25     /**
    26      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    27      */
    28     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    29 //        response.setHeader("content-type", "text/html");
    30 //        response.setContentType("text/html;charset=utf-8");
    31 //        response.getWriter().write("<html><title></title><body><h1>html</h1></body></html>");
    32 //        response.sendRedirect("/Http/adv.html");
    33         
    34         
    35         File file = new File("E:\pic.jpg");
    36         
    37 //        Content-Disposition:attachment;filename=aaa.zip
    38         //在照片传上去之前,告诉浏览器以下载方式打开资源
    39         response.setHeader("Content-Disposition", "attachment;filename="+file.getName());
    40         
    41         response.setContentType("image/jpg");
    42         FileInputStream in = new FileInputStream(file);
    43         
    44         byte[]b= new byte[1024];
    45         int length = 0;
    46         while((length=in.read(b))!=-1){
    47             response.getOutputStream().write(b,0,length);
    48         }
    49         
    50         
    51     }
    52 
    53     /**
    54      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    55      */
    56     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    57         
    58         doGet(request, response);
    59     }
    60 
    61 }

    关于乱码问题:

      在服务器向浏览器输送数据的时候,会发生乱码问题

      默认为iso-8859-1

      在response.getWriter.writer();方法前使用response.setCharceterEncoding("utf-8");

       设置响应的实体内容的编码

    完美项目解决编码问题:

      在每个servlet开头写:

        request.setCharacterEncoding("utf-8");

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

    总结:

      http协议:浏览器和服务器之间数据传输的格式规范

      1.http:请求

        格式:

          请求行

          请求头

          空行

          实体内容(POST提交的对象在实体内容中)

        重点:

          使用HttpServletRequest对象:获取请求的数据

      2.http响应

        格式:

          响应行

          响应头

          空行

          实体内容(浏览器看到的内容)

        重点:

          使用httpServletResponse对象:设置响应数据

  • 相关阅读:
    控件还是还原到客户端的好
    练习之彩票一 需求整理和分析
    Oracle 查询并删除重复记录的SQL语句
    C# 如何生成CHM帮助文件
    C#生成CHM帮助文件—>续
    datagridview中用Enter代替tab实现焦点切换,可换行
    博客园的dotaer
    winfrom中datagridview指定单元格为编辑状态
    C#生成CHM帮助文件(linq版)
    C语言03
  • 原文地址:https://www.cnblogs.com/syousetu/p/6528514.html
Copyright © 2011-2022 走看看