请问老师,题目要求怎样理解呢?

请问老师,题目要求怎样理解呢?

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

如上图,感觉再三实现都难以理解:

  1. 题目中要求实现Map<String, Object> params来存储页面的参数,但是这个参数(Map<String, Object> params)实际上不是静态参数,实际使用时不能通过“类名.参数”来调用该参数;

  2. 该参数Map<String, Object> params中一定要使用<String, Object> 的泛型吗?还是说可以使用<String, String>的泛型;

  3. public static Map<String, Object> UploadFile(HttpServletRequest request, String uploadDirectory)这个方法可以编写方法体呢?在实际编辑的过程中我觉得由于要返回“Map<String, Object>”有点无从下手呢?

  4. 以下为我的代码,麻烦老师看看怎样可以结合呢?其中第二段代码中含有“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);
	}

}


正在回答

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

2回答

在你贴的代码中不是分别将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;
    }


chrismorgen 2018-07-08 21:16:53

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);


  • 提问者 慕虎8754231 #1
    请问老师,你这段代码是放在哪里呢?按照要求这个是要放在类UploadUtils中,那么这个map.get("foodName")从哪里来呢?因为不是Servlet
    2018-07-09 13:11:55
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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