创建一个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”)获取相关得图片文件,进行读写操作。