来看看在Servlet开发中的一些真实场景的应用

还不会Servlet开发?来这里带你了解Servlet开发的基础知识
关于Servlet的规范扩展———监听器与过滤器

八、欢迎资源文件

1. 前提:

用户可以记住网站名,但是不会记住网站资源文件名。如果使用欢迎资源文件可以使用户不用记住网站中具体的资源文件名就可以访问网站。

2. 默认欢迎资源文件:
用户发送一个针对某个网站的【默认请求】时,由Http服务器自动从当前网站返回的资源文件。

正常请求:http://localhost:8080/myWeb/index.html

默认请求:http://localhost:8080/myWeb/
3. Tomcat对于默认欢迎资源文件定位规则

(1)规则位置:Tomcat安装位置/conf/web.xml

(2)规则命令:

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
4. 设置当前网站的默认欢迎资源文件规则

(1)规则位置:网站/web/WEB-INF/web.xml
(2)规则命令:

<welcome-file-list>
        <welcome-file>login.html</welcome-file>
        <welcome-file>user/find</welcome-file><!--servlet作为默认欢迎资源文件,开头斜线必须抹掉-->
    </welcome-file-list>

(3)网站设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效

九、Http状态码

1. 介绍

(1)由三位数字组成的一个字符
(2)Http服务器在推送相应包之前,根据本次请求处理情况,将Http状态码写入到相应包中【状态行】上。

2. 作用

(1)如果Http服务器针对本次请求,返回了对应的资源文件。通过Http状态码通知浏览器应该如何处理这个结果。
(2)如果Http服务器针对本次请求,无法返回对应的资源文件。通过Http状态码向浏览器应解释不能提供服务。

3. 分类:

(1)组成: 100-----599之间的数字,分为五大类

(2)1XX:最有特征的使100,通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收相应包之后,继续向Http服务器索要依赖的其他资源文件。
在这里插入图片描述

(3)2XX:最有特征的是200,通知浏览器本次返回的资源文件使一个独立完整的资源文件,浏览器在接收到之后不需要索要其他关联文件。

(4)3XX:最有特征的是302,通知浏览器本次返回的不是一个资源文件内容,而是一个资源文件地址,需要浏览器根据这个地址自动发起请求来索要这个资源文件。

response.sendRedirect("资源文件地址")写入到响应头中的location,而这个行为导致Tomcat将302状态码写入到状态行。

(5)4XX:

404:通知浏览器,由于在服务器没有定位到被访问的资源文件,因此无法通知

405:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),但是这个Servlet对于浏览器采用的请求方式不能处理

(6)5XX:
500:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),这个Servlet可以接收浏览器采用请求访问,但是Servlet在处理请求期间,由于Java异常导致处理失败

十、多个Servlet之间调用规则

1. 前提条件

某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。

2. 提高用户使用感受规则:

无论本次请求涉及到多少个Servlet,用户只需要【手动】通知浏览器发起一次请求即可。

3. 多个Servlet之间调用规则:

(1)重定向解决方案
(2)请求转发解决方案

十一、重定向解决方案

1. 工作原理:

用户第一次通过【手动方式】通知浏览器访问OneServlet。OneServlet工作完毕后,将TwoServlet地址写到响应头location属性中,导致Tomcat将302状态码写入到响应体。

在浏览器接收到响应包之后,会读取302状态码。此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务。
在这里插入图片描述

2. 实现命令:
//将地址写入到相应包中响应头的location属性中
response.sendRedirect("请求地址")
package com.lht.controller;

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 OneServlet extends HttpServlet {


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("洗韭菜");

        //重定向解决方案
        response.sendRedirect("/myWeb/two");      //[地址格式:/网站名/资源文件名]
    }
}
package com.lht.controller;

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 TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("韭菜炒鸡蛋");
    }
}
<?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_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.lht.controller.OneServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>com.lht.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
</web-app>
3. 特征

(1)请求地址:

既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名)

