目录
1,response对象【重点】
1.1:简述&继承关系&生命周期
1.2:响应行
1.3:响应头
1.4:响应体
2,案例2:读取WEB工程的资源文件
2.1:需求说明及分析
2.2:SE实现
2.3:EE实现【阶段重点】
作者简介:大家好呀!我是爱吃豆的土豆
个人主页:【爱吃豆的土豆的博客_CSDN博客-Web知识,spring框架,vue领域博主】
博主信息:人必有所执,方能有所成!希望大家多多支持一起进步呀!
若有帮助,还请【关注➕点赞➕收藏】,不行的话我再努力努力呀!
⚡版权声明:本文由【爱吃豆的土豆的博客】原创、在CSDN首发、需要转载请联系博主。
/**
* 状态码
*/
public void run1(){
HttpServletResponse response = getResponse();
response.setStatus(404);//若不设置状态码,由服务器自动设置。正常默认状态码:200
}
建议该方法仅发送4xx和5xx状态码
public void run2() throws IOException {
getResponse().sendError(404,"找不到该页面,呵呵");
}
/**
* 响应头
* @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");
服务器向响应体写出的内容,都会被浏览器接收。
若需要传递大量信息,把大量信息写在响应体。
字符流:
PrintWriter writer = response对象.getWriter();
writer.write("HTML代码+CSS代码+JS代码");
/**
* 响应体
*/
public void run4() throws IOException {
//字符流
PrintWriter writer = getResponse().getWriter();
writer.write("字符流
");
}
字节流:
ServletOutputStream outputStream = getResponse().getOutputStream();
outputStream.write(字节数组);
/**
* 响应体
*/
public void run5() throws IOException {
ServletOutputStream outputStream = getResponse().getOutputStream();
outputStream.write("字节流
".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" %>
Title
<%
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("haha".getBytes("utf-8"));
%>
报错:java.lang.IllegalStateException: getOutputStream() has already been called for this response
WEB项目,java代码读取资源文件(html/css/js/jsp/servlet/jpg/avi...)。
资源文件的有效路径。
目标:
通过该案例,熟练掌握getRealPath方法
要求分别使用JavaSE和JavaEE的技术来获取4个文件
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写法:
相对路径的出发目录为:源码的根目录
在定位文件时,会将相对路径 变为带盘符的绝对路径来使用。
//原因: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");
}