介绍
JavaWeb中的转发(forward)和重定向(redirect)是两种Web应用程序的跳转机制。
转发是指服务器将请求转发给另一个资源进行处理,它只能在服务器内部进行转发。转发时,请求对象和响应对象不变,转发后客户端浏览器的地址栏中显示的是Servlet。在Servlet中,可以通过RequestDispatcher对象的forward()方法来实现请求的转发。
重定向是指服务器告诉客户端浏览器重新发起一个新的请求,从而访问不同的资源。重定向后,请求对象和响应对象都发生了变化,客户端浏览器的地址栏中显示的是新的URL地址。在Servlet中,可以通过HttpServletResponse对象的sendRedirect()方法来实现请求的重定向。
实例
要求
实现简单的表单登录,登录后显示当前用户的用户名
实现
首先创建一个HTML文件写一个表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="LoginDemo1" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
注意action提交的Servlet
创建Java类获取表单数据
转发的方式
package com.org.controller;
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;
import java.net.URLEncoder;
/**
* 对表单数据做处理
*/
@WebServlet("/LoginDemo1")
public class LoginDemo1 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理中文乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//这里定死的用户名和密码方便测试
if ("好人".equals(username)&&"123".equals(password)){
//将username传给网页
req.setAttribute("username",username);
//用户名和密码正确后跳转的网页和携带的数据
req.getRequestDispatcher("index.jsp").forward(req,resp);
}else {
//用户名和密码错误后的跳转的网页
req.getRequestDispatcher("login.html").forward(req,resp);
}
}
}
在index.jsp文件中获取用户名的属性
<%--
Created by IntelliJ IDEA.
User: Asus
Date: 2023/9/7
Time: 15:27
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>
<%--获取username的值--%>
恭喜,<%=request.getAttribute("username")%>登录成功!
</body>
</html>
运行结果
输入用户名和密码
点击登录
重定向的方式
package com.org.controller;
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;
import java.net.URLEncoder;
/**
* 对表单数据做处理
*/
@WebServlet("/LoginDemo1")
public class LoginDemo1 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理中文乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//这里定死的用户名和密码方便测试
if ("好人".equals(username)&&"123".equals(password)){
/**
* 中文乱码问题
* 因为重定向会改变url,而url只支持ASC||码
* 使用URLEncoder类中的encode方法编码
* 浏览器会自行解码
* 如果没有就使用URLDecoder类中的decode方法解码
*/
String name = URLEncoder.encode(username, "utf-8");
//使用字符串拼接的方式将username带回网页
//用户名和密码正确后跳转的网页和携带的数据
resp.sendRedirect("/servletdemo1/index.jsp?username="+name);
}else {
//用户名和密码错误后的跳转的网页
resp.sendRedirect("/servletdemo1/login.html");
}
}
}
在index.jsp文件中获取用户名的属性
<%--
Created by IntelliJ IDEA.
User: Asus
Date: 2023/9/7
Time: 15:27
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>
<%--获取参数username--%>
恭喜,<%=request.getParameter("username")%>登录成功!
</body>
</html>
运行结果
输入用户名和密码
点击登录
区别
1.相对路径不同(转发是相对于站点根目录,重定向是相对于webapps目录)
2.请求次数不同(转发请求一次,重定向请求两次)
3.地址栏不同(转发地址栏会显示Servlet名,重定向会显示网页名)