也可以把其他网站资源文件地址发送给浏览器(http;//ip地址:端口号/网站名/资源文件名)

(2)请求次数

浏览器至少发送两次请求,但是只有一次是用户手动发送的,后续请求都是浏览器自动发送。

(3)请求方式

重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是【get】

(4)缺点

重定向解决方案需要在浏览器与服务器之间进行多次往返,大量事件小号在往返次数上,增加用户等待服务时间。

十二、请求转发解决方案

1. 原理

用户第一次通过手动方式要求浏览器访问OneServlet,OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat在接收到这个请求之后,申请调用TwoServlet。

Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务。
在这里插入图片描述

2. 实现命令
请求对象代替浏览器向Tomcat发送请求
//通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request.getRequestDispatcher("/资源文件名");   //一定要以“/”开头
//将报告对象发送给Tomcat
report.forward(当前请求对象,当前请求响应体);
3. 优点

(1)无论本次请求涉及到多个Servlet,用户只需要手动通过浏览器发送一次请求

(2)Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数增加处理服务器速度

4. 特征

(1)请求次数

在请求转发过程中,浏览器只发送一次请求

(2)请求地址

只能向Tomcat服务器申请调用当前网站下载资源文件

request.getRequestDispather("/资源文件名")		//不要写网站名

(3)请求方式

在请求转发过程中,浏览器只发送一个Http请求协议包,参与本次请求的所有Servlet共享同一个请求协议包。因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致。

十三、多个Servlet之间数据共享实现方案

1. 数据共享

OneServlet工作完毕之后,将产生的数据交给TwoServlet来使用

2. Servlet规范中提供四种数据共享方案

(1)ServletContext接口
(2)Cookie类
(3)HttpSession接口
(4)HttpServletRequest接口

十四、ServletContext接口

1. 介绍

(1)来自于Servlet规范中一个接口。在Tomcat中存在于servlet-api.jar,在Tomcat中负责提供这个接口实现类。
(2)如果两个Servlet来自于同一个网站,彼此之间通过网站的ServletContext实例对象实现数据共享。
(3)开发人员习惯于将ServletContext对象称为【全局作用域对象】

2. 工作原理

每一个网站都存在一个全局作用域对象。这个全局作用域对象相当于一个Map,在这个网站中OneServlet可以将数据存入到全局作用对象中,当前网站中其他Servlet此时都可以从全局对象得到这个数据进行使用。
在这里插入图片描述

3. 全局作用域对象生命周期

(1)在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象。
(2)在Http服务器运行期间,一个网站只有一个全局作用域对象。
(3)在Http服务器运行期间,全局作用域对象一直处于存活状态。
(4)在服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理。

4. 命令实现

同一个网站OneServlet将数据共享给TwoServlet

package com.lht.controller;

import javax.servlet.ServletContext;
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 OneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过请求对象向Tomcat索要当前网站全局作用域对象
        ServletContext application = request.getServletContext();
        //将数据添加到全局作用域对象中,作为共享数据
        application.setAttribute("key1",100);
    }
}
package com.lht.controller;

import javax.servlet.ServletContext;
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 TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过请求对象向Tomcat索要当前网站的全局作用域对象
        ServletContext application = request.getServletContext();
        //将指定关键字对应的数据从全局作用域对象中拿出来
        Integer num = (Integer) application.getAttribute("key1");
    }
}

十五、Cookie

1. 介绍

(1)Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中。
(2)如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时可以借助于Cookie对象进行数据共享。
(3)Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量。
(4)在现实生活中,Cookie相当于用户在服务端得到【会员卡】。

2. 原理

(1)用户通过浏览器第一次向MyWeb网站发送请求申请OneServlet,OneServlet在运行期间创建一个Cookie存储与当前用户相关数据【会员卡】。

(2)OneServlet工作完毕后,将Cookie写入到响应头交还给当前浏览器。

