利用ServletContext对象进行模拟添加保存学生信息

创建一个java web项目
准备一个负责收集学生信息的网页add.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加页面</title>
</head>
<body>
    <form action="/add" method="post" enctype="multipart/form-data">
        名字<input type="text" placeholder="请输入名字" name="name"><br>
        年龄<input type="text" placeholder="输入年龄" name="age"><br>
        上传头像<input type="file" name="img"><br>
        <input type="submit">
    </form>
</body>
</html>
学生类
package com.yunlian.servelt;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//使用lombok 插件 简化 get set toString
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {
    private String name;
    private int age;
    private String imgSrc;
}

创建一个Servlet创建一个保存学生类得集合,通过集合工具类保证其线程安全
package com.yunlian.servelt;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.util.ArrayList;
import java.util.Collections;

//这是一个 专门初始化的 servlet ,他的优先级最高 一启动服务 就进行初始化
// 只初始化一次
@WebServlet(value = "/init", loadOnStartup = 0)
public class InitServket extends HttpServlet {

    @Override
    public void init() throws ServletException {
        ServletContext servletContext = this.getServletContext();
        //将 学生集合 变成一个线程安全的集合
        servletContext.setAttribute("list", Collections.synchronizedList(new ArrayList<Student>()));
    }
}

创建一个Servlet类,进行处理用户信息
package com.yunlian.servelt;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

//必须要继承servlet
//必须重写 doget dopost
@WebServlet("/add")
@MultipartConfig
public class AddStudentServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //统一设置请求和响应的编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //req  处理请求
        //      1:获取 注册页面学生添加的信息
        String name = req.getParameter("name");
        int age = Integer.parseInt(req.getParameter("age"));
        //             获得上传的图片 保存在 WEB-INF 下的 img
        Part imgPart = req.getPart("img");
        String realPath = req.getServletContext().getRealPath("/WEB-INF/img/");
        String imgName = UUID.randomUUID().toString();// 获得一个不会重复的 图像名字 名
        Files.copy(imgPart.getInputStream(), Paths.get(realPath+imgName+".jpg"));

        //      2:封装成对于的 java对象
        Student student = new Student(name,age,imgName+".jpg");
        
        //      3:将注册的数据保存起来(永久保存) --->数据库
        List<Student> list = (List<Student>) req.getServletContext().getAttribute("list");
        list.add(student);

        //resp 处理响应
        //  告知浏览器 添加成功

        resp.getWriter().println("添加成功,");

        System.out.println(list);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
}
总结
  • 在add.html的页面,一定要添加enctype="multipart/form-data"标识,multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。使用了其标记,才能传输图片等二进制形式得文件
  • 在AddStudentServlet要添加注解@MultipartConfig配置该Servlet,才可以通过req.getPart(“img”)获取相关得图片文件,进行读写操作。
上一篇:2021-2022-1 20211419熊悠越《信息安全专业导论》第12周学习总结


下一篇:Servlet的Maven 依赖和web.xml