• Response设置响应数据,重定向,目录问题,字节流,字符流


    响应数据分为3部分:

    1:响应行  HTTP/1.1 200  OK

       void  setStatus(int sc)  设置响应状态码

    2响应头  Content-type :text/html

    void setHearder(String name,String value) 设置响应键值对

    3:响应体 

    PrintWriter getWriter() 获取字符输出流

    ServletOutputStream  getOUtputStream() :获取字节输出流

    Response完成重定向

    重定向(Redirect):一种资源跳转方式

    实现方式:

    resp.setStatus(302)

    resp.setHeader("location","资源的虚拟路径")

    或者

    resp.sendRedirect("要跳转的虚拟路径");

    重定向特点:

    浏览器地址栏路径发生变化

    可以重定向到任意位置的资源(服务器内部,外部均可) 因为浏览器发了两次请求

    两次请求,不能再多个资源使用request共享数据

    1. package Response;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/res1")
    9. public class Response1 extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. System.out.println("res1......");
    13. //第一种方法
    14. // resp.setStatus(302);
    15. // resp.setHeader("location","res2");
    16. //快捷方法
    17. // resp.sendRedirect("Servlet-demo1/res2");
    18. String contextPath = req.getContextPath();
    19. resp.sendRedirect(contextPath+"/res2");//这样获取路径更完美
    20. }
    21. }
    1. package Response;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/res2")
    9. public class Response2 extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. System.out.println("res2......");
    13. }
    14. }

    路径问题

    明确路径的使用

    浏览器使用:需要加虚拟目录(项目访问路径)

    服务端使用:不需要加虚拟路径

    比如:

      加虚拟路径

       加虚拟路径

    reg.getRequestDispatcher("路径" ) 不加虚拟路径

    resp.sendRedirect("路径")   加虚拟路径

    Response响应字符数据

    使用:通过Response对象获取字符输入流

    PrintWriter writer= resp.getWriter();

    写数据

    writer.write("数据");

    如需要写html代码,或者中文需要设置流的规则 

    resp.setContentType("text/html;charset=utf-8");
    1. package Response;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.io.PrintWriter;
    9. @WebServlet("/res3")
    10. public class Response3 extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. resp.setContentType("text/html;charset=utf-8");//设置流编码规则
    14. PrintWriter writer = resp.getWriter();
    15. writer.write("牛马");
    16. writer.write("aaa");
    17. writer.write("
      "
      );
    18. writer.write("11");
    19. }
    20. }

     

    流不需要关闭,随着响应结束,Response对象销毁,由服务器关闭

    字节流的使用

    通过Response对象获取字符输出流

    ServletOutputStream  os=resp.getOutputStream();

    写数据

    OutputStream.write(字节数据); 

    1. package Response;
    2. import org.apache.commons.io.IOUtils;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.ServletOutputStream;
    5. import javax.servlet.annotation.WebServlet;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import java.io.*;
    10. @WebServlet("/res4")
    11. public class Response4 extends HttpServlet {
    12. @Override
    13. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    14. //获取文件,字节输入流
    15. FileInputStream fs = new FileInputStream("F:\\1.png");
    16. //获取Response,输出流
    17. ServletOutputStream os = resp.getOutputStream();
    18. //进行拷贝
    19. // byte[] bytes = new byte[1024];
    20. // int len=0;
    21. // while ((len=fs.read(bytes))!=-1){
    22. // os.write(bytes,0,len);
    23. // }
    24. // fs.close();//关闭流
    25. //这里我们直击导坐标,调用方法 ,流对拷
    26. IOUtils.copy(fs,os);
    27. }
    28. }

    io工具包

    1. <dependency>
    2. <groupId>commons-iogroupId>
    3. <artifactId>commons-ioartifactId>
    4. <version>2.6version>
    5. dependency>

  • 相关阅读:
    WCH USB转多串口芯片相关型号
    Mybatis入门&Mapper开发&注解开发
    StarRocks操作笔记
    大厂秋招真题【DP/贪心】字节跳动20230923秋招T1-小红的 01 串【欧弟算法】全网最全大厂秋招题解
    Spring的重试机制-SpringRetry
    Java入门篇 之 逻辑控制(练习题篇)
    LQ0203 排它平方数【枚举+进制】
    Android Activity 重载 onConfigurationCangerd之屏幕方向改变
    LLaMA:开放和高效的基础语言模型
    TouchGFX之二进制翻译
  • 原文地址:https://blog.csdn.net/m0_64365315/article/details/126744891