javaweb——请求和响应

文章目录

  • 一、请求和响应的概述
  • 二、HttpServletResponse对象
    • 2.1发送状态码的相关方法
    • 2.2发送响应消息头相关的方法:
  • 三、HttpServletResponse应用
    • 3.1解决中文输出的乱码问题
    • 3.2实现网页的定时跳转并刷新:
  • 四、HttpServletResponse对象
    • 4.1获取请求行信息的相关方法
    • RequestDispatcher接口


一、请求和响应的概述

什么请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程。
什么响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。

二、HttpServletResponse对象

在Servlet API中,定义了一个HttpServletResponse接口,它继承子ServletResponse接口,专门针对用来封装Http响应消息。HttpServletResponse是一个接口,它的父接口是ServletResponse,在开发中通常使用HttpServletResponse响应信息分为三部分:响应行、响应头、响应正文(响应体)。

2.1发送状态码的相关方法

当Servlet向客户端回送响应消息时,需要在响应消息中设置状态码。为此,在HttpServletResponse接口中,定义了俩个发送状态码的方法:
1.setStatus(intstatus)方法
2.sendError(intsc)方法

2.2发送响应消息头相关的方法:

  1. 响应消息头的数据格式:key-value的形式,有的是一个key,一个value,有的是一个key,多个value
    1.设置响应消息头:
    * 一个key ,一个value
    setHeader(String key,String value);
    比如:setHeader(“aa”,“AA”);
    如果:setHeader(“aa”,“AA”);
    setHeader(“aa”,“BB”);
    最终的结果:aa这个头对应的值就是BB
    * 一个key,对应多个value
    addHeader(String key,String value);
    比如:addHeader(“aa”,“AA”);
    addHeader(“aa”,“BB”);
    最终的结果:aa这个头对应的值AA和BB

    比如:
    与响应消息头相关的方法 在用户名和密码输入错误的情况下,重新回到登录页面让用户重新数据
    1.设置状态码 response.setStatus(302);
    2.设置响应头,完成重定向到登录页面 response.setHeader(“Location”,"/chapter04/login.html");
    2.设置响应数据的长度:setContentLength(int src)方法
    3.设置处理乱码的方法:
    * setCharacterEncoding(String a);参数就是一个 码表格式,比如:“utf-8” * setContentType(String a);参数代表响应数据的类型和码表格式,比如: “text/html;charset=utf-8”

三、HttpServletResponse应用

3.1解决中文输出的乱码问题

  1. 第一种方式:字节流向浏览器输出中文,会不会乱码:可能会出现乱码。
    出现乱码的原因:服务器端的编码格式和浏览器的编码格式不一致引起的。
    比如:
    1.处理字节流的中文乱码问题
    String data=“中国”;
    ServletOutputStream out = response.getOutputStream();
    2.处理乱码:服务器端的编码和浏览器端的编码保持一致。
    3.让浏览器端的编码也是utf-8
    response.setHeader(“Content-Type”, “text/html;charset=utf-8”);
    4.让服务器端的中文编码格式是utf-8
    out.write(data.getBytes(“utf-8”)); 处理字节流的中文乱码问题两种方式: 第一种:response.setHeader(“Content-Type”,
    “text/html;charset=utf-8”);
    第二章:response.setContentType(“text/html;charset=utf-8”);
    第二种方式:字符流向浏览器输出中文,会不会乱码:肯定乱码。
    乱码的形式:?? ,这个问号就表示中文的编码格式是采用iso-8859-1编码的,这种编码格式不支持中文。
    处理原则:让浏览器和服务器的编码保持一致:
    1.处理字符流的中文乱码问题
    2.处理服务器的编码,让这个编码支持中文
    response.setCharacterEncoding(“utf-8”);
    3.处理器浏览器端的编码:
    response.setHeader(“Content-Type”, “text/html;charset=utf-8”);
    String data=“中国”;
    4.获取字符流
    PrintWriter pw = response.getWriter();
    pw.print(data);
    处理字符流的中文乱码问题:
    第一种方式:response.setCharacterEncoding(“utf-8”);
    response.setHeader(“Content-Type”, “text/html;charset=utf-8”);
    第二种方式:response.setContentType(“text/html;charset=utf-8”);

    结论:在处理字符流和字节流输出中文乱码时,都采用

