今天的主要工作:
继续编写菜品后台管理系统:C:\Program Files\apache-tomcat-8.0.52\webapps\foodManager。
遇到的问题:
1:根据ID修改菜品时,菜品修改不掉。原因是使用Map删除元素搞错了。在使用foreach循环遍历时使用remove(object key)方法不能元素。如果此时删除元素,因为删除了当前元素,下一个元素的指针丢失了。可能会导致异常。
2:food-query-name.jsp请求发送到food-show.jsp页面,如果使用post请求,提示空指针异常。使用get方式则没问题。
3:FoodDelete.java这个Servlet将菜品删除后,使用response.sendRedirect("/food-query-all.jsp")重定向,但是报404错误。而是用转发:request.getRequestDispatcher("/food-query-all.jsp")则不会报错。
问题分析:
1:foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况。
原本想可以先使用foreach循环找到该键,再在循环外删除元素。但是,foreach循环的循环变量必须在foreach中定义,提前定义无效。。所以改键就不能再循环外找到了。这时可以曲线救国。在循环外定义一个变量,在循环内定义一个循环变量。当匹配到键时,把循环变量赋值给循环外的变量,再使用循环外使用remove(Object key)删除就好了。
当然,如果在遍历过程中要删除元素,使用迭代器方式。例:
for (Iterator<Map.Entry<String, Integer>> it = myHashMap.entrySet().iterator(); it.hasNext();){
Map.Entry<String, Integer> item = it.next();
//... todo with item
it.remove();
}
2:原因是使用post需要对request进行编码。在请求获取页面使用request.setCharacterEncoding("utf-8");
3:转发和重定向中的路径不同。“/"在java中表示绝对路径。在转发中使用"/"表示项目路径。重定向中使用"/"和JSP以及HTML中的效果相同,表示服务器路径。所以这里不要加/。