对这个作业很大的迷惑

对这个作业很大的迷惑

http://img1.sycdn.imooc.com//climg/5ad96bbf0001fd3007350433.jpg

1。在前面我们的案例中,UploadUtils类只是用来处理文件的同名问题,所以我在里边只定义了 public static String getUUIDFileName(String fileName)
  {
 
  
   //将文件名的前面部分截取.jpg
   int idx=fileName.lastIndexOf(".");
  String content= fileName.substring(idx);
 String uuidFileName=  UUID.randomUUID().toString().replace("-", "")+content;
 return uuidFileName;
  }这么一个方法,也就是返回一个处理过的文件名。

我在添加菜品的servlet中,init方法里我定义了存放菜品的集合,然后再doGet方法里来写逻辑控制

package foodServlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import foodInfo.FoodInfo;
import utils.UploadUtils;

/*
 * 菜品添加的servlet
 */
@WebServlet("/FoodAddServlet")
public class FoodAddServlet extends HttpServlet {
 @Override
 public void init() throws ServletException {
  List<Map<String,FoodInfo>> list = new ArrayList<Map<String,FoodInfo>>();
  this.getServletContext().setAttribute("list", list);
 }

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

  try {
   // 定义一个Map,用来存放添加页面中用户输入的所有控件对应的值
   Map<String ,String> map = new HashMap<String,String>();
   // 1.创建一个磁盘文件项工厂对象
   DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
   // 2.创建一个核心解析类
   ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
   // 3.解析request请求,返回的是List集合,List集合中存放的是FileItem对象
   List<FileItem> list = servletFileUpload.parseRequest(request);
   //定义一个集合,用来存放口味数据
   List<String> taste=new ArrayList<String>();
   String url=null;
   //遍历FileItem集合,判断是表单项还是文件上传项
   for(FileItem fileItem:list)
   {
    if(fileItem.isFormField())
    {
     //普通表单项
     //接收表单项对应的值
     String name=fileItem.getFieldName();//获得表单项name的属性值
     String value=fileItem.getString("utf-8");//获得表单项的值
     //接收复选框的值
     if(name.equals("taste"))
     {
      String tasteValue=fileItem.getString("utf-8");
      taste.add(tasteValue);
       tasteValue=taste.toString().substring(1, taste.toString().length()-1);
      System.out.println(name+" "+ tasteValue);
      map.put(name, tasteValue);
     }else
     {
      map.put(name, value);
     }
    }else
    {
     //文件上传项
     //文件上传功能
     //获得文件上传的名称
     String fileName=fileItem.getName();
     if(fileName!=null&&!"".equals(fileName))
     {
      //通过工具类获得唯一文件名
      String uniqueFileName=UploadUtils.getUUIDFileName(fileName);
      //获得文件上传的数据
      InputStream is=fileItem.getInputStream();
      //获得文件上传的路径
      String path=this.getServletContext().getRealPath("/upload");
      //将输入流对接到输出流
       url=path+"\\"+uniqueFileName;
      OutputStream os=new FileOutputStream(url);
      int len=0;
      byte[] b=new byte[1024];
      while((len=is.read(b))!=-1)
      {
       os.write(b, 0, len);
      }
      os.flush();
      os.close();
      is.close();
     }
    }
    
   }
   //判断菜品ID是否存在
   List<Map<String,FoodInfo>> foodList=(List<Map<String,FoodInfo>>)this.getServletContext().getAttribute("list");
   for(Map<String,FoodInfo> food:foodList){
    if(food.get(map.get("id")).getFoodId().equals(map.get("id")))
    {
     request.setAttribute("msg", "该菜品已经存在,请重新添加");
     request.getRequestDispatcher("/myFile.jsp/addFood.jsp").forward(request, response);
     return;
    }
   
   }
   //封装数据到FoodInfo中
   FoodInfo food=new FoodInfo();
   food.setFoodId(map.get("id"));
   food.setFoodName(map.get("foodName"));
   food.setPicPath(url);
   food.setFoodPrice(map.get("price"));
   food.setDescription(map.get("description"));
   food.setFoodTaste(map.get("taste"));
   Map map1=new HashMap();
   map1.put(map.get("id"),food);
   //将菜品信息保存到集合中
   foodList.add(map1);
   for(Map<String,FoodInfo> fo:foodList){
    System.out.println(fo.get(map.get("id")));
   }
   this.getServletContext().setAttribute("list", foodList);
   //添加成功,跳转到展示页面
   response.sendRedirect(request.getContextPath()+"/myFile.jsp/showFoodList.jsp");
  } catch (FileUploadException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

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

  doGet(request, response);
 }

}

请问我这个思路,和作业提供的思路不一样,那么会出现什么问题,我不太理解作业的思路是什么意思,意思是我们定义一个上传相关的类,里边定义增删改查的方法,然后再servlet中调用吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
一叶知秋519 2018-04-20 14:33:10

你说的这两种思路都可以;作业提供的思路是将读取上传信息的代码封装成一个工具类,定义增删改查的Servlet类,如果需要用到这个工具类中的方法,就调用类中的方法就可以了。如果将读取表单信息的代码写到FoodAddServlet类中,那么在修改的Servlet类中也需要书写这些代码,造成代码的冗余,如果封装到一个类中,在其他Servlet中使用的时候,直接调用类中的方法就可以了。

祝学习愉快!

  • 提问者 liqihang #1
    1.修改时候我们只要this.getServletContext().getAttribute("list");来获取我们保存的集合,然后遍历他们不就行了,重新书写什么代码? 2.在修改的servlet中调用工具类中的方法是不是需要分别创建工具类的对象。
    2018-04-20 14:50:25
  • 提问者 liqihang #2
    老师我按照给的思路创建个公工具类,把原servlet中的代码挪到了里边,总觉得不太正确,你帮忙改改
    2018-04-20 16:08:49
  • 一叶知秋519 回复 提问者 liqihang #3
    1、遍历取得它们之后,不是要进行修改么?修改的时候也会再上传一遍图片的,重新书写的也是获取上传内容的这些代码。2、可以将工具类中获取上传内容的方法设置为静态方法,这样就可以直接通过类名获取到了。
    2018-04-20 16:18:31
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
从网页搭建入门Java Web2018版
  • 参与学习           人
  • 提交作业       1088    份
  • 解答问题       10205    个

如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师