1,response对象【重点】
1.1:简述&继承关系&生命周期
编辑
编辑
1.2:响应行
编辑
/** * 状态码 */ public void run1(){ HttpServletResponse response = getResponse(); response.setStatus(404);//若不设置状态码,由服务器自动设置。正常默认状态码:200 }
编辑
编辑
建议该方法仅发送4xx和5xx状态码
public void run2() throws IOException { getResponse().sendError(404,"找不到该页面,<font color='red'>呵呵</font>"); }
编辑
1.3:响应头
编辑
/** * 响应头 * @throws IOException */ public void run3() throws IOException { HttpServletResponse response = getResponse(); //k1=v1 k2=v2 k1=v3 //注意:若需要新值覆盖旧值,使用setHeader。 若需要保存所有值,使用addHeader //setHeader 设置/覆盖 响应头 /*response.setHeader("k1","v1"); response.setHeader("k2","v2"); response.setHeader("k1","v3");//覆盖了k1=v1*/ //addHeader 追加 响应头 response.addHeader("k1","v1"); response.addHeader("k2","v2"); response.addHeader("k1","v3"); }
编辑
编辑
//ajax:设置响应体:response.setCharacterEncoding //response.setCharacterEncoding("utf-8");//设置响应体编码码表为utf-8 //非ajax传统操作:response.setContentType //mime类型;charset=码表 //response.setContentType("text/html;charset=utf-8");
1.4:响应体
服务器向响应体写出的内容,都会被浏览器接收。
若需要传递大量信息,把大量信息写在响应体。
字符流:
PrintWriter writer = response对象.getWriter();
writer.write("HTML代码+CSS代码+JS代码");
/** * 响应体 */ public void run4() throws IOException { //字符流 PrintWriter writer = getResponse().getWriter(); writer.write("<h1 align='center' id='d'>字符流</h1><script>document.getElementById('d').innerHTML='字符流呵呵'</script>"); }
编辑
字节流:
ServletOutputStream outputStream = getResponse().getOutputStream();
outputStream.write(字节数组);
/** * 响应体 */ public void run5() throws IOException { ServletOutputStream outputStream = getResponse().getOutputStream(); outputStream.write("<h1 align='center' id='d'>字节流</h1><script>document.getElementById('d').innerHTML='字节流呵呵'</script>".getBytes("utf-8")); }
小结:
- 何时使用字节流、何时使用字符流?
文本、代码输出展示:字符流
图片、声音等文件输出:字节流(文件下载)
2. 流是否需要刷新和关闭?
一般情况下,无需对响应中的流进行刷新和关闭操作。
关闭是由tomcat来进行控制。
字符流中,若字符数据超过8K,需要人工调用flush()进行刷新。
注意事项:一个响应体不能同时被两种类型的流进行写出操作。(一山难容二虎)
/** * 响应体被两个流操作的报错 */ public void run6() throws IOException { getResponse().getWriter(); getResponse().getOutputStream();//java.lang.IllegalStateException: getWriter() has already been called for this response }
JSP:特殊Servlet。 展示HTML+CSS+JS使用 字符流。
注意:JSP因为已经调用了字符流,根据servlet的response对象特性,不能再调用字节流了。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <% ServletOutputStream outputStream = response.getOutputStream(); outputStream.write("haha".getBytes("utf-8")); %> </head> <body> </body> </html>
报错:java.lang.IllegalStateException: getOutputStream() has already been called for this response
2,案例2:读取WEB工程的资源文件
2.1:需求说明及分析
WEB项目,java代码读取资源文件(html/css/js/jsp/servlet/jpg/avi...)。
资源文件的有效路径。
目标:
通过该案例,熟练掌握getRealPath方法
编辑
要求分别使用JavaSE和JavaEE的技术来获取4个文件
2.2:SE实现
public class Demo1 { public static void main(String[] args) throws IOException { //javaSE //相对路径出发目录 是当前源码目录的根目录。 相对路径,最终会被拼接为绝对路径来定位资源文件 getFile("src/1.txt");//idea执行时,会将该相对路径,拼接为绝对路径 D:/IDEA2020/class12/10web2/day07_2/src/1.txt getFile("web/2.txt"); getFile("web/WEB-INF/3.txt"); getFile("4.txt"); } /** *根据路径读取文件的第一行内容 */ public static void getFile(String path) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(new File(path))); System.out.println(reader.readLine()); reader.close(); } }
小结:
JavaSE写法:
相对路径的出发目录为:源码的根目录
在定位文件时,会将相对路径 变为带盘符的绝对路径来使用。
2.3:EE实现【阶段重点】
//原因:SE和EE代码的执行位置不同的,相对路径出发目录也不同 //SE代码执行位置是:当前项目的Out执行。 相对路径出发目录:当前源码目录的根目录 //EE代码执行位置时:tomcat的bin目录执行。 相对路径出发目录:Tomcat的bin目录 //结论:1、SE和EE最终都需要绝对路径 // 2、SE的相对路径出发目录是当前源码根目录,所以可以正常使用 // EE的相对路径的出发目录是tomcat的bin目录,不能使用。 String absolutePath = new File("./").getAbsolutePath(); System.out.println(absolutePath);//D:\temp\apache-tomcat-7.0.52\bin\
编辑
我们使用ServletContext的getRealPath(String path);来获取文件的真实路径path路径需要写成webapps中的路径,项目名缩写为/
getRealPath("/"); 获取当前根目录在硬盘的绝对位置
public void run1() throws IOException { //尝试使用SE方式进行WEB项目资源获取 /*getFile("src/1.txt");//java.io.FileNotFoundException getFile("web/2.txt");//java.io.FileNotFoundException getFile("web/WEB-INF/3.txt");//java.io.FileNotFoundException getFile("4.txt");//java.io.FileNotFoundException*/ //原因:SE和EE代码的执行位置不同的,相对路径出发目录也不同 //SE代码执行位置是:当前项目的Out执行。 相对路径出发目录:当前源码目录的根目录 //EE代码执行位置时:tomcat的bin目录执行。 相对路径出发目录:Tomcat的bin目录 //结论:1、SE和EE最终都需要绝对路径 // 2、SE的相对路径出发目录是当前源码根目录,所以可以正常使用 // EE的相对路径的出发目录是tomcat的bin目录,不能使用。 String absolutePath = new File("./").getAbsolutePath(); System.out.println(absolutePath);//D:\temp\apache-tomcat-7.0.52\bin\ //获取发布目录根目录在硬盘的绝对位置 String path = getServletContext().getRealPath("/"); getFile(path+"/WEB-INF/classes/1.txt"); getFile(path+"/2.txt"); getFile(path+"/WEB-INF/3.txt"); }