http的request对象和response对象

概念:Hyper Text Transfer Protocol 超文本传输协议

特点:

  • 1.基于TCP/IP的高级协议

  • 2.默认端口号8080

  • 3.基于请求/相应模型:一次请求对应一次相应

  • 4.无状态的:每次请求直接相互独立

    请求消息的数据格式

  • 1.请求行

    请求方式  请求url  请求协议/版本
    请求方式:
        GET
            1.请求参数在请求行中,在url后面
            2.请求url的长度有限
            3.不太安全
        POST
            1.请求参数在请求体中
            2.请求url长度没有限制
            3.相对安全
  • 2.请求头

  • 3.请求空行

  • 4.请求体

请求消息数据格式

Request

  • request和response对象的原理

    1.request和response对象由服务器创建,我蛮来使用他们
    2.request对象是来获取请求消息,response是来设置相应消息
request获取请求消息
  • 获取请求行的数据

    GET /test/demo1?name=zhangsan HTTP/1.1
    1.获取请求方式 GET
    String getMethod()
    2.获取虚拟目录 /test
    String getContextPath()
    3.获取Servlet路径 /demo1
    String getServletPath()
    4.获取get方式请求传参 name=zhangsan 
    String getQueryString()
    5.获取URI /test/demo1
    String getRequestURI()
    6.获取协议及版本 HTTP/1.1
    String getProtocol()
    7.获取客户机的ip地址
    String getRemoteAddr()
  • 获取请求头的方法

    String getHeader(String name)通过获取请求头的名称,获取请求头的值 
  • 获取请求体数据

    只有post请求方式,才有请求体,在请求体中封装了post请求的请求参数

    步骤:

    • 1.获取流对象

      BufferedReader getReader():获取字符输入流
      ServletInputStream getInputStream():获取字节输入流
    • 2.再从流对象中拿数据

  • 获取请求参数的通用方法

    1.String getParameter(String name):根据参数名称获取参数值
    2.String[] getParameterValues(String name):根据参数名称获取参数值的数组
    3.Enumeration<String>  getParameterNames():获取所有请参数的名称
    4.Map<String,String[]> getParameterMap():获取参数的所有Map集合
    1
    2
    //设置流的编码 防止乱码
    req.setCharacterEncoding("utf-8");

请求转发:一种在服务器内部资源的跳转方式

  • 步骤:

    1.通过request对象获取请求转发器对象:RequestDispatcher  getRequestDispatcher(String path)
    2.使用RequestDispatcher对象进行转发,forword(ServletRequest req,ServletRespnonse resp)
  • 特点:

    1.浏览器地址栏不发生变化
    2.只能转发到当前服务器内部资源中
    3.转发是一次请求

数据共享

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用域请求转发的多个资源中共享数据

方法:
1.void setAttribute(String name,Object obj):存储数据
2.Object  getAttribute(String name):通过键获取值
3.void removeAttribute(String name):通过键来移除键值对

获取ServletContext对象

ServletContext getServletContext()

响应消息

相应消息的数据格式

  • 1.相应行

    组成:协议/版本 相应状态码  状态码描述
    状态码分类:
            1.1XX:服务器接收客户端消息,但没有接收完全,等待一段时间后,发送1XX
            2.2XX:成功。200
            3.3XX:重定向  302(重定向) 304(访问缓存)
            4.4XX:客户端错误 404(请求路径没有对应的资源) 405(请求方式没有对应的doXXX方法)
            5.5XX:服务器端错误 500(服务器内部出现异常)
  • 2.相应头

    1.格式:头名称:值
    2.常见的相应头:
            1.Content-Type:服务器告诉客户端本次相应体数据格式以及编码格式
            2.Content-disposition:服务器告诉客户端以什么格式打开相应数据
  • 3.相应空行

  • 4.相应体

Response对象

功能:设置相应消息
  • 设置相应行

    设置状态码:setStatus(int sc)
  • 设置相应头

    setHeader(String name,string value)
  • 设置相应体

    使用步骤:
    1.获取输出流
    字符输出流:PrintWriter getWriter()
    字节输出流:ServletOutputStream  getOutputStream()
    2.使用输出流,将数据输出到客户端浏览器
完成重定向

代码实现

1
2
//简单的重定向的方法
resp.sendRedirect("/ReaponseDemo_war_exploded/responseDemo2");

特点:

  • 1.地址栏发生变化
  • 2.重定向可以访问其他站点
  • 3.重定向是两次请求,不能使用request对象来共享数据

路径的写法

  • 相对路径:不可以确定唯一资源

    规则:.开头  找到当前资源和目标资源之间的相对位置关系
  • 据对路径:可以确定唯一资源

服务器输出字符数据到浏览器

步骤:
1.获取字符输出流
2.输出数据

防止乱码

1
2
3
4
resp.setHeader("content-type","text/html;charset=utf-8");

//简单的形式设计编码
resp.setContentType("text/html;charset=utf-8");

ServletContext对象

1.概念:代表整个web应用,可以和程序的容器(服务器)通信

2.获取:

  • 1.通过request对象获取
    request.getServletContext()
  • 2.通过HttpServlet获取
    this.getServletContext

3.功能:

  • 1.获取MIME类型

    MIME类型:在互联网通信过程中定义的一种文件类型
    格式:大类型/小类型   text/html
    获取:
    `String getMineType(String file)`
    代码示例
    
    1
    2
    3
    4
    5
    6
    7
    8
    ServletContext context = this.getServletContext();

    //定义文件名称
    String filename = "a.jpg";

    //获取MIME类型
    String MimeType = context.getMimeType(filename);
    System.out.println(MimeType);
  • 2.域对象:共享数据

    1.setAttribute(String name,String value)
    2.getAttribute(String name)
    3.removeAttribute(String name)
    ServletContext对象范围:所有用户请求的数据
  • 3.获取文件的真实服务器路径

    1.方法:String getRealPath()

案例

文件下载需求:

  • 1.页面显示超链接
  • 2.点击链接后弹出下载提示框
  • 3.完成图片文件下载
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //获取请求参数 文件名称
    String filename = req.getParameter("filename");

    //使用字节输入流,加载文件进内存
    ServletContext context = this.getServletContext();
    String realPath = context.getRealPath("/img/"+filename);//获取文件真实路径
    FileInputStream fis = new FileInputStream(realPath);

    //设置Response的相应头
    String mineType = context.getMimeType(filename);//获取文件的MIME类型
    resp.setHeader("content-type",mineType);
    resp.setHeader("content-disposition","attachment;filename="+filename);

    //将输入流的数据写出到输出流
    ServletOutputStream sos = resp.getOutputStream();
    byte[] bytes = new byte[1024];
    int len = 0;
    while ((len=fis.read(bytes))!=-1){
    sos.write(bytes,0,len);
    }
    fis.close();
    }

评论