2018年10月26日16:10:47 于易动
客户端浏览器和服务器:
请求的时候: request对象: HttpServletRequest
响应的时候: response对象: HttpServletResponse
service(HttpServletRequest request, HttpServletResponse response )
这两个参数对象,经常成对存在
response对象:
1: 生命周期:
诞生: 服务器端接收到请求的时候,创建。
销毁: service方法执行完毕,也就是响应结束, 对象销毁。
生命周期很短暂,唉~
2: 获得: 直接使用: tomcat服务器已经创建好。
3: 作用:
a: 设置响应正文:
b: 设置响应头信息:
c: 发送状态码:
d: 重定向:
b: 设置响应头信息: 告知浏览器, 浏览器可以根据响应头信息进行解析文档:
response.setHeader("headName","headValue"); 默认头和头的值 都是String类型。
setDateHeader(java.lang.String name, long date) 头是String类型。 头值Date类型。
getHeader(java.lang.String name) 返回的String类型。
getHeaderNames() 获得所有头的名称:
getHeaders(java.lang.String name) 获得一个头对应多个值的情况。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 演示response对象的: 设置响应头信息:
* response.setHeader();
*/
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setHeader("content-type", "text/html;charset=gbk");
//常见的: 和页面刷新相关:
// response.setHeader("refresh", "5");// 设置页面5S刷新一次。
// response.setHeader("refresh", "5;http://www.baidu.com");//5S后 刷新到百度。
//设置页面的不缓存:
response.setHeader("expires", "-1"); //页面立刻过期:
response.setHeader("pragma", "no-cache");// 这是http1.0不缓存:
response.setHeader("cache-control", "no-cache");
}
}
a: 设置响应正文:
方式一: 使用字符流:
response.getWriter(); PrintWriter;
响应的内容:
(1)可以是字符串类型。
(2)可以是html标签。 浏览器能够自动解析。
方式二: 使用字节流:
response.getOutputStream(); OutputStream:
注意: response对象 使用字符流或者是字节流,只能选择其中的一个。 不能同时使用。
如果同时使用,就会触发一个异常: IllegalStateException
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* response 对象:设置响应正文:
*
* 方式一: 使用字符流:
* 方式二: 使用字节流:
*/
public class BServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//使用字符的方式: 设置响应内容:
PrintWriter out = response.getWriter();
out.println("俊哥");
out.println("<br/>");
out.println("<font color='red' size='7'>你很帅</font>");
out.close();
//使用字节流 设置响应体:
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("俊哥 ,你真的很帅~ oh year".getBytes());
outputStream.close();
}
}
c: 设置响应状态码, 和其他的API方法:
sendError(int sc) 发送一个错误的状态码;
sendError(int sc,String message); 发送错误的状态码,并且带有描述性的信息。
setStatus(int code); 给客户端浏览器发送一个状态码。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 设置状态码 和其他的API方法:
*/
public class CServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//发送一个错误的状态码:
// response.sendError(404,"你访问的资源,存在的,当时不给看");
response.setStatus(500);
}
}
D:重定向: (重点)面试问题
访问的是bservlet,地址栏会发生变化
特点:
(1)两次请求 两次响应。
(2)地址栏会发生变化。 最终显示的是重定向后的地址。
(3)重定向是客户端的行为:
(4)重定向的地址可以是外部的资源。
(5)负责重定向的servlet 不要向客户端浏览器发送数据, 可能会引发异常。
使用代码实现:
实现方式一:
response.setStatus(302);
response.setHeader("location","URL");
负责重定向的servlet:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 负责重定向的servlet:
*/
public class DServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("这是负责重定向的Dservlet。 ");
//完成重定向:
// response.setStatus(302);
// response.setHeader("location", "/javaEE-06/servlet/EServlet");// EServlet: 属于本系统内资源。
// response.setHeader("location", "http://www.baidu.com");// 定向到站外的资源。
//使用便捷方法:
response.sendRedirect("EServlet"); // / : 相对于主机: http://locahost:8080
// 没有使用/开头: 相对于当前文件的存在位置: 建议使用/开头。
}
}
被重定向的servlet:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 被重定向过来的servlet。
*/
public class EServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("我是被重定向过来的EServlet");
}
}
方式二: 完成重定向的便捷方式:
response.sendRedirect("location ");
使用 /开头 : 其中的location是相对路径,相对于主机。
没有使用/ 开头:是相对于当前文件的位置