Servlet的response对象

目录

HTTP响应报文协议

reponse继承体系

reponse的方法

响应行

public void setStatus(int sc)

响应头

public void setHeader(String name, String value)

响应体

public java.io.PrintWriter getWriter() 

public ServletOutputStream getOutputStream() 

请求重定向

请求转发

public RequestDispatchergetRequestDispatcher(String path)

void forward(ServletRequest var1, ServletResponse var2)


HTTP响应报文协议

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>GET请求</h2>
    <form action="/reGetServlet" method="get">
        <input type="text" name="username"/> <br>
        <input type="text" name="password"/> <br>
        <input type="submit" value="提交"> <br>
    </form>
    <h2>POST请求</h2>
    <form action="/postServlet" method="post">
        <input type="text" name="username"/> <br>
        <input type="text" name="password"/> <br>
        <input type="submit" value="提交"> <br>
    </form>
</body>
</html>

servlet

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/reGetServlet")
public class ReGetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("response...");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

浏览器

  

响应行

响应头

响应体

总结

响应报文协议:服务器发给浏览器的数据遵守的规范

响应报文协议包括:

1.响应行

2.响应头

3.响应体

响应行:
1.响应状态码  200 404 500 405 302 304

2.响应协议/版本  http/1.1

响应头:
服务器时间

响应数据的字符个数

响应体:
服务器响应给浏览器的数据

如果浏览器请求的是静态资源页面,那么tomcat服务器就会响应给浏览器静态资源 

reponse继承体系

因为ServletReponse和HttpServletReponse都是接口,不能创建出对象,所以tomcat会在底层创建ReponseFacade门面类对象-->ServletReponse reponse=new ReponseFacade();

然后将响应对象传递给service的doGet() doPost()方法。 

reponse的方法

响应行

public void setStatus(int sc)

设置此响应的状态代码。此方法用于设置没有错误时的返回状态代码

响应头

public void setHeader(String name, String value)

 

用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在。

name头的名称
value头值,如果该值包含八位字节字符串,则应该根据 RFC 2047 (http://www.ietf.org/rfc/rfc2047.txt) 对其进行编码
See alsocontainsHeader, addHeader

响应体

对于响应体,是通过字符,字节输出流的方式往浏览器写 

public java.io.PrintWriter getWriter() 

获取字符输出流

返回可将字符文本发送到客户端的 PrintWriter 对象。

public ServletOutputStream getOutputStream() 

获取字节输出流

此方法的默认行为是返回对包装的响应对象调用 getOutputStream() 的结果。

请求重定向

重定向:属于服务器外部跳转的行为。当服务器某个资源没有处理业务的能力,会将新的服务器地址告知浏览器(location),并设置状态码304。浏览器会拿着新的地址再次向服务器发送请求

response.setStatus(302);

response.setHeader("location","资源B的访问路径")

特点
1. 服务器外部跳转

2.两次请求和响应

3.地址栏发生改变,记录最后一次的地址

4.不能共享request域对象

 测试

@WebServlet("/reponseDemo1")
public class reponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我无法处理");
       /* response.setStatus(302);//设置状态码
        response.setHeader("location","/reponseDemo2");//告知资源B的地址*/

        //简写
        response.sendRedirect("/reponseDemo2");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);B
    }
}
@WebServlet("/reponseDemo2")
public class reponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我可以处理");
        //响应数据给浏览器
        response.getWriter().println("success...");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

浏览器:最后的地址的responseDemo2

请求转发

使用

public RequestDispatchergetRequestDispatcher(String path)

path:要跳转服务器的路径

void forward(ServletRequest var1, ServletResponse var2)

特点
1. 服务器内部跳转

2.一次请求和响应

3.地址栏没有改变

4.共享request域对象

测试

@WebServlet("/responseDemo3")
public class responseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //请求转发
        System.out.println("responseDemo3...");

        //向request域对象存储数据
        request.setAttribute("msg","我无法解析");
        //获取转发器
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/responseDemo4");

        requestDispatcher.forward(request,response);//转发
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

@WebServlet("/responseDemo4")
public class responseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("responseDemo4...");
        //获取request域对象的数据
        Object msg = request.getAttribute("msg");
        System.out.println(msg);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

浏览器页面:地址没有变

响应字符数据中文乱码问题

 如果响应给浏览器的数据是中文,会出现中文乱码问题
 原因:tomcat传输中文使用默认的编码表ISO-8859-1对中文进行编码,然后将编码数据发送给浏览器  浏览器默认码表是utf-8,进行解码就会乱码
 解决:将响应的中文使用utf-8编码,同时告知浏览器使用utf-8解码

 处理响应乱码
        响应头 content-type 告知浏览器当前响应书数据的MINE类型,就是文件在tomcat的类型
        普通文本:text/plain
        超文本:text/html   text/html;charset=utf-8->告知浏览器响应的是超文本,并且使用编码表utf-8
        

 

@WebServlet("/responseDemo5")
public class responseDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       /* 如果响应给浏览器的数据是中文,会出现中文乱码问题
        原因:tomcat传输中文使用默认的编码表ISO-8859-1对中文进行编码,然后将编码数据发送给浏览器
        浏览器默认码表是utf-8,进行解码就会乱码
        解决:将响应的中文使用utf-8编码,同时告知浏览器使用utf-8解码
        */
        /*处理响应乱码
        响应头 content-type 告知浏览器当前响应书数据的MINE类型,就是文件在tomcat的类型
        普通文本:text/plain
        超文本:text/html   text/html;charset=utf-8->告知浏览器响应的是超文本,并且使用编码表utf-8
         */
        //response.setHeader("content-type","text/html;charset=utf-8");

        //简写
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("你好");



    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

 

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落落落sss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值