空指针异常
FoodDaoImpl.java 改动:在servlet中使用注解,设置了url和启动加载级数。添加了db的get方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | package com.imooc.demo.java; import java.util.ArrayList; import java.util.List; /** * 菜品数据处理类 * @author m1318 * */ public class FoodDaoImpl { //存放菜品对象的全局静态容器List private static final List<Food> foodList = new ArrayList<Food>(); //foodList的get方法 public static List<Food> getFoodlist() { return foodList; } //添加菜品 public void addFood(Food food) { //判断要添加的food对象是否为空 if (food != null ) { //food对象不为空,添加到foodList中 foodList.add(food); } } //查询所有菜品信息 public List<Food> getAllFood(){ //返回全局容器foodList List<Food> fl = new ArrayList<Food>(); for (Food food : foodList) { fl.add(food); } return fl; } //根据菜品名称查询菜品信息 public Food getFoodByName(String foodName) { //遍历foodList,以获取每个元素的foodName for (Food food : foodList) { //判断要查找的菜品名是否存在 if (foodName.equals(food.getFoodName())) { //存在该菜品名,返回该菜品对象。结束后续代码运行 return food; } } //程序执行至此,说明没有找到对应的food对象,因此返回null return null ; } //根据菜品id查询菜品信息 public Food getFoodById(String id) { //遍历foodList,以获取每个元素的foodId for (Food food : foodList) { //判断要查找的菜品ID是否存在 if (id.equals(food.getFoodId())) { //存在该菜品ID,返回该菜品对象。结束后续代码运行 return food; } } //程序执行至此,说明没有找到对应的food对象,因此返回null return null ; } //根据菜品ID修改菜品 public void updateFood(Food newFood) { //取得要修改菜品的ID String foodId = newFood.getFoodId(); //遍历foodList for (Food food : foodList) { //根据获取到的Id,找到对应的元素 if (foodId.equals(food.getFoodId())) { //将newFood中要修改的信息赋值给原来的菜品 //newFood中除foodId属性外其它不为null的属性,即为要更新的,否则不予以更新 //foodName更新判断 if (newFood.getFoodName() != null && newFood.getFoodName() != "" ) { food.setFoodName(newFood.getFoodName()); System.out.println( "菜名已更新" ); } //price更新判断 if (newFood.getPrice() != 0.0 ) { food.setPrice(newFood.getPrice()); } //taste更新 if (newFood.getTaste() != null && newFood.getTaste() != "" ) { food.setTaste(newFood.getTaste()); System.out.println( "口味已更新" ); } //description更新 if (newFood.getDescription() != null && newFood.getDescription() != "" ) { food.setDescription(newFood.getDescription()); } //path更新 if (newFood.getPath() != null && newFood.getPath() != "" ) { food.setPath(newFood.getPath()); } } } } // 根据菜品ID进行删除 public void deleteFoodById(String id) { for (Food food : foodList) { //根据id找到对应的元素 if (id.equals(food.getFoodId())) { //移除该该元素 foodList.remove(food); //移除成功,结束遍历 break ; } } } // public static void main(String[] args) { // Food food = new Food("f01","宫保鸡丁",36.5f,"旧口味","旧描述",null); // Food newfood = new Food("f01","辣子鸡",0.0f,"","好吃不贵",null); // FoodDaoImpl impl = new FoodDaoImpl(); // impl.addFood(food); // impl.updateFood(newfood); // } } |
FoodAddServlet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | package com.imooc.demo.servlet; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; 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.imooc.demo.java.Food; import com.imooc.demo.utils.FileUploadUtil; /** * 添加菜品Servlet */ @WebServlet ( "/add" ) public class FoodAddServlet extends HttpServlet { /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //定义一个字符串,用以存放文件上传后的完整路径 String url = null ; //定义一个map容器,存放一次请求表单项的名称与值 Map<String,String> fileItemMap = new HashMap<String,String>(); //创建磁盘文件项工厂 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); //创建核心解析类 ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory); //解析request请求,返回fileItem的集合 List<FileItem> fileItemList = servletFileUpload.parseRequest(request); //遍历fileItemList集合,判断其中的元素是普通表单项还是文件上传项 for (FileItem fileItem : fileItemList) { //判断fileItem是否为普通表单项 if (fileItem.isFormField()) { //普通表单项 //取得表单项的name属性值 String fileItemName = fileItem.getName(); //取得表单项中的值 String fileItemValue = fileItem.getString(); //将表单项加入到FileItemMap中 fileItemMap.put(fileItemName, fileItemValue); } else { //文件上传项 //取得文件上传名 String fileName = fileItem.getName(); //如果文件名不为空(即未上传文件)且不为空字符串,则进行上传工作 if (fileName != null && fileName.equals( "" )) { //获得唯一文件名 String uuidFileName = FileUploadUtil.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 food : foodList) { if (food.getFoodId().equals(fileItemMap.get( "id" ))) { request.setAttribute( "msg" , "菜品ID已经存在!" ); request.getRequestDispatcher( "/addFood.jsp" ).forward(request, response); } if (food.getFoodName().equals(fileItemMap.get( "foodName" ))) { request.setAttribute( "msg" , "菜品名已经存在!" ); request.getRequestDispatcher( "/addFood.jsp" ).forward(request, response); } } //封装数据到Food对象中去 Food food = new Food(fileItemMap.get( "id" ), fileItemMap.get( "foodName" ), Integer.parseInt(fileItemMap.get( "price" )), fileItemMap.get( "taste" ), fileItemMap.get( "description" ), fileItemMap.get( "path" )); foodList.add(food); this .getServletContext().setAttribute( "list" , foodList); request.getSession().setAttribute( "food" , food); response.sendRedirect(request.getContextPath()+ "/showFoodList.jsp" ); } catch (FileUploadException e) { e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this .doGet(request, response); } } |
InitServlet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package com.imooc.demo.servlet; import java.util.ArrayList; import java.util.List; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import com.imooc.demo.java.Food; import com.imooc.demo.java.FoodDaoImpl; /** * 菜品添加初始化Servlet */ @WebServlet (urlPatterns= "/init" ,loadOnStartup= 2 ) public class InitServlet extends HttpServlet { /** * 菜品添加初始化方法 */ public void init(ServletConfig config) throws ServletException { this .getServletContext().setAttribute( "list" , FoodDaoImpl.getFoodlist()); } } |
0
收起
正在回答
3回答
同学你好,报空指针的是foodList集合吗?建议同学输出一下foodList,查看是否为空。另外这里需要定义初始化菜品的init()方法,直接将菜品添加到db中,对db进行操作即可。
祝:学习愉快~
懒人13
2019-07-31 16:46:08
尝试将FoodDaoImpl.java改为Servlet也报相同的错误。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | package com.imooc.demo.java; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; /** * 菜品数据处理类 * @author m1318 * */ @WebServlet (urlPatterns= "/init" ,loadOnStartup= 2 ) public class FoodDaoImpl extends HttpServlet{ //存放菜品对象的全局静态容器List private static final List<Food> foodList = new ArrayList<Food>(); // //foodList的get方法 // public static List<Food> getFoodlist() { // return foodList; // } // 菜品添加初始化方法 public void init(ServletConfig config) throws ServletException { this .getServletContext().setAttribute( "list" , foodList); } //添加菜品 public void addFood(Food food) { //判断要添加的food对象是否为空 if (food != null ) { //food对象不为空,添加到foodList中 foodList.add(food); } } //查询所有菜品信息 public List<Food> getAllFood(){ //返回全局容器foodList List<Food> fl = new ArrayList<Food>(); for (Food food : foodList) { fl.add(food); } return fl; } //根据菜品名称查询菜品信息 public Food getFoodByName(String foodName) { //遍历foodList,以获取每个元素的foodName for (Food food : foodList) { //判断要查找的菜品名是否存在 if (foodName.equals(food.getFoodName())) { //存在该菜品名,返回该菜品对象。结束后续代码运行 return food; } } //程序执行至此,说明没有找到对应的food对象,因此返回null return null ; } //根据菜品id查询菜品信息 public Food getFoodById(String id) { //遍历foodList,以获取每个元素的foodId for (Food food : foodList) { //判断要查找的菜品ID是否存在 if (id.equals(food.getFoodId())) { //存在该菜品ID,返回该菜品对象。结束后续代码运行 return food; } } //程序执行至此,说明没有找到对应的food对象,因此返回null return null ; } //根据菜品ID修改菜品 public void updateFood(Food newFood) { //取得要修改菜品的ID String foodId = newFood.getFoodId(); //遍历foodList for (Food food : foodList) { //根据获取到的Id,找到对应的元素 if (foodId.equals(food.getFoodId())) { //将newFood中要修改的信息赋值给原来的菜品 //newFood中除foodId属性外其它不为null的属性,即为要更新的,否则不予以更新 //foodName更新判断 if (newFood.getFoodName() != null && newFood.getFoodName() != "" ) { food.setFoodName(newFood.getFoodName()); System.out.println( "菜名已更新" ); } //price更新判断 if (newFood.getPrice() != 0.0 ) { food.setPrice(newFood.getPrice()); } //taste更新 if (newFood.getTaste() != null && newFood.getTaste() != "" ) { food.setTaste(newFood.getTaste()); System.out.println( "口味已更新" ); } //description更新 if (newFood.getDescription() != null && newFood.getDescription() != "" ) { food.setDescription(newFood.getDescription()); } //path更新 if (newFood.getPath() != null && newFood.getPath() != "" ) { food.setPath(newFood.getPath()); } } } } // 根据菜品ID进行删除 public void deleteFoodById(String id) { for (Food food : foodList) { //根据id找到对应的元素 if (id.equals(food.getFoodId())) { //移除该该元素 foodList.remove(food); //移除成功,结束遍历 break ; } } } // public static void main(String[] args) { // Food food = new Food("f01","宫保鸡丁",36.5f,"旧口味","旧描述",null); // Food newfood = new Food("f01","辣子鸡",0.0f,"","好吃不贵",null); // FoodDaoImpl impl = new FoodDaoImpl(); // impl.addFood(food); // impl.updateFood(newfood); // } } |
从网页搭建入门Java Web2018版
- 参与学习 人
- 提交作业 1088 份
- 解答问题 10204 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