Servlet基础(续集2)

HttpServletResponse

web服务器接收到客户端的http的请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息:找HttpServletResponse

简单分类:

负责向浏览器发送数据的方法:

ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的方法:

响应的状态码:

下载文件:

  1. 向浏览器输出消息
  2. 下载文件
    1. 要获取下载文件的路径
    2. 下载的文件名是什么
    3. 设置想办法浏览器能够支持下载我们需要的文件
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取OujtputStream对象
    7. 将FileOujtputStream流写入到buffer缓冲区
    8. 使用OujtputStream将缓冲区中的数据输出到客户端!
public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.要获取下载文件的路径String realPath = "E:\\java project\\untitled\\note.md";
//        2.下载的文件名是什么String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//        3.设置想办法浏览器能够支持(Content-Disposition)下载我们需要的文件,让中文文件名URLEncoder.encode编码,否则可能乱码resp.setHeader("Content-Disposition","attachment;filename"+ URLEncoder.encode(fileName, "UTF-8"));
//        下载文件FileInputStream in  = new FileInputStream(realPath);
//        4.获取下载文件的输入流int len = 0;
//        5.创建缓冲区byte[] buffer = new byte[1024];
//        6.获取OujtputStream对象ServletOutputStream out = resp.getOutputStream();
//        7.将FileOujtputStream流写入到buffer缓冲区,使用OujtputStream将缓冲区中的数据输出到客户端!while((len=in.read(buffer))>0){out.write(buffer, 0, len);}in.close();out.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

验证码功能 :

验证怎么来的?

  • 前端实现
  • 后端实现,需要用到java图片类,生成一个图片
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;public class ImageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//如何让浏览器5秒自动刷新一次;resp.setHeader("refresh","5");//在内存中创建一个图片BufferedImage image = new BufferedImage(80, 20,BufferedImage.TYPE_3BYTE_BGR);//得到图片Graphics2D g = (Graphics2D) image.getGraphics();//笔//设置图片的背景颜色g.setColor(Color.white);g.fillRect(0, 0,80, 20);//给图片写数据g.setColor(Color.BLUE);g.setFont(new Font(null,Font.BOLD,20));g.drawString(makeNum(),0,20);//告诉浏览器,这个请求用图片的方式打开resp.setContentType("image/jepg");//网站存在缓存,不让浏览器缓存resp.setDateHeader("expires",-1);resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma", "no-cache");//把图片写给浏览器ImageIO.write(image,"jpg",resp.getOutputStream());}//生成随机数private String makeNum(){Random random = new Random();String num  = random.nextInt(9999999)+"";StringBuffer sb = new StringBuffer();for (int i = 0; i < 7-num.length(); i++) {sb.append("0");}num = sb.toString()+num;return num;}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

 实现重定向:

B一个web资源收到客户端A请求后,B会通知A客户端去访问另一个web资源C,这个过程叫重定向

常见场景:

  • 用户登录
package com.kuang.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setHeader("Location", "/r/img");
//        resp.setStatus(302);resp.sendRedirect("/r/img");//重定向}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

重定向与转发的区别:

相同点:页面都会实现跳转

不同点:

  • 请求转发的时候,url不会发生变化  307 
  • 重定向的时候,url地址会发生变化  302
package com.kuang.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RequestTest extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理请求String username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username+":"+password);//重定向的时候一定要注意路径问题,否则会404resp.sendRedirect("./success.jsp");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
<html>
<body>
<h2>Hello World!</h2><%--这里提交的路径,需要寻找项目的路径--%>
<%--${pageContext.request.contextPath}代表当前项目--%>
<form action="${pageContext.request.contextPath}/login" method="get">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit">
</form></body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>success</h1>
</body>
</html>

HttpServletReques

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。

获取前端传递的参数

 请求转发

