javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response

- Web服务器
  - 概念:
    - web资源:
      "英文直译"网"的意思
      资源:一切数据文件
      web资源:通过网络可以访问到的资源,通常指的是一切放在服务器上的文件"
    - web资源的分类:
      - 静态的web资源:
        "    内容是一成不变的"
      - 动态的web资源:
        "    内容有可能在不同的时间或者不同的人访问的时候会发生改变的"
    - web技术分类
      - 静态的web技术
        "    例如: html  css  js  ....."
      - 动态的web技术
        "    例如:servlet  jsp"
    - 软件的架构
      - c/s架构(Client/Server   客户端/服务器)
        "    例如:qq  迅雷  lol"
      - b/s架构(Browser/Server   浏览器/服务器)
        "    例如:京东  淘宝  "
      - 区别
        - c/s:需要客户下载客户端,页面比较炫,和服务器交互少,可以在客户端处理部分业务逻辑,可降低服务器的压力.需要维护客户端和服务器端
        - b/s:只需要客户有一个浏览器,一切页面从服务器加载,和服务器交互频繁,由服务器处理业务逻辑,服务器压力较大.只需要维护服务器端.
    - 通讯机制
      - 基于http协议
        - 浏览器发送给服务器的内容:请求(request)
        - 服务器返回给浏览器的内容:响应(response)
        - 注意:先有请求,后有响应,一次请求对应一次响应
  - web服务器
    - 作用:将我们编写好的网页发布出去,别人就可以通过网络访问
    - 常见的web服务器
      "名称        厂商            特点
      Weblogic     oracle        大型的收费的支持javaEE所有规范的web服务器(servlet和jsp)
      websphere     ibm            大型的收费的支持javaEE所有规范的web服务器(servlet和jsp)
      tomcat     apache        小型的免费的支持servlet和jsp规范的"web服务器""
    - Tomcat服务器★

        Tomcat如何优化?
            1: 优化连接配置.修改连接数,关闭客户端的dns查询(DNS查询需要占用网络,再获取对方ip的时候会消耗一定的时间)
            2: 优化jdk,扩大tomcat使用的内存,默认为128M
      - 下载
        - http://tomcat.apache.org/download-70.cgi
        - core:
          - zip:可以在window上运行的(我们今天使用)
          - tar.gz:运行在linux上的
      - 安装
        - 解压缩即可
      - 目录结构
        - bin:存放可执行的文件
        - ★conf:存放配置文件
        - lib:存放的是tomcat运行时和项目运行时必须的jar包
        - logs:存放的是日志文件(catalina.out)
        - temp:存放临时文件(不用管)
        - ★★webapps:存放要发布的web项目
        - ★work:存放项目运行时产生的java文件和class文件
      - 启动
        "    双击 tomcat目录下/bin/startup.bat"
      - 关闭
        "    方式1:点 x
            方式2:ctrl + c
            (记住)方式3:双击 tomcat目录下/bin/shutdown.bat"
      - 配置
        - 常见问题
          - 一闪而过
            "查看JAVA_HOME是否配置正确"
          - 端口占用: 可以修改Tomcat的端口号
            "修改 tomcat目录下/conf/server.xml 大约70行
                             <Connector port="8080" protocol="HTTP/1.1"
                               connectionTimeout="20000"
                               redirectPort="8443" />
                        需要将 8080 修改成其他的端口号
                        端口号:0~65535
                            0~1024:系统预留的端口号 一般不要使用 但是可以使用80端口
                            80端口是http协议的默认端口号,访问的时候可以不写端口号"
      - 访问格式
        - tomcat的访问路径(8080是tomcat的默认的端口号)
          "    http://localhost:8080"
        - 格式:http://ip地址:端口号/项目名/资源?参数名称=值&参数名称=值
- web项目
  - 目录结构:★
    "myweb(目录名:项目名)
                |
                |---资源文件  html img css js
                |---WEB-INF(目录:特点,通过浏览器直接访问不到)
                |        |
                |        |---lib(目录:项目运行的jar包)
                |        |---classes(目录:存放的class文件)
                |        |---web.xml(核心配置文件,在servlet2.5版本中必须有,serlvet3.0版本不是必须的)"
  - 项目访问路径:
    "http://localhost:80/myweb/1.html
    协议://ip地址:端口/项目名称/资源"
  - Tomcat和Eclipse整合
- Http协议:
  - 协议:规定内容的传输的格式
  - http协议:
    "用来制定互联网上数据的传输格式"
  - 包含:
    - 浏览器发送给服务器的内容  请求
      "规定请求数据的格式"
    - 服务器返回给浏览器的内容  响应
      "规定响应数据的格式"
  - 请求的格式:
    "请求行 请求头 请求体"
    - 请求行:请求的第一行
      - 格式:请求方式 请求资源 协议/版本
        "例如:  GET /33/1.html HTTP/1.1"
      - 请求方式:
        "常见的两种 get和post
        get请求:请求参数会在地址栏上显示,参数大小有限制,不安全
              http://ip地址:端口号/项目名/资源?参数名称=值&参数名称=值
        post请求:请求参数不在地址栏上显示,参数大小不受限制.较为安全
            格式:
                参数名称=值&参数名称=值"
    - 请求头
      - 格式: key/value的格式 (value可以为多个值的)
      - 常见的请求头
        - Accept: text/html,image/*        --支持数据类型
        - Accept-Charset: ISO-8859-1    --字符集
        - Accept-Encoding: gzip        --支持压缩
        - Accept-Language:zh-cn         --语言环境
        - Host: www.baidu.cn:80        --访问主机
        - If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT      --缓存文件的最后修改时间
        - Referer: http://www.baidu.com/index.jsp     --来自哪个页面、防盗链
        - User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
          "扩展知识:
              Trident内核代表产品Internet Explorer,又称其为IE内核
              Gecko内核代表作品Mozilla FirefoxGecko,火狐
              Chrome内核代表作品Chrome,谷歌"
        - Cookie
        - Connection: close/Keep-Alive       --链接状态
      - 重要的头:
        - Referer  User-Agent Cookie If-Modified-Since
    - 请求体
      "和请求头之间有一个空行
      post请求的参数:只有表单提交的时候明确了method="post"这时候是post请求,其他的都是get请求
      参数名称=值&参数名称=值
      username=jack&password=1234"
  - 响应的格式:
    "响应行 响应头 响应体"
    - 响应行:响应信息的第一行
      - 格式:
        - 协议/版本 响应的状态码 状态码说明
      - 例如:
        - HTTP/1.1 200 OK
      - 状态码:
        - 1xx    :请求已发送
        - 2xx    :响应已完成
          - 200:响应成功(请求成功)
        - 3xx    :需要浏览器进一步操作才可以完成
          - 302:重定向(配合location头使用)
          - 304:读缓存(Not Modified表示没有改变)
        - 4xx :用户访问错误(Not Found 表示:路径写错了,你访问的路径不存在)
          - 404:用户访问的资源不存在
        - 5xx :服务器内部错误(其实就是代码有问题,改代码)
          - 500:服务器内部异常
    - 响应头
      - 格式: key/value的格式 (value可以为多个值的)
      - 常见的响应头
        - Location: http://www.it315.org/index.jsp     --跳转方向
        - Server:apache tomcat            --服务器型号
        - Content-Encoding: gzip             --数据压缩
        - Content-Length: 80             --数据长度
        - Content-Language: zh-cn         --语言环境
        - Content-Type: text/html; charset=GB2312         --数据类型(MIME类型)  大类型/小类型 text/css  text/javascript  image/jpeg image/bmp
        - Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT    --最后修改时间
        - Refresh: 1;url=http://www.it315.org        --定时刷新
        - Content-Disposition: attachment; filename=aaa.zip    --下载
        - Set-Cookie:SS=Q0=5Lb_nQ; path=/search
        - Expires: -1                    --缓存
        - Cache-Control: no-cache              --缓存
        - Pragma: no-cache                   --缓存
        - Connection:Keep-Alive               --连接
      - 重点的头:
        - Set-Cookie Location Content-Type Refresh Content-Disposition Last-Modified
    - 响应体
      "和响应头之间有一个空行,
      浏览器解析的内容"
- servlet入门:
  "本质上就是一个运行在服务器上的类"
  - 作用:1.接受请求   2.调用Service  处理业务逻辑   3.生成响应结果
  - 入门步骤:
    - 1.编写一个类
      - 必须实现Servlet接口
      - 重写里面的方法
    - 2.编写配置文件(项目下 web-inf/web.xml)
      "注册servlet   绑定路径
                  <!-- 注册servlet
                      servlet-name:给servlet起个名称 名称自定义,保证唯一
                      servlet-class:serlvet的全限定名(包名+类名)
                  -->
                  <servlet>
                      <servlet-name>helloservlet</servlet-name>
                      <servlet-class>cn.baidu.demo.HelloServlet</servlet-class>
                  </servlet>

                  <!-- 绑定路径
                      servlet-name:在servlet标签中给servlet起好的名称
                      url-pattern:路径  暂时都以"/"开头
                   -->
                  <servlet-mapping>
                      <servlet-name>helloservlet</servlet-name>
                      <url-pattern>/hello</url-pattern>
                  </servlet-mapping>"
    - 3.测试
      "            localhost/项目名/绑定的路径
                  localhost/33/hello"

在服务器中,为什么需要项目部署?  为了让网络通过服务器访问到项目

回顾:
    tomcat服务器和Http协议:
    web服务器:
        概念:
            web资源:
            web资源分类:
                静态的web资源:内容一层不变
                动态的web资源:根据不同的人和不同的时间,可能会发生变化
            web技术:
                静态的web技术:html css js...
                动态的web技术:Servlet jsp
            结构:
                B/S(浏览器/服务器):
                C/S(客户端/服务器):
            通讯机制:
                基于HTTP协议
                一次请求一次响应,先有请求后有响应
        web服务器:
            Tomcat:
                下载:
                安装:
                目录结构:
                    bin:
                    conf:
                    webapps:
                    work:
                启动:
                    bin/startup.bat
                关闭:
                    X
                    ctrl + c
                    ★ bin/shutdown.bat
                访问:
                    协议://地址:端口/资源
        web项目:
            项目名称:
                |-------html
                |-------css
                |-------js
                |-------img
                |-------WEB-INF
                |-----------lib
                |-----------classes
                |-----------web.xml
        http:
            请求:浏览器发送给服务器的内容(request)
                请求行
                    请求信息的第一行
                        请求方式 请求的资源 协议/版本        http/1.0 http/1.1
                请求头
                    格式:
                        key/value  (value可以为多个值)
                请求体
                    当请求是post的时候,存放post请求所携带的参数
            响应:服务器返回给浏览器的内容(response)
                响应行
                    响应信息的第一行
                        协议/版本 状态码 说明
                响应头
                    格式:
                        key/value  (value可以为多个值)
                响应体
                    浏览器解析的内容
////////////////////////////////////////////
servlet:

案例-使用servlet完成用户登录功能
    需求分析:
        用户在表单中填写完用户名和密码后,点击登录的时候,向服务器发送登录的请求,
        在服务器上处理请求,处理完毕后将处理信息响应到页面
            处理结果:
                登录成功:欢迎...登录...
                登录失败:用户名或密码错误
                异常:当前功能正在维护....
        技术分析:
            html:表单
                form
                    action:提交路径
                    method:提交方式
                        get
                        post
            servlet:
                request
                response
    ////////////////
    项目:
        com.baidu.web
        com.baidu.service
        com.baidu.dao
        com.baidu.domain
        com.baidu.utils

        导入jar包
        导入工具类
- Servlet的概述
  - Servlet就是运行在web服务器上的java程序,本质上就是一个类.
    "一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口"
  - 作用:
    - 接收浏览器的请求
    - 处理请求
    - 生成响应信息
- Servlet入门★
  - 1.编写一个类
    "    实现servlet接口
        重写Service(request,response)方法"
  - 2.编写配置文件(web.xml)
    "    注册servlet
        绑定路径"
  - 3.测试
    "    http://localhost:8080/项目名称/绑定路径"
- Servlet API
  "查询javaEE的API"
  - Servlet:接口
    - (掌握★)init:初始化(第一次访问Servlet的实现类时候进行初始化,也就是说开启实现Servlet类和继承Servlet类的实现类,或者说是开启继承Servlet类的实现类和Servlet类的实现类)
    - (掌握★)service:提供服务(每次访问都执行都提供服务)
    - (掌握★)destroy:销毁(Servlet开启后,调用这个方法就是关闭或者销毁继承类)(服务器正常关闭,会把每一个servlet都给销毁了.(销毁的是Servlet的对象,也就是实现类的对象))
    - (理解)getServletConfig():获取当前Servlet的配置对象
    - (了解)getServletInfo():获取Servlet信息
  - GenericServlet:(通用Servlet)
    "实现了servlet接口的抽象类,
    实现servlet中除service方法之外的所有方法"
  - HttpServlet:
    "继承GenericServlet,实现了Servlet的所有方法."
- Servlet的生命周期★
  "从创建到死亡的过程"
  - init:初始化
  - service:提供服务
  - destroy:销毁
  - 面试题总结:
    "当浏览器第一次访问该servlet的时候,服务器会给我们创建该servlet的对象,并调用init()方法进行初始化,init()方法执行完毕后service方法会跟着执行.
    以后再访问该servlet的时候,服务器不会给我们创建该servlet的对象,也不会调用init()方法进行初始化,但是会调用service()方法给我们提供服务,并且是访问一次调用一次.
    当服务器正常关闭的时候或项目从服务器中移除的时候,服务器会的调用destroy()方法,将该servlet的对象销毁
    ★: 不论访问多少次只有一个servlet对象"
    这个servlet是一个单实例,多线程的.
package com.baidu_02;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletDemo implements Servlet{

    /*
     * 初始化:init
     * 调用者:tomcat服务器
     * 执行时机:servlet第一次访问的时候
     * 执行次数:1次
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("ServletLife 的init方法执行了, ServletLife出生了...55555");
    }
    //提供服务的service
//        调用者:tomcat服务器
//          执行时机:每次访问的时候
//         执行次数:访问一次执行一次
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("ServletLife 的service方法执行了,为您提供服务...66666");
    }

//销毁:destroy
//    调用者:tomcat服务器
//     执行时机:服务器正常关闭和项目从服务器移除
//     执行次数:1次
    //分为两种,一种是正常销毁,另一种是不正常销毁,正常服务器死亡销毁例如在Servers窗口点击了红色按钮.另一种是不正常服务器死亡销毁了,比如宕机就是断电,或者在Console点击了红色按钮(服务器就是死掉了,后面的也就不执行了)
    public void destroy() {
        System.out.println("ServletLife 的destory方法执行了...死亡了...44444444");
    }

    /*
     * 获取当前的Servlet的配置信息(web.xml中配置信息)
     */
    public ServletConfig getServletConfig() {

        return null;
    }

    /*
     * 当前servlet的基本信息
     */
    @Override
    public String getServletInfo() {

        return null;
    }

}

