栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

重定向与请求转发,以及它们之间的区别

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

重定向与请求转发,以及它们之间的区别

 重定向:

        在某些情况下,针对客户端的请求,一个Servlet类可能无法完成全部工作。这时,可以使用请求重定向来完成。所谓请求重定向,是指Web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。

        为了实现请求重定向,HttpServletResponse接口定义了一个sendRedirect()方法,该方法用于生成Location头字段。

通过一个用户登陆的案例,分步骤讲解sendRedirect()方法的使用。

        在一个项目的Web目录下编写用户登录的页面login.html和登录成功的页面。

 login.html:




    
    Insert title


        
        
用户名:
密   码:

welcome.html: 




    
    Insert title


    欢迎你!登陆成功

我的项目名是studyclass,login.html和welcome.html我放在了web目录下的denglu包中。

        在studyclass项目的classfour包中编写一个名为LoginServlet的类,用于处理用户登录请求

package classfour;

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(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //用HttpServletRequest对象的getParameter()方法获取用户名和密码
        String username= request.getParameter("username");
        String password=request.getParameter("password");
        //假设用户名和密码为itcast和123
        if (("itcast").equals(username)&&("123").equals(password)){
            //如果用户名和密码正确,重定向到welcome.html
            response.sendRedirect("/studyclass/denglu/welcome.html");
        }else {
            //如果用户名和密码错误,重定向到login.html
            response.sendRedirect("/studyclass/denglu/login.html");
        }
    }
}

        登录成功就会出现以下界面:

请求转发: 

        Servlet之间可以相互跳转,利用Servlet的跳转可以把一项任务按模块分开,例如:

使用一个Servlet实现用户登录,然后跳转到另外一个Servlet实现用户资料修改。Servlet的跳转要通过RequestDispatcher接口的实例对象实现。HttpServletRequest接口提供了getRequestDispatcher()方法用于获取RequestDispatcher对象。

        getRequestDispatcher()方法的具体格式

RequestDispatcher getRequestDispatcher (String path)

        获取到RequestDispatcher对象后,如果当前web资源不想处理请求,RequestDispatcher接口提供了一个forward()方法,该方法可以将当前请求传递给其他web资源,由其他资源对这些信息进行处理并将响应提交给客户端,这种方式称为请求转发。

        forward()方法的具体格式如下:

forward(ServletRequest request,ServletResponse response)

forward()方法用于将请求从一个Servlet传递给另一个web资源。在Servlet中,可以对请求做一个初步处理,然后调用forward()方法将请求传递给其他资源进行响应。需要注意的是,该方法必须在将响应提交给客户端之前被调用,否则将抛出异常。 

                

        在studyclass项目中建一个包,在包下创建一个名为RequestForwardServlet的类,该类调用forward()方法将请求转发到一个新的Servlet页面。

package QingqiuZhuanfa;

import javax.servlet.RequestDispatcher;
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(name = "RequestForwardServlet",urlPatterns = "/RequestForwardServlet")
public class RequestForwardServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setAttribute("username","张三");//将数据存储到request对象中
        RequestDispatcher dispatcher=request.getRequestDispatcher("/ResultServlet");
        dispatcher.forward(request,response);
    }
}

 

可以看到通过使用forward()方法将当前Servlet的请求转发到ResultServlet页面。

再次在该包下写一个ResultServlet的类,用于获取RequestForwardServlet类中存储在request对象中的数据并输出。

package QingqiuZhuanfa;

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.io.PrintWriter;

@WebServlet(name = "ResultServlet",urlPatterns = "/ResultServlet")
public class ResultServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        String username=(String) request.getAttribute("username");
        if (username!=null){
            out.println("用户名:"+username+"
"); } } }

 

 

 

由图可知,地址栏中显示的仍然是RequestForwardServlet的请求路径,但是浏览器却显示ResultServlet中要输出的内容。这是因为请求转发是发生在服务器内部的行为,从RequestForwardServlet到ResultServlet属于一次请求,在一次请求中可以使用request属性进行数据共享。

对比重定向的地址栏,是有不同的,重定向的地址是重定向后的路径。 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/927237.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号