概述
概述
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了;要向客户机输出数据,只需要找response对象就行了。
response的继承结构
ServletResponse -- 通用的response。提供了一个响应应该具有最基本的属性和方法。
|-HttpServletResponse -- 在ServletResponse的基础上针对于HTTP协议增加了很多强化的属性和方法。
利用response向浏览器输出一段数据
package me.zipstream.response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response.setContentType("text/html;charset=utf-8");//通知浏览器用u8来解码
// response.getOutputStream().write("中国".getBytes("utf-8"));
response.setCharacterEncoding("utf-8");//通知服务器以u8来编码。
//其实上面这句话可以省略,因为只要有下面这句话,服务器就会默认使用u8来编码。
response.setContentType("text/html; charset=utf-8");//通知浏览器以u8来解码。
response.getWriter().write("中国");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
另外,这里需要注意的是:
对于一次请求,Response的getOutputStream()方法和getWriter()方法互斥,只能调用其一,特别注意forward后(在请求转发时)也不要违反这一规则。
利用response实现下载
package me.zipstream.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("机械键盘.jpg", "utf-8"));
InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
OutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len=in.read(buf))!=-1){
out.write(buf, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
/*
* URL编码与解码的过程
*/
/*
public static void main(String[] args) throws Exception {
String str = "文明开化";
String str2 = URLEncoder.encode(str, "utf-8");
System.out.println(str2);
String str3 = URLDecoder.decode("%E6%96%87%E6%98%8E%E5%BC%80%E5%8C%96", "utf-8");
System.out.println(str3);
}
*/
}
设置响应头content-disposition为“attachment;filename=xxx.xxx”。
利用输入流将文件读取进来,再利用Response获取响应流输出。
如果文件名为中文,一定要进行URL编码,编码所用的码表必须是utf-8。
注意:
service方法返回后,服务器会自己检查Response获取的OutputStream()或者Writer()是否关闭,如果没有关闭,服务器自动帮你关闭,一般情况下不要自己关闭这两个流。
利用response实现定时刷新页面
package me.zipstream.response;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RefreshServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//隔1s刷新一次本页
// response.getWriter().write(new Date().toLocaleString());
// response.setHeader("Refresh", "1");
//隔3s跳转到主页
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("恭喜您注册成功,3秒后回到主页...");
response.setHeader("Refresh", "3;url=/Day04/index.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
设置响应头Refresh为一个数值,指定多少秒后刷新当前页面。
设置响应头Refresh为 3;url=/Day05/index.jsp
,指定多少秒后刷新到哪个页面。
可以用来实现注册后“注册成功,3秒后跳转到主页”的功能。
另外,在HTML可以利用<meta http-equiv= "" content="">
标签模拟响应头的功能。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Refresh" content="3;url=/Day04/index.jsp">
</head>
<body>
恭喜您注册成功,3秒后回到主页.... <br>
</body>
</html>
利用response控制是否缓存资源
不缓存资源:
控制浏览器不要缓存(如验证码图片不缓存),设置expires为0或-1,设置Cache-Control为no-cache,Pragma为no-cache
package me.zipstream.response;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class NoCacheServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setIntHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("当前时间是: " + new Date().toLocaleString());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
缓存资源:
即使不明确指定浏览器也会缓存资源,这种缓存没有截至日期。当在地址栏重新输入地址时会用缓存,但是当刷新或重新开浏览器访问时会重新获得资源。
如果明确指定缓存时间,浏览器缓存时会有一个截至日期,在截至日期到期之前,当在地址栏重新输入地址或重新开浏览器访问时都会用缓存,而当刷新时会重新获得资源。
package me.zipstream.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CacheServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setDateHeader("Expires", System.currentTimeMillis() + 1000l*3600*24*30);
//注意这里时间的设置。后面不要都是int型的,至少有一个为long型。
InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
OutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len=in.read(buf)) != -1){
out.write(buf, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
利用response实现请求重定向
package me.zipstream.response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response.setStatus(302);
// response.setHeader("Location", "/Day04/index.jsp");
response.sendRedirect("/Day04/index.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
古老方法:
response.setStatus(302);
response.addHeader("Location","URL");
快捷方式:
response.sendRedirect("URL");
最后
以上就是酷炫犀牛为你收集整理的深入学习请求响应(一)---response的应用概述response的继承结构利用response向浏览器输出一段数据利用response实现下载利用response实现定时刷新页面利用response控制是否缓存资源利用response实现请求重定向的全部内容,希望文章能够帮你解决深入学习请求响应(一)---response的应用概述response的继承结构利用response向浏览器输出一段数据利用response实现下载利用response实现定时刷新页面利用response控制是否缓存资源利用response实现请求重定向所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复