轉發和重定向又是什麼“垃圾”——教你再分類

泰斗賢若如發表於2019-07-23

轉發與重定向的區別

 

         前言:之前寫了幾篇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);

}


}

  

 

 

結束語

Servlet分享到此結束,想了解更多的朋友可以看之前總結過的部落格《Servlethttps://www.cnblogs.com/zyx110/p/10771172.html,和《JSPhttps://www.cnblogs.com/zyx110/p/10926587.html ,更多精彩等你來學習。

 

*****************************************************************************************************

我的部落格園地址:https://www.cnblogs.com/zyx110/

轉載請說明出處

我不能保證我所說的都是對的,但我能保證每一篇都是用心去寫的,我始終認同“分享的越多,你的價值增值越大”,歡迎大家關注我的技術分享“Java匹馬行天下”和學習心得分享“匹馬行天下”,在分享中進步,越努力越幸運,期待我們都有美好的明天!

支援我的朋友們記得點波推薦哦,您的肯定就是我進步的動力。

 

相關文章