转发和重定向又是什么“垃圾”——教你再分类

转发与重定向的区别

         前言:之前写了几篇JSP的博客,现在又回过头来看Servlet,温故而知新,再回顾回顾,总会有收获的。以前学习Servlet感觉内容很多,现在看的时候,其实也没多少东西,只需知道Servlet的生命周期,Servlet的实现方式,ServletContext作用域,接收和响应,转发和重定向,我觉得差不多够用了。当然,要是细究的话也不止这些,我针对的是新手。

转发与重定向简介

转发和重定向都是实现页面跳转,也就是说,当我们访问一个Servlet 的时候,Servlet帮我们跳转到另一个界面。

转发与重定向的区别

实现转发调用的是HttpServletRequest对象中的方法

实现重定向调用的是HttpServletResponse对象中的方法

转发时浏览器中的url地址不会发生改变

重定向时浏览器中的url地址会发生改变

转发时浏览器只请求一次服务器

重定向时浏览器请求两次服务器

转发能使用request带数据到跳转的页面

重定向能使用ServletContext带数据到跳转的页面

代码演示转发和重定向

package 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("/login")
public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取表单提交过来的数据
        //getParameter()方法可以获取请求的参数信息
        String name = req.getParameter("name");
        String password = req.getParameter("password");

        //打印获取到的参数信息
        System.out.println("name:"+name);
        System.out.println("password:"+password);

        //如果name=admin,password=123,则跳转到succee.jsp,否则跳转到fail.jsp
        if("admin".equals(name)&&"123".equals(password)){
            //通过转发实现跳转
            req.getRequestDispatcher("/success.jsp").forward(req,resp);
        }else {
            //通过重定向实现跳转
            resp.sendRedirect("/fail.jsp");
        }
    }

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

JSP代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>登录</title>

</head>

<body>

<form action="/login">

    <table align="center">

        <tr>

            <td>账号:</td>

            <td><input type="text" name="name"></td>

        </tr>

        <tr>

            <td>密码:</td>

            <td><input type="text" name="password"></td>

        </tr>

        <tr>

            <td><input type="submit" value="登录"></td>

            <td><input type="reset" value="重置"></td>

        </tr>

    </table>

</form>

</body>

</html>

转发和重定向如何带数据到某个页面

package servlet;



import javax.servlet.ServletContext;

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("/login")

public class ServletDemo extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {



            //通过转发带数据

            req.setAttribute("name","张三");

            req.getRequestDispatcher("/send.jsp").forward(req,resp);



    }



    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        doGet(req, resp);



    }

}

send.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>转发和重定向传代数据练习</title>

</head>

<body>

    <%

        //1、接收转发传代的数据

      String name =  (String) request.getAttribute("name");

      out.println("转发传代的数据:"+name);



    %>



</body>

</html>
package servlet;



import javax.servlet.ServletContext;

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("/login")

public class ServletDemo extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {





            //通过重定向带数据

        ServletContext servletContext = this.getServletContext();

        servletContext.setAttribute("name","王二麻子");

            resp.sendRedirect("/send2.jsp");



    }



    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        doGet(req, resp);



    }

}

send2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>转发和重定向传代数据练习</title>

</head>

<body>

    <%

        //1、接收重定向传代的数据

        String name1 = (String)application.getAttribute("name");

        out.println("重定向传代的数据:"+name1);

    %>

</body>

</html>

练习

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>Title</title>

</head>

<body>

<form action="CountServlet" method="post">

    <h3>加法计算器</h3>

    加数1:<input type="number" name="one">

    加数2:<input type="number" name="two">

    <input type="submit" value="计算">

</form>

</body>

</html>

count.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>



<html>



<head>



    <title>Title</title>



</head>



<body>



计算结果:<%=request.getAttribute("count")%>



<!--计算结果:<%=application.getAttribute("count")%>-->



</body>



</html>

Servlet

package servlet;


import javax.servlet.ServletContext;
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("/CountServlet")
public class CountServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String one=request.getParameter("one");

int o=Integer.parseInt(one);//强制转换,将String类型的数据转换成int类型

String two=request.getParameter("two");



int t=Integer.parseInt(two);//强制转换,将String类型的数据转换成int类型



System.out.println(one+"   "+two);



int c=o+t;



String co=String.valueOf(c);//将int类型的数据转换成String类型



//转发,可以携带数据



request.setAttribute("count",co);



request.getRequestDispatcher("count.jsp").forward(request,response);



//用于存放数据



//        ServletContext s=this.getServletContext();



//        s.setAttribute("count",co);



//重定向只能依靠ServletContext获取数据



//  response.sendRedirect("count.jsp");


System.out.println(co);

}

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

doPost(request,response);

}


}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据分析1480

成为Python大牛必须要掌握的高端语法——yield

作者:grisse 链接: https://segmentfault.com/a/1190000017405045

6520
来自专栏阿杜的世界

使用Optional摆脱NPE的折磨

architectural-architectural-design-architecture

11530
来自专栏MasiMaro 的技术博文

Java 学习笔记(11)——lambda 表达式

在写Java代码的时候,如果某个地方需要一个接口的实现类,一般的做法是新定义一个实现类,并重写接口中的方法,在需要使用的时候new一个实现类对象使用,为了一个简...

7640
来自专栏跟Qt君学编程

QML动态显示组件(支持在线编辑动态刷新)

QML动态组件显示器主要用于方便界面开发,在线编辑保存后自动刷新组件界面,并支持拖拽文件显示的方式。

55820
来自专栏悠扬前奏的博客

Scala-12.对象(object)

13650
来自专栏Java研发军团

【面试】谈谈提升Java性能的40个优化细节!!!

在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。

9710
来自专栏数据分析1480

大数据之脚踏实地学08--搭建Hadoop集群【2】

在《大数据之脚踏实地学07--搭建Hadoop集群【1】》中,讲解的是虚拟机的配置(包括网络设置、主机名修改和克隆等),文中我们在VMware中虚拟了3台计算机...

8820
来自专栏沉默王二

我竟然不再抗拒 Java 的类加载机制了

很长一段时间里,我对 Java 的类加载机制都非常的抗拒,因为我觉得太难理解了。但为了成为一名优秀的 Java 工程师,我决定硬着头皮研究一下。

8930
来自专栏Unity游戏开发

Unity-资产-常用资产

纹理是图片或者影视文件覆盖在GameObjects上面来给予他们可视化的效果 Unity支持任何类型的image 和 movie文件在3D项目资产文件中作为纹...

20130
来自专栏个人帖子

一位资深程序员大牛给予Java初学者的学习路线建议

Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱...

7800

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励