posts - 78, comments - 34, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

         今天一大早去到学校,便开始编写网上商城。写到下午3点多,完成了!感觉十分的好,因为这是自己第一次将所学的WEB知识规整到一起了。做出来的成品,虽然不能拿出来展示(只是个练习,很多校验没加),但已经让我十分开心了。以前为网上商城这个东西还是十分的恐惧,工程显得比较庞大。其实加上了论坛和评论等功能,还是十分庞大的。

         今天写些什么好呢?把工程中的一个难点写出来吧!

         我们在添加书籍的时候可以添加一张书籍的照片,照片是存在硬盘目录里的。而数据库中保存的是照片在硬盘目录中的路径。

1.        如何获取浏览器向服务器端发送过来的图片文件?使用request输入流吗?太麻烦了!Apache组织为我们提供了一个方便的工具——commons-fileupload,它可以很好的解决这一问题。

2.        如何确保,图片的名称不一样?当然是大名鼎鼎的UUID了,生成了一个不重复的随机串就OK了!

我把代码粘贴出来:

private String uploadFields(HttpServletRequest request,

           Map<String, String> map) {

       // 获取request中的请求参数

       DiskFileItemFactory dfif = new DiskFileItemFactory();

       ServletFileUpload sfu = new ServletFileUpload(dfif);

       sfu.setHeaderEncoding("UTF-8");

       String file = null;

       try {

           List<FileItem> list = sfu.parseRequest(request);

           // 遍历所有参数

           for (Iterator<FileItem> its = list.iterator(); its.hasNext();) {

               FileItem fi = its.next();

              // 是否为表单字段,如果不是则为文件上传输入流。

              if (!fi.isFormField()) {

                  InputStream is = fi.getInputStream();

                  // 获取图片目录

                  String dir = this.getServletContext().getRealPath("/")

                         + "/images/";

                  File dirF = new File(dir);

                  if (!dirF.exists())

                     dirF.mkdirs();

                  // 使用UUID创建文件名称

                  file = UUID.randomUUID().toString()

                         + fi.getName().substring(

                                fi.getName().lastIndexOf("."));

                  // 写出文件

                  byte[] buf = new byte[1024];

                  int len = 0;

                  FileOutputStream fos = new FileOutputStream(new File(dir

                         + file));

                  while ((len = is.read(buf)) != -1) {

                     fos.write(buf, 0, len);

                  }

                  // 关闭流

                  fos.close();

                  is.close();

                  fi.delete();

              } else {

                  // 如果为表单字段,则将这些信息添加到map中返回给调用函数

                  // filter无法对文件上传进行过滤,所以需要手动对编码转换。

                  map.put(fi.getFieldName(), new String(fi.getString()

                         .getBytes("iso8859-1"), "UTF-8"));

              }

           }

       } catch (Exception e) {

           e.printStackTrace();

       }

       // 返回在服务器保存后的文件路径。

       return "images/" + file;

    }

        

然后老方在下午4点钟时,给大家讲解了订单的提交。订单提交是唯一涉及到多表操作的模块,这也是练习的重点。一个多对多的设计方式。如下模块流程图。

clip_image001

看到里边的orderitemorders表了吧,这就是一个多对多的关系。Orderitem就是中间表,记录订单的的id和书的id,还包含数量和总计字段。这样,添加订单或是查询订单这样操作起来更直观方便些,这就是面向对象的有点。

         订单处理模块中也是首次使用到MVC,以前我认为Servlet就是业务逻辑层,其实不是。Servlet只是个Web层(V)。通过今天老方的讲解,我发现自己并未完全融入面向对象的设计模式,还有些面向过程的东西在影响着我。不过我想,这一点很快就会改变!

         今天的练习确实达到的预期效果,虽然有些同学还未完成。不过,有的同学昨天晚上已经完成了,有的上午已经完成了。卧虎藏龙!我需要向他们好好学习。

         今晚回来时我把老方的工程复制到工作空间里了,结果我的工程名与他相同。晕!幸好我的包名与他不同,只有几个JSP页面的名称与他相同,吓我一跳。我今天尝试着将数据库字段、requestresponse中的属性名称封装到静态类中,但操作起来十分不方便,比如编写一个SQL语句。在大工程中,这肯定非常有用!

         继续整理工程去

         加油!


只有注册用户登录后才能发表评论。


网站导航: