• 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")
  • 相关阅读:
    创建一个对象,包含有多个成绩,每个属性是一个成绩,遍历对象中的属性,计算出总成绩。
    创建一个计算器的函数calc含有两个数字,调用函数的函数传递一个函数,分别是实现加减乘除
    JS中的对象
    python+jieba+tfidf算法 文本相似度
    ubuntu hadoop2.x 伪分布部署及集群搭建(完全分布式)
    ubuntu16.04 +Java8+ hadoop2.x单机安装
    python pandas库的一些使用总结
    scrapy 当当网书籍信息爬取存储MySQL
    pymysql 中总结出来的一些问题
    python3 requests 12306下单环节
  • 原文地址:https://www.cnblogs.com/haizai/p/11368046.html
Copyright © 2020-2023  润新知