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一起处理该请求, 处理的结果会合并一起打给浏览器