本文共 1784 字,大约阅读时间需要 5 分钟。
页面重定向 由发表在
在用户登录并通过服务器验证以后,JSP会渲染一段HTML内容返回给浏览器,提示已经登录成功。但这样做存在一些问题:
上述问题对于任意表单提交都是存在的,包括文章创建表单。
上一节中表单提交的用户体验非常不友好,为了解决这个问题,一种叫做的模式被提出并广泛应用在Web程序开发中。和传统的表单提交方法不同,这种模式在POST请求完成后,会重定向(HTTP状态码302)到另外一个页面。这样相当于浏览器重新加载了一个页面(使用GET请求),此时用户无论如何刷新浏览器,都是刷新当前GET请求对应的页面而不再是重复提交一次表单。下面是一个用户提交订单到服务器的过程描述:
页面重定向相当于返回HTTP状态吗302以及一个重定向地址到浏览器,在Servlet中可以使用HttpServletResponse#sendRedirect()
方法来完成。例如在登录成功后,可以跳转到该用户的博客首页:
@WebServlet("/account/login")public class LoginController extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { User user = Data.getByUsername(username); if (user == null || !user.getPassword().equals(password)) { } else { req.getSession().setAttribute("user", user); resp.sendRedirect("/ServletBlogDemo/userPosts?username=" + user.getUsername()); } }}
注意这里的重定向地址需要包含本身的Context名字——ServletBlogDemo
。
和登录表单一样,创建文章表单提交成功后,直接跳转到该文章详细页面,这样用户自然而然的知道文章已经创建成功:
@WebServlet("/createPost")public class PostCreateController extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { User currentUser = (User) req.getSession().getAttribute("user"); Post post = new Post(req.getParameter("title"), req.getParameter("content"), currentUser); Data.posts.add(post); resp.sendRedirect("/ServletBlogDemo/userPosts?username=" + currentUser.getUsername()); }}
在通常情况下,表单通过POST方法提交数据后,我们推荐使用HTTP状态码302进行重定向来实现更友好的用户体验。