JavaWeb-Servlet服务连接器(三)

简介: Response响应对象、1.基本功能、2.重定向、3.路径、4.服务器输出数据到浏览器

 



Response响应对象

1.基本功能

设置响应行:格式为 HTTP/1.1 200 OK,可以使用 setStatus(int sc) 方法设置状态码为 200 表示成功。

方法名称 描述
setStatus(int sc) 设置状态码为给定的整数值。

设置响应头:使用 setHeader(String name, String value) 方法来设置响应头信息,比如 setHeader("Content-Type", "text/html") 设置响应内容类型为 HTML。

方法名称 描述
setHeader(String name, String value) 设置指定名称的请求头为给定的值。

设置响应体:获取输出流:

方法名称 描述
getWriter() 获取字符输出流,用于向客户端发送字符数据。
getOutputStream() 获取字节输出流,用于向客户端发送字节数据。

使用输出流将数据输出到客户端浏览器。


2.重定向

重定向通过response对象的sendRedirect("目标地址")进行跳转

方法名称 描述
sendRedirect(String location) 通过指定目标地址进行重定向跳转。设置响应的 Location 头,使客户端重新向指定的目标地址发送请求。
package com.company;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@WebServlet("/Demo9")
public class Demo9 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
//            等待三秒后跳转回到主页面
            TimeUnit.SECONDS.sleep(3);
        }catch (Exception e){
            e.printStackTrace();
        }
//        本站资源进行跳转
//        resp.sendRedirect("/com_alphamilk_war_exploded/Demo8");
//        外部站点资源进行跳转
        resp.sendRedirect("https://blog.csdn.net/dogxixi?spm=1000.2115.3001.5343");
    }
}

image.gif

image.gif编辑

访问后就自动跳转到CSDN中·image.gif编辑

