当前位置: 首页 > news >正文

Maven补充

HttpServletResponse

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

  • 如果要获取客户端请求过来的参数:找HttpServletRequest

  • 如果要给客户端响应一些信息:找HttpServletResponse

常见应用

1.下载文件

  • 要获取下载文件的路径

  • 下载的文件名是什么

  • 设置想办法让浏览器能够支持下载我们需要的东西

  • 获取下载文件的输入流

  • 创建缓冲区

  • 获取OutputStream对象

  • 将FileOutputStream流写入到buffer缓冲区

  • 使用Output Stream将缓冲区中的数据输出到客户端

​
package com.lyj.servlet;
​
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
​
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
​
public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 获取下载文件的路径(建议使用相对路径,避免硬编码绝对路径)String realPath = "C:\\Users\\puton\\IdeaProjects\\MavenClear\\Response2\\src\\main\\resources\\img.png";System.out.println("下载文件的路径:" + realPath);
​// 2. 获取下载的文件名String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
​// 3. 处理中文文件名(URLEncoder编码)String encodedFilename = URLEncoder.encode(filename, "UTF-8");
​// 4. 设置响应头,支持文件下载resp.setHeader("Content-Disposition", "attachment; filename=" + encodedFilename);// 设置内容类型为二进制流(通用格式)resp.setContentType("application/octet-stream");
​// 5. 获取文件输入流和响应输出流try (FileInputStream in = new FileInputStream(realPath);ServletOutputStream out = resp.getOutputStream()) {
​// 6. 创建缓冲区并写入数据byte[] buffer = new byte[1024];int len;// 读取到的字节数不为-1时继续循环while ((len = in.read(buffer)) != -1) {out.write(buffer, 0, len);}// 强制刷新输出流out.flush();} catch (IOException e) {e.printStackTrace();throw new ServletException("文件下载失败", e);}}
​@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// POST请求复用GET的处理逻辑doGet(req, resp);}
}

2.实现验证码功能

  • 前端实现

  • 后端实现,需要用到Java的图片类,生产一个图片

package com.lyj.servlet;
​
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
​
import javax.imageio.ImageIO;
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 {//如何让浏览器三秒自动刷新一次resp.setHeader("refresh","3");
​//在内存中创建一张图片BufferedImage bufferedImage = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
​//得到图片Graphics2D g = (Graphics2D) bufferedImage.getGraphics();//笔
​//设置图片的背景颜色g.setColor(Color.white);g.fillRect(0,0,100,100);
​//给图片写数据g.setColor(Color.blue);g.setFont(new Font("Times New Roman",Font.BOLD,20));g.drawString(makeNum(),0,20);
​//告诉浏览器,这个请求用图片的方式打开resp.setContentType("image/jpeg");//网站存在缓存,不让浏览器缓存resp.setDateHeader("Expires",-1);//使用 Cache-Control 头(如 no-cache 或 max-age=0)来控制缓存,因为它比 Expires 更灵活且优先级更高
//        // 设置 Cache-Control 头,禁止缓存resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
//        // 兼容 HTTP 1.0 协议resp.setHeader("Pragma", "no-cache");
​
​//把图片写给浏览器ImageIO.write(bufferedImage,"JPEG",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');}String s= sb.toString()+num;return num;}
​
​
​@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​}
}
​

<?xml version="1.0" encoding="UTF-8"?>
<web-appxmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"version="6.0"><display-name>Welcome to Tomcat</display-name><description>Welcome to Tomcat</description>
​<servlet><servlet-name>filedown</servlet-name><servlet-class>com.lyj.servlet.FileServlet</servlet-class></servlet><servlet-mapping><servlet-name>filedown</servlet-name><url-pattern>/down</url-pattern></servlet-mapping>
​
​<servlet><servlet-name>ImageServlet</servlet-name><servlet-class>com.lyj.servlet.ImageServlet</servlet-class></servlet><servlet-mapping><servlet-name>ImageServlet</servlet-name><url-pattern>/image</url-pattern></servlet-mapping>
​
​
​
</web-app>
​

3.实现重定向

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

常见场景:

  • 用户登录

测试

