美文网首页
day32 文件上传 提取代码 订单展示

day32 文件上传 提取代码 订单展示

作者: 路人爱早茶 | 来源:发表于2017-10-29 21:48 被阅读0次

    ----------文件上传

    • 文件上传是使用ajax一个工具来接受request得到的数据,其中上传到requset需要注意type,name,和上传方式enctype,形成文件块,之后使用特殊接口将文件快加以识别取出相应的上传文件部分,其中可以设置缓存大小,缓存位置,存储位置和存完即删除缓存等设置。
    • 上传接受(需注意中文问题)上传可设置缓存大小,和缓存位置
    ----------html上传时候会分文件块自动,但接受需要手动(接受并写入服务器)
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                try {
                //接受上传文件
                //1、创建磁盘文件项工厂
                DiskFileItemFactory factory = new DiskFileItemFactory();
                //2、创建文件上传的核心类
                ServletFileUpload upload = new ServletFileUpload(factory);
                
                //3、解析request---获得文件项集合
                List<FileItem> parseRequest = upload.parseRequest(request);
    
                //4、遍历文件项集合
                for(FileItem item : parseRequest){
                    //5、判断普通表单项/文件上传项
                    boolean formField = item.isFormField();//是否是一个普通表单项
                    if(formField){
                        //普通表单项
                        String fieldName = item.getFieldName();
                        String fieldValue = item.getString();
                        System.out.println(fieldName+":"+fieldValue);
                    }else{
                        //文件上传项
                        //获得上传文件的名称
                        String fileName = item.getName();
                        //获得上传文件的内容
                        InputStream in = item.getInputStream();
                        //将in中的数据拷贝服务器上
                        String path = this.getServletContext().getRealPath("upload");
                        OutputStream out = new FileOutputStream(path+"/"+fileName);
                        int len = 0;
                        byte[] buffer = new byte[1024];
                        while((len=in.read(buffer))>0){
                            out.write(buffer, 0, len);
                        }
                        in.close();
                        out.close();
                    }
                }
                    } catch (FileUploadException e) {
                e.printStackTrace();
            }
                }
    ----------------------api运用
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            try {
    
                //1、创建磁盘文件项工厂
                //作用:设置缓存文件的大小  设置临时文件存储的位置
                String path_temp = this.getServletContext().getRealPath("temp");
                //DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, new File(path_temp));
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold(1024*1024);
                factory.setRepository(new File(path_temp));
                //2、创建文件上传的核心类
                ServletFileUpload upload = new ServletFileUpload(factory);
                //设置上传文件的名称的编码
                upload.setHeaderEncoding("UTF-8");
                //ServletFileUpload的API
                boolean multipartContent = upload.isMultipartContent(request);//判断表单是否是文件上传的表单
                if(multipartContent){
                    //是文件上传的表单
                    //***解析request获得文件项集合
                    List<FileItem> parseRequest = upload.parseRequest(request);
                    if(parseRequest!=null){
                        for(FileItem item : parseRequest){
                            //判断是不是一个普通表单项
                            boolean formField = item.isFormField();
                            if(formField){
                                //username=zhangsan
                                String fieldName = item.getFieldName();
                                String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码
                                
                                System.out.println(fieldName+"----"+fieldValue);
                                
                                //当表单是enctype="multipart/form-data"时 request.getParameter相关的方法
                                //String parameter = request.getParameter("username");
                                
                            }else{
                                //文件上传项
                                //文件的名
                                String fileName = item.getName();
                                //获得上传文件的内容
                                InputStream in = item.getInputStream();
                                String path_store = this.getServletContext().getRealPath("upload");
                                OutputStream out = new FileOutputStream(path_store+"/"+fileName);
                                IOUtils.copy(in, out);
                                in.close();
                                out.close();
                                
                                //删除临时文件
                                item.delete();                                           }
                }               }
                }else{
                    //不是文件上传表单
                    //使用原始的表单数据的获得方式 request.getParameter();
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }}
    
    • 环境分tom服务器和本地
    • 使用阿帕奇的工具fileupload来接受上传的内容
    Paste_Image.png
    • 必须是post提交,type必须file,必须有name;"multipart/form-data多部分表单
    Paste_Image.png
    <body>
        <form action="/WEB32/fileuploadServlet2" method="post" enctype="multipart/form-data">
            <input type="text" name="username"><br>
            <input type="file" name="filename"><br>
            <input type="submit" value="上传文件">
        </form>
    </body>
    

    ---------用户注销要记得把自动登录的cookie同样删掉

        //用户注销
        public void logout(HttpServletRequest request, HttpServletResponse response) throws IOException{
            HttpSession session = request.getSession();
            //从session中将user删除
            session.removeAttribute("user");
            
            //将存储在客户端的cookie删除掉
            Cookie cookie_username = new Cookie("cookie_username","");
            cookie_username.setMaxAge(0);
            //创建存储密码的cookie
            Cookie cookie_password = new Cookie("cookie_password","");
            cookie_password.setMaxAge(0);
            response.addCookie(cookie_username);
            response.addCookie(cookie_password);
            response.sendRedirect(request.getContextPath()+"/login.jsp");           }   
    

    ------------------提取代码权限控制

    • filter过滤,使用注意转成http,xml配置要配置在自动登录后面(主要看mapping顺序)否则自动登录失效
    ---------xml--将需要过滤的都写在同一个虚拟目录下
        <!-- 用防护登录权限配置在自动登录的后面 -->
        <!-- <filter>
            <filter-name>UserLoginPrivilegeFilter</filter-name>
            <filter-class>com.itheima.web.filter.UserLoginPrivilegeFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>UserLoginPrivilegeFilter</filter-name>
            <url-pattern>/privilege/*</url-pattern>
        </filter-mapping> -->
        
    -------filter
    public class UserLoginPrivilegeFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            // 校验用户是否登录----校验session是否存在user对象
            HttpSession session = req.getSession();
            // 判断用户是否已经登录 未登录下面代码不执行
            User user = (User) session.getAttribute("user");
            if (user == null) {
                // 没有登录
                resp.sendRedirect(req.getContextPath() + "/login.jsp");
                return;
            }
            chain.doFilter(req, resp);  }
    

    --------------我的订单集合

    • 使用maplisthandler把多表查询没有实体对应结果封装
    Paste_Image.png
    • 封装实体,一对一连表查,一对多分开sql而后搭配for循环
    • 可以通过一条sql查出三张表信息,但是会有信息重复
    Paste_Image.png
    -------两表联查(一对一)
    public List<Map<String, Object>> findAllOrderItemByOid(String oid) throws SQLException {
            QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
            String sql = "select i.count,i.subtotal,p.pimage,p.pname,p.shop_price from orderitem i,product p where i.pid=p.pid and i.oid=?";
            List<Map<String, Object>> mapList = runner.query(sql, new MapListHandler(), oid);
            return mapList;
        }
    ------------------servlet
    // 获得我的订单
        public void myOrders(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            HttpSession session = request.getSession();
            User user = (User) session.getAttribute("user");
            ProductService service = new ProductService();
            // 查询该用户的所有的订单信息(单表查询orders表)
            // 集合中的每一个Order对象的数据是不完整的 缺少List<OrderItem> orderItems数据
            List<Order> orderList = service.findAllOrders(user.getUid());
            // 循环所有的订单 为每个订单填充订单项集合信息
            if (orderList != null) {
                for (Order order : orderList) {
                    // 获得每一个订单的oid
                    String oid = order.getOid();
                    // 查询该订单的所有的订单项---mapList封装的是多个订单项和该订单项中的商品的信息
                    List<Map<String, Object>> mapList = service.findAllOrderItemByOid(oid);
                    // 将mapList转换成List<OrderItem> orderItems
                    for (Map<String, Object> map : mapList) {
    
                        try {
                            // 从map中取出count subtotal 封装到OrderItem中
                            OrderItem item = new OrderItem();
                            // item.setCount(Integer.parseInt(map.get("count").toString()));
                            BeanUtils.populate(item, map);
                            // 从map中取出pimage pname shop_price 封装到Product中
                            Product product = new Product();
                            BeanUtils.populate(product, map);
                            // 将product封装到OrderItem
                            item.setProduct(product);
                            // 将orderitem封装到order中的orderItemList中
                            order.getOrderItems().add(item);
                        } catch (IllegalAccessException | InvocationTargetException e) {
                            e.printStackTrace();
                        }   }   }   }
            // orderList封装完整了
            request.setAttribute("orderList", orderList);
            request.getRequestDispatcher("/order_list.jsp").forward(request, response);
        }
    

    相关文章

      网友评论

          本文标题:day32 文件上传 提取代码 订单展示

          本文链接:https://www.haomeiwen.com/subject/mqydpxtx.html