文件上传与数据库及JSP实时相连

文件上传的三大要点
一、在文件上传时,表单一定要加enctype=“multipart/form-data” 。
        只有使用enctype=“multipart/form-data”,表单才会把文件的内容编码到HTML请求中。
        默认enctype=“application/x-www-form-urlencoded”,表单的内容会按URL规则编码。
        而enctype="multipart/form-data"不对字符编码。在使用包含文件上传控件的表单时,必须使                              用该值。
二、method也一定要使用post请求。因为get请求会有大小的限制。

三、input-->type的属性值必须为--file

文件上传所需的两个jar包

 

文件上传JSP

<form action="ShouJiServlet?op=wenjianshangchuan" enctype="multipart/form-data" method="post">
<input type="text" name="oprice">
<input type="file" name="img"/>
<input type="text" name="color">
<input type="submit" value="submit">
</form>

 action="ShouJiServlet?op=wenjianshangchuan":表示提交表单后,将表单交给ShouJiServlet(Servlet)中的wenjianshangchuan方法(方法名)

op

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//获取到前端的op值
        String op = req.getParameter("op");

//判断op是否为空 是空 默认就是进selectall方法
//不为空 op在前端等于什么方法名,走的就是什么方法
        op = op == null ? "selectall" : op;

        try {
//反射当前这个类 getClass
//调用这个类中的方法 因为方法修饰符为受保护的(protected)
//所以要用getDeclaredMethod这个方法调用
//传参是个两参一个String一个可变长
//op(对应的方法)后边两个是反射该方法的参数
            Method method = getClass().getDeclaredMethod(op, HttpServletRequest.class, HttpServletResponse.class);
//因为方法是受保护的所以要用Method对象忽略掉访问权限修饰符
//true为忽略
            method.setAccessible(true);
//调用方法invoke
//参数this当前这个方法,及方法的参数
            method.invoke(this, req, resp);

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

文件上传Servlet

//此类继承BaseSerlvetlet 来为op进行传值
public class ShouJiServlet extends BaseServlet {

//实现这个ShouJiServiceImpl类
//里面有添加的方法
private IShouJiService iss = new ShouJiServiceImpl();

protected void wenjianshangchuan(HttpServletRequest request, HttpServletResponse response) throws IOException {

//创建实体类对象 给他添加数据 数据库中要有对应的表与字段
        ShouJi shouJi = new ShouJi();

        /*1判断上传的数据是否为多段 (一个input为一段 多段的才是 文件上传)*/
        if (ServletFileUpload.isMultipartContent(request)){


            /*创建解析工具类对象--->又需要一个工厂的实现类  所以 创建 工厂实现类
            创建磁盘文件项工厂 处理文件上传路径或者大小限制*/
            FileItemFactory ff = new DiskFileItemFactory();


          /*创建解析工具类对象 因为拿到的中文数据是乱码状态 解析之后就好了 所以要解析类对象*/
            ServletFileUpload sfu = new ServletFileUpload(ff);


            try {

                /*对象创建好啦 调用解析方法 返回的就是 解析的数据集合*/
                List<FileItem> list = sfu.parseRequest(request);


                /*那么这个集合中有 普通的表单项(type为 text / password...)
                *            又有 文件表单项
                * 不同的项 我们执行方式 就不同 所以 接下来就判断 是普通的 还是 文件的项
                * 又因 返回的是 数据集合 所以 是多个表单项
                * 那么 如何能够 判断到 每一个表单项的类型
                * 所有 要 循坏遍历 每个项的 本质(表单项还是普通项)*/

                for (FileItem fileItem : list) {
                    /*isFormField 判断是否是普通的 表单项
                    * 是   返回 true  执行其中的代码
                    * 不是 返回 false 执行else中的代码*/

                    if (fileItem.isFormField()){
                        /*普通表单项
                        * 关注的点
                        * 表单中 name的属性值
                        * 表单中 value的值*/

       System.out.println("普通表单项中的name属性值为:"+fileItem.getFieldName());

                        /*UTF-8可以解决中文乱码问题*/
       System.out.println("普通表单项中的value属性值为:"+fileItem.getString("UTF-8"));


//这段就是将数据添加到集合中
//这是普通表单项的  img的文件项在else中
//fileItem.getFieldName() 拿到数据解析后的input的name的属性值

//是否包含我们前端input的name的属性值  oprice color
//包含 所以 拿到对应的数据fileItem.getString("UTF-8")
//添加至数据库JDBC实现连接  写个新增数据的接口
//类对象调用 实体类中对应属性的set 将数据添加进去
                        
                        if (fileItem.getFieldName().equals("oprice")){
                  shouJi.setOprice(Double.parseDouble(fileItem.getString("UTF-8")));
                        }
                        if (fileItem.getFieldName().equals("color")){
                  shouJi.setColor(fileItem.getString("UTF-8"));
                        }


                    }else {

                        /*上传文件 表单项
                        * 表单中 name的属性值
                        * 表单中 value的值*/

      System.out.println("文件表单项中的name属性值为:"+fileItem.getFieldName());

      System.out.println("文件表单项中的文件名(图片的名字)为:"+fileItem.getName());

                        String name = fileItem.getName();
                        System.out.println(name+"name===========");

      /*将上传的图片写到项目中的 img(存放图片的目录)*/
fileItem.write(new File("E:\\qftx\\two\\day46project\\code\\untitled\\web\\img\\"+name));

                        if (fileItem.getFieldName().equals("img")){
                            shouJi.setImg(fileItem.getName());
                        }

                    }
                }
//调用了接口中的添加方法  将实体类的对象 放进去 就添加到数据库了 
                boolean insert = iss.insert(shouJi);
                if (insert){
                    System.out.println("添加成功");

//添加进去后 重定向到  有跳转到列表页面的  Servlet的方法中
                    response.sendRedirect("ShouJiServlet?op=shoujipage");
                }

            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

拿到数据库的数据 做成表格展示出来的实时数据

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值