response对象重定向的特点(sendRedirect)

    1. 地址栏会发生变化
    2. 重定向可以访问其他站点(服务器)的资源
    3. 重定向是二次请求,但是重定向后不能使用request的共享变量

    request对象的请求转发特定(Forward)

      1. 地址栏不会发生变化
      2. 转发只能访问当前服务器下的资源
      3. 转发是一次请求

      3.路径

      相对路径(通过访问当前的资源和目标的资源之间的相对位置关系):

        1.     同级目录:. /资源名称
        2.     后退一个目录: . . /资源名称

        特点:无法确定唯一的资源

        绝对路径:根据请求对象分类

          • 如果是客户端浏览器访问的就需要加上虚拟目录
          • 如果是服务器自行使用则不需要加虚拟目录

          特点:通过绝对路径可以确定唯一的资源.


          注意:但是在重定向时,为了保证跳转的准确性,需要将虚拟目录包含在重定向的路径中。例如:resp.sendRedirect("/context_path/Demo8")


          问题引出:

                 由于为了重定向的准确性,一般会在重定向的路径中加入虚拟目录,但是如果虚拟目录经常发生变化,就需要相应的所有有关的路径全部修改,会造成大量的时间浪费,所以引入了动态路径的概念。具体原理是通过request对象的方法的获取路径getContextPath+/资源名。


          案例代码:

          package com.company;
          import javax.servlet.ServletException;
          import javax.servlet.annotation.WebServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          import java.util.concurrent.TimeUnit;
          @WebServlet("/Demo9")
          public class Demo9 extends HttpServlet{
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  try {
          //            等待三秒后跳转回到主页面
                      TimeUnit.SECONDS.sleep(3);
                  }catch (Exception e){
                      e.printStackTrace();
                  }
          //        本站资源进行跳转(动态路径)
                  resp.sendRedirect(req.getContextPath()+"/Demo5");
              }
          }

          image.gif


           

          4.服务器输出数据到浏览器

          通过流输出内容,具体方法如下:

          方法名称 描述
          getWriter() 获取字符输出流,用于向客户端发送字符数据。
          getOutputStream() 获取字节输出流,用于向客户端发送字节数据。

          1.通过字符流实现数据发送

          package com.company;
          import javax.servlet.ServletException;
          import javax.servlet.annotation.WebServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          import java.io.PrintWriter;
          @WebServlet("/Demo10")
          public class writer extends HttpServlet{
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          //        创建字符流输出对象
                  PrintWriter writer = resp.getWriter();
          //        输出数据
                  writer.write("<h1>Hello World</h1>" +
                          "<h1>你好 世界</h1>");
                  writer.close();
              }
          //    统一方法操作
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  this.doGet(req, resp);
              }
          }

          image.gif

          image.gif编辑

          可以发现用了字符流输出中文的时候出现了乱码,原因在于:使用编码的字符集不一致(字符集使用的是GBK 而流使用的是ISO - 8859-1),只需要告诉浏览器服务器用的编码方式,浏览器就会自动进行相应编码转换

          修改后代码

          package com.company;
          import javax.servlet.ServletException;
          import javax.servlet.annotation.WebServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          import java.io.PrintWriter;
          @WebServlet("/Demo10")
          public class writer extends HttpServlet{
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          //        告诉浏览器服务器使用编码方式是utf-8
                  resp.setHeader("content-type","text/html;charset=utf-8");
          //        创建字符流输出对象
                  PrintWriter writer = resp.getWriter();
          //        输出数据
                  writer.write("<h1>Hello World</h1>" +
                          "<h1>你好 世界</h1>");
                  writer.close();
              }
          //    统一方法操作
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  this.doGet(req, resp);
              }
          }

          image.gif

          image.gif编辑

           

          2.字节流发送数据

          原理同上

          案例:

          package com.company;
          import javax.servlet.ServletException;
          import javax.servlet.ServletOutputStream;
          import javax.servlet.annotation.WebServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          import java.nio.charset.StandardCharsets;
          @WebServlet("/Demo11")
          public class writeByte extends HttpServlet{
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          //        告诉浏览器编码格式为utf-8
                  resp.setHeader("content-type","text/html;charset=utf-8");
          //        创建字节流
                  ServletOutputStream sos = resp.getOutputStream();
          //        使用字节流输出
                  sos.write("你好啊".getBytes(StandardCharsets.UTF_8));
              }
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  this.doPost(req, resp);
              }
          }

          image.gif



          目录
          相关文章
          |
          9月前
          |
          存储 XML JSON
          JavaWeb-Servlet服务连接器(四)
          1.ServletContext Cookie与Session 1.Cookie 2.Session
          44 0
          |
          9月前
          |
          存储 Java 应用服务中间件
          JavaWeb-Servlet服务连接器(二)
          Request(获取请求信息)、1.获取请求行内容、2.解决乱码问题、3.获取请求头部分、4.获取请求体、5.其他功能
          41 0
          |
          XML 前端开发 Java
          关于服务连接器(Servlet)你了解多少?
          Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。 使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。 Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
          56 0
          关于服务连接器(Servlet)你了解多少?
          |
          JavaScript 前端开发 Java
          SAP ABAP SICF服务和Java Servlet的比较
          SAP ABAP SICF服务和Java Servlet的比较
          130 0
          SAP ABAP SICF服务和Java Servlet的比较
          |
          JavaScript 前端开发 Java
          ABAP SICF服务和Java Servlet的比较
          ABAP SICF服务和Java Servlet的比较
          |
          JavaScript 前端开发 Java
          SAP ABAP SICF服务和Java Servlet的比较
          SAP ABAP SICF服务和Java Servlet的比较
          154 0
          SAP ABAP SICF服务和Java Servlet的比较
          |
          2天前
          |
          Java
          学院管理系统【JSP+Servlet+JavaBean】(Java课设)
          学院管理系统【JSP+Servlet+JavaBean】(Java课设)
          20 3
          学院管理系统【JSP+Servlet+JavaBean】(Java课设)
          |
          2天前
          |
          Java
          人事管理系统【JSP+Servlet+JavaBean】(Java课设)
          人事管理系统【JSP+Servlet+JavaBean】(Java课设)
          21 0
          |
          2天前
          |
          Java
          排课系统【JSP+Servlet+JavaBean】(Java课设)
          排课系统【JSP+Servlet+JavaBean】(Java课设)
          16 5
          |
          2天前
          |
          Java
          仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
          仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
          15 1