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



          目录
          相关文章
          |
          存储 XML JSON
          JavaWeb-Servlet服务连接器(四)
          1.ServletContext Cookie与Session 1.Cookie 2.Session
          74 0
          |
          存储 Java 应用服务中间件
          JavaWeb-Servlet服务连接器(二)
          Request(获取请求信息)、1.获取请求行内容、2.解决乱码问题、3.获取请求头部分、4.获取请求体、5.其他功能
          78 0
          |
          XML 前端开发 Java
          关于服务连接器(Servlet)你了解多少?
          Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。 使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。 Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
          91 0
          关于服务连接器(Servlet)你了解多少?
          |
          6月前
          |
          缓存 安全 Java
          Java服务器端技术:Servlet与JSP的集成与扩展
          Java服务器端技术:Servlet与JSP的集成与扩展
          61 3
          |
          6月前
          |
          存储 缓存 前端开发
          Servlet与JSP在Java Web应用中的性能调优策略
          Servlet与JSP在Java Web应用中的性能调优策略
          58 1
          |
          6月前
          |
          存储 Java 关系型数据库
          基于Servlet和JSP的Java Web应用开发指南
          基于Servlet和JSP的Java Web应用开发指南
          142 0
          |
          6月前
          |
          前端开发 安全 Java
          在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
          在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
          41 0
          |
          8月前
          |
          自然语言处理 前端开发 Java
          Servlet与JSP:Java Web开发的基石技术详解
          【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
          140 12
          |
          8月前
          |
          存储 Java 关系型数据库
          基于Servlet和JSP的Java Web应用开发指南
          【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
          159 10
          |
          8月前
          |
          缓存 小程序 前端开发
          Java服务器端技术探秘:Servlet与JSP的核心原理
          【6月更文挑战第23天】Java Web开发中的Servlet和JSP详解:Servlet是服务器端的Java小程序,处理HTTP请求并响应。生命周期含初始化、服务和销毁。创建Servlet示例代码展示了`doGet()`方法的覆盖。JSP则侧重视图,动态HTML生成,通过JSP脚本元素、声明和表达式嵌入Java代码。Servlet常作为控制器,JSP处理视图,遵循MVC模式。优化策略涉及缓存、分页和安全措施。这些技术是Java服务器端开发的基础。
          90 9