response实际上用的是HttpServletResponse,HttpServletResponse是ServletResponse的子类
我们在创建Servlet时需要重写service()方法,或者doGet()/doPost(), service()方法是由Servlet接口定义的,oGet()/doPost()方法是由HttpServlet接口定义的
这些方法都有两个参数:代表请求的request和代表响应response。
service方法中的 对象response的类型是ServletResponse,而doGet/doPost方法的 对象response的类型是HttpServletResponse
HttpServletResponse是ServletResponse的子接口.
(response多为set方法)
由tomcat创建respone和request这两个对象,传入Service()方法,response将哟输出的内容组装成响应,响应给浏览器。
因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体
抓包看看响应行,头,体
设置响应行的状态码:
setStatus(int sc)
相关方法:
set
setHeader(String name, String value)
setIntHeader(String name, int value)
setDateHeader(String name, long date)
使用set方式添加的数据,如果之前有同名的key存放了数据,会将其覆盖。
add
addHeader(String name, String value)
addIntHeader(String name, int value)
addDateHeader(String name, long date)
使用add方式添加的数据,如果之前有同名的key已经存放了数据,会再次添加一个数据进去。
重定向过程:
浏览器发送http请求——>服务器接受后发送302状态码进行响应及对应新的 location(请求地址)给浏览器——>浏览器发现是302响应,就会自动再发送一个新的http请求,请求url是接收到的新location (请求地址)——>服务器根据此请求寻找资源并发送给客户。
在这里新的请求地址 location可以重定向到任意URL,既然是浏览器重新发出了请求,那么之前的request就相当于结束了生命周期。最终在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。
重定向行为是浏览器做了至少两次的访问请求的。
重定向可以到另一个servlet(动态) 或 另一个页面(静态) 反正是一个新的路径资源
public class RedirecteServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 1.设置状态码为302 * 2.设置响应头location * * sendRedirect(url);重定向,完成了上述2个操作的封装 */ System.out.println("实现重定向的操作"); // response.setStatus(302); // //response.setHeader("location", "http://www.baidu.com"); // response.setHeader("location", "/web03/index.html"); response.sendRedirect("/web03/index.html"); } }
注意:
重定向的地址是给浏览器解析的,需要(会加上)加上 项目名
( 通过获取请求行获取包含项目名的路径 项目名: request.getContextPath() ) 例如: /javaweb01
应用场景: 浏览器显示的内容, 下载文件等.
response 可以将响应内容输出给浏览器,也可以输出一个html给浏览器。
response.getWriter() 获取响应体的字符输出流 (中文乱码的问题) 需要设置编码
response.getOutputStream() 获取响应体的字节输出流 响应一张图片/电影 获取要响应的资源:注意项目发布的路径 servetContext去获取项目完整路径 getRealpath()
字节流的响应
* 字节流响应 */ ServletOutputStream out = response.getOutputStream(); //1.获取文件的绝对路径 String realPath = getServletContext().getRealPath("/img3.jpg"); System.out.println(realPath); //2.获取文件流对象 FileInputStream fs = new FileInputStream(realPath); int len = 0; byte[] buf = new byte[1024]; while((len = fs.read(buf))!=-1){ //3.将文件以字节的方式响应给浏览器 out.write(buf, 0, len); } fs.close();
字节流和字符流都可以,通过这两个流都可以向浏览器响应数据.
getOutputStream 和 getWriter 相互排斥,调用了其中一个方法就不能调用另外一个方法。
tomcat会自动调用response输出流的 close方法和flush方法, 因此不需要我们手动关闭流。
字符流输出流 ,中文乱码的问题
因为编码和解码使用的码表不一致,汤姆猫默认码表iso-8859-1,浏览器默认码表GBK;
因此在输出响应体的过程(代码)中,对码表进行设置
将汤姆猫的编码设置为: response.setCharacterEncoding(“utf-8”) ;
将浏览器的解码方式设置为: response.setHeader(“content-type”, “text/html; charset=utf-8”) / html中的meta标签
直接指定response缓冲区编码方式和浏览器解析页面的解码方式,【设置媒体类型】 以上的结合
response.setContentType(" text/html; charset=utf-8 ");
text/html; charset=utf-8 指的是输出html 编码是utf-8
Json呢?
ServletContext:直译servlet的上下文对象,ServletContext就代表一个web应用
ServletContext内部维护着该web应用的一些相关信息,这些信息可以被工程中的所有的servlet所共享。
如何获取:
可以通过底层代码查看获取ServletConfig和ServletContext的获取过程和之间的联系
1、ServletContext context = config.getServletContext()
2、ServletContext context = this.getServletContext();
* servletContext:指代了当前项目的上下文对象。就代表了当前项目的一些配置信息 * 1.获取全局的初始化参数(了解) * 2.可以获取文件的绝对路径(常用) * servletContext.getRealPath("");获取的当前项目发布的绝对路径 * 这个方法是将当前项目的发布的绝对路径和方法的参数做了个字符串的拼接 * 3. 域对象 :servletContext可以作为一个存储数据库的对象。这个区域是有范围的。 * 如下特点: * setAttribute(key,value); * getAttribute(key); * removeAttribute(key); */ ServletContext servletContext = getServletContext(); //获取初始化信息 /*String username = servletContext.getInitParameter("username"); System.out.println(username); */ //获取绝对路径 String realPath = servletContext.getRealPath("/WEB-INF/classes/2.txt"); //配置信息 2.txt /properties 位置是是class FileInputStream fs = new FileInputStream(realPath); System.out.println(realPath); //作为域对象存值 servletContext.setAttribute("sex", "female");
原文:https://www.cnblogs.com/wenhui2015/p/11442783.html