mvc:五

回顾:
我的订单
    查询我的订单(订单基本信息)  select * from orders where uid = ?
    查询订单项列表  select * from orderitem oi,product p where oi.pid = p.pid and oi.oid = ?
    使用maplisthandler
订单详情
在线支付
  支付方式:  对银行  对第三方
  如何保证数据有效性?电子签名(将商场发送给第三方的数据用秘钥,算法生成一个不可逆的字符串)
权限过滤(一个filter,作用就是到达目标jsp servlet资源之前做的一件事)

后台所有分类展示

需求:  在左侧的树上上添加一个连接 "分类列表",点击分类列表 将所有的分类展示在右边的主页面上
步骤分析:
  1.在left.jsp上添加一个连接 父节点"分类管理",在分类管理下面添加一个子节点"分类列表"
    连接: /store/adminCategory?method=findAll

  2.编写adminCategoryservlet,继承baseservlet,编写findAll方法
    调用service 查询所有分类,返回值:List<Category>
    请求转发 /admin/category/list.jsp

后台添加分类

需求:在一个表单页面(点击添加按钮跳到页面)中,输入分类名称,点击保存,将分类保存到数据库
步骤分析:
  1.在left.jsp上添加一个连接 "添加分类"  /store/adminCategory?method=addUI

  2.在admincategoryservlet下编写addUI方法  请求转发到 /admin/category/add.jsp


  3.修改add.jsp,  action:/store/adminCategory?method=save  给分类input标签添加name属性

  4,点击保存,发送 adminCategory一个请求 请求方法:save  获取cname,设置cid  封装category对象
    调用service完成添加操作  重定向到分类列表页面

    //添加分类
    public String save(HttpServletRequest request, HttpServletResponse response) throws IOException {
        try {
            //1.封装category对象
            Category c = new Category();
            c.setCid(UUIDUtils.getId());
            c.setCname(request.getParameter("cname"));
            //2.调用service完成添加操作
            CategoryService cs = (CategoryService) BeanFactory.getBean("CategoryService");
            cs.save(c);
            //3.重定向
            response.sendRedirect(request.getContextPath()+"/adminCategory?method=findAll");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
        return null;
    }

  5.service  调用dao保存(我们第二天使用redis进行了优化,这里还要更新redis中的数据,优先从redis中获取,redis中获取不到才从数据库获取并保存在redis中)更新redis中数据(清空redis中该条记录)

 

分类中编辑分类,删除分类没有实现

后台展示所有商品

需求:
  点击左边树上的一个连接 "已上架商品列表",在右边的主页面上展示所有的商品

步骤分析:
  1.在left.jsp上添加一个连接 "已上架商品列表",  /store/adminProduct?method=findAll


  2.编写adminProductServlet,继承baseservlet,编写findAll方法

    调用service,获取所有的已上架的商品信息 返回值:list
    将list放入request中,请求转发 /admin/product/list.jsp

后台添加商品

需求:有一个商品的表单页面,填写商品信息,选择商品的图片,点击保存,将商品的信息保存到数据库中和web服务器上
技术分析:文件上传(之前做过一个商品的添加操作,只不过没有涉及到文件上传)

文件上传(通过网络将客户端图片上传到服务器上):

文件上传要求:
  浏览器端要求:1.表单提交方式 post(get参数大小有限制)  2.(得有选择的地方)提供文件上传框(组件) input type="file"  3.表单entype属性必须为 multipart/form-data(不加这个上传的只是一个文件名,并没有把文件的内容上传上去)
  服务器端要求:request.getInputStream()
  注意:若表单使用了 multipart/form-data ,使用原生request去获取参数的时候都为null
    使用工具类或者框架去解析用户上传的内容。都有哪些工具类和框架呢?
    commons-fileupload
    struts(底层:commons-fileupload)
    serlvet3.0(servlet3.0版本可以解决这个问题,但一般也用不上这个了,后面都是用框架开发,框架会把什么初始化操作都做了,我们只用写逻辑就可以了,什么请求转发,重定向都不用request,response了)
测试--------------------------------------------------------------------------------------------------

另外新建一个web项目,写一个index.jsp页面和一个获取上传文件的servlet并打印出来

 抓包

 这是因为,form表单没有加上enctype="multipart/form-data"这个属性

 表单设置了属性后,后天要想获取数据就要request.getInputStream(),这就获取到了一个流,获取到流后该切割切割,干干嘛干嘛。下面把代码改了

 如果是普通文本数据,只需要将这个流获取到打印成字符串

------------------------------------------------------------------------------------------------------------------------------

commons-fileupload------apache出品的一款专门处理文件上传的工具类,不是sun公司的所以使用第一步导包
使用步骤:
  1.导入jar包
  2.创建磁盘文件项工厂:DiskFileItemFactory factory=new DiskFileItemFactory();
  3.创建核心上传对象:ServletFileUpload upload=new ServletFileUpload(factory);
  4.解析请求,获取所有的上传组件 List<FileItem>:List<FileItem> list=upload.parseRequest(request);(解析这块有难度,所以它帮你做了,上传组件有普通上传组件和文件上传组件file)
  5.遍历list 获取每一个上传组件,就是FileItem:
    getFiledName():获取标签name属性的值
    isFormFiled():判断  是否   是普通上传组件  true:普通上传组件  false:文件上传组件 <input type="file">

      普通上传组件:getString("utf-8"):获取用户输入的内容
      文件上传组件:getName():文件名称  getInputStream():获取专属这个文件的流  delete():删除文件上传时候产生的临时文件

 本地使用上传代码上传成功

上传注意问题:(后面学框架了就不会存在这个问题,所以此次只是简单记录)
1.文件名称 :浏览器不同,有可能获取的名称不同, 1.txt 或者 G:1.txt(浏览器版本低了获取的是带盘符路径的,解决方法:减掉得到最后一个后面的名称)
2.文件重名:
  给文件来一个随机名称
    uuid方式
    毫米值+三个随机数(比喻以前在百度下载照片,前面都是一大串字母,后面来个jpg)
  数据库中可以存放多个字段: 文件名称和文件路径(此方法解决比喻我上传的是身份证正面.jpg,但是你修改了名称,我下次就不好获取了的解决方案)
    文件名称:身份证正面.jpg
    文件路径:g:123123123423sfsf.jpg
  文件下载:
    response.setHeader("content-disposition","attachment;filename="+真实名称);
3.文件安全(fastDFS)
  安全目录:web-inf meta-inf 项目之外的目录
  不安全目录:项目目录(除去web-inf和meta-inf)
4.目录分离
  常用的方式:按用户划分  按时间划分  按数量划分  随机划分 /AA/AB

实战商品保存       文件上传的应用

 略

原文地址:https://www.cnblogs.com/djlindex/p/11518176.html