您的位置:首页 > 理论基础 > 计算机网络

HttpServletResponse

2018-03-09 23:02 288 查看
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了
HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。响应行:
  void setStatus(int sc) 
响应头:
  void setHeader(String name, String value)
  void setIntHeader(String name, int  value) 
  void setDateHeader(String name, long date)
  void addHeader(String name, String value)
  void addIntHeader(String name, intvalue) 
  void addDateHeader(String name, long date) 
响应体:
  Servlet OutputStream getOutputStream() 
  PrintWriterget Writer() 



response对象(响应对象)
* 想要获取客户端的内容,使用request对象。对客户端做出响应使用response对象。
* 响应:
* 响应行
* 状态码:
void setStatus(int sc) 设置状态码
* 响应头key:value的形式,一个key对应一个value,一个key对应多个value)
* 设置头信息
void setHeader(String name, String value)  (一个key对应一个value)经常使用的
setHeader("aa","bb");
setHeader("aa","cc");
结果:aa:cc

void setIntHeader(String name, int value)  
void setDateHeader(String name, long date) 值是毫秒值(int 秒 long 毫秒)

void addHeader(String name, String value)  (一个key对应多个value
addHeader("aa","bb");
addHeader("aa","cc");
结果:aa:bb,cc

void addIntHeader(String name, int value)  
void addDateHeader(String name, long date)  

* 响应体
ServletOutputStream getOutputStream()   字节输出流
PrintWriter getWriter()   字符输出流
* 案例
response状态码和头信息应用

重定向(登陆页面)

通过response实现请求重定向。•请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向•302+Location ------ response.sendRedirect•案例:用户登陆时,用户名密码错误,重定向回登陆页面发送http头,控制浏览器定时刷新网页(refresh)•多学一招:HTML<meta>标签来控制浏览器行为 * 登陆页面重定向
* 状态码302 应头location
* 需求:登陆页面,用户名和密码的登陆页面,用户名和密码都是admin, 如果有一个不是,重定向到登陆页面,重新登陆。
// 设置302的状态码
response.setStatus(302);
// 设置地址
response.setHeader("location", "/day10/response/login.html");
// response对象提供了一个方法,可以完成重定向。
response.sendRedirect("/day10/response/login.html");

public void doGet(HttpServletRequestrequest, HttpServletResponseresponse)
  throws ServletException,IOException{
  // 获得请求中 用户名和密码
  Stringu sername = request.getParameter("username");
  // 字符串要为form表单对象name属性
  String password = request.getParameter("password");
  // 假设admin/admin就是用户名和密码
  if (username.equals("admin")&& password.equals("admin")){
  // 登陆成功
  response.setContentType("text/html;charset=utf-8");
  response.getWriter().println("登陆成功!");
  } else {
  // 用户名或者密码错误 ----重定向登陆页面
  // response.setStatus(302);
  // response.setHeader("Location","/day6/response/demo2.html");
  response.sendRedirect("/day6/response/demo2.html");
  }
}
多学一招
HTML中meta标签,可以产生Http响应头信息相同效果
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
http-equiv响应头信息name
content响应头信息value
例如:<meta http-equiv="refresh"content="5;url=/day6/hello.html" /> === 生成响应体中
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!--meta标签可以实现和HTTP响应头信息设置相同效果-->
<meta http-equiv="refresh"content="5;url=/day6/hello.html" />
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
  var i= 5;
  function init(){
  document.getElementById("mytimes").innerHTML= i;
  // 每隔1秒重复调用init方法 i--
  i--;
  // 通过window内置对象 setTimeOut完成每隔1秒重复调用
  window.setTimeout("init();",1000);
  }
</script>
</head>
<!--在页面加载完成后执行init方法 -->
<body onload="init();">
<h1>HTML中通过Meta实现<span id="mytimes"></span>秒后自动跳转hello.html</h1>
</body>
</html>
/**
 * 重定向到登陆页面
 * @author Administrator
 *
 */
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 先获取用户输入的内容(request对象)
* 判断姓名和密码是否都是admin,如果有一个不是,重定向到登陆页面,如果都是,就登陆成功。
*/
// 获取用户输入的内容
String username = request.getParameter("username"); // 程序入口
// 获取密码
String password = request.getParameter("password");
// 判断
if("admin".equals(username) && "admin".equals(password)){
// 登陆成功
// 重定向到登陆页面
// response.getWriter().write("success");
response.sendRedirect("/day10/response/refresh.html");
}else{
// 重定向到登陆页面
// 设置302的状态码
//response.setStatus(302);
// 设置地址
//response.setHeader("location", "/day10/response/login.html");

// 重定向
response.sendRedirect("/day10/response/login.html");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

页面定时刷新(页面读秒操作)
* 响应的头 refresh
<meta http-equiv="refresh" content="5;url=/day10/response/login.html">
定时刷新
response.setHeader("refresh","5;url=/day6/hello.html");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("页面会在5秒后自动跳转hello.html");
/**
 * 页面的定时跳转
 * @author Administrator
 *
 */
public class RefreshServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 读秒操作
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<h1>页面将在5秒后跳转</h1>");
// 通过refresh头完成页面刷新
response.setHeader("refresh", "5;url=/day10/response/login.html");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
禁用浏览器缓存(三个头信息)
* 应用:网银。页面的数据是发送变化的。
Cache-Control : no-cache
Expires: -1 值是日期类型(setDateHeader())
Pragma : no-cache 发送http头,控制浏览器禁止缓存当前文档内容•向页面输出时间,使用IE浏览器查看效果。设置三个Http头信息禁用浏览器缓存Cache-Control : no-cachePragma : no-cache Expires: Thu, 01 Dec 1994 16:00:00 GMT (非常特殊,转换特定日期格式才可以) 有些动态页面,每次访问内容都不同-----如果浏览器缓存页面,无法查看最近内容存放缓存文件夹:工具---internet选项 ---设置 ---查看文件 //设置response的三个头信息response.setHeader("Cache-Control","no-cache");response.setHeader("Pragma","no-cache");//Expires 要求格式日期格式//通过setDateHeader设置一个毫秒信息,自动转换日期格式response.setDateHeader("Expires",-1);response.getWriter().println("AAAAA"+ new Date().toLocaleString());/**
 * 禁用浏览器的缓存
 * @author Administrator
 *
 */
public class CEPServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* Cache-Control : no-cache
Expires: -1 值是日期类型(setDateHeader())
Pragma : no-cache
*/
// 设置三个头信息
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
response.setDateHeader("Expires", -1);
// 向页面输出当前的时间
// 获取当前时间
Date date = new Date();
// 修改格式 yyyy-MM-dd HH:mm:ss
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(date);
// 输出
response.getWriter().write(str);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
} 向页面输出中文(乱码问题)

字节流输出中文•乱码和浏览器的编码有关•设置浏览器默认打开的时候的编码集•获得字节数组的时候,传入一个编码集字符流输出中文•response的字符流的缓冲区是ISO-8859-1编码.•设置response缓冲区的编码.•设置浏览器的默认打开的时候字符集编码. 字节:ServletOutputStream getOutputStream()   字节输出流
* 字节的输出中文的乱码
* * 输出哈罗我的是否乱码呢?
* * 不一定乱码。
* * 解决办法
* * 设置浏览器打开文件时所采用的编码
* response.setHeader("Content-Type", "text/html;charset=UTF-8");
* * 获取字符串byte数组时编码和打开文件时编码一致。
* "哈罗我的".getBytes("UTF-8")

PrintWriter getWriter()   字符输出流

* 字符输出中文是否乱码呢?
* * 肯定乱码
* response缓冲区的编码,默认值ISO-8859-1
* * 设置response缓冲编码
* response.setCharacterEncoding("UTF-8");
*  * 设置浏览器打开文件所采用的编码
*   response.setHeader("Content-Type", "text/html;charset=UTF-8");
*  * 简写方式
*   response.setContentType("text/html;charset=UTF-8");  
 
* 总结:response对象输出中文,产生乱码。
* 字节
* 解决方案
* 设置浏览器打开文件时采用的编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
* 获取字符串的byte数组采用的编码
"哈罗我的".getBytes("UTF-8")
* 字符
* 解决方法
* 设置浏览器打开文件时采用的编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
* 设置response缓冲区的编码
response.setCharacterEncoding("UTF-8");
* 简写的方式(等于上面的两句)
* response.setContentType("text/html;charset=UTF-8");
字节:
设置浏览器默认打开时的编码
   response.setHeader("Content-Type","text/html;charset=UTF-8");
设置获取字节数组时的编码
   response.getOutputStream().write("中文".getBytes("UTF-8"));
字符:
设置response缓冲区的编码.
   response.setCharacterEncoding("UTF-8");
设置浏览器打开的时候采用的编码
   response.setHeader("Content-Type","text/html;charset=UTF-8");
/**
 * 输出中文的乱码的问题
 * @author Administrator
 *
 */
public class OutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
run2(response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
/**
* @param response
* @throws IOException
*/
public void run2(HttpServletResponse response) throws IOException{
// 设置response缓冲区的编码
//response.setCharacterEncoding("UTF-8");
// 设置浏览器打开文件所采用的编码
//response.setHeader("Content-Type", "text/html;charset=UTF-8");

// 简写的形式(等于上面两句)
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("哈罗卧得");
}
/**
* @throws IOException 
*/
public void run1(HttpServletResponse response) throws IOException{
// 设置浏览器打开文件时编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 获取字节输出流
OutputStream os = response.getOutputStream();
// 输出中文
os.write("哈罗我的".getBytes("UTF-8"));
}

}

字节流与字符流是互斥的•同一个页面只能使用一种流,不能同时向页面响应。使用字符流输入数字,有可能存在问题•想输入数字时,使用字符串”1”getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。 Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。调用close的时候,应该会调用flushBuffer 实现文件下载(初级的下载)

超链接下载•如果浏览器不能识别的格式,会弹出下载窗口。但是如果浏览器识别的话,会默认打开文件。后台程序下载•设置头信息response.setHeader(“Content-Disposition”,”attachment;filename=”+文件名称);•通过response.getOutputStream()向浏览器端输出 * 超链接,浏览器可以解析直接打开。
* 弹出下载窗口。
* 前提条件:先准备一个文件。
* 读取文件,读入到输入流中。
* 通过response读出到浏览器端。
* 设置头信息
* Content-Disposition attachment;filename=文件名称
* 以附件的形式打开。
文件下载
Test1:
String realpath= this.getServletContext().getRealPath(
"/download/11.jpg");
String filename = realpath.substring(realpath.lastIndexOf("\\")+ 1);
response.setHeader("content-disposition","attachment;filename="+filename);
FileInputStream fis= new FileInputStream(realpath);
int len = 0;
byte[] buf= new byte[1024];
OutputStream os= response.getOutputStream();
while((len=fis.read(buf))!=-1){
os.write(buf,0, len);
}
fis.close();
Test2:文件名中文
String realpath= this.getServletContext().getRealPath(
"/download/11.jpg");
String filename = realpath.substring(realpath.lastIndexOf("\\")+ 1);
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"utf-8"));
FileInputStream fis= new FileInputStream(realpath);
int len = 0;
byte[]buf= new byte[1024];
OutputStream os= response.getOutputStream();
while((len=fis.read(buf))!=-1){
os.write(buf,0, len);
}
fis.close();
Test3:字符流下载
String realpath= this.getServletContext().getRealPath(
"/download/11.jpg");
Stringfile name = realpath.substring(realpath.lastIndexOf("\\")+ 1);
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"utf-8"));
FileReader fis= new FileReader(realpath);
int len = 0;
char[] buf= new char[1024];
PrintWriter os= response.getWriter();
while((len=fis.read(buf))!=-1){
os.write(buf,0, len);
}
fis.close();
/**
 * 文件下载
 * @author Administrator
 *
 */
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 先获取到文件,读入输入流中
// 获取文件的绝对磁盘路径
String path = getServletContext().getRealPath("/img/外国美女.jpg");
// 包含文件的名称 c:\tomcat\webapps\day10\img\girl7.jpg
// 截取文件的名称 girl7.jpg
String filename = null;
// 获取最后一个\的位置
int index = path.lastIndexOf("\\");
if(index != -1){
filename = path.substring(index+1);
}
// 判断是什么浏览器 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
// Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
String agent = request.getHeader("User-Agent");
// System.out.println(agent);
if(agent.contains("MSIE")){
filename = URLEncoder.encode(filename,"UTF-8");
}
if(filename != null){
// 设置头信息
response.setHeader("Content-Disposition", "attachment;filename="+filename);
System.out.println(request.getRemoteAddr());
System.out.println(path);
InputStream in = new FileInputStream(path);
// 通过response读出到客户端
OutputStream os = response.getOutputStream();
// io的拷贝
byte [] b = new byte[1024];
int len = 0;
while((len =  in.read(b)) != -1){
os.write(b, 0, len);
}
in.close();
// os.close();服务器管理流
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

实现验证码(*****)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: