HttpServletRequest
常用对象
常用方法
获取请求时的完整路径 (从http开始,到"?"前面结束)
System.out.println("获取请求时的完整路径:" + request.getRequestURL());
获取请求时的部分路径 (从站点名开始,到"?"前面结束)
System.out.println("获取请求时的部分路径:" + request.getRequestURI());
获取请求时的参数字符串 (从"?"开始到最后)
System.out.println("获取请求时的参数字符串:" + request.getQueryString());
获取请求类型 (GET|POST)
System.out.println("获取请求类型:" + request.getMethod());
获取请求协议版本 (HTTP/1.1)
System.out.println("获取请求协议版本: " +request.getProtocol());
获取站点名 (webapp的名称)
System.out.println("获取站点名: " +request.getContextPath());
请求乱码的解决
乱码的原因:
request在解析数据时使用的编码格式是ISO-8859-1,该编码本身就不支持中文。
解决方案:
1、设置request的解析编码(只针对于POST请求有效)
request.setCharacterEncoding("UTF-8");
2、通过new String()将ISO-8859-1的编码转换为UTF-8
new String(request.getParamter(name).getBytes("ISO-8859-1"),"UTF-8");
POST请求 GET请求
Tomcat8 乱码 不乱码
request.setCharacterEncoding("UTF-8"); 不处理
Tomcat7 乱码 乱码
request.setCharacterEncoding("UTF-8"); new String(request.getParamter(name).getBytes("ISO-8859-1"),"UTF-8");
请求转发跳转
概念: 请求转发是一种服务端的跳转方式,是服务端行为
格式:request.getRequestDispatcher("地址").forward(request, response);
特点:
1、服务端行为,服务端跳转
2、浏览器的地址不发生改变
3、从始至终只有一个请求
4、请求转发时,数据可以共享(request对象共享)
request作用域
设置request域对象
request.setAttribute("限域变量名","域变量的值");
获取指定域对象的值
request.getAttribute("限域变量名");
移除指定域对象的值
request.removeAttribute("限域变量名");
设置在request作用域中的数据可以实现数据共享,但只在一次请求中有效,即只在请求转发跳转有效。
HttpServletResponse
常用方法
添加响应头
resp.addHeader("userName", "zhangsan");
判断响应头是否被设置
System.out.println(resp.containsHeader("userName"));
System.out.println(resp.containsHeader("userPwd"));
设置错误状态码
resp.sendError(404);
resp.sendError(404,"由于颜值过低,无法访问!");
设置自动刷新
resp.setHeader("refresh", "2"); // 每两秒刷新一次
设置固定时间后跳转到某页面
resp.setHeader("refresh", "3;URL=http://www.baidu.com"); // 3秒钟后跳转到百度
响应数据
1、输出字符流
PrintWriter writer = response.getWriter();
输出字符串
2、输出字节流
ServletOutputStream out = response.getOutputStream();
输出任意
注意:字符流和字节流不能同时使用
java.lang.IllegalStateException: getWriter() has already been called for this response
响应类型
response.setContentType("响应类型MIME-TYPE");
text文本格式:text/plain
html格式:text/html
响应乱码解决
getWriter()的字符乱码
对于 getWriter()获取到的字符流,响应中文必定出乱码。
由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。
getOutputStream()字节乱码
对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示。
当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。
解决方案:
第一步:设置服务端的响应编码格式
response.setCharacterEncoding("UTF-8");
第二步:设置客户端的编码的格式
response.setHeader("content-type","text/html;charset=UTF-8");
总结:
保证发送端和接收端的编码一致;设置客户端和服务端的编码保持一致,且都支持中文。
同时设置客户端和服务端的编码
response.setContentType("text/html;charset=utf-8");
响应图片
设置响应类型
resp.setContentType("image/jpeg");
getRealPath():得到项目存放在服务器中位置
String realPath = req.getServletContext().getRealPath("/");
System.out.println(realPath);
得到图片存放的路径
String filePath = realPath + "/WEB-INF/jay.jpg"; 得到file文件对象
File file = new File(filePath);
得到输出字节流
ServletOutputStream out = resp.getOutputStream();
得到文件的输入流
InputStream in = new FileInputStream(file);
输出数据
byte[] bytes = new byte[1024];
int len = 0;
while((len=in.read(bytes)) != -1) {
输出
out.write(bytes, 0, len);
}
刷出流
out.flush();
关闭流
in.close();
out.close();
重定向
一种跳转方式,是一种由服务端指导,客户端的跳转行为。
流程:当有请求到达服务器时,服务器接收请求,响应给客户端时会向客户端响应一个新的地址,客户端接收到响应后,会立刻马上重新发起一次请求到新的地址,服务器再接收并接收。
特点:
1、客户端跳转
2、存在两次请求
3、地址栏会发生改变
4、数据不共享(request对象不共享)
请求转发与重定向的区别
1、请求转发是服务端跳转,重定向是客户端跳转
2、请求转发时地址栏不发生改变,重定向时地址栏发生改变
3、请求转发时从始至终只有一次请求,重定向时存在两次请求
4、请求转发时数据可以共享(request对象和域对象),重定向时数据不共享
5、请求转发时地址只能定位到当前站点下(不能跨域),重定向时地址可以是任意地址
请求路径问题
相对路径
相对于当前资源所在的路径
绝对路径
1、以http://开头的路径,已经跨域,可以定位到任意地址
2、以/开头
如果是服务端跳转,"/"代表的含义是 http://IP:端口/站点名/
如果是客户端跳转,"/"代表的含义是 http://IP:端口/
Cookie对象
Cookie
客户端的缓存技术,浏览器技术。
作用: 提高网页效率,减轻服务器负载。
一、Cookie的创建和发送
Cookie的创建:
Cookie cookie = new Cookie("名称","值");
Cookie的发送:
response.addCookie(cookie);
Cookie对象的获取
返回是cookie数组
获取cookie数组
Cookie[] cookies = request.getCookies();
判断非空
if (cookies != null && cookies.length >0) {
遍历cookie数组
for (Cookie cookie : cookies) {
System.out.println("名称:" + cookie.getName() + ",值:" + cookie.getValue());
获取uname的名称
if ("uname".equals(cookie.getName())) {
System.out.println("name的值为:" + cookie.getValue());
}
}
}
Cookie到期时间的设定
到期时间,到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。
通过 setMaxAge(int time);方法设定 cookie 的最大有效时间,以秒为单位。
大于0的整数
表示cookie存活指定秒数
在浏览器中存活指定秒数,在时间未到之前,cookie会一直存在,无论是关闭浏览器还是关闭电脑,都不影响。但是不跨浏览器和电脑。
小于0的整数
表示不存储,默认关闭浏览器失效
0
表示删除