请问老师,题目要求怎样理解呢?
如上图,感觉再三实现都难以理解:
题目中要求实现Map<String, Object> params来存储页面的参数,但是这个参数(Map<String, Object> params)实际上不是静态参数,实际使用时不能通过“类名.参数”来调用该参数;
该参数Map<String, Object> params中一定要使用<String, Object> 的泛型吗?还是说可以使用<String, String>的泛型;
public static Map<String, Object> UploadFile(HttpServletRequest request, String uploadDirectory)这个方法可以编写方法体呢?在实际编辑的过程中我觉得由于要返回“Map<String, Object>”有点无从下手呢?
以下为我的代码,麻烦老师看看怎样可以结合呢?其中第二段代码中含有“Map<String, Object>”,没有按要求实现。所以想改进下。还有就是这个处理JSP页面的参数到底是放在类“UploadUtils”还是类“FoodAddServlet”处理好点呢?这个题目的要求限制有点多,每次看到这里想绕过去但是还是觉得不妥,又返回来按照要求实现,想了一下毕竟要求如此设计:
package com.java.utils; import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import com.java.food.Food; /* * 1.类型描述:存储添加页面中所有参数的集合Map<String, Object> params; 其中key值是表单中控件的名称,value是表单控件对应的值 * 2.方法: * 文件上传的工具方法:public static Map<String, Object> * UploadFile(HttpServletRequest request, String uploadDirectory) */ public class UploadUtils { /** * 1.类型描述:存储添加页面中所有参数的集合Map<String, Object> params; 其中key值是表单中控件的名称,value是表单控件对应的值 * 2. 文件上传的工具方法:public static Map<String, Object> UploadFile(HttpServletRequest request, String uploadDirectory) */ Map<String, String> map=new HashMap<String, String>(); public static Map<String, String> UploadFile(HttpServletRequest request, String uploadDirectory) { return ; } /** * 生成唯一的文件名 */ public static String getUUIDFileName(String fileName) { //将文件名的前面部分进行截取:xx.jpg --> .jpg int inx=fileName.lastIndexOf("."); String extention=fileName.substring(inx); String uuidFileName=UUID.randomUUID().toString().replace("-", "")+extention; return uuidFileName; } public static void main(String[] args) { System.out.println(getUUIDFileName("wakaka.jpg")); } }
package com.java.servlet; 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 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 com.java.food.Food; import com.java.utils.UploadUtils; /** * 菜品添加 的Servlet */ @WebServlet("/FoodAddServlet") public class FoodAddServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接受数据 try { //定义一个map集合来保存从addFood.jsp来的数据 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); //4.遍历集合,获得每个FileItem,判断是表单项还是文件上传项 String url = null; for (FileItem fileItem : list) { //判断是表单项还是文件上传项 if(fileItem.isFormField()) { //普通表单项 String name=fileItem.getFieldName();//获得表单项的name属性的值 String value=fileItem.getString("UTF-8");//解决中文乱码的问题,获得对应表单项的value属性的值 map.put(name, value); }else { String fileName=fileItem.getName(); if(fileName!=null&&!"".equals(fileName)) { //通过工具类获得唯一文件名 String uuidFileName=UploadUtils.getUUIDFileName(fileName); //获得文件上传的数据 InputStream is=fileItem.getInputStream(); //获得文件上传的路径 String path=this.getServletContext().getRealPath("/upload"); //将输入流对接到输出流 url=path+"\\"+uuidFileName; OutputStream os=new FileOutputStream(url); int len=0; byte[] b=new byte[1024]; while((len=is.read(b))!=-1) { os.write(b, 0, len); } is.close(); os.close(); } } } //获取ServletContext()对象 List<Food> foodList=(List<Food>) this.getServletContext().getAttribute("list"); //校验菜单编号与菜名 for (Food f : foodList) { if(f.getFoodName().equals(map.get("foodName"))||f.getFoodId().equals(map.get("id"))) { request.setAttribute("msg", "菜品编号或菜名已经存在!"); System.out.println("我进来了!"); request.getRequestDispatcher("/FoodManage/addFood.jsp").forward(request, response); return; } } System.out.println(map); //封装数据到Food当中 Food food=new Food(); food.setFoodId(map.get("id")); food.setFoodName(map.get("foodName")); food.setFoodTaste(map.get("taste")); food.setFoodPath(url); food.setFoodPrice(map.get("price")); food.setFoodDec(map.get("description")); //将添加的菜样增加到菜单列表中 System.out.println("添加的菜样增加到菜单列表中"); foodList.add(food); System.out.println("已经添加的菜样增加到菜单列表中"); for (Food f : foodList) { System.out.println(f); } //将具有新数据的List集合存回去 this.getServletContext().setAttribute("list",foodList); //将菜品的信息保存到session中 request.getSession().setAttribute("food", food); response.sendRedirect(request.getContextPath()+"/selectFood.jsp"); } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
正在回答
在你贴的代码中不是分别将map.get("id")存入数据中么,我只是针对你编写的代码进行了修改,菜品数据应该传到Servlet中,然后在Servlet中调用UploadUtils类中的方法来完成表单数据的处理,也就是说,我在FoodAddServlet中完成菜品的添加,那么表单的数据要交给UploadUtils类来处理,譬如:在FoodAddServlet中使用下面的代码获取UploadUtils返回的处理之后的数据。
Map<String, Object> mp = UploadUtils.UploadFile(request, "upload");
然后UploadUtils应该按如下代码区修改:
public static Map<String, Object> UploadFile(HttpServletRequest request, String uploadDirectory) { Map<String, Object> params = new HashMap<String, Object>(); try { ServletContext context = request.getServletContext(); // 1、首先得到ServletFileUpload,是文件上传的核心组件。它能够将request中的每一个属性字段都封装成FileItem对象 DiskFileItemFactory fatory = new DiskFileItemFactory(); ServletFileUpload sfu = new ServletFileUpload(fatory); // 设置文件上传的大小(单个文件上传的大小,和多个文件上传的大小) // 动态获取单个文件大小 String singleFileSize = context.getInitParameter("singleFileSize"); String multiFilesSize = context.getInitParameter("multiFilesSize"); // sfu.setFileSizeMax(Long.parseLong(singleFileSize));// 设置单个文件的大小 //sfu.setSizeMax(Long.parseLong(multiFilesSize));// 设置多个文件的大小 // 2、需要判断当前的FileItem是文件还是普通字段 List<FileItem> fileItemLists = sfu.parseRequest(request); // 3、如果是文件的话,就保存到服务器中 for (FileItem fileItem : fileItemLists) { // 判断当前拿到的是否是文件 boolean flag = fileItem.isFormField();// flag=true代表当前获取的是普通字段(username);flag=false代表当前的FileItem封装的是文件 if (flag) {// 普通字段 // String username = request.getParameter("username"); String field1 = fileItem.getFieldName(); // 动态获取web.xml文件中的编码配置 String value = fileItem.getString("UTF-8"); // 将普通字段的值保存到Map集合中去 params.put(field1, value); } else {// 文件,需要将文件保存到当前工程的upload文件夹中 System.out.println("*****************fileItem.getName()======" + fileItem.getName()); // 首先拿到上传的文件 InputStream ins = fileItem.getInputStream();// 获取文件到servlet的流 // 将上传过来的文件保存到upload这个文件夹下面去 // 动态获取文件夹的绝对路径 // 根据系统当前的时间,返回一个yyyyMMdd的文件名 long cTime = System.currentTimeMillis(); Date currentDate = new Date(cTime); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String yyyyMMdd = sdf.format(currentDate); String realPath= context.getRealPath("/upload")+ "\\" + yyyyMMdd; System.out.println(realPath); File file = new File(realPath); System.out.println("realpath"+realPath); // 判断指定路径的文件是否存在 boolean isExists = file.exists(); if (isExists == false) {// 如果不存在则创建 file.mkdirs(); } // 动态获取拓展名 String fileName = fileItem.getName();// 1.png String extension = fileName.split("\\.")[1]; // 动态的生成全球不重复的名字 String uuid = UUID.randomUUID().toString();// 网卡号+时间戳 String url=realPath + "\\" + uuid + "." + extension; params.put("url", url); FileOutputStream fos = new FileOutputStream(realPath + "\\" + uuid + "." + extension); // 将数据写入到磁盘上面去 byte[] buffer = new byte[1024]; int len = 0; while ((len = ins.read(buffer)) != -1) { fos.write(buffer, 0, len); } // 关闭各种流 ins.close(); fos.close(); } } } catch (Exception e) { params.put("msg", "文件上传失败,请您检查一下文件大小"); e.printStackTrace(); } return params; }
Map<String, Object> params这么定义Map集合其实是更合理,我们知道String类型代表的是key,可以是菜品id,Object则代表的是Food类,譬如:Map<String,Food> params,通过params.get("菜品id")就可以获取对应的Food类了。你可以按照下图代码修改,这样就能返回一个Map<String,Food>类型的对象了,如果我的建议解决了你的问题,请采纳,祝学习愉快~
Map<String,Food> params=new HashMap<String,Food>(); //封装数据到Food当中 Food food=new Food(); food.setFoodId(map.get("id")); food.setFoodName(map.get("foodName")); food.setFoodTaste(map.get("taste")); food.setFoodPath(url); food.setFoodPrice(map.get("price")); food.setFoodDec(map.get("description")); params.put("1001", food);
- 参与学习 人
- 提交作业 1088 份
- 解答问题 10205 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星