servlet的转发与重定向以及它们目录地址的的区别

转发:

结论:

  1. 转发是获取跳转页面的内容,并且渲染在自己的页面上,下文会使用画图进行讲解
  2. 域名没有跳转到B.jsp下,而是servlet类绑定的域名
  3. 使用转发继续执行转发语句后面的代码
  4. 转发可以获取到前面A.jsp发来的值,也就是网页请求里面的值
  5. 经过几次的实验,转发的路径加不加"/“都可以,也就是说
    req.getRequestDispatcher(”/B.jsp").forward(req,resp);
    req.getRequestDispatcher(“B.jsp”).forward(req,resp);
    都可以成功获取到B.jsp的内容
    而且我将B.jsp放入jsp目录下时也是如此,
    req.getRequestDispatcher("/jsp/B.jsp").forward(req,resp);
    req.getRequestDispatcher(“jsp/B.jsp”).forward(req,resp);
    也都可以成功获取到B.jsp的内容。
    在使用绝对路径开始实验,发现404
    由此总结,转发的路径必须是相对路径而不能是绝对路径。
  6. 把转发的路径更改为https://www.baidu.com/,发现不能跳转至百度。由此可见,转发只能选择项目中的路径。

重定向



结论:

  1. 重定向是跳转到对应页面,下文会使用画图进行讲解
  2. 域名跳转到B.jsp下
  3. 使用重定向继续执行转发语句后面的代码
  4. 重定向不能获取到网页请求中的值,即上面的用户名和密码都为NULL
  5. 经过几次的实验,重定向的路径前面不可以加"/",也就是说
    resp.sendRedirect("/B.jsp");          会报404
    resp.sendRedirect(“B.jsp”);          可以跳转到B.jsp
    而且我将B.jsp放入jsp目录下时也是如此,
    resp.sendRedirect("/jsp/B.jsp");    会报404
    resp.sendRedirect(“jsp/B.jsp”);    可以跳转到B.jsp
    在使用绝对路径开始实验,发现404
    由此总结,重定向的路径必须是相对路径而不能是绝对路径。
  6. 把转发的路径更改为https://www.baidu.com/,发现可以跳转至百度。由此可见,重定向可以选择项目之外的路径。


画图

转发: A向服务器发起请求,服务器发起转发请求给B,B收到请求后会返回自己的网页给服务器,服务器在把B的网页渲染在A.jsp表单提交的网页上,即地址栏并没有变化。

重定向: A向服务器发起请求,服务器返回目标网页地址,让A自己去找它,A再向B发起请求,B就
响应A的请求,地址栏便跳转到了B,地址栏发生了变化。

总结

  1. 转发可以获取到服务器中请求域的值,但是重定向不可以
  2. 两者的使用路径都不可以使用绝对路径,路径都是相对于webapp目录的;转发相对宽松,路径前面加不加"/"都可以**,而重定向前面不可以加"/"
  3. 两者语句后面的代码都能得到执行。
  4. 转发的地址栏不会发生变化,而重定向的地址栏跳转到相对应的域名下。
  5. 转发只能选择项目中的路径,重定向可以选择项目外的路径。

实验代码和目录结构

<!--前端-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!--              创建一个有用户名和密码的表单
             对他们进行输入来查看转发和重定向的区别-->
<form action="${pageContext.request.contextPath}/test" method="post">
    请输入用户名:<input type="text" name="username">
    <br>
    请输入密码:<input type="password" name="password">
    <input type="submit">
</form>
</body>
</html>

//servlet类

package com.zovz.test;

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

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String userName = req.getParameter("username");
        String password = req.getParameter("password");

        req.setAttribute("username",userName);
        req.setAttribute("password",password);
        //转发
        req.getRequestDispatcher("/B.jsp").forward(req,resp);
        System.out.println("程序运行完毕");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值