JAVA基础之HttpServletResponse响应

JAVA基础之HttpServletResponse响应

用户在客户端输入网址(虚拟路径)时,开始发送一个HTTP请求(请求行、请求头、请求体)至服务器。服务器内的Tomcat引擎会解析请求的地址,去找XML文件,然后根据虚拟路径找Servlet的真实路径,真实的Servlet会将请求的信息封装成request(请求)对象,然后再创建一个response(响应)对象,(此时的response内是空的)同时创建servlet对象,并调用service方法(或doGet和doPost方法)。这样就是把两个对象传给了服务器内的某个servlet的service方法,通过这个方法,我们可以获得request的所有的信息,并且向response内设置信息。response.getwriter().write()将内容写到response的缓冲区,这样service方法结束了,方法返回后,tomcat引擎会将从该response缓冲区中获取的设置信息封装成一个HTTP响应(响应行、响应头、响应体),发送给客户端。客户端解析响应回来的东西继而进行显示。

我们可以通过设置修改响应的信息进行相应的重定向(用户访问的网页不存在并跳转到其他网页上)、修改响应文本(需要修改浏览器和服务器两边的编码,并且还得处理兼容问题)。

一、概述:

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大

二、运行流程:

img

三、内容:

响应行、响应头、响应体;

四、通过response 设置响应行:

设置响应行的状态码:setStatus( int sc)

五、通过response 设置响应头:

setHeader(String name,String value) 设置

public class RefreshServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置定时刷新的头response.setHeader("refresh","5;url=https://www.baidu.com");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">window.onload=function(){//获取span元素var second=document.getElementById("second");//定义秒数var time =5;//设置定时器var timer=setInterval(function(){second.innerHTML=time;time--;if(time < 0){clearInterval(timer);location.href="https://www.baidu.com";}},1000);}</script>
</head>
<body>恭喜您,注册成功!<span id="second" style="color:red">5</span>秒后跳转,如没跳转,请点击<a href="https://www.baidu.com">这里</a>
</body>
</html>

1、重定向:(请求服务器两次,地址栏变化)

①、状态码:302;

②、响应头:location 代表重定向地址;

public class Servlet01 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*// 设置响应状态码response.setStatus(302);//设置响应头中的Locationresponse.setHeader("Location","/WEB0/Servlet02");*///重定向response.sendRedirect("/WEB0/Servlet02");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
public class Servlet02 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().write("Servlet02");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

六、通过response 设置响应体:

1、响应体设置文本:

PrintWritergetWriter()

获得字符流,通过字符流的write(Strings)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览 器端。

关于设置中文的乱码问题

原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(Stringcharset)``设置response的编码,

但我们发现客户端还是不能正常显示文字。

原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以手动修改浏览器的编码是UTF-8。

我们还可以在代码中指定浏览器解析页面的编码方式,通过response的setContentType(Stringtype)方法指定页面解析时的编码是UTF-8。

response.setContentType(“text/html;charset=UTF-8”);

上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含 setCharacterEncoding的功能,所以在实际开发中只要编写 **response.setContentType(“text/html;charset=UTF-8”),**就可以解决页面输出中文乱码问题。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body><a href="/WEB0/DownloadServlet?file=乱码.png">乱码.png</a><a href="/WEB0/DownloadServlet?file=a.txt">a.txt</a><a href="/WEB0/DownloadServlet?file=a.zip">a.zip</a>
</body>
</html>
package com.oracle;import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import sun.misc.BASE64Encoder;public class DownloadServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//服务器获取文件名(文件名是中文的话,获取的时候就成了乱码了)String filename = request.getParameter("file");//??.png//get请求中---解决文件名中文乱码问题filename =new String(filename.getBytes("ISO-8859-1"),"UTF-8");//乱码.png//获取User-Agent获取客户端浏览器到底是哪个浏览器    String agent=request.getHeader("User-Agent");String filenameEncoder="";if (agent.contains("MSIE")) {// IE浏览器filenameEncoder= URLEncoder.encode(filename, "utf-8");filenameEncoder= filenameEncoder.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filenameEncoder= "=?utf-8?B?"+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它浏览器filenameEncoder= URLEncoder.encode(filename, "utf-8");                }//告知浏览器文件的类型(响应体)response.setContentType(getServletContext().getMimeType(filename));//告知浏览器以附件的方式提供下载功能 而不是解析response.setHeader("Content-Disposition","attachment;filename="+filenameEncoder);//服务器获取后开始进行复制的程序:获取字节输出流ServletOutputStream sos = response.getOutputStream();//获取数据源的绝对路径String realpath = getServletContext().getRealPath("download/"+filename);//获取字节输入流FileInputStream fis =new FileInputStream(realpath);//开始复制byte[] bytes=new byte[1024];int len=0;while((len=fis.read(bytes))!=-1){sos.write(bytes, 0, len);}//释放资源fis.close();}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

