JavaWeb-Servlet服务连接器(三)

目录

Response响应对象

1.基本功能

2.重定向

3.路径

4.服务器输出数据到浏览器


Response响应对象

1.基本功能

设置响应行:格式为 HTTP/1.1 200 OK,可以使用 setStatus(int sc) 方法设置状态码为 200 表示成功。

方法名称描述
setStatus(int sc)设置状态码为给定的整数值。

设置响应头:使用 setHeader(String name, String value) 方法来设置响应头信息,比如 setHeader("Content-Type", "text/html") 设置响应内容类型为 HTML。

方法名称描述
setHeader(String name, String value)设置指定名称的请求头为给定的值。

设置响应体:获取输出流:

方法名称描述
getWriter()获取字符输出流,用于向客户端发送字符数据。
getOutputStream()获取字节输出流,用于向客户端发送字节数据。

使用输出流将数据输出到客户端浏览器。


2.重定向

 重定向通过response对象的sendRedirect("目标地址")进行跳转

方法名称描述
sendRedirect(String location)通过指定目标地址进行重定向跳转。设置响应的 Location 头,使客户端重新向指定的目标地址发送请求。
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;@WebServlet("/Demo9")
public class Demo9 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {
//            等待三秒后跳转回到主页面TimeUnit.SECONDS.sleep(3);}catch (Exception e){e.printStackTrace();}
//        本站资源进行跳转
//        resp.sendRedirect("/com_alphamilk_war_exploded/Demo8");
//        外部站点资源进行跳转resp.sendRedirect("https://blog.csdn.net/dogxixi?spm=1000.2115.3001.5343");}
}

 访问后就自动跳转到CSDN中·

 response对象重定向的特点(sendRedirect)

  1. 地址栏会发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是二次请求,但是重定向后不能使用request的共享变量

request对象的请求转发特定(Forward)

  1. 地址栏不会发生变化
  2. 转发只能访问当前服务器下的资源
  3. 转发是一次请求

3.路径

相对路径(通过访问当前的资源和目标的资源之间的相对位置关系):

  1.      同级目录:. /资源名称
  2.      后退一个目录: . . /资源名称

特点:无法确定唯一的资源

绝对路径:根据请求对象分类

  • 如果是客户端浏览器访问的就需要加上虚拟目录
  • 如果是服务器自行使用则不需要加虚拟目录

特点:通过绝对路径可以确定唯一的资源.

注意:但是在重定向时,为了保证跳转的准确性,需要将虚拟目录包含在重定向的路径中。例如:resp.sendRedirect("/context_path/Demo8")

问题引出:

        由于为了重定向的准确性,一般会在重定向的路径中加入虚拟目录,但是如果虚拟目录经常发生变化,就需要相应的所有有关的路径全部修改,会造成大量的时间浪费,所以引入了动态路径的概念。具体原理是通过request对象的方法的获取路径getContextPath+/资源名。

案例代码:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;@WebServlet("/Demo9")
public class Demo9 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {
//            等待三秒后跳转回到主页面TimeUnit.SECONDS.sleep(3);}catch (Exception e){e.printStackTrace();}
//        本站资源进行跳转(动态路径)resp.sendRedirect(req.getContextPath()+"/Demo5");}
}

4.服务器输出数据到浏览器

 通过流输出内容,具体方法如下:

1.通过字符流实现数据发送

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/Demo10")
public class writer extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建字符流输出对象PrintWriter writer = resp.getWriter();
//        输出数据writer.write("<h1>Hello World</h1>" +"<h1>你好 世界</h1>");writer.close();}
//    统一方法操作@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

可以发现用了字符流输出中文的时候出现了乱码,原因在于:使用编码的字符集不一致(字符集使用的是GBK 而流使用的是ISO - 8859-1),只需要告诉浏览器服务器用的编码方式,浏览器就会自动进行相应编码转换

 修改后代码

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/Demo10")
public class writer extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//        告诉浏览器服务器使用编码方式是utf-8resp.setHeader("content-type","text/html;charset=utf-8");//        创建字符流输出对象PrintWriter writer = resp.getWriter();
//        输出数据writer.write("<h1>Hello World</h1>" +"<h1>你好 世界</h1>");writer.close();}
//    统一方法操作@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