package com.kuang.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");String[] hobbys = req.getParameterValues("hobbys");System.out.println(username+":"+password+ Arrays.toString(hobbys));//resp.sendRedirect("./success");//通过请求转发req.getRequestDispatcher(req.getContextPath()+"/success.jsp").forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录</title>
</head>
<body><h1>登录</h1><div style="text-align: center"><%--以post方式提交表单,提交我们的login请求--%><form action="${pageContext.request.contextPath}/login" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>爱好:<input type="checkbox" name="hobbys" value="唱歌">唱歌<input type="checkbox" name="hobbys" value="女孩">女孩<input type="checkbox" name="hobbys" value="代码">代码<input type="checkbox" name="hobbys" value="电影">电影<br><input type="submit"></form></div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<H1>SUCCESS</H1>
</body>
</html>

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

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

相关文章

【前端面试】二叉树递归模板和题解

递归模板和步骤 递归题目的通用步骤递归模板总结1. 树的遍历&#xff08;DFS&#xff09;2. 二叉树的最大深度3. 二叉树的最近公共祖先 递归题目的记忆技巧 递归题目的通用步骤 明确递归函数的功能&#xff1a;确定递归函数的输入参数和返回值&#xff0c;明确函数的功能。基准…

如何在本地部署ChatTTS? 完美部署 简单几步 cpu gpu cuda

前言 最近,24-05-27号,github上出现了一个新项目,ChatTTS。该项目提供了一个文本转语音(Text To Speech)的开源方案,同时支持中文和英文。在官网的演示视频中,可以看到合成效果高度接近真人。 到目前(06-04)为止,已经有18.3k的star。 那我们就来看看这个模型的基本…

63、上海大学:MSConvNet-多尺度卷积神经网络解码大鼠运动疲劳数据[攒劲的模型来喽]

1、介绍&#xff1a; 文章&#xff1a;<A multiscale convolutional neural network based on time-frequency features for decoding rat exercise fatigue LFP >&#xff0c;本文由上海大学于2024.4.8日发表于<Biomedical Signal Processing and Control >&…

语音翻译软件app排名来啦,这些工具让旅游畅通无阻

#这个夏天我们一定要去看海# 出国旅行时&#xff0c;语言障碍常常是最让人头疼的问题之一。 特别是在像缅甸这样英语并不普及的国家&#xff0c;基本的日常交流&#xff0c;比如用餐或问路&#xff0c;都可能成为难题。 然而&#xff0c;随着技术的进步&#xff0c;现在有了…

全功能知识付费小程序源码系统 界面支持万能DIY装修 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代&#xff0c;知识付费已经成为一种重要的商业模式。为了满足市场对于便捷、高效、个性化的知识付费解决方案的需求&#xff0c;小编给大家分享一款全功能知识付费小程序源码系统。这一系统不仅具备界面支持万能 DIY 装修的独特优势&#xff0c;还配备…

游戏开发丨基于PyGame的消消乐小游戏

文章目录 写在前面PyGame消消乐注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame实现喜羊羊与灰太狼版消消乐小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700193 实验环境 python3.11及以上pycharmpygame 安装pygame…

Cocos2dlua棋牌Lua解密

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ 介绍使用libcocos2dlua.so库的游戏的解密分析方法。” Cocos2dlua是一款流行的游戏引擎&#xff0c;常用于开发棋牌游戏。为了保护游戏代码&#xff0c;Cocos2dlua通常会对游戏脚本lua文件进行加密&#xff0c;生成Luac文件&…

电脑已删除的文件在回收站找不到怎么办?数据恢复办法分享!

电脑中的数据已经成为了我们生活和工作的重要部分。无论是珍贵的照片、重要的文档&#xff0c;还是日常的工作文件&#xff0c;我们都希望能够妥善保存很久。 然而&#xff0c;误删除文件的情况时有发生&#xff0c;而当我们急切地打开回收站试图找回这些文件时&#xff0c;却…

这些已经死去的软件,依旧无可替代

互联网这条长河里&#xff0c;软件们就像流星一样&#xff0c;一闪而过。有的软件火过一段时间&#xff0c;然后就慢慢消失了。 说不定有些软件你以前天天用&#xff0c;但不知道从什么时候开始就不再用了。时间一天天过去&#xff0c;我们的热情、记忆都在消退&#xff0c;还…

[巨详细]使用HBuilder-X新建uniapp项目教程

