当web服务器收到客户端的http请求时,会针对每一次请求,分别创建一个用于代码请求的request对象和代表响应的response对象。HttpServletResponse的主要功能是用于服务器对客户端的请求进行响应。
方法名 | 具体描述 |
---|---|
addHeader(String name,String value) | 添加指定的键值到响应头的信息中 |
containerHeader(String name) | 判断响应的头部是否被设置 |
encodeURL(String url) | 编码指定的URL |
sendError(int sc) | 使用指定状态码发送一个错误到客户 |
setHeader(String name, String value) | 设置指定响应头的 |
setStatus(int sc) | 给当前响应设置状态 |
setContentType(String ContentType) | 设置响应的 MIME 类型 |
getWriter() | 获取输出字符流 |
getOutputStream() | 获取输出的字节流 |
代码:
System.out.println("s01.....");
// 添加指定的键值到响应头信息中
resp.addHeader("aaa", "bbb");
// 判断响应的头部是否被设置
boolean containsHeader = resp.containsHeader("Date");
System.out.println(containsHeader);
System.out.println(resp.containsHeader("a"));
// 使用指定状态码发送一个错误到客户端
resp.sendError(404,"对不起,请XXX");
// 设置指定响应头的值
resp.setHeader("caa", "cbc");
// 给当前响应设置状态
resp.setStatus(200);
// 设置响应的 MIME 类型
// 查询响应文件对应的 MIME 类型,通过Tomcat服务器下conf下的web.xml可以查到
// 只要是浏览器不识别的MIME类型,会直接进行下载操作
resp.setContentType("text/html;charset=utf-8");
// 获取输出字符流 不能同时使用输出字符流和输出字节流
//resp.getWriter().write("helloHello
");
// 输出字节流
resp.getOutputStream().write("Hello
".getBytes());
}
代码
public class Servlet02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 定时刷新
//response.setHeader("refresh", "10");
// 定时跳转
response.setHeader("refresh", "3;http://www.baidu.com");
response.setHeader("refresh", "3;URL=index.html");
}
}
主要原因:前后端的字符集合不一致
(1).字符流乱码
- 将服务器的默认字符编码集设为GBK(只针对前端默认字符编码为GBK的情况)
- 设置前台字符编码集 response.setHeader(“content-type”, “text/html;charset=UTF-8”);
- 同时指定前台和后端的字符集(万能)response.setContentType(“text/html;charset=utf-8”);
(2).字节流乱码
前台编码GBK 指定后台编码 也为GBK
response.getOutputStream().write("
你好啊
".getBytes("GBK"));2.指定前台为UTF-8
response.setHeader("content-type", "text/html;charset=UTF-8");
3.同时指定前台和后端的字符集(万能)
response.setContentType("text/html;charset=utf-8");
方式一:通过img标签设置src路径即可(简单)
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("");
方式二:通过输入流输出流(复杂)
// 获取用户请求图片名称参数
String imageName = request.getParameter("imageName");
// 判断参数
if(imageName == null || "".equals(imageName)){
response.getWriter().write("请告诉我你要看啥图片");
return;
}
// 获取图片路径
String realPath = request.getServletContext().getRealPath("/WEB-INF/image/");
System.out.println(realPath);
System.out.println(realPath + imageName);
// 得到图片
//路径无法确定
//File file = new File("E:/Journey/Mage/class/06middle/code/servletResponse/WebContent/image/timg.jpg");
File file = new File(realPath + imageName);
// 判断是否存在并且是否是文件
if(file != null && file.isFile()){
// 判断用户访问的图片类型 timg.jpg
String imageType = imageName.split("\\.")[1];
if("jpg".equals(imageType) || "jpeg".equals(imageType)){
response.setContentType("image/jpeg;charset=utf-8");
}else if("png".equals(imageType)){
response.setContentType("image/png;charset=utf-8");
}else if("gif".equals(imageType)){
response.setContentType("image/gif;charset=utf-8");
}
// 指定响应类型
//response.setContentType("image/jpeg;charset=utf-8");
// 是文件
// 获取输入流
FileInputStream in = new FileInputStream(file);
// 获取字节输出流
ServletOutputStream out = response.getOutputStream();
// 响应图片
// 创建字节数组
byte[] car = new byte[1024];
int len = 0;
while((len = in.read(car)) != -1){
out.write(car, 0, len);
}
// 关闭
in.close();
out.close();
}else{
// 不是文件或者不存在
response.getWriter().write("请输入正确的图片名称");
return;
}
主要步骤(客户端发生了两次请求)
客户端 → as → 响应报文里带了Location: bs客户端 → bs → 客户端
public class AServlet01 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("A被请求去买水");
String money = request.getParameter("money");
request.setAttribute("小费", "1");
System.out.println("A重定向给了B");
// 发生重定向
response.sendRedirect("bs");
}
}
public class BServlet02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
System.out.println("B被请求买水");
String smallmoney = (String)request.getAttribute("小费");
System.out.println("得到小费" + smallmoney);
String money = request.getParameter("money");
if(money == null || "".equals(money)){
response.getWriter().write("不给钱,滚蛋");
return;
}
System.out.println("拿到" + money + "毛去买水");
PrintWriter out = response.getWriter();
out.write("这是一瓶超级好喝的自来水!");
out.close();
}
}
注意事项:
1.重定向是客户端行为
2.客户端发生了地址栏的改变
3.由于request的生命周期只在一次请求有效,而重定向是两次请求,因而无法共享request对象中的数据
相对路径
1.书写路径时,无论是哪类请求相对路径都是相对当前资源的路径
2.书写格式:直接从当前路径开始写,目录前不加任何符号;a.html html/b.html
3.相对路径在请求转发时可能会失效,在请求转发的情况下,因为地址栏不会发生改变,因此开发中不推荐使用相对路径
绝对路径
1.格式:以 http:// 开头,或者以 / 开头
2.浏览器中:“/”代表的是 http://主机|IP:端口
3.服务器中:“/”代表的是 http://主机|IP:端口/站点名
Cookie是一种浏览器技术。主要通过服务器的程序能将一些只需放在客户端的数据放在本地计算机。当用户访问服务器时,站点可以通过访问Cookie来获取客户端的部分信息,减少服务器的加载时间。
// 创建Cookie对象
Cookie cookie = new Cookie("A", "a");
// 响应给客户端
resp.addCookie(cookie);
// 获取客户端的Cookie数组
Cookie[] cookies = req.getCookies();
// 判断是否为空
if(cookies != null && cookies.length > 0){
// 遍历
for (Cookie cookie : cookies) {
// 键名称
String name = cookie.getName();
// 值
String value = cookie.getValue();
System.out.println("键:" + name + ",值:" + value);
}
}
public class Cookie03 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 键相同,则覆盖
// 创建cookie
Cookie cookie = new Cookie("uname","xiaoqiang");
// 设置maxAge过期时间 默认 -1 保存在浏览器缓存中 关闭浏览器失效
//cookie.setMaxAge(-1);
// 正整数设置过期时间7天,单位为s
//cookie.setMaxAge(7*24*60*60);
// 0 立即失效 cookie的销毁
cookie.setMaxAge(0);
// 发送
response.addCookie(cookie);
}
}