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一起处理该请求, 处理的结果会合并一起打给浏览器
JavaWeb知识回顾二的更多相关文章
- JavaWeb知识回顾-servlet简介。
现在公司主要用jsp+servlet这种原生的开发方式,用的是uap的开发平台,所以趁着这个时候把有关javaweb的知识回顾一下. 首先是从servlet开始. 一.什么是Servlet?(是一些理 ...
- JavaWeb知识回顾-使用IDEA开发一个servlet.
刚刚开始学习使用IDEA进行开发,好多都不会,本来想直接导入一个eclipse项目,但是出现了好多错误,一时不知道怎么修改,所以就从最基本的servlet开始着手,慢慢熟悉这个工具,下面是使用IDEA ...
- JavaWeb知识回顾-Servlet常用类、接口及其方法
今天主要把servlet的一些常用的类.接口和方法简单回顾一下. javax.servlet包 1.javax.servlet.Servlet接口 接口用于开发servlet,所有的servlet都要 ...
- JavaWeb知识回顾-servlet生命周期。
Servlet生命周期 生命周期,很容易理解,拿人来说,就是你从出生到离开的这一过程.无论是什么技术,只要谈到生命周期都可以这样理解. Servlet的生命周期就是从它被创建到毁灭的过程,整个过程可以 ...
- python---基础知识回顾(二)(闭包函数和装饰器)
一.闭包函数: 闭包函数: 1.在一个外函数中定义了一个内函数 2.内函数里运用了外函数的临时变量,而不是全局变量 3.并且外函数的返回值是内函数的引用.(函数名,内存块地址,函数名指针..) 正确形 ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- [.NET] C# 知识回顾 - 事件入门
C# 知识回顾 - 事件入门 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通过<C# 知识回顾 - 委托 de ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
随机推荐
- FMDB增删查改
创建,插入,更新和删除:使用executeUpdate方法,而查询则用executeQuery 1.实例化FMDatabase //paths: ios下Document路径,Document为ios ...
- ubuntu php 出现 Cannot find module (SNMPv2-TC) 等错误
有时编译一个东西或输入某个命令的时候会出现: Cannot find module (MTA-MIB): At line in (none) Cannot find module (NETWORK-S ...
- 在阿里云ECS(CentOS6.5)上安装redis
下载所需的redis 命令: wget http://download.redis.io/releases/redis-3.0.7.tar.gz 结果: 解压redis压缩文件: 命令: .tar.g ...
- Android L(5.0)源码之图形与图像处理之绘图——Canvas
最近在研究android 5.0的gallery模块,学习了相关的知识点,准备写点博客总结一下,有时间了会补充完整
- Android L(5.0)源码之手势识别GestureDetector
本人新手,最近下了Android L的源码,正在研究手势识别,能力有限,现总结如下: Android识别触摸屏手势使得用户体验大大提高.在View类中有个View.OnTouchListener内部接 ...
- VS2010环境下用ANSI C创建DLL和使用方法(转)
源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...
- 【转】一大波实用的 bash 别名和函数
作为一个命令行探索者,你或许发现你自己一遍又一遍重复同样的命令.如果你总是用ssh进入到同一台电脑,如果你总是将一连串命令连接起来,如果你总是用同样的参数运行一个程序,你也许希望在这种不断的重复中为你 ...
- ARM处理器工作模式
学习ARM处理器参考的首选资料是ARM Architecture Reference Manual,是最专业权威的学习资料. ARM处理器共有7种工作模式,如表1-1和1-2所示: 表1-1 处理器工 ...
- Swing 布局时 组件大小问题
在JFrame中放置了几个JPanel ,想调整JPanel大小,一直无效. 问题在于: 因为JPanel A的四周没有添加任何组件,所以JPanel B会把JPanel A填满.这种情况想固定JPa ...
- java--面向对象编程
instanceof的用法 静态绑定,即早期绑定,首先找父类 动态绑定,即运行时绑定,new谁找谁 Object o1 = null; //正确的语法,null也是一种特殊的引用数据类型 object ...