JavaWeb知识回顾二

动态web资源相关

  1、tomcat相关

    tomcat的目录结构

    bin -- tomcat服务器的批处理文件的存放目录
    conf -- tomcat服务器配置文件的存放目录
    lib -- tomcat服务器运行时所依赖的jar包的存放目录
    logs -- tomcat服务器运行时产生的日志文件的存放目录
    temp -- tomcat服务器运行时产生的临时文件的存放目录

tomcat的三种部署web应用的方式

    1、在tomcat/conf/server.xml中<host>下添加<Context path="..." docBase="..." /> docBase用来指定真实的web应用路径,path虚拟路径,这种方式配置完需要重启服务器

    2、在tomcat/conf/Catalina/host下面添加xxx.xml,文件中写:<Context docBase="D:\news2"/> ,docBase是web应用的真实路径,xxx是虚拟路径

    3、将web应用直接丢到虚拟主机默认的管理目录下就可以了

   tomcat的虚拟主机配置

    在tomcat/conf/server.xml中的<Engine>标签下添加<Host name="" appBase=""/> name是虚拟主机的名字,相当于localhost,appBase是该虚拟主机管理的目录为可选属性

    打war包:进入到web应用的根目录下,通过 jar -cvf xxx.war * 命令可以将当前目录下的所有文件打成一个war包

