本篇博文主要解决的问题是,自己制作的网页,如学生信息表,有头像需求,提供头像更改功能,并能根据上传的文件,实时更新并显示出来。
如下图效果
图1: 图2
图3
图4:
源代码:
jsp图片显示的代码:
<c:forEach var="Student" items="${sessionScope.list}">
<tr>
<%--注意图片的路径,必须配置虚拟路径,不然实时更新功能不能实现--%>
<td width="116px" height="116px"><img src="/upload/${Student.img}" align="center"></td>
<td>${Student.id}</td>
<td>${Student.name}</td>
<td>${Student.age}</td>
<td>${Student.score}</td>
<td><a href="javascript:void(0)" onclick="del(${Student.id})">删除</a>
<a href="javascript:void(0)" onclick="update1(${Student.id})">修改</a>
</td>
</tr>
</c:forEach>
图片上传的jsp源代码:
<td ><img src="/upload/<%=stu.getImg()%>" align="center" width="116px" height="116px">
<form action="imgUploadServlet" enctype="multipart/form-data" method="POST" >
头像文件: <input type="file" name="myfile"/><br>
<input type="submit" value="upload"/>
</form>
</td>
Servlet的源代码
package servlet;
import entity.Student;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@SuppressWarnings("all")
@WebServlet(value = "/imgUploadServlet",name = "ImgUploadServlet")
public class ImgUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext application = this.getServletContext();// 获取application
Student stu=(Student) application.getAttribute("upstu");
//1、设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//2、创建文件上传核心对象DiskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
//3、文件上传对象
ServletFileUpload upload = new ServletFileUpload(factory);
//设置相关参数
// upload.setHeaderEncoding("utf-8");//防止中文名乱码
// upload.setFileSizeMax(1024*1024*5);//单位:b
//4、解析request,将请求中的数据封装成FileItem
try {
List<FileItem> list = upload.parseRequest(request);
//遍历集合解析数据
for (FileItem item : list) {
if(item.isFormField()){//普通字段
}else{//表示是文件
//文件上传
//获取所上传的原来的文件名
// String filename =stu.getId()+".png";
//设置存储在文件中的文件名。 注意:对于头像的实时更新,同一个学生的头像的文件名,第一次和第二次上传后的文件名不能相同,否则实时更新功能可能时灵时不灵。
String filename =stu.getId()+"f"+new Date().getTime()+".png";
stu.setImg(filename);
//更新该学生的头像文件名
File fil = new File("G:\\JavaServlet_last\\day01\\src\\servlet\\student");
ArrayList<Student> list1 = new ArrayList<Student>();
if(fil.length()!=0) {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fil)); // 开启 对象输入流
try {
list1=(ArrayList<Student>) ois.readObject();
ois.close();
} catch (ClassNotFoundException e) {
}
}
for (int i = 0; i < list1.size(); i++) {
if(list1.get(i).getId()==stu.getId()){
list1.get(i).setImg(filename);
break;
}
}
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fil));
oos.writeObject(list1);
oos.close();
//确定存储路径
String filepath = "G:\\JavaServlet_last\\day01\\web\\img";
File file = new File(filepath);
if(!file.exists()){
file.mkdirs();
}
//拼接上传路径
filepath = filepath+File.separator+filename;
System.out.println(filepath);
//获取输入流
InputStream in = item.getInputStream();
//获取输出流
FileOutputStream out = new FileOutputStream(filepath);
//复制
IOUtils.copy(in, out);
out.close();
in.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
// response.sendRedirect("/updateServlet");
// request.getRequestDispatcher("/updateServlet").forward(request,response );
response.sendRedirect("/update01.jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response );
}
}
注意点:
1、图片的读取,必须使用虚拟路径;
2、同一个位置的图片的显示,存储在Servlet中的名称相邻两次不能一样;
(备注:这个项目完成了管理人员登陆功能,学生信息的添加,修改,删除,头像的更改功能,如有源代码需求,可私信)