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

如上图,感觉再三实现都难以理解:
题目中要求实现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 份
- 解答问题 10204 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星