Servlet的forward与include方法

原文链接:http://www.yiidian.com/servlet/servlet-dispatcher.html

使用Servlet请求转发与包含
RequestDispatcher接口提供了将请求转发到另一个资源的功能,该资源可能是Html,Servlet或Jsp。该接口还可以用于包含其他资源的内容。

1 RequestDispatcher接口的方法

RequestDispatcher接口提供两种方法。他们是:

  • public void forward(ServletRequest request,ServletResponse response)thorws ServletException,java.io.IOException:将请求从Servlet转发到服务器上的另一个资源(Servlet,JSP文件或HTML文件)。
  • public void include(ServletRequest request,ServletResponse response)throws ServletException,java.io.IOException:在响应中包含资源(servlet,JSP页面或HTML文件)的内容。

如上图所示,第二个Servlet的响应被发送到客户端。第一个Servlet的响应不会显示给用户。

如上图所示,第二个Servlet的响应包含在第一个Servlet的响应中,最终才发送回用户。

2 获取RequestDispatcher的对象

ServletRequest接口的getRequestDispatcher()方法返回RequestDispatcher的对象。语法是:

public  RequestDispatcher getRequestDispatcher(String resource);  

getRequestDispatcher方法示例:

RequestDispatcher rd=request.getRequestDispatcher("servlet2");
//servlet2是第二个Servlet的url-pattern
rd.forward(request, response);//这里可以是forward或者include方法

3 RequestDispatcher的案例

3.1 案例涉及元素及流程说明

在本案例中,我们需要验证用户输入的密码。如果密码是yiidian,将转发请求到WelcomeServlet,否则将显示错误消息:“抱歉,用户名或密码错误!”本案例,我们的用户名和密码都是采用硬编码方式,当然您也可以将其改为从数据库中查询,可以参考后面的开发案例《使用Servlet完成用户登录》。以下文件是本案例需要的文件:

index.jsp文件:用于从用户获取输入。
LoginServlet.java文件:用于处理响应的Servlet类。如果用户输入了正确的密码,它将把请求转发到WelcomeServlet。
WelcomeServlet.java文件:用于显示欢迎消息的Servlet类。
web.xml文件:Web部署描述符文件,其中包含所有Servlet的配置信息。

3.2 编写inde.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>一点教程网-请求转发与包含</title>
    <meta http-equiv="content-type" content="text/html" charset="UTF-8">
</head>
<body>
<form action="servlet1" method="post">
    用户名:<input type="text" name="userName"/><br/>
    密码:<input type="password" name="userPass"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

3.3 编写LoginServlet

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * 一点教程网 - http://www.yiidian.com
 * 验证密码是否正确
 */
public class LoginServlet extends HttpServlet{

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        String n=request.getParameter("userName");
        String p=request.getParameter("userPass");

        if(p.equals("yiidian")){
            RequestDispatcher rd=request.getRequestDispatcher("servlet2");
            rd.forward(request, response);
        }else{
            out.print("抱歉,用户名或密码错误!");
            RequestDispatcher rd=request.getRequestDispatcher("/index.jsp");
            rd.include(request, response);
        }
    }

}

3.4 编写WelcomeServlet

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

/**
 * 一点教程网 - http://www.yiidian.com
 * 欢迎页面
 */
public class WelcomeServlet extends HttpServlet{

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        String n=request.getParameter("userName");
        out.print("欢迎你,"+n);
    }
}

3.5 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>WelcomeServlet</servlet-name>
        <servlet-class>WelcomeServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Login</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>WelcomeServlet</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>

</web-app>

3.6 运行测试

输入yiidian密码,正确的情况

!

输入错误密码的情况

欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
如果您对我的系列教程感兴趣,也可以关注我的网站:yiidian.com

原文地址:https://www.cnblogs.com/yiidian/p/12495813.html

时间: 2024-10-03 22:55:33

Servlet的forward与include方法的相关文章

(十二)会话跟踪技术之servlet通信(forward和include)

一.servlet通信方法 二.具体应用 scopeServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(

RequestDispatcher接口的include()方法与forward()方法的区别

RequestDispatcher接口所定义的forward()方法可以将HTTP请求转送给其他Web资源(例如Servlet.JSP或HTML)进行处理,并产生HTTP回应.RequestDispatcher接口的include()方法与forward()方法非常类似,惟一的不同在于:利用include()方法将HTTP请求转送给其他Servlet后,被调用的Servlet虽然可以处理这个HTTP请求,但是最后的主导权仍然是在原来的Servlet.RequestDispatcher是一个Web

【Servlet】Servlet之forward、sendRedirect、 include区别与使用

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka servlet中的请求转发主要有三种方式:1. forward:是指转发,将当前request和response对象保存,交给指定的url处理.并没有表示页面的跳转,所以地址栏的地址不会发生改变.2. redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会变发生改变.3. include:意为包含,即包含url中的内

jsp中 RequestDispatcher接口的两种跳转:forward()和include()

在web程序中,经常是由多个Servlet来完成请求.RequestDispatcher接口就是为了多个Servlet之间的调整而实现的.该接口可以用httpSerbletRequest的getRequestDispatcher()方法取得.调用时指定跳转的URL地址即可完成跳转动作.RequestDispatcher接口有两种方法实现跳转 一.include方法 本示例不需要前台页面,直接通过地址访问. IncludeMethod.java代码 1 package com.gys; 2 3 i

RequestDispatcher中 forward()和include()对比

一,RequestDispatcher接口方法简介 1,RequestDispatcher对象由Servlet容器来创建,封装一个由路径所标识的服务器资源. 2,RequestDispatcher接口中定义了二种方法用于请求转发: forward(ServletRequest,ServletResponse)方法: 将请求转发给服务器上另外一个Servlet,JSP页面,或者HTML文件       这个方法必须在响应被提交给客户端之前调用,否则抛出异常. 方法调用后在响应中的没有提交的内容被自

struts2的action访问servlet API的三种方法

学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object get(Object key);可以获取request属性 Map getSession():可以得到session属性 Map getAppliction():可以得到ServletContext实例 2.action类实现 ServletContextAware,ServletRequestAwa

《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7  在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ查询,使用了类似这样的操作 group by,join,和where:你想使用Include()方法预先加载额外的实体.另外你想使用Code-First来管理数据访问. 解决方案 假设你有如图5-22所示的概念模型 图5-22 一个简单的包含Club和Event以及它们之间一对多关联的模型 在Visual S

Action访问Servlet API的三种方法

一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器而言,不访问action是不行的,Struts提供了一种比较简单的方式来访问Servlet API . 二.通常我们需要访问的Servlet API 是 HttpSession.HttpservletRequest.ServletContext,分别对应了JSP内置对象 session,reques

关于java中sendRedirect,forward和include区别

在javaWeb中页面跳转一般有三种形式,sendRedirect,forward和include,三者有什么区别呢? 我先进行说明,再以一个小例子说明 一.sendRedirect 使用方式 response.sendRedirect(); 服务器根据逻辑,发送一个状态码,告诉浏览器去请求指定的地址,把需要的参数放在转发的地址里面.由于是一次新的申请,原先的request就不能读取了,可以使用session代替,或者使用include,和forward代替 二.forward 使用方式 req