使用Map封装请求信息并显示

使用Map封装请求信息并显示

使用Map封装请求信息并显示_第1张图片
upload.jsp表单文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>




Insert title here


	

文件上传


${errorMsg}
账号:
邮箱:
头像:

自定义异常类(LogicException):

public class LogicException extends RuntimeException{
	private static final long serialVersionUID = 1L;

	public LogicException(String message, Throwable cause) {
		super(message, cause);
	}

	public LogicException(String message) {
		super(message);
	}
	
}

一、新建一个对象类(如:user)

@Data
public class User {
	private String username = null;
	private String email = null;
	private String imageUrl = null;//图片保存的路径  (JSP:)
	private String imageName = null;//图片的原始名称
}

二、在调用者类(UplocalServlet.java)中获得upload.jsp传入的参数值,并赋值给user对象,再在user.jsp中显示;

@WebServlet("/upload")
public class UploadServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;
	

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			User user = new User();
			//-------------------往user对象中传入数据-------------------------
			//封装普通表单的数据
			//key:参数名称
			//value:参数值
			Map fieldMap = new HashMap<>();
			//封装上传图片(因为要通过一个key获得两个value,所以对图片进行再封装)
			//key:参数名称
			//value:ImgFile对象同时封装了imgeUrl和imageName
			Map imgMap = new HashMap<>();
			
			FileUtil.upload(req,fieldMap,imgMap);
			
			user.setUsername(fieldMap.get("username"));
			user.setEmail(fieldMap.get("email"));
			
			user.setImageName(imgMap.get("headImg").getImageName());
			user.setImageUrl(imgMap.get("headImg").getImageUrl());
			
			//---------------------------------------------------------------
			System.out.println(user);
			System.out.println(fieldMap);
			System.out.println(imgMap);
			req.setAttribute("user", user);
			req.getRequestDispatcher("/user.jsp").forward(req, resp);
		}catch(LogicException e) {
			String errorMsg = e.getMessage();//获取异常信息
			req.setAttribute("errorMsg",errorMsg);
			req.getRequestDispatcher("/upload.jsp").forward(req, resp);
		}
	}
}

三、封装的ImgFile类(保存图片相对路径和真实名称)

@Data
public class ImgFile {
	private String imageUrl = null;//图片保存的路径  (JSP:)
	private String imageName = null;//图片的原始名称
}

四、使用自定义的工具类(FileUtil.java)进行接受处理upload.jsp传入的参数

public class FileUtil {
	
	//允许接受上传的文件类型(如:图片)
	private static final String ALLOWED_IMAGE_TYPE="png;gif;jpg;jpeg";

	public static void upload(HttpServletRequest req,Map fieldMap,Map imgMap){
		//解析和检查请求:请求方式是否是POST,请求编码是否是muitipart/form-data
		boolean isMultipart = ServletFileUpload.isMultipartContent(req);
		if(!isMultipart) {
			return;
		}
		try {
			//1.创建FileItemFactory对象
			//FileItemFactory是用来创建FileItem对象的
			//FileItem对象:form表单中的表单控件的封装
			DiskFileItemFactory factory = new DiskFileItemFactory();
			//2.创建文件上传处理器
			ServletFileUpload upload = new ServletFileUpload(factory);
			
				//设置单个上传文件的大小限制
				upload.setFileSizeMax(1024*1024*2);//2M
				//设置该次请求总数据大小限制
				upload.setSizeMax(1024*1024*3);//3M
			
			//3.解析请求
			List items = upload.parseRequest(req);
			//4.迭代出每一个FileItem
			for(FileItem item : items) {
				String fieldName = item.getFieldName();//获取表单控件的name属性值(参数名)
				if(item.isFormField()) {
				//普通表单控件
					//得到控件的参数值
					String value = item.getString("UTF-8");
					//存储控件名称(jsp文件中的name)和对应的value值,最后返回到调用者中进行读取
					fieldMap.put(fieldName,value);
				}else {
					//-----------------------判断上传文件格式是否符合要求------------
					//上传文件的拓展名
					String ext = FilenameUtils.getExtension(item.getName());
					String[] allowedImageType = ALLOWED_IMAGE_TYPE.split(";");
					
					//当前上传类型不再允许的范围内
					if(!Arrays.asList(allowedImageType).contains(ext)) {
						throw new LogicException("上传格式错误,请重新上传");
						
					}
					//----------------------------------------------------------
					//表单上传控件
					System.out.println("上传文件的名称:"+item.getName());
					//文件名称
					String fileName = UUID.randomUUID().toString()+"."
									+FilenameUtils.getExtension(item.getName());
					//目标的绝对路径"E:/JAVA/My_eclipseEE/upload-download-i18n/webapp/upload"
					String dir = req.getServletContext().getRealPath("/upload");
					//把二进制数据写到哪一个文件中
					item.write(new File(dir, fileName));	
					
					//-----------将图片中的真实名字和图片相对路径保存在imgMap中,最后返回给调用者-------------------------
					ImgFile img = new ImgFile();
					img.setImageUrl("/upload/"+fileName);
					img.setImageName(FilenameUtils.getName(item.getName()));
					imgMap.put(fieldName,img);
					//---------------------------------------------------
				}
			}
		}catch(FileSizeLimitExceededException e) {
			throw new LogicException("单个上传文件大小不能超过2M",e);//继续抛出异常类给该类调用者(UploadServlet)
		}catch(SizeLimitExceededException e) {
			throw new LogicException("该次请求大小不能超过3M",e);//继续抛出异常类给该类调用者(UploadServlet)
		}catch(LogicException e) {
			throw e;//继续抛出异常类给该类调用者(UploadServlet)
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

五、在user.jsp中显示表单输入的内容

<%@ page language="java" contentType="text/html; charset=UTF-8"%>




Insert title here


	${user}
名称:${user.username}
邮箱:${user.email}
头像:${user.imageName}



upload.jsp:
使用Map封装请求信息并显示_第2张图片

user.jsp:
使用Map封装请求信息并显示_第3张图片

你可能感兴趣的:(JSP)