rr(request&response)
一、响应(response)
1.作用(了解):服务器往浏览器回写
2.组成部分(响应行 响应头 响应体)
(1)操作响应行(响应行:响应信息的第一行)
a.格式:协议/版本 状态码 状态码说明
例如:HTTP/1.1 200 OK
b.状态码
1xx:已发送请求
2xx:已完成响应
200:正常响应
3xx:还需浏览器进一步操作
302:重定向 配合响应头:location
304:读缓存
4xx:用户操作错误
404:用户操作资源不存在
405:访问的方法不存在
5xx:服务器错误
500:服务器内部异常
c.常用方法
格式:setStatus(int 状态码):针对于 1xx 2xx 3xx
例如:response.setStatus(302);
了解:
sendError(int 状态码):针对于 4xx和5xx
(2)操作响应头(响应头:从响应信息的第二行到空行结束)
a.格式:key/value(value可以是多个值)
b.常用方法
setHeader(String key,String value):设置字符串形式的响应头
了解:setIntHeader(String key,int value):设置整形的响应头
了解:setDateHeader(String key,long value):设置时间的响应头
addHeader(String key,String value):添加字符串形式的响应头 之前设置过则追加,若没有设置过则设置
了解:addIntHeader(String key,int value):添加整形的响应头
了解:addDateHeader(String key,long value):添加时间的响应头
c.常用的响应头
location:重定向 配合302
refresh:定时刷新
content-type:设置文件的mimeType,及设置响应流的编码并且通知浏览器用什么编码打开
content-disposition:设置文件下载
d.常见的响应头(了解)
★Location: http://www.it315.org/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.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 --连接
掌握的头信息:
Location Content-Type Last-Modified Refresh Content-Disposition Set-Cookie
(3)操作响应体 (响应体:空行以下的内容)
浏览器要展示的内容(html代码)
常用方法: ★★★
Writer getWriter():字符流
ServletOutputStream getOutputStream() :字节流
注:自己写的东西用字符流,其他一概用字节流;
两个流互斥;
服务器会帮我们关闭此流
3.处理响应中文乱码(content-type)
方式1:★
response.setContentType("text/html;charset=utf-8");//建议大家放在servlet方法中的第一行
方式2:(理解)
response.setHeader("content-type", "text/html;charset=utf-8");
4.重定向(location)
方式1:(常用)★★★
格式:response.sendRedirect("跳转路径");
例如:response.sendRedirect("/day10/loc2");
方式2:(了解)
response.setStatus(302);
response.setHeader("location","/day10/loc2");
5.定时刷新(refresh) ★★★
方案1:设置头 java
response.setHeader("refresh","秒数;url=跳转的路径");
方案2:html代码的meta标签
<meta http-equiv="refresh" content="3;url=/day10/refresh2.html">
其中 http-equiv为响应头;content为响应头的内容
6.文件下载(content-disposition)
方式1:超链接下载
<a href="/day10/download/day10.txt">下载 day10.txt</a>
若浏览器能解析该资源的mime类型,则打开;若不能解析则下载
方式2:编码下载(两个头一个流) 通过servlet完成(常用) ★★★
<a href="/day10/download?name=day10.txt">下载 day10.txt</a>
a.设置文件的mime类型 content-type
String mimeType=context.getMimeType(文件名)
response.setContentType(mimeType);
b.设置下载头信息 content-disposition
response.setHeader("content-disposition", "attachment;filename="+文件名称);
c.提供流
response.getOutputStream();
扩展:使用commons-io工具类
对拷流:IOUtils.copy(is,os);
扩展:
中文名称的文件名下载的时候名称会出现问题
常见的浏览器需要提供文件名称的utf-8编码
对于火狐来说需要提供文件名称的base64编码
方案1:使用工具类(通用)
DownLoadUtils.getName(request.getHeader("user-agent"), filename);
方案2:网上的方式(八成好使)
new String(filename.getBytes("gbk"),"iso8859-1");
7.验证码生成(扩展)(了解)
通过response生成验证码
验证码作用:防止暴力攻击
点击换一张的js代码:
function changeImg(obj){
//操作src属性
obj.src="/day10/code?i="+Math.random();
}
二、请求(request)
1.作用(了解):获取浏览器发送过来的数据(浏览器往服务器发送)
2.组成部分(请求行 请求头 请求体)
(1)操作请求行(请求行:请求信息的第一行)
a.格式:请求方式 请求资源 协议/版本
例如:GET /day10/row?username=tom&password=123 HTTP/1.1
b.常用方法:HttpServletRequest
掌握
String getMethod():获取请求方式
String getRemoteAddr():获取请求的ip地址
★String getContextPath():在java中获取项目名称(例如:/day10)
了解
String getRequestURI():获取的是从项目名到参数之前的内容 /day10/regist
String getRequestURL():获取的是带协议的完整路径 http://localhost/day10/regist
String getQueryString():get请求的所有参数 username=tom&password=123
String getProtocol():获取协议和版本
c.请求方式:get和post(了解)
get会把参数放在url的后面,post不会
get参数大小有限制,post请求却没有限制
get请求没有请求体;post请求有请求体且请求参数放在请求体中
(2)操作请求头 (请求头:请求信息的第二行到空行结束)
a.格式:key/value(value可以是多个值)
b.常用方法
★String getHeader(String key):通过key获取指定的value (一个)
了解:
Enumeration getHeaders(String name):通过key获取指定的value(多个)
Enumeration getHeaderNames():获取所有的请求头的名称
int getIntHeader(String key):获取整型的请求头
long getDateHeader(String key):获取时间的请求头
c.常用的请求头
user-agent:获取浏览器内核 msie firefox chrome
referer:页面从哪里跳转过来的 防盗链
d.常见的请求头(了解)
Accept: text/html,image/bmp --支持数据类型 text/html text/css text/javascript 大类型/小类型 mime类型
Accept-Charset: ISO-8859-1 --字符集
Accept-Encoding: gzip --支持压缩
Accept-Language:zh-cn --语言环境
Host: www.itcast.cn:80 --访问主机
★If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --缓存文件的最后修改时间
★Referer: http://www.itcast.com/index.jsp --来自哪个页面、防盗链
★User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --浏览器内核
★Cookie
Connection:Keep-Alive --链接状态
掌握的头信息
If-Modified-Since Referer User-Agent Cookie
(3)操作请求参数(请求体:空行以下的内容) ★★★
username=tom&password=123&hobby=drink&hobby=sleep
常用方法:
String getParameter(String key):获取一个值
String[] getParameterValues(String key):通过一个key获取多个值
Map<String,String[]> getParameterMap():获取所有的参数名称和值
3.处理请求中文乱码 ★★★
对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
方式1:(通用的方法:get和post均适用)
格式:new String(参数.getBytes("iso-8859-1"),"utf-8");
例如:new String(username.getBytes("iso8859-1"),"utf-8");
方式2:针对于post请求来说:只需要将请求流的编码设置成utf-8即可
request.setCharacterEncoding("utf-8");
扩展:
URLEncoder.encode(s, "utf-8"); 指定编码
URLDecoder.decode(s8, "iso8859-1");指定解码
4.请求转发 ★★★
域对象:request
xxxAttribute()
生命周期:一次请求
创建:一次请求来的时候
销毁:响应生成的时候
作用:一次请求里面的数据
请求转发(请求链,请求串)
格式:request.getRequestDispatcher("内部路径").forward(request,response);
例如:request.getRequestDispatcher("/dis2").forward(request,response);
5.请求转发和重定向的区别(常见面试题)
重定向发送两次请求,请求转发一次请求;
重定向地址栏发生改变,请求转发不变;
重定向是从浏览器发送,请求转发是服务器内部;
重定向不存在request域对象,请求转发可以使用request域对象;
重定向是response的方法,请求转发是request的方法;
重定向可以请求站外资源,请求转发不可以
三、其他
1.封装对象(扩展)
apache提供的一个工具类:BeanUtils
封装数据
使用步骤:
a.导入两个jar包(commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar)
b.调用 BeanUtils.populate(Object bean,Map<> 参数);
四、常见案例
1.案例一-文件下载
(1)需求:下载文件
(2)技术分析:response 文件下载
(3)步骤分析:编码下载(两个头一个流)
a.设置文件的mime类型
b.设置下载头信息 content-disposition
c.提供流(对拷流)
2.案例二-用户注册
(1)需求:在一个表单页面上填写用户数据,点击提交,将所有的数据提交到服务器上,
通过java代码最终保存到数据库中.
(2)技术分析:表单 request
(3)步骤分析:
a.先有数据库和表(见day09)
b.创建工程
例如:day1001(web工程)
c.复制页面(表单)
修改register.htm
给每个字段添加name属性(部分需要添加value属性)
修改表单的action属性
action="http://localhost/day1001/regist"
添加method属性:method="post"
d.创建用户类(User)
e.表单提交到一个servlet(RegistServlet:路径 /regist)
设置编码(request);
封装数据:接受数据,封装成一个user(使用beanutils封装对象);
调用UserSerivce完成保存操作 int regist(User user)
判断结果是否符合我们预期
若int=1,插入成功;若int!=1,插入失败
相应的提示信息在当前的servlet不做处理,将信息转发给另一个servlet展示(MsgServlet)
f.MsgServlet
设置编码(response);
从request域中获取内容msg;
将信息打印到页面上
g.UserService
调用UserDao
h.UserDao
通过dbutils在数据库中插入一条记录
创建queryrunner
编写sql
执行sql