页面使用重定向可以避免表单的重复提交问题
如果页面中需要使用域对象中的属性,必须使用转发。此外都使用重定向。
逻辑关系:
点击超链——>add.jsp(接收meg信息,接收参数的值)——>add.do(判断用户名是否存在)——存在(放入meg信息到request域中)——>add.jsp
——不存在(重定向)——>success.jsp
步骤:
1.在query.jsp中点击新建用户的超链接,跳转页面为当前目录的add.jsp
2.add.jsp内容
<body> <% Object meg = request.getAttribute("message"); if (meg!=null){ %> <br> <b style="color: red"><%=meg%></b> <br><br> <% } %> <form action="add.do" method="post"> <table> <tr> <td>CustomerName:</td> <td><input type="text" name="name" value="<%=request.getParameter("name")==null?"":request.getParameter("name")%>"></td> </tr> <tr> <td>CustomerPassword:</td> <td><input type="password" name="password" value="<%=request.getParameter("password")==null?"":request.getParameter("password")%>"></td> </tr> <tr> <td colspan="2"><input type="submit" value="添加" ></td> </tr> </table> </form> </body>
3.add.do
private void add(HttpServletRequest req, HttpServletResponse resp) { //1.获取表单参数:name,address,phone String name = req.getParameter("name"); String password = req.getParameter("password"); //2.检验name是否存在: //2.1调用CustomerDAO的getCountWithName(String name)获取name在数据库中是否存在 long count = customerDAO.getCountWithName(name); //2.2若返回值大于0,则响应add.jsp页面: //通过转发的方式来响应add.jsp if (count>0){ //2.2.1要求在add.jsp页面显示一个错误信息:用户名name已经被占用,请重新选择 req.setAttribute("message","用户名"+name+"已经被占用,请重新选择!"); //2.2.2add.jsp的表单值可以回显 //通过value="<%= request.getParameter("name")==null?"" : request.getParameter("name")%>" try { req.getRequestDispatcher("add.jsp").forward(req,resp); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return; } Customer customer = new Customer(name,password); customerDAO.save(customer); try { resp.sendRedirect("success.jsp"); } catch (IOException e) { e.printStackTrace(); } }
4.success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <b>ADD SUCCESS</b> <br><br> <a href="query.jsp">return</a> </body> </html>
效果图: