想问下老师按照思路分析那样写为什么感觉会有线程上的问题
思路分析和前面讲的是两种,前面讲的是在Servlet中添加一个list,然后把map放在list里再放入context中,后面用就从context取,但思路分析好像是让我们放在菜品分析的处理类中,我在add的servlet里调用了菜品处理类的add方法(这个方法就一句话:db.add(food);food是传入参数,我断点看过food传入是正常显示的一个map),然后执行完这一句立刻报错,是空指针异常,错误信息出现的错误就显示在db.add(food);好像是这句语句在内部执行的时候出的问题,我试了下step into里面似乎是Thread和HttpServlet类里的步骤,看不懂出了什么错,但是按照第一种方法(就是视频讲的就很正常)
正在回答 回答被采纳积分+1
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进行删除
}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选择其中一个就可以。同学可以自己选择。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
相似问题
登录后可查看更多问答,登录/注册
- 参与学习 人
- 提交作业 1088 份
- 解答问题 10204 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星