day17-Servlet06

十念  金牌会员 | 2022-11-13 21:15:22 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 888|帖子 888|积分 2664

Servlet06

15.HttpServletResponse

15.1HttpServletResponse介绍


  • 每次HTTP请求,Tomcat都会创建一个HttpServletResponse对象传递给Servlet程序使用
  • HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,如果需要设置返回给客户端的信息,通过HttpServletResponse对象来设置即可。


  • HttpServletResponse类图


  • 向客户端返回数据方法:

  • 字节流getOutputStreamWriter(); 常用于下载(处理二进制数据)
  • 字符流getWriter(); 常用于回传字符串
  • 两个流同时只能使用一个,使用了字节流,就不能使用字符流,反之亦然,否则就会报错。
例子
15.2返回数据时注意事项和细节


  • 处理中文乱码问题-方案1(推荐)
    1. response.setContentType("text/html;charset=utf-8");
    复制代码
  • 处理中文乱码问题-方案2
    1. //1.设置服务器使用utf-8
    2. response.setCharacterEncoding("utf-8");
    3. //2.设置浏览器端是utf-8,而且类型是text/html
    4. response.setHeader("Content-Type","text/html;charset=utf-8");
    复制代码
15.3请求重定向

15.3.1请求重定向介绍

请求重定向:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向
请求重定向的地址栏会改变
15.3.2请求重定向应用实例

需求:演示请求重定向的使用,当访问DownServlet下载文件,重定向到DownServletNew下载文件
DownServlet:
  1. package com.li.servlet.response;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.annotation.*;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. @WebServlet(urlPatterns = {"/downServlet"})
  8. public class DownServlet extends HttpServlet {
  9.     @Override
  10.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11.         doPost(request, response);
  12.     }
  13.     @Override
  14.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15.         //完成自己的业务..
  16.         //请求重定向->downServletNew
  17.         //1.sendRedirect本质 会返回一个 302的状态码 和一个Location:/servlet_demo/downServletNew
  18.         //2.因此302和location是浏览器解析的,而不是服务器
  19.         //3.浏览器会将/servlet_demo/downServletNew 解析成
  20.         //  =>http://localhost:8080/servlet_demo/downServletNew
  21.         //浏览器不能知道服务器上的web应用名称,只能将当前所在页面的主机名和端口拼上来,
  22.         // 所以重定向需要把/web应用名也写上来
  23.         //而请求转发是在服务器端的,可以获取到web应用名称,所以请求转发直接写/资源名即可
  24.         response.sendRedirect("/servlet_demo/downServletNew");
  25.     }
  26. }
复制代码
DownServletNew:
  1. package com.li.servlet.response;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.annotation.*;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. @WebServlet(urlPatterns = {"/downServletNew"})
  8. public class DownServletNew extends HttpServlet {
  9.     @Override
  10.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11.         doPost(request, response);
  12.     }
  13.     @Override
  14.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15.         System.out.println("DownServletNew-doPost()被调用..");
  16.         response.setContentType("application/x-tar;charset=utf-8");
  17.         PrintWriter writer = response.getWriter();
  18.         writer.print("ok");
  19.         writer.flush();
  20.         writer.close();
  21.     }
  22. }
复制代码
down.html:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>下载文件</title>
  6. </head>
  7. <body>
  8. <h1>下载文件</h1>
  9. <a target="_blank" href="http://localhost:8080/servlet_demo/downServlet">天龙八部</a>
  10. </body>
  11. </html>
复制代码
15.3.3请求重定向注意事项和细节


  • 最佳应用场景:网站迁移,比如原域名是www.abc.com,迁移到www.xyz.com,但是百度抓取的还是原网址
  • 浏览器地址会发生变化,本质上是两次http请求
  • 不能共享Request域中的数据,本质是两次http请求,因此会产生两个httpServletRequest对象
  • 不能重定向到/WEB-INF下的资源
  • 可以重定向到Web工程之外的资源,比如到 www.baidu.com
  • 重定向有两种方式,推荐使用第一种

  • 动态获取到application context(即Tomcat中配置的web应用项目名称)
    1. //动态获取到application context
    2. String contextPath = getServletContext().getContextPath();
    3. //contextPath =>  /servlet_demo
    4. response.sendRedirect(contextPath+"/downServletNew");
    复制代码
15.3.4练习

  

  • 编写一个MyPayServlet,能够接收到提交的数据
  • 编写一个简单的html页面pay.html
  • 如果支付金额大于100,则重定向到payok.html,否则重定向到原来的pay.ok
WebUtils:
  1. package com.li.servlet.response.homework;
  2. //编写一个String-->int的方法,并处理可能的异常
  3. public class WebUtils {
  4.     public static int parseString(String str) {
  5.         int num = 0;
  6.         try {
  7.             //try-catch快捷键:ctrl+alt+t
  8.             num = Integer.parseInt(str);
  9.         } catch (NumberFormatException e) {
  10.             //这个异常不会throw给Tomcat
  11.             System.out.println("输入的str格式不正确...");
  12.             //如果输入的格式不正确,num的值还是0
  13.         }
  14.         return num;
  15.     }
  16. }
复制代码
MyPayServlet:
  1. package com.li.servlet.response.homework;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.annotation.*;
  5. import java.io.IOException;
  6. @WebServlet(urlPatterns = {"/myPayServlet"})
  7. public class MyPayServlet extends HttpServlet {
  8.     @Override
  9.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  10.         doPost(request, response);
  11.     }
  12.     @Override
  13.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14.         //得到金额
  15.         String moneyCount = request.getParameter("moneyCount");
  16.         //转成int
  17.         //处理一下异常
  18.         int i = WebUtils.parseString(moneyCount);
  19.         if (i > 100) {
  20.             //重定向到payok.html
  21.             response.sendRedirect(getServletContext().getContextPath() + "/payok.html");
  22.         } else {
  23.             //重定向到pay.html
  24.             response.sendRedirect(getServletContext().getContextPath() + "/pay.html");
  25.         }
  26.     }
  27. }
复制代码
pay.html:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>支付页面</title>
  6. </head>
  7. <body>
  8. <h1>支付页面</h1>
  9. <form action="/servlet_demo/myPayServlet" method="post">
  10.     用户编号:<input type="text" name="userId"/><br/>
  11.     支付金额:<input type="text" name="moneyCount"/><br/>
  12.     <input type="submit" value="点击支付">
  13. </form>
  14. </body>
  15. </html>
复制代码
payok.html:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>支付成功</title>
  6. </head>
  7. <body>
  8. <h1>恭喜你,支付成功~</h1>
  9. </body>
  10. </html>
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表