文章目录 安装HBuilder-X启动uniapp项目其他&#xff1a;下载预览浏览器下载终端插件 安装HBuilder-X 详细步骤可看上文》》 启动uniapp项目 先打开HBuilder-X 点击新建项目 选择uniapp侧边栏&#xff0c;mian中的点击浏览 选择已经安装到本地的uniapp项目&#xff0c;并输…

数据分析中的数学:从基础到应用20240617

数据分析中的数学&#xff1a;从基础到应用 数据分析离不开数学的支持&#xff0c;统计学和概率论是其重要组成部分。本文将通过几个具体的实例&#xff0c;详细讲解数据分析中常用的数学知识&#xff0c;并通过Python代码演示如何应用这些知识。 1. 描述性统计 基本概念和用…

运营一个商城网站需要办理什么许可证?

搭建一个商城网站以下资质是必须要办理的&#xff1a;网站ICP备案以及增值电信业务经营许可证。 一、网站ICP备案 国家对提供互联网信息服务的ICP实行许可证制度。从而&#xff0c;ICP证成为网络经营的许可证&#xff0c;经营性网站必须办理ICP证&#xff0c;否则就属于非法经营…

做好六西格玛项目,效率翻倍不是事!——张驰咨询

六西格玛作为一种数据驱动、客户为中心的持续改进方法&#xff0c;旨在通过减少过程变异和缺陷&#xff0c;提升业务效率和产品质量。以下是六西格玛项目执行的专业流程&#xff1a; 1. 定义阶段&#xff08;Define&#xff09; 识别机会&#xff1a;明确项目范围和目标&#…

Stable Diffusion 3 Medium 正式开源,用户对此产品评价如何?

前两天 Stability.AI 终于开源了 Stable Diffusion 3&#xff0c;虽然只是中杯的 Medium 版本&#xff0c;没有放出当初宣布的 8B 版本[1]&#xff0c;但也在很多方面取得了进步。本想第一时间尝鲜测试&#xff0c;但这几天出差在外&#xff0c;使用颇不方便。 正好老朋友揽睿…

【大分享05】动态容差归档,打通不动产登记管理“最后一公里”

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章&#xff0c;来自上海涵妍档案信息技术有限责任公司&#xff0c;作者&#xff1a;陈雪。 一、政策背景 在“互联网政务服务”的浪潮下&#xff0c;各级政府机构…

镭眸T51三维深度成像激光雷达为移动叉车导航及避障保驾护航

如今&#xff0c;移动叉车在智慧工厂里应用非常广泛&#xff0c;因此移动叉车如何做到准确导航及精准避障显得至关重要&#xff01;镭眸 T51 三维深度成像激光雷达为移动叉车的导航及避障提供了解决方案&#xff01; 镭眸 T51 三维深度成像激光雷达具有高精度、自适应自动曝光、…

如何使用ChatGPT等大模型翻译视频?2024最新翻译技巧分享

随着全球化的浪潮&#xff0c;跨语言沟通的需求日益增长。视频&#xff0c;作为一种生动直观的表达方式&#xff0c;也越来越需要跨越语言的障碍&#xff0c;触达更广泛的受众。因此&#xff0c;视频翻译成为了一个重要的领域&#xff0c;为不同语言背景的人们打开了理解彼此、…

MyBatis Plus Generator代码生成

一、MyBatis Plus Generator MyBatis Plus是一个功能强大的持久层框架&#xff0c;它简化了MyBatis的使用&#xff0c;提供了许多便捷的功能。其中&#xff0c;MyBatis Plus Generator是一个强大的代码生成器&#xff0c;可以帮助我们快速地根据数据库表结构生成对应的实体类、…

Java基础-案例练习-全是干货

目录 案例&#xff1a;卖飞机票 案例&#xff1a;找质数&#xff1a; 案例&#xff1a;开发验证码 案例&#xff1a;评委打分 案例&#xff1a;卖飞机票 package anlixunlian;import java.util.Scanner;/*机票价格按照淡季旺季、头等舱和经济舱收费、 输入机票原价、月份和…

使用Ollama+OpenWebUI本地部署阿里通义千问Qwen2 AI大模型

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月17日22点50分 &#x1f004;️文章质量&#xff…