serlvet+jsp 利用反射填充实体类和完成文件上传

实现代码

注意,需要借助一个 jar 包。在下面参考中给出了详细地址

	/**
     * 添加书籍
     * 1.enctype="multipart/form-data":和一起不同
     * 获取表单元素,req.getParameter("name"):error
     * 2.文件上传:图片文件从浏览器保存到服务器端(第三方 FileUpload+id)
     * 3.路径
     *  注意虚拟路径和实际路径,文件存储都是要存储到实际路径中的,而访问可以通过虚拟路径
     * @param req
     * @param resp
     * @param out
     */
    private void add(HttpServletRequest req, HttpServletResponse resp, PrintWriter out) throws Exception {
        // 1 构建一个磁盘工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //1.1 设置大小
        factory.setSizeThreshold(1024*9);
        // 1.2 临时仓库
        File file = new File("D:\\IntelliJ_IDEA_Item\\bookItem\\web\\Images\\cover");
        if(!file.exists()){
            file.mkdir(); // 创建文件夹
        }
        // Repository:仓库
        factory.setRepository(file);

        // 2 文件上传+表单数据
        ServletFileUpload fileUpload = new ServletFileUpload(factory);

        // 3 将请求解析成一个 FileItem
        List<FileItem> fileItems = fileUpload.parseRequest(req);
        Book book = new Book();
        // 4 遍历 fileItems
        for (FileItem item : fileItems){
            // 对应表单域标签的 name 属性
            String fieldName = item.getFieldName();
            // 若表单域是文件类型
            if(!item.isFormField()){
                // 1. 获取上传的文件名:图片的文件名 文成.png
                String fileName = item.getName();
                if(fileName != null && !"".equals(fileName)){
                    // 避免文件替换:使用 UUID
                    // 2 获取后缀名 .png   文件的后缀名是不变的
                    String filterName = fileName.substring(fileName.lastIndexOf("."));
                    // 3 修改文件名    12321321321.png
                    fileName = UUID.randomUUID() + filterName;
                    // 保存到哪里
                    // 虚拟路径:Images/cover/1-1.png
                    // 文件的读写:实际路径 d://xx ---> 虚拟路径: Images/cover 对应的实际路径
                    // 获取服务器端存储图片的实际路径
                    String realPath = req.getServletContext().getRealPath("/Images/cover");
                    // d:/xx/xxx/ 12321321321.png
                    String filePath = realPath + "/" + fileName;
                    // 数据库表中的路径: Images/cover/101-1/png: 相对项目的根目录的位置
                    String dbPath = "Images/cover/"+fileName;
                    // 将图片 url 赋给对应的成员变量
                    setParameter(book,fieldName,dbPath);
                    // 保存文件
                    item.write(new File(filePath));
                }else{
                    System.out.println(fieldName + "has on img to upload");
                }
                // 表单域是普通类型
            }else{
                // 将其映射到
                String fieldValue = item.getString("utf-8"); // 防止乱码
                setParameter(book,fieldName,fieldValue);
            }
        }

        // 5 将信息保存到数据库
        int count = bookBiz.addBook(book);
        if(count > 0){
            out.println("<script>alert('添加书籍成功');location.href='book.let?type=query&pageIndex=1'</script>");
        }else {
            out.println("<script>alert('添加书籍失败');location.href='book_add.jsp';</script>");
        }
    }

    /**
     * 通过反射填充实体类属性字段
     * @param book 实体类
     * @param fieldName 字段名
     * @param fieldValue 实体类属性的值
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    private void setParameter(Book book,String fieldName,String fieldValue) throws NoSuchFieldException, IllegalAccessException {
        // getDeclaredField()方法返回一个Field对象,它反映此Class对象所表示的类或接口的指定已声明字段。name参数是一个字符串,指定所需的字段的简单名称。
        Field field = book.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        // 将 filedValue 从字符串转换为字段类型
        Object convert = ConvertUtils.convert(fieldValue, field.getType());
        // 给属性赋值
        field.set(book,convert);
    }

参考

代码参考
https://blog.csdn.net/u010018421/article/details/52831565
jar 包下载
https://www.cnblogs.com/wansiqi/p/14052270.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值