(3)浏览器收到响应包之后,将Cookie存储在浏览器的缓存一段时间后,用户通过同一个浏览器再次向MyWeb网站发送请求申请TwoServlet时,【浏览器需要无条件的将MyWeb网站之前推送过来的Cookie写入到请求头】并且发送过去。

(4)此时TwoServlet在运行时,就可以通过读取请求头中Cookie中信息,得到OneServlet提供的共享数据。

3. 实现命令

同一个网站OneServlet与TwoServlet借助于Cookie实现数据共享

OneServlet {
	public void doGet(HttpServletRequest request,HttpServletResponse resp){
		//创建一个Cookie对象,保存共享数据(当前用户数据)
		Cookie card1() = new Cookie("key1","abc");
		Cookie card2() = new Cookie("key2","edg");
		/*
		 *	Cookie相当于一个map
		 *	一个Cookie中只能存放一个键值对
		 *	这个键值对的key与value只能是String
		 *	键值对中key不能是中文
		 */
		//将Cookie写入到响应头,交给浏览器
		resp.addCookie(card1);
		resp.addCookie(card2);
	}
}

浏览器/用户 <----------响应包

响应行【200】
响应头【Cookie:key1=abc;key2=edg】
空白行
响应体【处理结果】

浏览器向myWeb网站发送请求访问TwoServlet---------->请求包

请求行【url:/myWeb/two method:get】
请求头【请求参数 和 Cookie】
空白行
请求体
TwoServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse resp){
		//调用请求对象从请求头得到浏览器返回的Cookie
		Cookie cookieArray[] = request.getCookies();
		//循环遍历数据德奥每一个Cookie的key与value
		for(Cookie card:cookieArray){
			String key = card.getName();	//读取key
			String value = card.getValue();	//读取value
		}
	}
}
4. 一个Cookie的案例

在这里插入图片描述

package com.lht.controller;

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

public class OneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String userName,money;
        //调用请求对象读取请求头中参数信息
        userName = request.getParameter("userName");
        money = request.getParameter("money");
        //开卡
        Cookie card1 = new Cookie("userName",userName);
        Cookie card2 = new Cookie("money",money);
        //发卡,将Cookie写入到响应头交给浏览器
        response.addCookie(card1);
        response.addCookie(card2);
        //通知Tomcat将【点餐页面】内容写入到响应体交给浏览器
        request.getRequestDispatcher("/index_2.html").forward(request,response);
    }
}
package com.lht.controller;

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

public class TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int jiaozi_money = 30;
        int miantiao_money = 20;
        int mifan_money = 10;
        int money = 0;
        int cost = 0,balance = 0;
        String food,userName=null;
        Cookie cookieArray[] = null;
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        Cookie newCard =null;
        //读取请求头参数信息,得到用户点餐食物类型
        food = request.getParameter("food");
        //2.读取请求中Cookie
        cookieArray = request.getCookies();
        //3.刷卡消费
        for(Cookie card:cookieArray){
            String key = card.getName();
            String value = card.getValue();
            if("userName".equals(key)){
                userName = value;
            } else if("money".equals(key)){
                money = Integer.valueOf(value);
                if("饺子".equals(food)){
                    if(jiaozi_money > money){
                        out.print("用户 "+ userName +"余额不足,请充值");
                    } else{
                        newCard = new Cookie("money",(money-jiaozi_money)+"");
                        cost = jiaozi_money;
                        balance = money-jiaozi_money;
                    }
                }else if("面条".equals(food)){
                    if(miantiao_money > money){
                        out.print("用户" + userName + "余额不足,请充值");
                    } else{
                        newCard = new Cookie("money",(money-miantiao_money)+"");
                        cost = miantiao_money;
                        balance = money-miantiao_money;
                    }
                }else if("米饭".equals(food)){
                    if(mifan_money > money){
                        out.print("用户"+userName+"余额不足,请充值");
                    }else{
                        newCard = new Cookie("money",(money-mifan_money)+"");
                        cost = mifan_money;
                        balance = money-mifan_money;
                    }
                }
            }
        }
        //将用户会员卡返还给用户
        response.addCookie(newCard);
        //将消费记录写入到响应
        out.print("用户 "+userName+"本次消费:"+cost+"余额:"+balance);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <center>
        <font style="color: red;font-size: 40px">新会员申请开卡</font>
        <form>
            <table border="2">
                <tr>
                    <td>用户名</td>
                    <td><input type="text" name="userName"></td>
                </tr>
                <tr>
                    <td>预存金额</td>
                    <td><input type="text" name="money"></td>
                </tr>
                <tr>
                    <td><input type="submit" value="申请开卡"></td>
                    <td><input type="reset"></td>
                </tr>
            </table>
        </form>
    </center>

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <center>
        <font style="color: red;font-size: 40px">点餐页面</font>
        <form action="/myWeb/two">
            食物类型:<input type="radio" name="food" value="饺子">饺子(30元)
            <input type="radio" name="food" value="面条">面条(20元)
            <input type="radio" name="food" vlaue="米饭">米饭(10元)<br>
            <input type="submit" value="划卡消费">
        </form>
    </center>