2、HTTP详解

  特点:基于请求响应模型,一次请求对应一次响应,请求只能有客户端发出,服务端只能被动等待请求做出响应

  (1) http请求
    一个请求行
    GET /news3/1.html HTTP/1.1
    GET: 请求方式, 7种, 只用GET和POST
    /news3/1.html: 请求资源的路径
    HTTP/1.1: 所遵循协议的版本
    1.0和1.1: 1.0版本的http协议在一次请求响应结束后会立即断开连接, 如果在短时间内需要频繁的发送请求, 也需要频繁的开关连接, 效率低下
    1.1版本的http协议在一次请求响应结束后连接会会保持一段时间, 在这段时间内如果需要再次发送请求,无需建立连接, 可以复用之前的连接

    若干请求头
    Accept: text/html,image/*
    -- 通知服务器当前浏览器可以接受那些格式的数据
    Accept-Charset: ISO-8859-1
    -- 通知服务器当前浏览器可以接受的字符集编码
    Accept-Encoding: gzip,compress
    -- 通知服务器当前浏览器可以接受的压缩格式
    Accept-Language: en-us,zh-cn
    -- 通知服务器当前浏览器接受的语言环境,和国际化相关的头
    Host: www.baidu.com:80
    -- 需要访问的虚拟主机的名称
    If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
    -- 这是和缓存机制相关的头
    Referer: http://www.tedu.cn/index.jsp
    -- 这是和防盗链相关的头,对当前资源的访问来自哪个页面的超链接
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) -- 客户端的基本信息
    Cookie
    -- 和cookie相关的头
    Connection: close/Keep-Alive
    -- 是否继续保持连接
    Date: Tue, 11 Jul 2000 18:23:51 GMT
    -- 当前发送请求的时间
    (一个空行)
    请求实体内容
    username=zhangsan&password=123

  (2) http响应
    一个状态行
    HTTP/1.1 200 OK
    HTTP/1.1: 所遵循协议的版本
    200:
    状态码, 一个三位的数字, 用来表示服务器对请求处理的结果
    200 表示成功处理完成请求
    302 表示请求重定向
    304 表示通知浏览器使用缓存中的资源
    307 表示通知浏览器使用缓存中的资源
    404 找不到资源
    500 服务器端错误

    OK: 描述字符串

    若干响应头

    Location: http://www.tedu.cn/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.tedu.cn
    -- 定时刷新相关的头,通知浏览器,过几秒后自动刷新访问哪个地址
    Content-Disposition: attachment;filename=aaa.zip
    -- 通知浏览器以附件的形式打开发送过去的数据,是和文件下载相关的头
    Set-Cookie:SS=Q0=5Lb_nQ; path=/search
    -- 和Cookie相关的头
    Expires: -1
    -- 通知浏览器是否缓存
    Cache-Control: no-cache
    -- 通知浏览器是否缓存
    Pragma: no-cache
    -- 通知浏览器是否缓存
    --之所以一个功能有三个头,是因为历史原因.所以为了网页的兼容性考虑,通常这三个头要一起使用
    Connection: close/Keep-Alive
    -- 是否保持连接
    Date: Tue, 11 Jul 2000 18:23:51 GMT
    -- 响应时的时间
    (一个空行)
    响应实体内容
    xxxxxx

3、servlet

  servlet生命周期:servlet会在第一次访问的时候创建,servlet被创建出来后,服务器会执行init方法来进行初始化操作,从此servlet实例会存在在内存中,为后续的servlet访问,直到服务器停止,web应用被移除容器时为止,随着web容器的销毁servlet也被销毁,在销毁之前调用destory方法执行善后的处理

  Servlet开发中的细节问题
    (1) Servlet在web.xml中虚拟路径的配置
      a) 直接写一个路径 如: /servlet/SecondServlet
      b) 可以利用*匹配符来写一个路径
        要么以/开头, /*结尾
        要么以*.后缀的形式

4、request

  代表http请求的对象
  1.Request继承结构
    ServletRequest -- 通用request接口, 提供了一个request所应该具有的功能
      |
      |-- HttpServletRequest, 在ServletRequest基础上, 增加了很多和http协议相关的方法

  2.Request的功能
    (1) 获取客户端基本信息
      getRequestURL方法 -- 返回客户端发出请求完整URL
      getRequestURI方法 -- 返回请求行中的资源名部分
      getQueryString方法 -- 返回请求行中的参数部分
      getRemoteAddr方法 -- 返回发出请求的客户机的IP地址
      getMethod方法 -- 返回客户机的请求方式
      getContextPath方法 -- 获得当前web应用的虚拟目录名称

      在工程中不要将web应用的虚拟目录名称写死, 要通过方法来动态的获取!!

    (2) 获取请求头信息
      getHeader(name)方法 --- String
      getHeaders(String name)方法 --- Enumeration<String>
      getHeaderNames方法 --- Enumeration<String>
      getIntHeader(name)方法 --- int
      getDateHeader(name)方法 --- long(日期对应毫秒)

    (3) 获取请求参数
      getParameter(String name) -- String 通过name获得值
      getParameterValues(String name) -- String[] 通过name获得多值 如: 爱好
      getParameterNames() -- Enumeration<String> 获得所有请求参数的name
      getParameterMap() -- Map<String,String[ ]> key :name value: 多值

    请求参数乱码问题: -- 编解码不一致
    浏览器发送数据使用的编码: -- utf-8
    浏览器使用什么编码来打开当前页面, 就使用什么编码来发送数据, 我们可以通过控制浏览器使用什么编码来打开当前页面, 从而间接的控制浏览器使用什么编码来发送数据

    服务器接受数据使用的编码: -- iso8859-1
    如果不指定, 服务器默认使用iso8859-1来接受客户端浏览器发送过来的数据
    由于这个码表没有中文字符, 所以在接受中文数据时, 必然会产生乱码

    **解决方案:
    request.setCharacterEncoding("utf-8"); 这个方法用来通知服务器用什么编码来接受客户端发送过来的请求实体内容中的数据,
    注意: 这个方法必须放在所有获取数据的代码之前执行

    POST提交的请求参数刚好在请求实体中, 所有该方法可以解决POST提交的乱码问题

    而GET提交的请求参数在请求资源路径的后面拼接着, 不再请求实体中, 所以该方法对GET提交的乱码无效

    怎么解决GET提交的参数乱码问题?? -- 根据乱码产生的原理手动编解码来解决乱码
    String username = request.getParameter("username");
    byte[] bytes = username.getBytes("iso8859-1");
    username = new String(bytes, "utf-8");

  (4) 实现请求转发
    请求重定向: 302+location
    请求转发: 可以实现资源的跳转, 是服务器内部的资源跳转 一次请求, 一次响应 地址栏不会发生变化

    实现请求转发:
    request.getRequestDispatcher("xxx").forward(request, response);

    注意: 转发时路径不要带web应用的虚拟路径的名称
    转发时要通过forward()方法将request和response转发出去

  细节:
    如果转发之前, response缓冲区被写入了数据但是还没有打给浏览器, 转发时该数据将会被清空!
    如果转发之前, response缓冲区被写入了数据并且已经打给了浏览器, 转发将会失败!

    不能进行多次转发!! 可以进行多重转发!!

    转发就像方法的调用, 在转发之后的代码 转发成功之后还会接着执行

  (5) 作为域对象使用
    域对象: 如果一个对象具有可以被看见的范围, 那么利用这个对象上的map就可以在整个范围中实现资源的共享!

    request -- 域对象

    setAttribute(String name, Object obj);
    getAttribute(String name);
    removeAttribute(String name);
    getAttributeNames();

    生命周期: 一次请求开始, 一次请求结束

    作用范围: 整个请求链

    主要功能: 把数据带到目的地(在整个范围中实现资源的共享)

  (6) 实现请求包含
    请求包含是服务器内部资源合并的效果
    浏览器发请求访问AServlet, AServlet不能独立的处理该请求, 需要BServlet来帮忙, 于是将BServlet包含了进来:
    request.getRequestDispatcher("BServlet").include(request, response);
    最终是由AServlet和BServlet一起处理该请求, 处理的结果会合并一起打给浏览器

时间: 2024-11-01 12:53:40

JavaWeb知识回顾二的相关文章

概率与统计 知识回顾(二) 一维随机变量及概率分布

1 随机变量的概念 顾名思义,随机变量就是“其值随机会而定”的变量.随机变量的反面是“确定性变量”,即其值遵循某种严格的规律的变量,比如从北京到上海的距离.但是从绝对意义上讲,许多通常视为确定性变量的量,本质上都有随机性,只是由于随机性干扰不大,以至在所要求的精度之内,不妨把经作为确定性变量来处理. 根据随机变量其可能取的值的全体的性质,可以把随机变量分为2大类,一类是离散型随机变量:一类是连续型随机变量.但是连续型变量这个概念只是数学上的抽象,因为任何量都有单位,都只能在该单位下量到一定的精度

JS基础知识回顾:引用类型(二)

ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的. 因此,Date类型使用自UTC(Coordinated Universal Time,国际协调时间)1970年1月1日午夜零点开始经过的毫秒数来保存日期. 在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日或之后的285616年. 要创建一个日期对象,使用new操作符和Date构造函数即可:var now=new Date(); 在调用Date构造函数而不传递参数

JS基础知识回顾:ECMAScript的语法(二)

ECMAScript中有五种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String ECMAScript还有一种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的. ECMAScript不支持任何创建自定义类型的机制,而所有值最终都将是上述六种数据类型之一,由于ECMAScript的数据类型具有动态性,因此的确没有再定义其他数据类型的必要了. 监狱ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据

java基础知识回顾之---java String final类普通方法

辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      *      * 1,获取:     * 1.1 获取字符串中字符的个数(长度).     *         int length();     * 1.2 取字符串中的某一个字符,其中的参数index指的是字符串中序数.字符串的序数从0开始到length()-1 .     *       

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字节的值,该如何在它上面调用方法? 二:值类型转换为引用类型--装箱 2.1CLR对值类型进行装箱时:新分配托管堆内存,将值类型的实例字段拷贝到新分配的内存中,返回托管堆中新分配对象的地址.这个地址就是一个指向对象的引用. int i = 10; Object obj = i; 三:将引用类型转换为值

java基础知识回顾之面向对象

一 . 抽象类 什么是抽象类?很简单,就是用abstract关键字修饰,并允许包含未实现方法的类. 什么时候定义抽象类?在有些情况下,可能有些方法无法确定要怎么实现,这时就可以定义抽象类,无法实现的方法定义成抽象方法. 抽象类的特性: 1. 不能实例化,即不能创建对象,只能作为父类被继承. 2. 子类继承一个抽象类后,必须实现父类的抽象方法. 3. 抽象类中可以有抽象方法,也可以不包含抽象方法,但如果包含抽象方法,就必须定义成抽象类. public abstract class Shaoe{ p

[C#] C# 知识回顾 - Excetion 异常的介绍、使用和处理

Excetion 异常的介绍.使用和处理 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally 等,用来处理失败的情况. CLR..NET 自身的类库.其它第三方库或者你写的程序代码都有可能会出现异

概率与统计 知识回顾(一) 事件的概率

一.概率是什么 概率是表示某种情况(事件)出现的可能性大小的一种数量指标,它介于0与1之间. 1.1 主观概率 凭着经验和知识对事件发生的可能性作出的一种主观估计,主观概率可以理解为一种心态或倾向性. 1.2 等可能试验 假定某个试验有有限个可能的结果$e_1,e_2,\dots,e_N$.假定从该试验的条件及实施方法去分析,我们找不到任何理由认为其中某一结果,例如$e_i$,比任一其他结果,例如$e_j$,更具有优势(即更倾向于易发生),则我们只好认为,所有结果$e_1,e_2,\dots,e

JS基础知识回顾:ECMAScript的语法(三)

ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符.位操作符.关系操作符和相等操作符. ECMAScript操作符的与众不同之处在于,他们能够适用于很多值,例如字符串.数字值.布尔值.甚至是对象. 在将这些操作符应用于对象时,相应的操作符通常都会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值. 只能操作一个值的操作符叫做一元操作符. 递增和递减操作符直接借鉴自C,各有前置型和后置型两个版本:a++.++a.a--.--a 这四种操作符不仅适用于整