JavaWeb转发和重定向

介绍

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名,重定向会显示网页名)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值