2、response细节点:

①、response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭,

②、getWriter和getOutputStream不能同时调用

③、重定向语句一般作为终结代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android imageview 设置网络图片,ImageView加载网络图片

android网络加载图片框架Android-Universal-Image-Loader功能非常强大&#xff0c;其开源地址https://github.com/nostra13/Android-Universal-Image-Loader&#xff0c;讲解非常地详细&#xff0c;今天我要贴下工作中用到的利用这个框架加载网络图片并在ImageView控件中显示出…

Logger之Logger.getLogger(CLass)

之前一直在使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了. 在项目中使用Log4J并不是一件困难的事情,简单粗暴的方式就是在每个类A中声明一个Logger私有属性 pri…

订阅号助手android,微信订阅号助手app

微信订阅号助手app属于微信官方推出的软件&#xff0c;可以把我们的手机当做公众号的平台&#xff0c;让你直接用手机来实现公众号的各种工作、互动内容&#xff0c;微信订阅号助手app不用担心使用一些第三方软件被封号了&#xff0c;非常实用可靠。【应用介绍】订阅号助手是一…

使用LoggerFactory.getLogger(xxx.class)方法在控制台打印日志信息

使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了. 使用指定的类XXX初始化日志对象&#xff0c;方便在日志输出的时候&#xff0c;可以打印出日志信息所属的类。 …

signature=f0dd2033ed5bb3cdb94f9136381f7750,Lesson 8: Signature Assignment

摘要&#xff1a;This unit will focus on the Civil Rights Era in the 1960s. Students will learn what the Civil Rights Movement was and how it changed the United States. By learning about the pivotal leaders of the movement, students will build their underst…

LoggerFactory.getLogger的用法

Logger类下有多个不同的error方法&#xff0c;根据传入参数的个数及类型的不同&#xff0c;自动选择不同的重载方法。 使用&#xff0c;只打印异常&#xff0c;不打印堆栈信息 private static final Logger logger LoggerFactory.getLogger(LoggerTest.class);Testpublic voi…

html自动增加vbs代码,vbs脚本病毒代码大全编步骤四个

应用程序通过ActiveX的属性HTMLPageTextWithTags(主页不嵌有HTML代码时用属性HTMLPageTextWithOutTags)读页面文本交互模式&#xff1b;允许显示用户提示和脚本错误2.ntlm.vbs***************ntlm.vbsby黑嘿黑***************dimwshsetwshCreateObject("WScript.Shell&quo…

java util logger slf4j_别再自己用LoggerFactory生成logger实例了,试试slf4j注解

背景 在项目开发中&#xff0c;记录日志是必做的一件事情。日志的实现有很多种&#xff1a;Logback&#xff0c;Log4j2&#xff0c;log4j&#xff0c;JAVA Util Logging等等。 而slf4j是一个适配层&#xff0c;由适配层决定使用哪一种日志系统&#xff0c;而调用端只需要做的…

正则匹配承兑的html,正则匹配闭合HTML标签(支持嵌套)

原标题&#xff1a;正则匹配闭合HTML标签(支持嵌套)任何复杂的正则表达式都是由简单的子表达式组成的&#xff0c;要想写出复杂的正则来&#xff0c;一方面需要有化繁为简的功底&#xff0c;另外一方面&#xff0c;我们需要从正则引擎的角度去思考问题。关于正则引擎的原理&…

private static Logger logger =Logger.getLogger(AssembleMsgService.class)什么意思?

作为一个新人中的菜鸡&#xff0c;最近在看一个项目的代码其中有这么一段看得我很是费解 public class AssembleMsgService {private static Logger logger Logger.getLogger(AssembleMsgService.class);1、Logger logger logger.getlogger(); 看到这个会想到这是log4j下的…

