JavaWeb文件上传

举报
Bug 终结者 发表于 2023/02/01 15:37:29 2023/02/01
【摘要】 JavaWeb文件上传

JavaWeb文件上传

Hello,各位小伙伴好久不见,本周我们学习JavaWeb中最重要的技术之一,文件上传,该案例我会用一个小型的用户管理系统实现,一步步带入,内容通俗易懂,下面我们步入正题!

做一个简单的用户管理系统

功能如下

用户注册,参数有用户名,用户名密码,用户头像,

用户登录,登录成功后跳转至主页显示用户头像和名称,支持注销账号,注销账号后,页面跳转至登录页

==技术栈:后端采用JavaWebMySQL5.7Druid连接池、前端采用bootstrap框架结合jsp==

先上效果

完整操作项目演示:

包含:用户注册,用户登录,用户登录后显示用户信息,即头像,账号名,最右侧显示注销,点击注销后跳转至登录页

在这里插入图片描述

在这里插入图片描述

项目结构

Java源码

在这里插入图片描述

前端页面jsp

在这里插入图片描述

准备工作

数据表准备

t_user_info

CREATE TABLE `t_user_info` (
  `noid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `head_portrait_path` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`noid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Jar文件准备

项目所需jar包如下

在这里插入图片描述

jar文件放在WEB-INF/lib文件夹下,主要是为了安全。

文件上传需要的jar包:

在这里插入图片描述

jar文件我会同步资源,小伙伴们不用担心哦~

项目结构简介

本项目采用三层架构实现,即:service层、dao层、servlet层

  1. servlet层:

    由于之前的servlet层类增删改查的类太过于多,导致代码冗余,所以在jsp页面发送请求时,采用模块化的方式进行访问,例如:

    http://localhost/Blog/user/addUser 访问user模块的addUser

    http://localhost/Blog/user/getUserList 访问user模块的getUserList

    http://localhost/Blog/dept/addDept 访问dept的addDept

    http://localhost/Blog/dept/getDeptList 访问dept的getDeptList

    这样一个对应的类解决该类的所有对数据库的增删改查操作,提高了程序的可维护性,减少代码的冗余,提高了程序的健壮性。

    抽取出公共父类:BaseServlet

BaseServlet类核心代码

public class BaseServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1.获取浏览器请求的资源
		String uri = req.getRequestURI();
		//2.获取请求的方法名,最后斜线后面的内容
		String methodName = uri.substring(uri.lastIndexOf("/")+1);
		try {
			//3.根据方法名获取方法,通过反射获取
			Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
			//4.调用方法
			method.invoke(this, req, resp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  1. dao层

    dao层抽取出公共数据库连接类,BaseDao,基于db.properties配置文件连接本地数据库

db.properties配置文件:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1/db_blog?useSSL=true
username=root
password=111111

BaseDao核心代码

public class BaseDao {

	//采用单例模式实现,防止数据库连接超时
	private static DataSource ds = null;
	
	public QueryRunner initQueryRunner() throws Exception {
		if (ds == null) {
			String dbFile = this.getClass().getClassLoader().getResource("/").getFile();
			dbFile = dbFile.substring(1) + "db.properties";
			
			FileReader fr = new FileReader(dbFile);
			
			Properties pro = new Properties();
			pro.load(fr);
			
			ds = DruidDataSourceFactory.createDataSource(pro);
		}
		QueryRunner qur = new QueryRunner(ds);
		return qur;
	}
}

Userservlet核心代码

@WebServlet("/user/*")
public class UserServlet extends BaseServlet{

	//业务层类,用于调用业务层方法
	UserService userService = new UserServiceImpl();
	
	/**
	 * 注册用户
	 * @param req
	 * @param resp
	 */
	public void register(HttpServletRequest req, HttpServletResponse resp) {
		//获取数据
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload fileUpload  = new ServletFileUpload(factory);
		try {
			List<FileItem> fileItemList = fileUpload.parseRequest(req);
			//获取当前项目的路径
			String classesPath = this.getClass().getResource("/").getPath();
			
			File f1 = new File(classesPath);
			//项目路径
			String projectPath = f1.getParentFile().getParentFile().getParentFile().getAbsolutePath();
			
			//最后上传的路径
			String uploadPath = projectPath + "\\ROOT\\upload\\";
			
			File f2 = new File(uploadPath);
			if (!f2.exists()) {
				f2.mkdirs();
			}
			//存入数据库的路径
			String headPortraitPath = "";
			for (FileItem fileItem : fileItemList) {
				if (!fileItem.isFormField()) {
					//是文件域
					String fileName = fileItem.getName();
					//获取原来文件的后缀
					String suffix = fileName.substring(fileName.lastIndexOf("."));
					//生成新的文件名,为防止重复,采用随机数
					String destFileName = UUID.randomUUID().toString().replace("-", "");
					
					//存入数据库的路径拼接完毕,例如格式:随机文件名.txt
					headPortraitPath = destFileName + suffix;
					//写入硬盘的路径
					uploadPath += headPortraitPath;
					//获取输入流
					InputStream is = fileItem.getInputStream();
					//输出流
					FileOutputStream fos = new FileOutputStream(uploadPath);
					//将上传的文件写入指定路径
					try {
						byte[] buf = new byte[10240];
						while (true) {
							int realLen = is.read(buf, 0, buf.length);
							if (realLen < 0) {
								break;
							}
							fos.write(buf, 0, realLen);
						}
					} finally {
						if (fos != null)
							fos.close();
						if (is != null)
							is.close();
					}
				} else {
					//不是文件域,是普通控件
					//获取输入框的名称
					String fieldName = fileItem.getFieldName();
					//获取输入框中的值
					String fieldVal = fileItem.getString("utf-8");
					//加入请求域中
					req.setAttribute(fieldName, fieldVal);
				}
			}
			String username = (String) req.getAttribute("username");
			String password = (String) req.getAttribute("password");
			//验证参数是否合法,不为空
			boolean flag = userService.exam(username, password);
			if (flag) {
				//将数据存入数据库
				User user = new User();
				user.setUsername(username);
				user.setPassword(password);
				user.setHead_portrait_path(headPortraitPath);
				if (userService.save(user)) {
					resp.sendRedirect(req.getContextPath()+"/login.jsp");
				}
			} else {
				resp.sendRedirect(req.getContextPath()+"/register.jsp");
			}
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	
	/**
	 * 用户登录
	 * @param req
	 * @param resp
	 */
	public void login(HttpServletRequest req, HttpServletResponse resp) {
		//获取数据
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		//验证是否存在该用户
		User user = new User();
		try {
			if (userService.exam(username, password)) {
				user.setUsername(username);
				user.setPassword(password);
				user = userService.getByUser(user);
				if (user.getHead_portrait_path() != null) {
					HttpSession s1 = req.getSession();
					s1.setAttribute("user", user);
					resp.sendRedirect(req.getContextPath()+"/index.jsp");
				} else {
					resp.sendRedirect(req.getContextPath()+"/login.jsp");
				}
			} else {
				resp.sendRedirect(req.getContextPath()+"/login.jsp");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
}

博主絮语

千言万语不舍,但美好的时光总是短暂的,博主本周分享就到此结束了,本周博客主题:文件上传

制作不易,博主愿与各位前辈大佬共学习,共前进,编程之路任重道远,艰辛,我们共前进,克服难关,挺过去,就是彩虹,风雨过后就是彩虹,加油,愿我们成为想要成为的人!

都看到这里了,不确定来个一键三连么~

我们下周见~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。