Servlet详解(二):request和response对象

2023-10-26

什么是request和response

request对象是服务器对浏览器请求的封装,而response是服务器对服务器响应的封装。
这里写图片描述

request用来取出请求信息,而response则用来添加要返回给浏览器的信息。

使用response对象设置http响应协议中的信息

用来生成Http响应信息,发送给用户。

响应首行

HTTP/1.1 200 OK

  • setStatus(int sc):设置正常的响应状态码 status code
  • setStatus(int sc, String sm):设置正常的响应状态码,状态码描述 status message,过时,因为正常状态下,状态码信息不会显示给用户,所以没有必要设置
  • sendError(int sc):设置错误的状态码
  • sendError(int sc, String sm):设置错误的状态码,包含错误信息

响应头

key:value

  • setHeader(String name, String value):设置一个键值对,值为string
  • setDateHeader(String name, long date):设置一个键值对,值为long,long常用于毫秒的表示
  • setIntHeader(String name, int value):设置一个键值对,值为int类型
  • setHeader(String name, String value):添加一个键值对,值为string
  • setDateHeader(String name, long date):添加一个键值对,值为long,long常用于毫秒的表示
  • setIntHeader(String name, int value):添加一个键值对,值为int类型
  • add 和 set 区别在于,前置直接添加(key是可以重复的),后者会修改原来的,没有才会添加。

几个常见的响应头:

  • ContentType:text/html;charset=utf-8
  • Refresh:3;url=http://path 3秒后跳转网页

html中meta标签的作用就是用于向响应头中添加信息。

响应空行

一个分隔符

响应正文

需要发送的资源

  • response.getWriter():获取字符流
  • 父类方法getOutputSteam():获取输出字节流

实现请求重定向

手动实现:

实现重定向很简单,只需要两个步骤:

  1. 在响应头中添加302状态码,告诉浏览器需要进行重定向
    response.setStatus(302)

  2. 在响应头中添加Location,指定重定向的位置
    response.setHeader("Location", "http://www.baidu.com");

当用户请求servlet时,服务器返回一个类似上面的响应头,上面的信息告诉浏览器,应该重新进行一次请求,请求的地址为 Header中的Location地址。
所以,请求重定向实际上是两次请求。

直接实现:

我们只需要使用:response.setRedirect("http://www.baidu.com")即可实现。

通过访问Servlet向浏览器传递一个图片

// 获取图片输入流
InputStream is = getServletContext().getResourceAsStream("/WEB-INFO/mm.jpg");
// 获取浏览器的输出流
byte[] buffer = new byte[1024];
// 将图片篇输入流写出到浏览器中
int len = -1;
while((len = is.readBuffer(buffer)) != -1){
	os.write(buffer, 0, len);
	os.flush();
}

通过访问Servlet下载文件

类似于图片,但是浏览器不能识别文件的名称和文件的类型,需要我们在响应头中设置文件的类型:

ServletContext sc = getServletContext();
String mimeType = sc.getMimeType("下载的文件名称"); // 传入下载的文件名称,会根据名称的拓展名识别mime类型
response.setContentType(type);

即可。

通过request对象获取http请求协议中的内容

用来生成http请求信息。

请求首行

请求方式 请求路径 协议/版本号

  • request.getMethod() 请求方式
  • request.getContextPath()getServletPath()…获取请求路径
  • 父类方法 request.getScheme() 获取请求协议

请求头

键值对

  • request.getHeader(String name)
  • request.getIntHeader(String name)
  • request.getDateHeader(String name)
  • request.getHeaderNames()
  • request.getHeaders(Sring name)一个key对应多个value

请求空行

请求正文(post才有)

但是以下方法,无论是get还是post请求都可以获得参数值

  • 父类方法 String getParameter(String name)
  • Map<String, String[]> getParameterMap()
  • Enumeration getParameterNames()
  • String[] getParameterValues(String name)

解决响应和请求的乱码问题

处理get请求编码问题

解决方案:在conf/server.xml中URIEncoding="UTF-8" 69行,

<Connector URIEncoding="UTF-8" 
	connectionTimeout="20000" 
	port="8888" 
	protocol="HTTP/1.1" 
	redirectPort="8443"/>

设置URIEncoding为UTF-8

处理post请求编码问题

服务器响应时的数据,即服务器向浏览器传递的数据的编码格式由服务器决定:
编码时使用的编码表,使用getByte("编码表")设置,或者使用response.setCharacterEncoding(编码表)设置。两者的区别在于 ,前者设置字节流码表,后者设置字符流码表。

解码时使用的编码表,使response.setHeader("ContentType","text/html;charset=utf-8")指定http响应头来设置。

这里写图片描述


