想问下老师按照思路分析那样写为什么感觉会有线程上的问题

想问下老师按照思路分析那样写为什么感觉会有线程上的问题

思路分析和前面讲的是两种,前面讲的是在Servlet中添加一个list,然后把map放在list里再放入context中,后面用就从context取,但思路分析好像是让我们放在菜品分析的处理类中,我在add的servlet里调用了菜品处理类的add方法(这个方法就一句话:db.add(food);food是传入参数,我断点看过food传入是正常显示的一个map),然后执行完这一句立刻报错,是空指针异常,错误信息出现的错误就显示在db.add(food);好像是这句语句在内部执行的时候出的问题,我试了下step into里面似乎是Thread和HttpServlet类里的步骤,看不懂出了什么错,但是按照第一种方法(就是视频讲的就很正常)

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

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

2回答
提问者 跟着小鸟去抓琴梨4290628 2018-12-20 19:49:27
package com.foodmanager.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.ServletContext;
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.foodmanager.shiti.Upload;
import com.foodmanager.shiti.FoodDaoImpl;

@WebServlet("/FoodAddServlet")
public class FoodAddServlet extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Map<String,String> food=new HashMap<String,String>();
		try {
			DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
			ServletFileUpload servletFileUpload=new ServletFileUpload(diskFileItemFactory);
			List<FileItem> list=servletFileUpload.parseRequest(request);
			for (FileItem fileItem : list) {
				if(fileItem.isFormField()) {
					String name=fileItem.getFieldName();
					String value=fileItem.getString("UTF-8");
					food.put(name, value);//将菜品资料放入Map集合中
				}//表单项
				else {
					if(fileItem.getName()!=null&&!"".equals(fileItem.getName())){
						String uuid=Upload.getUuid(fileItem.getName());
						InputStream is=fileItem.getInputStream();
						String path=this.getServletContext().getRealPath("/upload");
						String url=path+"\\"+uuid;
						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();
						food.put("path", url);//将菜品资料放入Map集合中
					}
				}//文件上传项
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(food);
		FoodDaoImpl fd=new FoodDaoImpl();
		fd.addFood(food);
		response.sendRedirect("/foodmanager/selectFoodInfo.jsp");
	}

}
package com.foodmanager.shiti;

import java.util.List;
import java.util.Map;

public class FoodDaoImpl {
	private static final List<Map<String,String>> db=null;
	public void addFood(Map<String,String> food) {
		db.add(food);
	}//添加菜品
	public List<Map<String, String>> getAllFood(){
		return db;
	}//查询所有菜品
	public List<Map<String, String>> getFoodByName(String foodName){
		return null;
	}//根据菜品名称查询菜品信息
	public List<Map<String, String>> getFoodById(String id){
		return null;
		
	}//根据菜品id查询菜品信息
	public void updateFood(Map<String, String> food){
		
	}//菜品修改
	public void deleteFoodById(String id) {
		
	}//根据菜品ID进行删除
}


好帮手慕阿莹 2018-12-20 19:19:55

1、老师之前讲的课程是把food存在域中,在本次作业中,老师提示大家可以换一种写法,就是单独写一个FoodDaoImpl类来存放food的信息。两个选择其中一个就可以了。

这样添加时,向FoodDaoImpl类中的db添加,查询时return这个FoodDaoImpl类的db集合就可以。

同学可以参考一下这个思路:

我们可以在这个FoodDaoImpl类中写一个静态变量:

private static final List<Map<String, Object>> db= new ArrlayList<Map<String, Object>>();

(如果同学写了Food类,就可以这样写:

private static final List<Food> db= new ArrlayList<Food>();老师是用Map<String, Object>代替了Food类)

当我们添加一个food的时候,直接把表示food的Map存到这个集合中就可以了。不要再向域中存了。以后也不用从域中获取了。

在FoodDaoImpl类中写一个add方法:

public void addFood(Map<String, Object> food){

}

在这个方法中,把food添加到集合db中就可以了。

在Servlet中,调用FoodDaoImpl类的add方法。把代表食物的food对象传进去就保存好了。

2、应该不存在同学说的线程问题的。之前的空指针异常应该是同学获取到的db是null。所以会报空指针异常。

context和FoodDaoImpl选择其中一个就可以。同学可以自己选择。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!



问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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