HTTP响应消息 与 Response 响应

HTTP 响应概念

响应消息:服务端发送给客户端的数据

 数据格式:

  1.响应行

   (1).组成:协议/版本 响应状态码 状态码描述

   (2).响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态

    1.状态码都是3位数字

    2.分类:

     ①. 1xx:服务器接收客户端消息,但是没有接受完成,等待一段时间后,发送1xx多状态码

     ②. 2xx:成功。例如::200

     ③. 3xx:重定向。例如:302(重定向),304(访问缓存)

     ④. 4xx:客户端错误。例如:404(请求路径没有对应的资源),405(请求方式没有对应的doXxx方法)

     ⑤. 5xx:服务器端错误。例如500(服务器内部出现异常)

  2.响应头

   (1).格式:头名称 : 值

   (2).常见的响应头

Location: http://www.company.org/index.jsp   --重定向的地址,该响应头和302的状态码一起使用。
Server:apache tomcat  --服务器的类型
Content-Encoding: gzip   --服务器发送给浏览器的数据压缩类型
Content-Length: 80  --服务器发送给浏览器的数据长度
Content-Language: zh-cn   --服务器支持的语言
Content-Type: text/html; charset=GB2312  --服务器发送给浏览器的数据类型及内容编码
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT   --服务器资源的最后修改时间
Refresh: 1;url=http://www.company.org  --定时刷新
Content-Disposition: attachment; filename=aaa.zip  --告诉浏览器以下载方式打开资源(文件下载)
Set-Cookie:SS=Q0=5Lb_nQ; path=/search   --服务器发送给浏览器的cookie信息(会话管理时用到)
Connection: close/Keep-Alive   --服务器和浏览器的连接状态。close:关闭连接 keep-alive:保持连接

  3. 响应体:传输的数据

   发送给浏览器的内容

Response对象 响应

功能:设置响应消息

 1.设置响应行

  response.setStatus(int sc);  设置状态码

//设置状态码为302
response.setStatus(404);
//404 + 错误页面
response.sendError(404);
//简单的重定向方法
response.sendRedirect("/day01/responseDemo1");

 2.设置响应头

  setHeader(String name, String value);  

//重定向路径(注意项目名称)
response.setHeader("Location",req.getContextPath()+"/login.html");
//刷新  Refresh :刷新   间隔1秒  原理:浏览器认识refresh头,得到refresh头之后重新请求当前资源
response.setHeader("Refresh", "1");
//定时跳转      间隔3     URL = 网址
response.setHeader("Refresh", "3; url = http://www.baidu.com");

 3.设置响应体

  使用步骤:

  response.getWriter().write();  发送字符实体内容

  response.getOutputStream().write()  发送字节实体内容

//格式化日期
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
//获取当前日期
String format = simpleDateFormat.format(new Date());
//输出当前日期到浏览器
response.getWriter().write(format)

forward(转发) 和 redirect(重定向) 区别

 转发的特点:

  1.转发地址栏路径不变

  2.转发只能访问当前服务器下的资源

  3.转发是一次请求,可以使用requet对象来共享数据

 重定向的特点:

  1.地址栏发生变化

  2.重定向可以访问其他占点(服务器)的资源

  3.重定向是两次请求,不能使用request对象来共享数据

//设置以下载方式打开文件
File file = new File("E:/img/2.jpg");
response.setHeader("Content-Disposition", "attachment;filename="+file.getName());
FileInputStream in = new FileInputStream(file);
byte[] b = new byte[1024];
//把图片内容写出到浏览器
while( in.read(b)!=-1 ){
    response.getOutputStream().write(b);
}

ServletContext对象:

 1.概念:

  代表整个web应用,可以和程序的容器(服务器)来通讯

 2.获取:

 1.通过request对象获取

  request.getServletContext();

 2.通过HttpServlet获取

  this.getServletContext();

 3. 功能:

  ServletContext是一个域对象
  域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。

  案例:两个Servlet之间传递数据
   Servlet1
    name=eric
     方案1:response.sendRedirect("/Servlet2?name=eric")
   Servlet2
    String request.getParameter("name");
     方案2:保存到域对象中,从域对象获取
 方案1: 可以通过传递参数的形式,共享数据。局限:只能传递非中文字符串类型。
 方案2: 可以使用域对象共享数据,好处:可以共享任何类型的数据!!!

 保存数据: void setAttribute(java.lang.String name, java.lang.Object object)
 获取数据: java.lang.Object getAttribute(java.lang.String name)
 删除数据: void removeAttribute(java.lang.String name)

ServletContext域对象:作用范围在整个web应用中有效!!!

 所有域对象:(域范围从大到小)
  ServletContext 域对象
  HttpSession 域对象
  HttpServletRequet 域对象
  PageContext 域对象

代码实现:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/responsedome1")
public class ResponseDome1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("==<在域中写入内容>==");
        //获取ServletContext对象(域对象)   一个web项目只有一个ServletContext对象
        ServletContext servletContext = req.getServletContext();
        System.out.println(servletContext);
        //在不同的动态资源之间传递数据
        //保存数据
        servletContext.setAttribute("username", "Tom");
    }
}
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/responsedome2")
public class ResponseDome2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("==<从域中读取内容>==");
        ServletContext servletContext = req.getServletContext();
        //读取数据
        String username = (String)servletContext.getAttribute("username");
        System.out.println(username);
        resp.setHeader("Refresh", "3");
    }
}
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/responsedome3")
public class ResponseDome3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = req.getServletContext();
        //从域对象中移除内容
        servletContext.removeAttribute("username");
        System.out.println("==<从域移除内容>==");
    }
}

 

posted @ 2021-05-12 19:49  青草的骨头  阅读(828)  评论(0)    收藏  举报