客户端发送请求时的乱码解决:
GET提交,参数在URL中,设置URL的解码配置,服务器默认使用IOS-8855-1拉丁码表解码URL,我们可以通过 tomcat/config/server.xml配置文件中:

 <Connector 
	 connectionTimeout="20000" 
	 port="8080" 
	 protocol="HTTP/1.1" 
	 redirectPort="8443"/>

添加属性URIEncoding="UTF-8"即可将服务器默认的解码url的方式设置为utf-8

或者在doget方法中

将接收的乱码文字使用新的码表转换:

String name = request.getParamter("name"); // 获取乱码文字
byte[] bs = name.getBytes("IOS-8859-1"); // 根据乱码码表,将文字转换为字节数组
	String s = new String(bs, "UTF-8"); // 将字节数组按照新的码表解码,生成文字

这里写图片描述

POST提交

与GET提交解码的区别:
解码事件不同,GET因为参数在URL中,所以服务器一旦接受请求就会立刻解码参数,而POST在Servlet调用获取参数的方法时才会解码。
所以,解决post请求的乱码很简单,只需要在参数调用前使用

request.setCharacterEncoding("utf-8");

设置请求解码表即可。

request 请求转发实现和request域

这里写图片描述

这就是请求转发,浏览器发送请求,servlet处理request和response部分业务,但是无法全部处理,也无法简单的显示到页面中,所以将处理过得request和response发送给jsp,jsp进行一些业务操作,并响应给浏览器,展示。

请求转发主要用来分工操作。

AServlet doGet():


// ***** 不标准自定义转发
//todo AServlet进行业务处理,比如从数据库获取数据
// 处理结束后:=>
// 发送给Bservlet
BServlet bServlet = new BServlet();
bServlet.doGet(request, response);

//*****标准转发
// 使用request域(一个请求内有效,主要用于请求转发) 保存数据库的信息,发送给BServlet,即 AServlet和BServlet使用request域共享数据,request域是request对象中的一个Map。
request.setAttribute("name","Feathers");  // 向request域中存入一个键值对
request.getRequestDispatcher("/servlet/BServlet").forword(request.response);

BServlet doGet():

// todo 负责输出显示
// 从request域中取出值
System.out.println((String)request.getAttribute("name"));
注意:

不能在转发的Servlet中向浏览器输出任何响应正文的内容,但是可以添加响应头。
因为Servlet中,即使你添加了响应体,也会被清空。

##重定向和转发的区别

  • 重定向是一次请求,转发一次请求
  • 重定向可以访问项目之外的地址,而转发不能。
  • 重定向不可以使用request域,而转使用request域,一次请求,一个request对象
  • 重定向地址栏可能会发生会发生变化,而转发一定不会
  • 重定向请求方式有可能发生改变(重定后的请求一定是get请求,只有显示设置post才是post请求,否则是get请求),而转发不会
  • 重定向时response的方法(通过修改response头来完成重定向),而请求转发是resquest的方法(一次请求,转发给不同的Servlet)

请求包含

请求转发,转发的Servlet不能修改请求体,而请求包含中,同请求转发类似,但是可以修改请求体。
用途:用来解决重复操作。
将重复的操作提取到这个Servlet中,统一进行处理。

这里写图片描述

往往在多个JSP中使用,一个jsp用于处理相同的操作,其余的jsp根据是否需要处理,进行依次处理。

实现:
AServlet doGet():

response.setContentType("text/html;charset=utf-8");
// 包含
request.getRequestDispatcher("/servlet/BServlet").include(request,response);
response.getWriter().write("Aservlet 处理");

BServlet doGet():

response.getWriter().write("Bservlet 处理");

结果:

Aservlet 处理Bservlet 处理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servlet详解(二):request和response对象 的相关文章