</body>
</html>
5. Cookie销毁时机
  1. 在默认情况下,Cookie对象存放在浏览器的缓存中。因此只要关闭浏览器,Cookie对象就会被销毁掉。

  2. 在手动设置情况下,可以要求浏览器将接收的Cookie存放在客户端计算机上硬盘上,同时需要指定Cookie在硬盘上存活时间。在存活时间范围内,关闭浏览器关闭客户端计算机,关闭服务器,都不会导致Cookie被销毁。在存活时间到达,Cookie自动从硬盘上被删除。

    cookie.setMaxAge(60);	//cookie在硬盘上存活1分钟
    

十六、HttpSession接口

1. 介绍

(1)HttpSession接口来自于Servlet规范下一个接口。存在于Tomcat中servlet-api.jar中,其实现类由Http服务器提供,Tomcat提供实现类存在于servlet-api.jar。
(2)如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于HttpSession对象进行数据共享。
(3)开发人员习惯于将HttpSession接口修饰对象称为【会话作用域对象】

2. HttpSession与Cookie的区别

(1)存储位置:一个在天上,一个在地下

Cookie:存放在客户端计算机 (浏览器内存/硬盘)

HttpSession:存放在服务端计算机内存

(2)数据类型

Cookie对象存储共享数据类型只能是String

HttpSession对象可以存储任意类型的共享数据Object

(3)数据数量

一个Cookie对象只能存储一个共享数据

HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据

(4)参照物

Cookie相当于客户端【会员卡】

HttpSession相当于在服务端【保险柜】
3. 命令实现

同一个网站(myWeb)下OneServlet将数据传递给TwoServlet

OneServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		// 调用请求对象向Tomcat索要当前用户在服务端的私人储物柜
		HttpSession session = request.getSession();
		//将数据添加到用户私人储物柜
		session.setAttribute("key1",共享数据);
	}
}

浏览器访问/myWeb中的TwoServlet

TwoServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		// 调用请求对象向Tomcat索要当前用户在服务端的私人储物柜
		HttpSession session = request.getSession();
		//从会话作用域对西昂得到OneServlet提供的数据
		object 共享对象 = session.getAttribute("key1");
	}
}
4. 案例分析:购物车功能实现

在这里插入图片描述

package com.lht.controller;

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

public class TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.调用请求对象,向Tomcat索要当前用户在服务端私人储物柜
        HttpSession session = request.getSession();
        //2.将session中所有的key读取出来,存放在一个枚举对象中
        Enumeration goodsNames = session.getAttributeNames();
        while(goodsNames.hasMoreElements()){
            String goodsName = (String)goodsNames.nextElement();
            int goodNum = (int)session.getAttribute(goodsName);
            System.out.println("商品名称"+ goodsName+"商品数量"+goodNum);
        }
    }
}
package com.lht.controller;

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

