JavaWeb文件上传

简介: 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();
        }
    }
    
}

博主絮语

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

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

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

我们下周见~

相关文章
|
10天前
|
Java
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
本文介绍了如何使用IDEA(IntelliJ IDEA)创建一个新的Java项目,并运行一个简单的Java程序输出"Hello Word"。文章详细展示了创建项目的步骤,包括选择JDK版本、设置项目名称和路径、创建包和类,以及编写和运行代码。最后,还展示了如何通过IDEA的运行功能来执行程序并查看输出结果。
32 4
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
|
10天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
27 1
|
4天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
12 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
21天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
176 37
|
21天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
6天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
18 4
|
5天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
22 2
|
9天前
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
44 4
|
15天前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
1月前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
下一篇
无影云桌面