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


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

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

15.2返回数据时注意事项和细节
处理中文乱码问题-方案1(推荐)

response.setContentType("text/html;charset=utf-8");
处理中文乱码问题-方案2

//1.设置服务器使用utf-8
response.setCharacterEncoding("utf-8");
//2.设置浏览器端是utf-8,而且类型是text/html
response.setHeader("Content-Type","text/html;charset=utf-8");
15.3请求重定向
15.3.1请求重定向介绍
请求重定向:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向

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

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


动态获取到application context(即Tomcat中配置的web应用项目名称)

//动态获取到application context
String contextPath = getServletContext().getContextPath();
//contextPath => /servlet_demo
response.sendRedirect(contextPath+"/downServletNew");
15.3.4练习

- 编写一个MyPayServlet,能够接收到提交的数据
- 编写一个简单的html页面pay.html
- 如果支付金额大于100,则重定向到payok.html,否则重定向到原来的pay.ok
WebUtils:
package com.li.servlet.response.homework;
//编写一个String-->int的方法,并处理可能的异常
public class WebUtils {
public static int parseString(String str) {
int num = 0;
try {
//try-catch快捷键:ctrl+alt+t
num = Integer.parseInt(str);
} catch (NumberFormatException e) {
//这个异常不会throw给Tomcat
System.out.println("输入的str格式不正确...");
//如果输入的格式不正确,num的值还是0
}
return num;
}
}
MyPayServlet:
package com.li.servlet.response.homework;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(urlPatterns = {"/myPayServlet"})
public class MyPayServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到金额
String moneyCount = request.getParameter("moneyCount");
//转成int
//处理一下异常
int i = WebUtils.parseString(moneyCount);
if (i > 100) {
//重定向到payok.html
response.sendRedirect(getServletContext().getContextPath() + "/payok.html");
} else {
//重定向到pay.html
response.sendRedirect(getServletContext().getContextPath() + "/pay.html");
}
}
}
pay.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>支付页面</title>
</head>
<body>
<h1>支付页面</h1>
<!--注意:这里action="/servlet_demo/myPayServlet"的第一个斜杠/
被浏览器解析成浏览器当前地址栏的主机-->
<!--什么时候加上web应用名主要看 / 是服务器还是浏览器来解析
如果是浏览器来解析就要加上web工程名
如果是服务器来解析,就不需要加(例如请求转发)-->
<form action="/servlet_demo/myPayServlet" method="post">
用户编号:<input type="text" name="userId"/><br/>
支付金额:<input type="text" name="moneyCount"/><br/>
<input type="submit" value="点击支付">
</form>
</body>
</html>
payok.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>支付成功</title>
</head>
<body>
<h1>恭喜你,支付成功~</h1>
</body>
</html>
.gif)
day17-Servlet06的更多相关文章
- python_way day17 html-day3 前端插件(fontawsome,easyui,bootstrap,jqueryui,bxslider,jquerylazyload),web框架
python_way day17 一.模板插件 图标的插件 fontawsome: 后台管理: easyui jqueryui 很多网站都会用: bootstrap :引入jQuery:(2.x,1. ...
- python_way day17 jQuery表单验证,事件绑定,插件,文本框架,正则表达式
python_way day17 1.jQuery表单验证 dom事件绑定 jquery事件绑定 $.each return值的判断 jquery扩展方法 2.前段插件 3.jDango文本框架 4. ...
- Spark Streaming揭秘 Day17 资源动态分配
Spark Streaming揭秘 Day17 资源动态分配 今天,让我们研究一下一个在Spark中非常重要的特性:资源动态分配. 为什么要动态分配?于Spark不断运行,对资源也有不小的消耗,在默认 ...
- Python之路,Day17 - 分分钟做个BBS论坛
Python之路,Day17 - 分分钟做个BBS论坛 本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同 ...
- Python—day17时间模块、系统模块、递推遍历、序列化
一.time'''时间戳(timestamp):time.time()延迟线程的运行:time.sleep(secs)(指定时间戳下的)当前时区时间:time.localtime([secs])(指定 ...
- 11.6 正睿停课训练 Day17
目录 2018.11.6 正睿停课训练 Day17 A chinese(思路 计数) B physics(单调队列/剪枝 DP) C chemistry(期望 DP) 考试代码 A B C 2018. ...
- day17 十七、时间模块
一.时间模块 import time print(time) # <module 'time' (built-in)> import time print('暂停开始') secs = t ...
- day16 Hbase day17
这个HBase学习了第二遍也不是太透彻PS:启动Hbase之前先启动Zookeeper.HDFS.yarn 1. hbase简介(是基于HDFS.相当于是一个缓存层) 1.1. 什么是hbase(列式 ...
- day17 正则表达式 re模块和hashlib模块
今日内容 1. re&正则表达式(*****) 注:不要将自定义文件命名为re import re re.findall(正则表达式,被匹配的字符串) 拿着正则表达式去字符串中找,返回一个列表 ...
- day17(JDBC入门&jdbcUtils工具介绍)
day17 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中url ...
随机推荐
- Android Module配置C++支持
AndroidStudio提供了创建项目时选择C++支持的模板,但是新建Module的时候并没有C++模板, 要如何配置Module的C++支持呢? 虽然Module没有提供C++模板,但是我们可以手 ...
- 使用man手册查看内核函数
1.为避免man的一些功能缺失,先装好manpages-dev sudo apt-get install manpages-dev 2.安装mandocs的依赖包xmlto sudo apt-get ...
- [第二章 web进阶]XSS闯关-1
定义:跨站脚本(Cross_Site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其他用户浏览网 ...
- React版/Vue版都齐了,开源一套【特别】的后台管理系统...
本项目主要基于Elux+Antd构建,包含React版本和Vue版本,旨在提供给大家一个简单基础.开箱即用的后台管理系统通用模版,主要包含运行环境.脚手架.代码风格.基本Layout.状态管理.路由管 ...
- Ros入门21讲
一.ROS是什么? ROS=通信机制+开发工具+应用功能+生态系统 目的:提高机器人研发中的软件复用率. 1.ROS中的通信机制 松耦合分布式通信: 注意:什么是耦合.紧耦合.松耦合? 1.1 耦合 ...
- 《!--suppress ALL --> 在Android XML 文件中的用途是什么?
<!--suppress ALL --> 在Android XML 文件中的用途是什么? 警告一次又一次地出现在谷歌地图的 XML 文件中,但是当我使用时,所有警告都被禁用.那么压制所有评 ...
- 一文带你体验MRS HetuEngine如何实现跨源跨域分析
摘要: HetuEngine作为MRS服务中交互式分析&多源统一SQL引擎,亲自全程体验其如何实现多数据源的跨源跨域分析能力. 本文分享自华为云社区<MRS HetuEngine体验跨源 ...
- Alertmanager集成Dingtalk/Wechat/Email报警
grafana对报警的支持真的很弱,而Prometheus提供的报警系统就强大很多 Prometheus将数据采集和报警分成了两个模块.报警规则配置在Prometheus Servers上,然后发送报 ...
- 面试突击87:说一下 Spring 事务传播机制?
Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的. 既然是"事务传播",所以事务的数量应该在两个或两个以上,Spring 事务传播机制的 ...
- 我的Vue之旅、05 导航栏、登录、注册 (Mobile)
第一期 · 使用 Vue 3.1 + TypeScript + Router + Tailwind.css 构建手机底部导航栏.仿B站的登录.注册页面. 代码仓库 alicepolice/Vue-05 ...