JavaWeb-Servlet服务连接器(三)

news2024/11/24 9:47:44

目录

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{
    @Override
    protected 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{
    @Override
    protected 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{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建字符流输出对象
        PrintWriter writer = resp.getWriter();
//        输出数据
        writer.write("<h1>Hello World</h1>" +
                "<h1>你好 世界</h1>");
        writer.close();
    }
//    统一方法操作
    @Override
    protected 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{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        告诉浏览器服务器使用编码方式是utf-8
        resp.setHeader("content-type","text/html;charset=utf-8");

//        创建字符流输出对象
        PrintWriter writer = resp.getWriter();
//        输出数据
        writer.write("<h1>Hello World</h1>" +
                "<h1>你好 世界</h1>");
        writer.close();
    }
//    统一方法操作
    @Override
    protected 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{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        告诉浏览器编码格式为utf-8
        resp.setHeader("content-type","text/html;charset=utf-8");
//        创建字节流
        ServletOutputStream sos = resp.getOutputStream();
//        使用字节流输出
        sos.write("你好啊".getBytes(StandardCharsets.UTF_8));
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

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


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

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

相关文章

负载均衡搭建

LVS-DR部署 [客户端] node1 192.168.157.148 [lvs] node2 192.168.157.142 [web服务器] node3 192.168.157.145 node4 192.168.157.146&#xff08;1&#xff09;[lvs] yum install -y ipvsadm.x86_64 配置LVS负载均衡服务 &#xff08;1&#xff09;手动添加LVS转发1&#xff…

python selenium如何保存网站的cookie用于下次自动登录

## 一、python selenium如何保存网站的cookie 使用Selenium保存网站的Cookie非常简单。下面是一个示例&#xff0c;展示了如何使用Selenium打开网站&#xff0c;然后保存获取到的Cookie&#xff1a; from selenium import webdriver# 初始化浏览器 browser webdriver.Chrome…

基于nodejs+vue+elementui文学创作的社交论坛新闻文章管理系统

课题主要采用vue技术和MySQL数据库技术以及vue框架进行开发。系统主要包括个人中心、用户管理、文章类型管理、文章信息管理、文章举报管理、警告信息管理、系统管理等功能&#xff0c;从而实现智能化的社交论坛管理方式&#xff0c;提高社交论坛管理的效率。 通过对基于文学创…

9月30日生效:微软官方服务协议更新,防止人工智能进行逆向工程

微软最近更新了其官方服务协议&#xff0c;新规则将于9月30日生效&#xff0c;包括多个新增和变化&#xff0c;具体细节请参考最新的微软服务协议。 微软最新更新涉及使用Bing Chat聊天机器人、Windows Copilot和Microsoft 365 Copilot服务&#xff0c;引起了广泛关注。这次更新…

如何实现Vue路由的二级菜单

目录 Vue路由&#xff08;一、二级路由&#xff09; 一级路由配置 二级路由配置 Vue中展示二级路由的默认模块/二级路由默认显示 Vue路由&#xff0c;二级路由及跳转 如何用vue实现二级菜单栏 ◼️ 相关参考资料 当朋友们看到这个文章时想必是想要了解vue路由二级菜单相…

LeetCode150道面试经典题-- 有效的字母异位词(简单)

1.题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 2.示例 s"adasd" t"daads" 返回true s"addad" t &q…

森海塞尔集团专注专业音频业务的首个财年圆满收官

2022年&#xff0c;这家家族企业通过其专业音频解决方案实现4.677亿欧元销售额 韦德马克&#xff0c;2023年6月27日——2022财年&#xff0c;森海塞尔集团进一步扩展其作为专业音频解决方案提供商的强大地位&#xff0c;并依靠自身取得可持续增长。专业音频解决方案的销售额增…

在Ubuntu20.04以Docker方式安装Mysql详细教程(支持外部连接,数据映射到物理磁盘,备份数据,导出数据,恢复数据)...

最近&#xff0c;从阿里云迁移到天翼云&#xff0c;为了保证WordPress查库速度&#xff0c;数据库也要一并迁移&#xff0c;但数据库是很贵的&#xff0c;为了降低个人WordPress网站的成本&#xff0c;我决定自己建数据库。本文是使用Docker镜像建立数据库的方法&#xff0c;数…

SAP MM学习笔记19- SAP中的库存类型,以及 保留在库的利用场景

SAP中有3种库存类型。 1&#xff0c;利用可能在库&#xff08;非限制使用库存&#xff09; 2&#xff0c;品质检查中在库&#xff08;质检库存&#xff09; 3&#xff0c;保留在库&#xff08;已冻结库存&#xff09; 这3种库存类型在库存移动的时候&#xff0c;是可以互相转…

4. 软件开发的环境搭建

目录 1. 搭建环境 1.1 检查 JDK 1.2 检查 MySQL 数据库 1.3 检查 Maven 1.4 检查 GITEEGIT 1.5 安装插件 1.5.1 安装 Spring Boot Helper 1.5.2 安装 lombok 1.6 创建仓库 1.6.1 登录 GITEE 创建仓库并复制仓库地址 1.6.2 克隆到本地 1.7 创建工程 1.7.1 设置编码…

Unity 框架学习--1

由浅入深&#xff0c;慢慢演化实现框架 两个类的实现代码完全一样&#xff0c;就只有类名或类型不一样的时候&#xff0c;而且还需要不断扩展&#xff08;未来会增加各种事件&#xff09;的时候&#xff0c;这时候就用 泛型 继承 来提取&#xff0c;继承解决扩展的问题&#…

【Quarkus技术系列】打造基于Quarkus的云原生微服务框架实践(1)

前提介绍 本系列文章主要讲解如何基于Quarkus技术搭建和开发"专为Kubernetes而优化的Java微服务框架"的入门和实践&#xff0c;你将会学习到如何搭建Quarkus微服务脚环境及脚手架&#xff0c;开发Quarkus的端点服务&#xff0c;系统和应用层级的配置介绍与Quarkus的…

JavaWeb_总体介绍

文章目录 1.总括2.JavaWeb项目架构 1.总括 2.JavaWeb项目架构

【Linux】DNS协议——应用层

DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&#xff0c;是一个用来将域名转化为IP地址的应用层协议。 DNS背景 TCP/IP中通过IP地址和端口号的方式&#xff0c;来确定网络中一个主机上的一个程序。但IP地址是一长串数字&#xff0c;并不…

阿里云账号注册流程_多种注册方法_图文详解

阿里云账号怎么注册&#xff1f;阿里云账号支持手机号注册、阿里云APP注册、支付宝和钉钉多种注册方式&#xff0c;账号注册后需要通过实名认证才可以购买或使用云产品&#xff0c;阿里云百科来详细说下不同途径注册阿里云账号图文流程&#xff1a; 目录 阿里云账号注册流程 …

利用python实现网络设备配置批量上传和批量下载功能

利用python实现网络设备配置批量上传和批量下载功能 利用ensp实现网络设备和物理主机互通配置网络设备配置批量上传功能配置批量下载功能常见问题 提示&#xff1a; 本文章代码所使用目录均使用相对目录&#xff0c;只需将配置存放目录和文件下载目录&#xff08;已用符号标出…

Java:正则表达式书写规则及相关案例:检验QQ号码,校验手机号码,邮箱格式,当前时间

正则表达式 目标:体验一下使用正则表达式来校验数据格式的合法性。需求:校验QQ号码是否正确&#xff0c;要求全部是数字&#xff0c;长度是(6-20&#xff09;之间&#xff0c;不能以0开头 首先用自己编写的程序判断QQ号码是否正确 public static void main(String[] args) {Sy…

走近ChatGPT与类似产品:原理解析与比较

目录 1. 引言1.1 技术的进步与自然语言处理1.2 ChatGPT的崭新概念 2. ChatGPT: 一览众山小2.1 GPT-3.5架构简介2.2 ChatGPT的学习与训练2.3 文本生成的工作原理 3. 市场上类似产品调研3.1 对话式人工智能产品分类3.2 文心一言3.3 讯飞星火 4. 应用前景与局限性展望4.1 ChatGPT的…

STM32 F103C8T6学习笔记6:IIC通信__驱动MPU6050 6轴运动处理组件—一阶互补滤波

今日主要学习一款倾角传感器——MPU6050,往后对单片机原理基础讲的会比较少&#xff0c;更倾向于简单粗暴地贴代码&#xff0c;因为经过前些日子对MSP432的学习&#xff0c;对原理方面也有些熟络了&#xff0c;除了在新接触它时会对其引脚、时钟、总线等进行仔细一些的研究之外…

790. 多米诺和托米诺平铺

题目描述&#xff1a; 主要思路&#xff1a; class Solution { public:int numTilings(int n) {long long f[n][4],mod1e97;f[0][0]1;f[0][1]f[0][2]0;f[0][3]1;for(int i1;i<n;i){f[i][0]f[i-1][3];f[i][1] (f[i-1][0]f[i-1][2])%mod;f[i][2] (f[i-1][0]f[i-1][1])%mod;f…