- Servlet配置:
  - servlet标签:(注册Servlet)
    - servlet-name:给Servlet起名称
    - servlet-class:Servlet全限定名(包名+类名)
  - servlet-mapping标签:(绑定路径)
    - servlet-name:已经注册好的Servlet名称
    - url-pattern:
      - 1.完全匹配: /a/b/hello      以"/"开始
      - 2.目录匹配: /a/*               以"/"开始,以"*"结尾
      - 3.后缀名匹配:  .jsp   .action    以"."开始,匹配后缀名
      - 注意事项:
        "一个路径只能对应一个servlet,
        一个servlet可以对应多个路径"
  - Tomcat的web.xml文件(了解)
    "作用:处理其他servlet都处理不了的请求"
    - DefaultServlet 在tomcat的conf/web.xml中配置的
      "我们项目的web.xml配置文件优先匹对,匹对不上再找Tomcat的web.xml"
  - servlet中的其他标签:
    - init-param(了解):配置servlet的初始化参数的
      "<init-param>
              <param-name>Str</param-name>
              <param-value>tom123</param-value>
          </init-param>"
    - load-on-startup:修改servlet的初始化时机的
      "<load-on-startup>正整数</load-on-startup>
      设置servlet的初始化时机,随着服务器的启动而初始化.
      数字越小初始化的优先级越高"
  - 路径:
    - 相对路径(很少使用,了解即可)
      - ./ 当前目录下  ./也可以省略不写
      - ../ 上一级目录
    - 绝对路径
      - 带协议和主机的绝对路径(访问站外资源)
        "http://localhost:80/34/js/jquery-1.11.3.min.js"
      - 不带协议和主机的绝对路径(访问站内资源)
        "/34/js/jquery-1.11.3.min.js"
  - 访问项目时,设置默认首页
    - 在web.xml中 通过welcome-file-list标签设置的(可以删除)
      "访问的时候直接写项目名称,就可以访问到默认设置的资源"
  - ServletConfig(了解)
    "Servlet的配置对象"
    - 作用:
      "获取Servlet的名称
      获取Servlet的初始化参数
      获取上下文对象(全局管理者ServletContext)"
    - 创建
      "    服务创建Servlet的同时,也创建了Servlet的配置对象,通过Servlet的init方法传递给Servlet."
    - 获取:
      "通过 getServletConfig方法获取即可"
    - 常见的方法:
      - 获取servlet的名称(注册到tomcat的名称)
        "String getServletName()"
      - 获取serlvet的初始化参数
        "String getInitParameter(String name)"
      - 获取上下文(全局管理者ServletContext)
        "ServletContext getServletContext()"

/*

/*

案例1-统计CountServlet被访问的次数
    需求分析:
        服务器上有一个CountServlet,要统计CountServlet被访问的次数.通过调用ShowServlet展示CountServlet被访问的次数
    技术分析:
        ServletContext对象

案例2-文件下载
    需求分析:
        将服务器上的文件保存到本地
    技术分析:
        Response
    步骤分析:
        //设置两个头
            //设置文件的类型
              response.setContentType(文件mime类型);
            //设置文件下载专用头
              response.setHeader("content-disposition","attachment;filename="+文件名称);

            //设置一个流
             输出流

案例3-点击切换验证码
    作用:
        防止暴力破解

- ServletContext:
  "上下文对象,全局管理者,知晓一个项目中所有Servlet的一切信息"
  - 作用:
    "获取全局的初始化参数
    获取文件的mime类型
    资源共享
    获取资源的路径"
  - 生命周期
    - 创建:当服务器启动的时候,服务器会为每一个项目创建servletcontext对象,一个项目只有一个servletcontext对象
    - 销毁:项目从服务器上移除或者服务器正常关闭的时候
  - 获取方式
    - 方式1:通过ServletConfig对象获取
      "ServletContext ServletConfig().getServletContext();"
    - 方式2:通过getServletContext方法获取
      "ServletContext getServletContext();"
  - 常用方法:
    - (理解)获取指定的项目初始化参数
      "String getInitParameter(String name)"
    - (了解)获取项目所有初始化参数名称
      "Enumeration getInitParameterNames()"
    - (掌握)获取一个文件的mime类型
      "String getMimeType(String 文件名)"
    - (掌握)资源共享: 相当于一个map集合
      - setAttribute(String name,Object value):设置
      - getAttribute(String name):获取指定的属性值
      - removeAttribute(String name):移除指定的属性
    - (掌握)获取资源在服务器上的路径
      "String getRealPath(String filepath)
      注意:
          filepath:直接从项目的根目录开始写
          getRealPath("/")  ---> d:/tomcat/webapps/14"
    - (理解)以流的方式返回一个文件
      "InputStream getResourceAsStream(String filepath)"
- response
  "设置服务器发送给浏览器的内容"
  - 操作响应行
    "格式:
        协议/版本  状态码  状态说明
    状态码分类:
        1xx:已发送请求
        2xx:响应完成
            200:正常完成响应
        3xx:还需浏览器进一步操作
            302:重定向 配合响应头location使用
            304:读缓存
        4xx:用户操作错误
            404:用户访问的资源不存在
        5xx:服务器错误
            500:程序异常"
    - 常用方法
      - (理解)setStatus(int code):针对1   2   3
      - (了解)sendError(int code):针对 4   5
  - 操作响应头
    "格式:
        key/value形式(value可以为多个值)"
    - 常用方法
      - (重点)setHeader(String name,String value);
        "设置一个字符串形式的响应头"
      - 了解:
        "setIntHeader(String name,int value);设置一个整型的响应头
        setDateHeader(String name,long value);设置一个时间的响应头
        追加:
        addHeader(String name,String value):追加一个字符串形式的响应头 若无设置则设置,若已设置则追加
        addIntHeader(String name,int value);追加一个整型的响应头
        addDateHeader(String name,long value);追加一个时间的响应头
        "
    - 常见的响应头
      - location:重定向
        "需要配合302状态码一起使用"
        - 方式1(了解):
          "response.setStatus(302);
          response.setHeader("location","路径");"
        - 方式2(掌握):
          "response.sendRedirect("路径");"
      - refresh:定时刷新
        - java中(使用比较少)
          "response.setHeader("refresh","秒数;url=跳转的路径"); 几秒之后跳转到指定的路径上"
        - html中
          "<meta http-equiv="refresh" content="3;url=/14/2.html">"
      - content-type:设置文件的mime类型
      //tomcat传递方式都是以iso-8859-1编码传递的
        "设置文件的mime类型 并且通知浏览器用什么编码打开"
        - 方式1(了解):
          "格式:
              response.setHeader("content-type","mime类型;charset=编码");"
        - 方式2(掌握):
          "response.setContentType("文件的mime类型;charset=utf-8");"
      - content-disposition:文件下载专用头
        "response.setHeader("content-disposition","attachment;filename="+文件名称);"
  - 操作响应体
    "页面上需要解析的内容"
    - 常用方法:
      - PrintWriter getWriter():字符流
      - ServletOutputStream getOutputStream():字节流
      - 注意事项:
        "自己编写的文件   一般都使用字符流输出 如:txt  html等
        音频,视频等文件使用字节流输出
        字节流和字符流互斥,不能同时使用
        服务器会帮我们释放资源,建议自己关闭;底层使用的缓存流
        "

HTTP & Tomcat

    1. web服务器

        web资源:通过网络可以访问到的资源,通常指放在服务器上的文件

            1. 静态web资源:

                内容是一成不变的

            2. 动态web资源:

                内容有可能随着访问时间和人不同而发生改变

            3. 静态web技术:

                html css js

            4. 动态web技术:

                servlet jsp

        软件架构:

            1. c/s架构(Client/Server 客户端/服务器)

            2. b/s架构(Browser/Server 浏览器/服务器)

        通讯机制:

            1. 基于http协议

                浏览器发送给服务器的内容:请求(request)

                服务器返回给浏览器的内容:响应(response)

                注意:先有请求,后有响应,一次请求对应一次响应

        web服务器:

            常见的web服务器

            Weblogic    oracle        大型收费支持javaEE所有规范的web服务器(servlet和jsp)

            websphere    ibm        大型收费支持javaEE所有规范的web服务器(servlet和jsp)

            tomcat        apache        小型免费支持servlet和jsp规范的web服务器

        Tomcat服务器

            下载

                http://tomcat.apache.org/download-70.cgi

                zip 可以在windows上使用

                tar.gz 运行在linux上

            目录结构

                bin:    存放可执行的文件

                conf:    存放配置文件

                lib:    存放的是tomcat运行时和项目运行时必须的jar包

                logs:    存放的是日志文件

                temp:    临时文件

                webapps:    需要发布的项目放在这

                work:    存放项目运行时产生的java和class文件

            启动tomcat

                运行tomcat目录下 /bin/startup.bat

            关闭tomcat

                1. 直接关闭

                2. 运行 /bin/shutdown.bat

            tomcat配置:

                修改tomcat端口号:

                /conf/server.xml 大约70行

                <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"

                   redirectPort="8443" />

                (0-1024是系统预留的端口号,一般不要使用,但是可以使用90端口,

                80端口是http协议的默认端口号,访问的时候可以不写端口号)

            访问格式:

                http://localhost:8080

                http://ip:端口号/项目名/资源?参数名=值&参数名=值

        Http协议:

            协议:规定内容的传输的格式

            http协议:规定互联网上数据的传输的格式

            请求:

            响应:

                状态码:

                    1xx: 请求已经成功发送

                    2xx: 响应已经完成

                        200:响应成功(请求成功)

                    3xx: 需要浏览器进一步操作才可以完成

                        302:重定向(配合location头使用)

                        304: 读缓存

                    4xx:用户访问错误

                        404:用户访问的资源不存在

                    5xx:服务器内部错误

                        500:服务器内部异常

        Eclipse上配置Tomcat:

            1. Window --> Preference --> 搜索server --> 选择Runtime Environments

            2. 将tomcat安装地址,添加到Server Runtime Environments列表中

            3. 创建一个动态 web project,在servers窗口中添加你的tomcat服务器

            4. 在servers窗口双击服务器,

                1. 配置项目工作空间,2. 选择部署路径

                添加项目,开启服务器

Servlet:

    一个类如果想要被(浏览器)访问到,就必须直接或者间接的实现Servlet接口

    作用:

        1. 接受浏览器的请求

        2. 处理请求

        3. 生成响应信息

    入门使用:

        1. 编写一个类

            实现servlet接口

            重写Service(request, response)方法

        2. 编写配置文件(web.xml)

            将访问路径与java类绑定起来

        3. 测试

            http://192.xxx.xxx.xx:8888/项目名/路径名

    Servlet API

        Servlet接口:

            init() -- 初始化时

            service()

            destory() -- 销毁时(正常关闭服务器或者删除项目)

            getServletConfig() -- 获取当前Servlet的配置对象

            getServletInfo() -- 获取Servlet信息

        GenericServlet(抽象类,继承Servlet)

            实现了出了service方法外的所有方法

        HttpServlet(也是抽象类):

            继承了GenericService实现了所有Servlet的方法

        方法详细说明:

            根据反射,利用xml文件创建servlet对象,创建三个参数对象:

            request response servletconfig

            初始化方法:init方法中,利用this.config = config,为全局变量赋值

            getServletConfig() 方法就是获取私有全局变量的方法

            servletConfig对象就是配置文件信息对象,可以获取web.xml中信息

            (可以获取到web.xml中自定义的key value 参数)

            HttpServlet中的service方法:

                String method = reg.getMethod();

                if(method == "get"){

                    doGet(request, response);

                } else if (method == "post"){

                    doPost(resquest, response);

                }

    Servlet的生命周期:

        当浏览器第一次访问该servlet的时候,服务器会给我们创建该servlet的对象,

        并调用inizgt()方法进行初始化,init()方法执行完毕后service方法会跟着执行.

        以后再访问该servlet的时候,服务器不会给我们创建该servlet的对象,

        也不会调用init()方法进行初始化,但是会调用service()方法给我们提供服务,

        并且是访问一次调用一次.

        当服务器正常关闭的时候或则项目从服务器中移除的时候,

        服务器会的调用destroy()方法,将该servlet的对象销毁

        ★: 不论访问多少次只有一个servlet对象

        ServletConfig:

            1. 封装了servlet的配置信息,一个servlet有一个ServletConfig

            2. Servlet创建时,会调用有参init方法,创建ServletConfig(再调用无参init)

                拿到ServletConfig对象:getServletConfig();

            3. 作用:

                1. 拿到web.xml中的servlet的名字:<servlet-name></servlet-name>

                2. 拿到web.xml中该servlet自定义参数标签中的值(根据键)

                    <init-param>
                        <param-name>name</param-name>
                        <param-value>value</param-value>
                    </init-param>

                    String value = config.getInitParameter("name");

                3. 拿到ServletContext对象

                    config.getServletContext();

        ServletContext:

            1. 封装了整个web应用信息,一个项目有一个ServletContext

            2. 获取ServletContext对象:

                直接:this.getServletContext();

                public ServletContext getServletContext(){

                    return getServletConfig().getServletContext();

                }

            3. 作用:

                1. 获取整个web应用的全局初始化参数

                    String value = context.getInitParameter("name");

                    web.xml中:

                    <context-param>

                        <param-name>name</param-name>

                        <param-value>tom</param-value>

                    </context-param>

                2. 存储数据:ServletContext是一个域对象

                    所有servlet都可以将数据存进去,共同使用

                    存、取、删:

                    setAttribute(name,value);  String,Object

                    getAttribute(name);    String

                    removeAttribute(name);    String

        Response:

            设置服务器发送给浏览器的内容

            1. 操作响应行:

                格式: 协议/版本  状态码  状态说明

                状态码分类:

                    1xx:已发送请求

                    2xx:响应完成

                        200:正常完成响应

                    3xx:还需要浏览器进一步操作

                        302:重定向,配合响应头中的location使用

                        304:读缓存

                    4xx:用户操作错误

                        404:用户访问的资源不存在

                    5xx:服务器错误

                        500:程序异常

                方法:

                    setStatus(int code)针对 1 2 3

                    sendError(int code) 针对 4 5

            2. 操作响应头:

                格式:  key/value

                方法:

                    setHeader(String name, String value);

                其他方法:

                    setIntHeader(String name, int value);
                    setDataHeader(String name, long value);
                    addHeader(String name, String value);没有就设置,有就追加
                    addIntHeader(String name, int value);
                    addDateHeader(String name, long value);

                常见的响应头:

                    1. location:重定向

                        让浏览器重新访问其他服务器资源

                        (算是重新访问,地址栏跟新)

                        操作响应内容:需要同时配合302状态码使用

                        response.setStatus(302);
                        response.setHeader("location","路径");

                        简便、常用使用方法:

                        response.sendRedirect("路径");

                    2. refresh:定时刷新

                        java:(少)

                        response.setHeader("refresh","秒数;url=");

                        html:

                        <meta http-equiv="refresh" content="3;url=路径">

                    3. content-type:设置文件类型

                        设置文件类型,并通知浏览器用什么编码打开

                        常见互联网媒体类型(MIME类型)

                            text/html : HTML格式

                            text/plain :纯文本格式 

                            text/xml :  XML格式

                               image/gif :gif图片格式 

                            image/jpeg :jpg图片格式

                            image/png:png图片格式

                response.setHeader("content-type","text/html;charset=utf-8");

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

                    PS:中文乱码原因

                    http协议响应头不支持中文,同一采用ISO-8859-1编码

                    浏览器:火狐、谷歌采用 UTF-8  IE采用GBK

                    文件下载 --> 经过响应头(文字 --> ISO字节)--> 客户端

                    文件上传 --> 经过响应头(字节 --> ISO文字)--> 服务端

                    待商议

                    4. 文件下载

                    步骤:

                        1. 获取前端传来的文件名

                        2. 根据文件名,使用ServletContext对象

        response.setHeader("content-disposition","attachment;filename="+文件名称);

                    下载之前要将文件名字反编码成 ISO-8859-1 文字

                    传送到头文件中,头文件按照ISO解码,发送给浏览器

                    火狐、谷歌将字节编码成UTF-8显示,IE编码成GBK

    PS:

    1. 发送get请求,参数中空格处理:

处理方式1:

http://baidu.com?name=han&content=hello world

url = “http://baidu.com?name=han&content=”+URLEncoder.encode(“hello world”,“utf-8”); 

    2. 文件下载中,在响应头中设置的文件名里面包含空格,使下载文件时无法获取空格之后的文件名

    处理方式:

        设置响应头时,使用双引号将文件名括起来

        response.setHeader("content-disposition", "attachment;filename=\""+name+"\"");

        request:

            请求行 请求头 请求体

            requestAPI:

                request.getMethod()    获取请求方式

                request.getContextPath()    获取本项目名

                request.getServletPath()    获取本servlet名

                request.RemoteAddr()    获取客户IP地址

            请求头:

                获取头信息

                    request.getHeader(String name)

            请求体:

                请求体中包含了请求携带的参数

                get方式没有请求体,post有

                获取参数的方法:

                request.getParameter(String name); String 

                    根据参数名获取参数值

                request.getParameterValues(String name); String[]

                    根据参数名获取一组参数值(checkbox)

                request.getParameterMap(); Map(String name, String[] values)

                    获取表单提交上来的所有参数值,以name为键,

                    存放在Map中(可以配合BeanUtils使用,使用populate方法,

                    直接给Bean对象赋值)

            获取中文参数乱码:

                接受到http流传送来的中文,需要手动处理乱码

                以ISO格式将乱码解码,在按照想要的格式重新编码

                若是post请求,参数在请求体中,可以直接使用api让tomcat处理

                get:

                    new String(str.getBytes("iso-8859-1"),"utf-8");

                post:

                    request.setCharacterEncoding("utf-8")

            页面、后台跳转方式:请求转发

                请求转发:

                    并不以向浏览器发送响应信息作为本次请求的结束,

                    而是将同一个request对象继续传送到下一个页面、后台程序

                    中去,一直使用客户方发送的第一个请求。

                使用:

                request.getRequestDispatcher("路径").forward(request, response)

                特点:

                    1. 地址栏访问地址不变,一直是第一次请求时的访问地址

                    2. 一直使用同一个request对象,可以使用request对象传递数据

                    3. 每次跳转都视为服务器内部跳转,相对路径为本服务器地址内

                       每次跳转之后相对路径都会变为服务器根目录,不是某个页面

                       或程序(路径需要从项目名写起)

                重定向(sendRedirect)的不同点:

                    1. 地址栏每次跳转都改变,显示最新访问的路径

                    2. request每次跳转都会结束生命周期,不可使用它来传参

                    3. 可以访问服务器之外的资源(跳转到其他ip地址)

简单来说,如果只是返回页面,不关乎地址问题,那就转发

如果需要进行下一步业务操作,从而需要改变地址,那就重定向吧

重定向时的网址可以是任何网址
  转发的网址必须是本站点的网址
重定向与请求转发使用
前后两个页面 有数据传递 用请求转发,没有则用重定向。
比如servlet查询了数据需要在页面显示,就用请求转发。
比如servlet做了update操作跳转到其他页面,就用重定向。    

回顾:

Request
    行
        获得请求方式 : request.getMethod();
        获得项目名称 : request.getContextPath()
        获得资源名称 : request.getServletPath()
        获得远程主机的地址: request.getRemoteAddr()
    头
        Request.getHeader(name) : 根据名称获得一个指定的头信息
    体(请求参数)
        Request.getParameter(name) : 根据名称获得一个指定的value
        Request.getParameterValues(name) : 根据名称获得一组指定的value
        Request.getParameterMap() : 获得所有的表单中键值对
    请求转发:
       request.getRequestDispatcher("路径").forward(request.response)
    重定向:
        request.sendRedirect("路径")
    乱码处理
        Get
            new String(乱码.getBytes(iso-8859-1),"编码");
        Post
            Request.setCharacterEncoding(编码)   通知tomcat处理
            response.setHeader("content-type","text/html;charset=utf-8")

原文地址:https://www.cnblogs.com/haizai/p/11368046.html

时间: 2024-10-24 00:51:20

javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response的相关文章

javaWeb核心技术第六篇之BootStrap

概述: Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目. 作用: 开发响应式的页面 响应式:就是一个网站能够兼容多个终端 节约开发成本,提高开发效率 入门: 下载BootStrap www.bootcss.com 官网地址 模版 1.导入BootStrap的css 2.导入jquery的js(1.8+) 3.导入BootStrap的js 4.设置视口(支持移动设备) <meta name="viewport"

javaWeb核心技术第十篇之Filter

Web中有三大组件(需要配置web.xml) servlet:服务器端的小程序. Filter(过滤器):运行在服务器,对请求的资源进行过滤,对响应进行包装. 经典案例: 自动登录,网站全局编码,非法文字过滤... Filter编写流程: 1.创建一个类,实现一个javax.servlet.Filter接口. 2.配置web.xml 配置解释如下: <!-- <filter>通知tomcat需要加载过滤器 <filter-name>给filter命名,名称任意,web.xml

javaweb回顾第六篇谈一谈Servlet线程安全问题

前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安全问题. 1:多线程的Servlet模型 要想弄清Servlet线程安全我们必须先要明白Servlet实例是如何创建,它的模式是什么样的. 在默认的情况下Servlet容器对声明的Servlet,只创建一个Servlet实例,那么如果要是多个客户同时请求访问这个Servlet,Servlet容器就采取多线程.下面我们来看一幅图 从图中可以看出当客户发送请求的时候,Servlet容器通过调度者线程从线程池

javaWeb核心技术第八篇之Cookie和Session

会话技术: 会话是什么? 浏览器和服务器交互,浏览器打开网页访问服务器,会话开始,正常交互. 浏览器关闭,会话结束. 会话能干什么? 会话可以共享数据. Cookie和session将数据保存在不同的位置 进行数据共享 Cookie入门案例 1.创建一个cookie对象 a. Cookie cookie = new Cookie(String name,String value); 2.响应给浏览器 a.Response.addCookie(cookie) 3.再次请求时需要获得cookie a

javaWeb核心技术第五篇之jQuery

- 概述 - jQuery是一个优秀的javascript框架(js类库),兼容css3和各大浏览器,提供dom,events,animate,ajax等简易的操作.并且jQuery有非常丰富的插件,大多数功能都有相应的插件解决方案.jQuery的宗旨是write less, do more. (写的更少,做的更多) - jQuery入门 - jQuery和html整合 - 下载 - 下载地址:www.jquery.com - 使用script的src属性即可 "eg:<script sr

javaWeb核心技术第十三篇之Ajax

Js--ajax--原理解释 概述:异步刷新网页,不会刷新整个页面. Get原理: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w

javaWeb核心技术第九篇之JSP

JSP:全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术.在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示.JSP文件的扩展名为.JSP; JSP技术所开发的Web应用程序是基于Java的,它可以用一种简捷而快速的方法从Java程序生成Web页面,使用上具有如下特征: 1:跨平台:由于JSP是基于Java语音的,它可以使用JavaAPI,所有它也是跨平台的,可以

JavaWeb学习总结第二篇--第一个JavaWeb程序

JavaWeb学习总结第二篇—第一个JavaWeb程序 最近我在学院工作室学习并加入到研究生的项目中,在学长学姐的带领下,进入项目实践中,为该项目实现一个框架(用已有框架进行改写).于是我在这里记录下我JavaWeb学习的过程,加油! 我们在第一篇中提到了开发JavaWeb程序需要的一些工具,在安装完成后(请朋友们自行网上查找安装步骤和配置),接下来我以图片形式介绍编写JavaWeb程序. 一:创建Web项目 1.打开IntelliJ IDEA->File->New Project 项目创建完

SaltStack 入门到精通 - 第七篇: Targeting

什么是Targeting? Targeting minions 是指那些minion会作为运行命令或是执行状态的目标.这些目标可以是一个主机名,系统信息,定义的分组,甚至是自定义的绑定的对象. 例如命令  salt web1 apache.signal restart 可以重启ID 为web1的minion的apache.当然也可以在top文件中使用web1来作为目标匹配的内容: base:   'web1':     - webserver Targing 有哪些匹配方式? Minion Id