package com.lyj.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("/r2/image");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-appxmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"version="6.0"><display-name>Welcome to Tomcat</display-name><description>Welcome to Tomcat</description>
​<servlet><servlet-name>filedown</servlet-name><servlet-class>com.lyj.servlet.FileServlet</servlet-class></servlet><servlet-mapping><servlet-name>filedown</servlet-name><url-pattern>/down</url-pattern></servlet-mapping>
​
​<servlet><servlet-name>ImageServlet</servlet-name><servlet-class>com.lyj.servlet.ImageServlet</servlet-class></servlet><servlet-mapping><servlet-name>ImageServlet</servlet-name><url-pattern>/image</url-pattern></servlet-mapping>
​
​<servlet><servlet-name>RedirctServlet</servlet-name><servlet-class>com.lyj.servlet.RedirectServlet</servlet-class></servlet><servlet-mapping><servlet-name>RedirctServlet</servlet-name><url-pattern>/redirect</url-pattern></servlet-mapping>​
</web-app>
​

4.面试题

请你了了重定向和转发的区别?

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

不同点:

请求转发的时候,url不会产生变化 307

重定向的时候,url地址栏会发生变化 302

HttpServletRequest

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

获取前端传递的参数

getParameter(String s) String

getParameterValues(String s) String[]

LoginServlet

package com.lyj.servlet;
​
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.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 {resp.setContentType("text/html;charset=UTF-8");req.setCharacterEncoding("UTF-8");
​String username = req.getParameter("username");String password = req.getParameter("password");String[] hobbys = req.getParameterValues("hobbys");System.out.println("=======================");System.out.println("username: " + username);System.out.println("password: " + password);System.out.println("hobbys: " + Arrays.toString(hobbys));
​req.getRequestDispatcher("/success.jsp").forward(req, resp);
​
​
​}
​@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
​

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>index</title>
</head>
<body>
​
<h1>登录</h1>
​
<div style="text-align: center"><%--    以post方式提交表单,提交到login1请求--%><form action="${pageContext.request.contextPath}/login" method="post">用户名<input type="text" name="username">密码<input type="password" name="password">爱好<input type="checkbox" name="hobbys" value="111">111<input type="checkbox" name="hobbys" value="222">222<input type="checkbox" name="hobbys" value="333">333<input type="checkbox" name="hobbys" value="444">444<br><input type="submit"></form>
​
</div>
​
</body>
</html>

success.jsp

<%--Created by IntelliJ IDEA.User: putonDate: 2025/8/2Time: 22:07To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>success</title>
</head>
<body>
<h1>SUCCESS</h1>
</body>
</html>
​

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-appxmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"version="6.0"><display-name>Welcome to Tomcat</display-name><description>Welcome to Tomcat</description>
​<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.lyj.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>
</web-app>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Request01</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>Request01 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>compile</scope></dependency>
​<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency></dependencies><build><finalName>Request01</finalName></build>
</project>
​
http://www.dtcms.com/a/317094.html

相关文章:

  • 【Linux内核系列】:信号(上)
  • HTML应用指南:利用GET请求获取全国OPPO官方授权体验店门店位置信息
  • nflsoi 8.6 题解
  • 【JavaEE】(8) 网络原理 HTTP/HTTPS
  • 使用MatterJs物理2D引擎实现重力和鼠标交互等功能,有点击事件(盒子堆叠效果)
  • GaussDB 数据库架构师修炼(六)-3 集群工具管理-主备倒换
  • CentOS7中Docker的安装与卸载
  • 8.6 CSS3rem布局
  • 聊一聊RPC接口测试工具及方法
  • 基于串口实现可扩展的硬件函数 RPC 框架(附完整 Verilog 源码)
  • 【第5话:相机模型1】针孔相机、鱼眼相机模型的介绍及其在自动驾驶中的作用及使用方法
  • 【计算机网络】王道考研笔记整理(3)数据链路层
  • 自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网
  • STM32 外设驱动模块二:蜂鸣器模块
  • 工控机 vs 服务器:核心区别与应用场景深度解析
  • 支持多网络协议的测试工具(postman被无视版)
  • Cortex-M MCU分散加载文件与链接文件关系
  • WebSocket 通信与 WebSocketpp 库使用指南
  • 哈尔滨云前沿-关于物理服务器
  • 计算机网络:一个 IP 地址可以同时属于 A 类、B 类或 C 类吗?
  • Anthropic MCP架构深度解析:下一代AI工具集成协议的设计哲学
  • 乱码原因、解决
  • SSL/TLS协议深度解析
  • Agent安全机制:权限控制与风险防范
  • React 表单处理:移动端输入场景下的卡顿问题与防抖优化方案
  • OpenAI最新开源:GPT-OSS原理与实践
  • OpenAI 开源GPT OSS系列模型
  • 【第6话:相机模型2】相机标定在自动驾驶中的作用、相机标定方法详解及代码说明
  • Ansys Discovery 2025R2的主要增强功能:CFD仿真的亮点
  • ubuntu 22.04 中安装python3.11 和 3.11 的 pip