随机推荐

  • WChar_t 字符集的操作函数

    函数介绍 wcslen 类似与char 类型作参数的strlen 函数 用来获取wchar t 变量的长度 不包含终结符 wcscpy 类似与char 类型作参数的strcpy 函数 用来进行wchar t 变量之间的复制 同样的还有 wc
  • Qt应用开发(基础篇)——布局管理 Layout Management

    一 前言 在实际项目开发中 经常需要使用到布局 让控件自动排列 不仅节省控件还易于管控 Qt布局系统提供了一种简单而强大的方式来自动布局小部件中的子小部件 以确保它们充分利用可用空间 所有QWidget子类都可以使用setLayout 设置
  • JavaScript面向对象详解

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 面向对象 JavaScript中没有类的概念 我们可以把对象看作散列表 无非就是一
  • html中的checkbox不显示值,html checkbox的checked属性问题和value属性问题

    lt html xmlns http www w3 org 1999 xhtml gt lt head gt lt script type text JavaScript gt function onbutton document getE
  • 前端Img使用图片跨域问题是怎么引起的?该如何解决呢?

    在项目种遇到一个问题 图片在dom节点这种使用了 img 标签来加载可以正常显示 但是运用到style中没有经过标签的加载就会出现跨域的问题 怎么会引起这个问题呢 1 通过 img 加载的图片 浏览器默认情况下会将其缓存起来 2 当我们从
  • 为什么数据分析进行的预测不够成功

    行业专家有时感叹大规模分析和数据科学计划经常缺乏价值 虽然人们从许多努力中看到了其巨大的价值 但结果非常差的例子也屡见不鲜 专家认为 通常这些问题可以归结为一个基本的错误 也就是说 认为生成预测 预测或模拟就足够了 但事实却不是这样 预测是
  • go 打开文件句柄_Go中trace包的使用

    Go给我们提供了一个工具trace 可以在运行时启用trace 并获得程序执行情况的详细视图 应该怎么使用trace呢 一般有下面三种使用方式 运行go test的时候 带上 trace参数标记 go test trace trace ou
  • Android6.0软件崩溃问题

    概述 targetSdkVersion是23 在Android 6 0上运行就会遇到crash的问题 因为Android 6 0在原有的AndroidManifest xml声明权限的基础上 增加了运行时的权限 无法在AndroidMani
  • ZBrush中Tool工具的保存

    ZBrush软件的界面及操作方法与其他的三维软件完全不同 很多初学者常常会觉得有些困难 接下来我们就讲解一下ZBrush 最为基础的操作 Tool工具的保存 首先要明白什么是Tool工具 我们创建的每一个模型 以及ZBrush可以调用的模型
  • Photoshop cc2019 破解教程

    Photoshop cc2019 破解教程 内含破解器 1 下载替换文件 Photoshop exe 链接如下 链接 https pan baidu com s 11XrnXWvGsnQ7YMbIMb49Lw 提取码 t9ol 2 打开Ph
  • Nginx 学习 一(安装)

    1 从官网现在nginx wget https nginx org download nginx 1 16 1 tar gz 解压 共有如下目录文件 2 让nginx 配置文件 vim 语法高亮 原先的 复制contrib 目录下文件到当前
  • windows Server 2008 R2服务器IIS环境启用TLS 1.2

    windows Server 2008 R2服务器IIS环境启用TLS 1 2 配置TLS1 2 分为2步 添加TLS配置和禁用老的SSL版本 提供两种方法 选择其中一种就行了 手动设置 打开注册表 运行regedit 找到 HKEY LO
  • kettle转换js实现MD5加密

    Script here js文件与转换文件保存路径一样LoadScriptFile getVariable Internal Transformation Filename Directory MD5 js var pass usernam
  • python【2】python3 的CSV数据规整化1

    最近分析一套数据 是csv格式的数据 必须是python分析数据比较顺手啊 于是研究一下csv模块 由于py的版本问题 3的资料中文的很少 所以记录一下 方便以后的学习 点击打开链接 上面的链接是python官网给的文档 英语好的建议看原版
  • 回归预测

    回归预测 MATLAB实现GRNN广义回归神经网络多输入多输出预测 目录 回归预测 MATLAB实现GRNN广义回归神经网络多输入多输出预测 预测效果 基本介绍 程序设计 往期精彩 参考资料 预测效果 基本介绍 MATLAB实现GRNN广义
  • 组合特征(三)tfidf(word+article+length)

    特征拼接 拼接文章长度 1 载入特征 2 读文章长度 3 特征缩放 拼接特征 import pickle 载入特征 with open tfidf word article pkl rb as f x train y train y tes
  • 【数字 IC】从底层重新认识 D 触发器、建立时间和保持时间

    目录 1 NMOS 和 PMOS 2 MOS 管搭建逻辑门 3 锁存器和触发器 3 1 交叉耦合反相器 3 2 SR 锁存器 3 3 D 锁存器 3 4 D 触发器 4 D 触发器的建立 保持时间 1 NMOS 和 PMOS MOSFET
  • 制作镜像

    2017 03 10 一直以来 都没有自己制作过景象 这次我得自己尝试下 https docs openstack org image guide virt install html 这里是官方的教程 2017 03 11 目前实验室制作镜
  • whistle代理配置帮助文档

    背景 Android开发需要与服务器调试API接口 whistle可以帮助配置代理的方式访问测试环境 并且联调抓包也非常方便 一 安装whistle 1 下载Node js 下载地址 https nodejs org en 下载完成后安装即
  • Servlet详解(二):request和response对象

    什么是request和response request对象是服务器对浏览器请求的封装 而response是服务器对服务器响应的封装 request用来取出请求信息 而response则用来添加要返回给浏览器的信息 使用response对象设