JSP/Servlet页面重定向

JSP/Servlet页面重定向 由David发表在天码营


页面重定向

在用户登录并通过服务器验证以后,JSP会渲染一段HTML内容返回给浏览器,提示已经登录成功。但这样做存在一些问题:

  • 用户体验不佳,用户成功登录后肯定需要去其他页面。如果登录成功在系统的任何一个页面都应该在导航栏中看到用户信息,如果进入一个提示信息页面,还需要一次点击才能到达目标页面。
  • 在登录成功页面刷新,此时浏览器会提示是否重新提交数据,因为这是一个POST请求,如果点击了确定意味着将之前的数据再次提交一遍,这不是我们所希望的。

上述问题对于任意表单提交都是存在的,包括文章创建表单。

POST/Redirect/GET模式

上一节中表单提交的用户体验非常不友好,为了解决这个问题,一种叫做Post/Redirect/GET的模式被提出并广泛应用在Web程序开发中。和传统的表单提交方法不同,这种模式在POST请求完成后,会重定向(HTTP状态码302)到另外一个页面。这样相当于浏览器重新加载了一个页面(使用GET请求),此时用户无论如何刷新浏览器,都是刷新当前GET请求对应的页面而不再是重复提交一次表单。下面是一个用户提交订单到服务器的过程描述:

alter-text

Servlet重定向

页面重定向相当于返回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进行重定向来实现更友好的用户体验。


更多文章请访问 天码营网站



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值