创建一个java web项目
准备一个负责收集学生信息的网页add.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()));
}
}
创建一个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 list = (List) 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”)获取相关得图片文件,进行读写操作。