Maven补充

发布于:2025-08-08 ⋅ 阅读:(302) ⋅ 点赞:(0)

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 {
    @Override
    protected 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);
        }
    }
​
    @Override
    protected 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 {
    @Override
    protected 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;
    }
​
​
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​
    }
}
​

<?xml version="1.0" encoding="UTF-8"?>
<web-app
        xmlns="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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/r2/image");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
        xmlns="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 {
    @Override
    protected 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);
​
​
​
    }
​
    @Override
    protected 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: puton
  Date: 2025/8/2
  Time: 22:07
  To 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-app
        xmlns="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>
​

网站公告

今日签到

点亮在社区的每一天
去签到