public class OneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String goodsName;
        //1.调用请求对象,读取请求头参数,得到用户选择的商品名
        goodsName = request.getParameter("goodsName");
        //2.调用请求对象,向Tomcat索要当前用户在服务端的私人储物柜
        HttpSession session = request.getSession();
        //3.将用户选购商品添加到当前用户私人储物柜中
        Integer goodsNum = (Integer)session.getAttribute(goodsName);
        if(goodsNum == null){
            session.setAttribute(goodsName,1);
        } else{
            session.setAttribute(goodsName,goodsName+1);
        }
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table border="2" align="center">
        <tr>
            <td>商品名称</td>
            <td>商品单价</td>
            <td>供货商</td>
            <td>放入购物车</td>
        </tr>

        <tr>
            <td>华为笔记本电脑</td>
            <td>7000</td>
            <td>华为</td>
            <td><a href="/myWeb/one?goodsName=华为笔记本电脑">放入购物车</a></td>
        </tr>

        <tr>
            <td>榴莲</td>
            <td>300</td>
            <td>泰国</td>
            <td><a href="/myWeb/one?goodsName=榴莲">放入购物车</a></td>
        </tr>

        <tr>
            <td>袜子</td>
            <td>10</td>
            <td>中国</td>
            <td><a href="/myWeb/one?goodsName=袜子">放入购物车</a></td>
        </tr>
        <tr align="center">
            <td colspan="4">
                <a  href="/myWeb/two">查看我的购物车</a>
            </td>
        </tr>
    </table>
</body>
</html>
5. Http服务器如何将用户与HttpSession关联起来

在这里插入图片描述

6.getSession()与getSession(false)

(1)getSession()

  1. 如果当前用户在服务端已经拥有了自己的私人储物柜,要求Tomcat将这个私人储物柜进行返回。
  2. 如果当前用户在服务端尚未拥有自己的私人储物柜,要求Tomcat为当前用户创建一个全新的私人储物柜。

(2)getSession(false)

  1. 如果当前用户在服务端已经拥有了自己的私人储物柜,要求Tomcat将这个私人储物柜进行返回。
  2. 如果当前用户在服务端尚未拥有自己的私人储物柜,此时Tomcat将安徽null
7. HttpSession销毁时机
  1. 用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中。
  2. 在浏览器关闭时,意味着用户与他的HttpSession关系被切断。
  3. 由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁。
  4. 为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】,这个空闲时间默认为30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁这个HttpSession。
8. HttpSession空闲时间手动设置

在当前网站/web/WEB-INF/web.xml

<session-config>
	<session-timeout>5</session-timeout>	<!--当前网站中每一个session最大空闲时间为5分钟-->
</session-config>

十七、HttpServletRequest接口实现数据共享

1. 介绍

(1)在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对西昂。因此Servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个Servlet之间实现数据共享。
(2)在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】。

2.命令实现

OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据

OneServlet {
	public void doGet(HttpServletRequest req,HttpServletResponse resp){
		//将数据添加到【请求作用域对象】中attribute属性
		req.setAttribute("key1",数据);	//数据类型可以时任意类型Object
		//向Tomcat申请调用TwoServlet
		req,getRequestDispatcher("/two").forward(req,resp);
	}
}
TwoServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse resp){
		//从当前请求对象得到OneServlet写入到共享数据
		Object 数据 = req.getAttribute("key1");
	}
}
具体实现
package com.lht.controller;

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 OneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //将数据添加到请求作用域对象,作为共享数据
        request.setAttribute("key1","hello world");
        //2.代替浏览器,向Tomcat索要TwoServlet来完成剩余任务
        request.getRequestDispatcher("/two").forward(request,response);
    }
}

package com.lht.controller;

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 TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //同一个请求作用域对象得到OneServlet写入到共享数据
        String value = (String)request.getAttribute("key1");
        System.out.println("TwoServlet得到的共享数据"+value);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值