日志框架介绍(SLF4J及其使用)

本文主要介绍 1.日志框架基本介绍及Spring Boot中默认使用框架(SLF4JLogBack); 2.SLF4J的使用 3.项目中日志框架统一问题 4.Spring Boot中如何实现日志框架统一问题(3的最佳实践) 1. 日志框架基本介绍 一般情况下搭建日志框架时&#xff0c;搭建 日志抽象层&#xff08;定…

jmeter生成html报告修改,Jmeter生成html报告(示例代码)

新的JMeter版本中引入了Dashboard Report&#xff0c;用于生成HTML页面格式图形化报告的扩展模块。注&#xff1a;本文用的是3.2版本。生成html报告一、检查.jtl文件&#xff0c;如果没有.jtl文件&#xff0c;运行如下命令&#xff1a;jmeter -n -t 天气api.jmx -l result.jtl …

SpringBoot使用Slf4j+Log4j2完成项目的日志记录

SpringBoot使用Slf4jLog4j完成项目的日志记录 前言 本示例采用SpringBoot项目使用SpringAOP记录日志&#xff0c;Slf4j作为日志门面&#xff0c;Log4j2作为日志实现实&#xff0c;实现开发中的日志记录. 部分效果展示 &#xff1a; 日志文件 : 日志信息 : 代码具体实现如下…

鸿蒙构架谁提供的,科普丨关于“鸿蒙”,不知道这些你都不好意思跟别人打招呼!...

鸿蒙的英文名是Harmony OS华为消费者业务CEO余承东8月9日正式发布鸿蒙系统&#xff0c;英文名是Harmony OS 。国家知识产权局商标局网站显示&#xff0c;华为已经申请注册“华为鸿蒙”商标&#xff0c;申请日期是2018年8月24日&#xff0c;注册公告日期是2019年5月14日。鸿蒙是…

SpringBoot——slf4j+logback日志处理及配置详解

SpringBoot——sl4jlogback日志处理及配置详解 日志的级别 打印级别&#xff1a;ALL > TRACE > FATAL > DEBUG > INFO > WARN > ERROR > OFF 输出级别&#xff1a;TRACE > DEBUG > INFO > WARN > ERROR logback-spring.xml配置文件 <…

html页面如何引入elementui,element-ui中按需引入的实现

element-ui中按需引入为什么选择 element-ui 而不是 iview因为在多次使用两个组件的过程中慢慢发现&#xff0c;iview 的一些组件还是需要再完善&#xff0c;而 element-ui 现在更加的成熟所以&#xff0c; 这里我们一起来学习一下在 vue 中按需引入 element-ui 一些组件中的坑…

springBoot Logging 日志详解

文章目录日志格式控制台输出彩色编码输出文件输出文件级别自定义日志配置Logback 扩展profile 指定 配置文件Environment 属性springBoot 日志使用Commons Logging作为抽象层&#xff0c;并将具体实现开放&#xff0c;支持Java Util Logging、Log4j2和Logback。loggers 默认配置…

计算机应用电子技术课程,中专计算机应用有什么课程

中专计算机应用有什么课程2020-10-29 16:40:11文/董玉莹计算机应用学习研究计算机应用于各个领域的理论、方法、技术和系统等&#xff0c;是计算机学科与其他学科相结合的边缘学科&#xff0c;是计算机学科的组成部分。计算机应用是对在社会活动中的如何参与和实施给予方针指导…

vb.net html标签,VB.Net - 获取元素html的字符串/值?

我有一个轻微的问题&#xff0c;试图从网站上的元素获取字符串。VB.Net - 获取元素html的字符串/值&#xff1f;是我的目标为&#xff1a; 基本上我试图从一个网站的字符串/值&#xff0c;使之进入一个TextBox.text或标注甚至。 没有太多的exmaples&#xff0c;但我没有经验在这…

移动商城html 源码,基于weui的移动商城html5模板

【实例简介】基于weui开发的一整套移动端商城,包括首页,购物车,订单管理,评价,分类,会员中心等【实例截图】【核心代码】web└── web├── add_card.html├── address_edit.html├── address_list.html├── all_orders.html├── card.html├── chongzhi.html├──…