Servlet跳转之重定向

2017-11-20 11:27:18

    重定向简介:

    重定向是根据服务器返回的状态码来实现的.客户端浏览器在请求服务器的时候,服务端会返回一个状态码.服务器通过HttpServletResponse的setStatus(int status)方法来设置状态码.如果服务器这个时候返回的状态码是301或者302,则浏览器会到新的网址重新请求该资源,服务器的响应中会带着这个新资源的地址.

    请求重定向的相关代码:

    //设置状态码为302,SC_MOVED_TEMPORAILY就是302的静态常量response.setStatus(HttpServletResponse.SC_MOVED_TEMPOPAILY);

    //在请求头在携带新的资源地址

    response.setHeader("Location","http://www.baidu.com");

    为了使用方便HttpServletResponse中将setStatus和setHeader这两人种方法合并到一起叫做sendRedirect(String location);

    接下来实现登陆成功以后,跳转到用户中心界面

    首行建立一个用户中心简单界面,member.jsp具体内容如下:

<%--
  Created by IntelliJ IDEA.
  User: nosay
  Date: 17-11-20
  Time: 上午11:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>这里是用户中心</h1>
</body>
</html>

    

    在Test5Servlet文件中,加入登陆成功的相应代码,具体代码如下:

package com.nosay.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "Test5Servlet",urlPatterns = "/test5")
public class Test5Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = "nosay";
        String pass = "123456";

        String name = request.getParameter("username");
        String password = request.getParameter("password");

        if(!name.equals(username))
        {
            request.setAttribute("errorMessage","帐户不存在");
            request.getRequestDispatcher("/loginError.jsp").forward(request,response);
            //帐户不存在
        }else if(!password.equals(pass))
        {
            request.setAttribute("errorMessage","密码错误");
            request.getRequestDispatcher("/loginError.jsp").forward(request,response);
            //密码错误
        }else{ //登陆成功
            response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
            response.setHeader("Location","/member.jsp");
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

    这样我们输入正确的用户名,以及密码.成功的跳转到了正确的页面,即用户中心界面(member.jsp)

    1.png

    其实,为了方便我们实现重定向功能,有一个简化的sendRedirect(String location);相关代码如下所示:

package com.nosay.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "Test5Servlet",urlPatterns = "/test5")
public class Test5Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = "nosay";
        String pass = "123456";

        String name = request.getParameter("username");
        String password = request.getParameter("password");

        if(!name.equals(username))
        {
            request.setAttribute("errorMessage","帐户不存在");
            request.getRequestDispatcher("/loginError.jsp").forward(request,response);
            //帐户不存在
        }else if(!password.equals(pass))
        {
            request.setAttribute("errorMessage","密码错误");
            request.getRequestDispatcher("/loginError.jsp").forward(request,response);
            //密码错误
        }else{ //登陆成功
//            response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
//            response.setHeader("Location","/member.jsp");
            response.sendRedirect("/member.jsp");
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

    这样同样能实现相同的效果.

    请求转发和重定向有什么功别呢?

    1.重定向的地址栏会发生变化 ,转发不会.

    2.重定向是两次请求两次响应,转发是一次请求一次响应.

    3.重定向路径需要加工程名,转发路径不需要加工程名.

    4.重定向可以跳转到任何网站,转发只能在服务器内部进行.