- _nosay
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)
其实,为了方便我们实现重定向功能,有一个简化的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.重定向可以跳转到任何网站,转发只能在服务器内部进行.