response.setContentType(“text/html;charset=utf-8”);
注意:常见的编码格式:
GB GB18030 GB2312 都是支持中文的编码格式,当然支持其它一些字符。
UTF-8 :万能码表格式,支持所有的字符。
ISO-8859-1:不支持中文。

3.2实现网页的定时跳转并刷新:

  1. 定时跳转:从一个注册页面跳转到登录页面,输入之前注册的用户名和密码。 代码如下:
    1.定时跳转:需要用到Refresh响应头 response.setHeader(“Refresh”, “5;URL=/chapter04/login.html”);
    定时刷新: 在当前页面的地址不发生变化,但是当前页面自己定时刷新,页面数据会发生变化。

    	代码如下:
    
 response.setHeader("Refresh","5");
			 response.getWriter().print(new Date());

四、HttpServletResponse对象

4.1获取请求行信息的相关方法

  1. 1.获取请求行消息的相关方法:
    常用的请求行方法:
    1.获取请求提交的方式: getMethod();
    2.获取请求的协议: getProtocol();
    3.获取项目名称:getContextPath();
    4.获取servlet路径:getServletPath();
    5.获取请求路径: getRequsetURI(),getRequestURL();
    uri对应的值:/项目名称/servlet路径
    url对应的值:http://localhost:8080/uri

    2.获取请求消息头相关的方法
    1. 根据消息头,获取值: String value = getHeader(消息头的名称);
    2. 获取所有的消息头: Enumeration er = getHeaderNames();
    根据Referer请求消息头,做一个防盗链的案例:
    难点:怎么判断这个发起的下载请求是从别的网站上发起的?
    解决方法:根据Referer请求头对应的值,是否包含了服务器的名称
    如果包含,就说明是从本网站下载的,否则就不是。
    3.获取请求参数相关的方法:
    1.根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值);
    2.根据name属性值,获取用户选择的值:String[] vaules = getParameterValues(name属性对应的值);
    3.没有参数,获取所有值:Map map = getParameterMap();

    4.解决请求参数的中文乱码问题:
    中文乱码处理分两种情况:
    第一种情况:处理get方式提交的中文乱码
    使用的String的构造方法解决中文乱码:new String(字节数组,编码格式);
    代码:String newvalue = new String(value.getBytes(“ISO8859-1”),“utf-8”);
    第二种情况:处理post请求的中文乱码问题:
    post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码是ISO8859-1,不支持中文
    处理方法:把request缓冲区的编码给设置成支持中文的码表格式。
    代码:request.setCharacterEncoding(“utf-8”);
    5.通过Requset对象传递数据
    什么域对象:在一定的范围内,可以存值和取值。
    request域对象:在一次请求中,可以存值和取值。
    存值: setAttribute(String key,Object obj);
    取值:Object obj = getAttribute(String key); 移除: removeAttribute(String key);

RequestDispatcher接口

  1. 在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向
    方法来实现,也可以RequestDispatcher转发对象的forward方法来实现。
    得到转发对象:RequestDispatcher forwardObj =
    request.getRequestDispatcher(“另一个资源的路径”); 常用方法:
    1.实现请求转发:forwardObj.forward(request,response);
    2.实现请求包含:forwardObj.include(request,response);
    1. 请求转发:
    特点:发送了一次请求,响应一次,和request域对象配合使用,可以实现值的传递。
    转发路径:转发动作是在服务器内部实现的,所以转发路径不要携带项目名称。
    请求重定向:
    特点:发送了两次请求,响应了两次,不能和request域对象配合使用。
    重定向路径:重定向动作在浏览器端执行的,所以路径需要携带项目名称。
    2.请求包含:
    请求包含:在服务器内部完成的,路径不需要携带项目名称。

你可能感兴趣的:(服务器,运维)