2.字节流发送数据

 原理同上

案例:

package com.company;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;@WebServlet("/Demo11")
public class writeByte extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        告诉浏览器编码格式为utf-8resp.setHeader("content-type","text/html;charset=utf-8");
//        创建字节流ServletOutputStream sos = resp.getOutputStream();
//        使用字节流输出sos.write("你好啊".getBytes(StandardCharsets.UTF_8));}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

如果不了解字符流和字节流和打印流的知识可以在下面的章节中了解更多内容Java IO(File、字节输入输出流、字符输入输出流、打印流)附带相关面试题_Alphamilk的博客-CSDN博客


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

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

相关文章

算法模板七月

数学类模板 求组合数模板 求组合数 蓝桥杯集合的分割; static int mod 1000000000 7; static int N 1010; //求static long [][] arrnew long[N][N]; //需要开一个longstatic {for (int i 0; i < N; i) {for (int j 0; j < i; j) {if (j 0) {arr[i][j] 1;} el…

将商城项目放到docker-centos7中

1、docker pull centos:7 2、docker run -d -it --privileged 仓库名称/shopcentos:1.1 /usr/sbin/init 注意&#xff1a; /usr/sbin/init 必须加&#xff0c;否则没法使用systemctl启动mysql 3、安装mysql教程 安装msyql教程&#xff1a;https://blog.csdn.net/davice_li…

docker下载和案例

文章目录 Docker安装一,根据官方文档安装二,根据我以下方式 Docker配置错误导致漏洞一,CRLF注入漏洞介绍在nginx中该漏洞例子解决方法 目录穿越漏洞介绍解决方法 Docker安装 一,根据官方文档安装 官方文档 二,根据我以下方式 docker安装要求&#xff1a; Docker要求Ce…

扑克牌(二分)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 你有n种牌&#xff0c;第i种牌的数目为ci。另外有一种特殊的牌&#xff1a;joker&#xff0c;它的数目是m。你可以用每种牌各一张来组成一套牌&#xff0c;也可以用一张joker和除了某…

用户数据报协议UDP

UDP的格式 载荷存放的是:应用层完整的UDP数据报 报头结构: 源端口号:发出的信息的来源端口目的端口号:信息要到达的目的端口UDP长度:2个字节(16位),即UDP总长度为:2^16bit 2^10bit * 2^6bit 1KB * 64 64KB.所以一个UDP的最大长度为64KBUDP校验和:网络的传输并非稳定传输,…

BIO、NIO、AIO 有什么区别

在Java中&#xff0c;BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;和AIO&#xff08;Asynchronous I/O&#xff09;都是用于处理I/O&#xff08;输入/输出&#xff09;操作的不同方式。它们在处理I/O时具有不同的特点和适用场景。 B…

【leetcode】前缀和

内容摘抄自&#xff1a; 小而美的算法技巧&#xff1a;前缀和数组 | labuladong 的算法小抄 一维数组的前缀和 看这个 preSum 数组&#xff0c;若想求索引区间 [1, 4] 内的所有元素之和&#xff0c; 就可以通过 preSum[5] - preSum[1] 得出。 class NumArray {private:// 前缀…

wordpress数据表中标签和分类如何区分?

wordpress中标签和分类是什么关系怎么区分&#xff1f;最后有一个群的网友告诉了我文章ID和标签ID的关系是放在了wp_term_relationships表中&#xff0c;然后我百度了下这个表的结构和相关介绍&#xff0c;发现果然如此&#xff0c;先把文章保存起来&#xff1a; wp_term_rela…

消息中间件 Asio (C++)

折腾了一上午&#xff0c;看到这个结果的时候泪目了兄弟闷&#xff0c;讲真。我的asio客户端成功收到服务端发来的消息了。虽然这确实是极其智障又简单的入门哈哈 下载独立版本 asio网络通信库新建cmake工程&#xff0c;CMakeLists.txt加载asioasio最简单的服务端和客户端代码…

SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)

