JSP点击按钮操作ArrayList时如何将最新状态传递给Servlet处理
问题排查与修复方案
1. 表单提交无响应、收不到参数问题
你JSP里的表单method属性是post,但你的Servlet只实现了doGet方法,没有处理POST请求,默认的doPost会直接返回错误,所以点击按钮后没有进入你写的业务逻辑,自然打印不出参数。
- 修复方式一:在Servlet里新增
doPost方法,直接调用doGet即可:
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
- 修复方式二:把JSP表单的
method="post"改成method="get"。
另外你表单里的button1类型是type="button",普通按钮默认不会触发表单提交,要改成type="submit":
<input type="submit" name="button1" value="Button 1" />
2. ArrayList操作后状态不保留问题
你现在每次请求Servlet都重新new三个ArrayList并填充初始值,就算你这次操作修改了List,下次请求又会被重置成初始状态,看不到操作效果。
要保留状态可以把三个ArrayList存在Session里,只有第一次访问的时候初始化:
修改Servlet里的List初始化逻辑:
// 先从session里取 HttpSession session = request.getSession(); ArrayList<ObjetosArreglo> personas = (ArrayList<ObjetosArreglo>) session.getAttribute("ArrayPer"); ArrayList<ObjetosArreglo> mascotas = (ArrayList<ObjetosArreglo>) session.getAttribute("ArrayMasc"); ArrayList<ObjetosArreglo> comidas = (ArrayList<ObjetosArreglo>) session.getAttribute("ArrayCom"); // 第一次访问不存在的话才初始化 if(personas == null) { personas = new ArrayList<ObjetosArreglo>(); personas.add(new ObjetosArreglo("Cesar")); personas.add(new ObjetosArreglo("Miguel")); personas.add(new ObjetosArreglo("Chavez")); personas.add(new ObjetosArreglo("Linares")); personas.add(new ObjetosArreglo("TATAMASTER")); } if(mascotas == null) { mascotas = new ArrayList<ObjetosArreglo>(); mascotas.add(new ObjetosArreglo("Clifford")); mascotas.add(new ObjetosArreglo("Chuzo")); mascotas.add(new ObjetosArreglo("Hoshi")); mascotas.add(new ObjetosArreglo("Persian")); mascotas.add(new ObjetosArreglo("Bebeto")); } if(comidas == null) { comidas = new ArrayList<ObjetosArreglo>(); comidas.add(new ObjetosArreglo("Carne")); comidas.add(new ObjetosArreglo("Queso")); comidas.add(new ObjetosArreglo("Yogur")); comidas.add(new ObjetosArreglo("Pan dulce")); comidas.add(new ObjetosArreglo("Pasta")); } // 操作完之后把修改后的List存回session session.setAttribute("ArrayPer", personas); session.setAttribute("ArrayMasc", mascotas); session.setAttribute("ArrayCom", comidas);
3. 工具方法逻辑错误修复
你当前的moverPriElemento方法逻辑和调用的预期不符,按你代码里的调用MetodosUtiles.moverPriElemento(comidas, mascotas),你是想把comidas的第一个元素移到mascotas对吧?现在的代码是把mascotas的第一个元素移到comidas,逻辑反了,修改成:
public static void moverPriElemento(ArrayList<ObjetosArreglo> oriList, ArrayList<ObjetosArreglo> targetList) { // 把oriList的第一个元素移到targetList if(oriList != null && oriList.size() > 0) { targetList.add(oriList.remove(0)); } }
同时建议给工具方法的ArrayList加上泛型,避免类型转换错误,另外所有操作List的地方都加非空和大小判断,避免空指针或下标越界。
4. 其他优化
你当前的borrarElemento方法是先get(index)再remove对象,直接调用remove(int index)效率更高,也不会因为重复元素删错:
public static void borrarElemento(ArrayList<ObjetosArreglo> elem1, int index) { if(elem1 != null && index >=0 && index < elem1.size()) { elem1.remove(index); } }
内容的提问来源于stack exchange,提问作者Cesar Chavez
相关产品推荐
相关产品推荐

