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对象:设置响应数据

 

posted @ 2017-03-09 23:33  優syousetu  阅读(449)  评论(0编辑  收藏  举报