SpringBoot集成websocket&#xff08;3&#xff09;|&#xff08;websocket调用websocket采用回调方式实现数据互传&#xff09; 文章目录 SpringBoot集成websocket&#xff08;3&#xff09;|&#xff08;websocket调用websocket采用回调方式实现数据互传&#xff09;[TOC] 前…

Vue引入外部js文件中的变量,方法

写法一&#xff1a; vue文件 <template><div class"index"><div>{{zuopin}}</div><h2>{{content.name}}</h2><h2>{{content.title}}</h2><div class"box" v-for"item in info" :key"…

Java技术整理(6)—— 微服务篇

1、服务注册发现 服务注册就是维护一个服务列表&#xff0c;它在管理系统内所有的服务地址&#xff0c;当新的服务启动后&#xff0c;它会向服务列表提交自己的服务地址&#xff0c;服务的调用法可以直接向服务列表发送服务列表获取请求&#xff0c;就能获得所有的服务地址&am…

【LangChain】Prompts之示例选择器

LangChain学习文档 【LangChain】向量存储(Vector stores)【LangChain】向量存储之FAISS【LangChain】Prompts之Prompt templates【LangChain】Prompts之自定义提示模板【LangChain】Prompts之示例选择器 概要 如果您有大量示例&#xff0c;您可能需要选择要包含在提示中的哪…

pytest功能特性介绍

前言 学pytest就不得不说fixture&#xff0c;fixture是pytest的精髓所在&#xff0c;就像unittest中的setup和teardown一样&#xff0c;如果不学fixture那么使用pytest和使用unittest是没什么区别的(个人理解)。 fixture用途 1.做测试前后的初始化设置&#xff0c;如测试数据…

【AI】《动手学-深度学习-PyTorch版》笔记(十七):卷积神经网络入门

AI学习目录汇总 1、从全链接层到卷积 1.1 卷积 我们在前面学习的多层感知机中,已经认识了全链接层,缺点很明显,在稍微大点的网络模型中,参数成指数级别增长。参数量很快就达到数十亿,这样的量级几乎无法计算。为此科学家们想出一个减少参数的方法:卷积。 从全链接层到…

Android Monkey测试

1.直接使用 当配置好一切环境的前提下&#xff0c;仅需套用以下基础语法&#xff0c;即可简单使用(更多的命令可以去Android的官网查询) adb shell monkey -p [包名] -v [需要点击的次数] 举例&#xff0c;如我这里的包名是 com.test.chj233 &#xff0c;需要随机生成 1万次…

linux 关机和重启

关机和重启 关机和重启之前最好先数据数据同步一下 # 将数据由内存同步到硬盘sync 关机 #shutdown [选项] 时间#立即进入维护模式shutdown now#立即重启shutdown -r now#20:00 重新启动计算机shutdown -r 20:00& #立即关机shutdown -h now# 20:00 关闭计算机shutdown -h 20…

K8S系列文章之 Shell批处理脚本应用

一、简要说明 1、批处理脚本介绍 命令批处理脚本&#xff1a;/usr/shell/all.sh文件批量分发脚本&#xff1a;/usr/shell/scp.sh 2、批处理命令脚本原理 读取/usr/shell/hosts文件中的ip列表使用$*接收脚本所有参数for循环遍历hosts文件中的ip地址通过ssh host cmd 实现目的…

【elasticSearch系】3.完整搭建详尽版elk

话不多说,我们先看下经典的elk 是由哪些组件搭建组合起来的 elasticSearch和kibana搭建 可以查看之前我搭建elasticsearch和kibana 的这篇文章 logstash搭建 为了和之前我搭建elasticsearch和kibana版本保持一致,这里我们还是选择7.17.3 下载地址 点击下载,这里为了方…

wangEditor5实现@评论功能

需求描述&#xff1a;在输入框输入后显示用户列表&#xff0c;实现人功能 当前环境&#xff1a;vue3viteelementPluswangEditor5 需要插件&#xff1a;wangeditor/plugin-mention 安装插件&#xff1a;npm i wangeditor/plugin-mention 输入框组件分两部分&#xff1a;1. wa…