Servlet接口实现类开发(二)

十.多个Servlet之间调用规则

1.前提条件:

某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。
但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器 发起多次请求才能得到服务。
这样增加用户获得服务难度,导致用户放弃访问当前网站【98k,AKM】

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

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

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

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

1.重定向解决方案
1.工作原理: 用户第一次通过【手动方式】通知浏览器访问OneServlet

OneServlet工作完毕后,将TwoServlet地址写入到响应头
location属性中,导致Tomcat将302状态码写入到状态行 在浏览器接收到响应包之后,会读取到302状态。此时浏览器
自动根据响应头中location属性地址发起第二次请求,访问 TwoServlet去完成请求中剩余任务
2.实现命令:

response.sendRedirect(“请求地址”)
将地址写入到响应包中响应头中location属性

3.特征:

(1)请求地址:

既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
(2)请求次数

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

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

重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间 消耗在往返次数上,增加用户等待服务时间
2.请求转发解决方案:
1.原理:

用户第一次通过手动方式要求浏览器访问OneServlet。
OneServlet工作完毕后,通过当前的请求对象代替浏览器 向Tomcat发送请求,申请调用TwoServlet。 Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务
2.实现命令: 请求对象代替浏览器向Tomcat发送请求

//1.通过当前请求对象生成资源文件申请报告对象

RequestDispatcher report =request.getRequestDispatcher("/资源文件名");一定要以"/"为开头

//2.将报告对象发送给Tomcat

report.forward(当前请求对象,当前响应对象)

3.优点:

1)无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求
2) Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数
增加处理服务速度

4.特征:

(1)请求次数

在请求转发过程中,浏览器只发送一次请求
(2)请求地址

-只能向Tomcat服务器申请调用当前网站下资源文件地址 request.getRequestDispathcer("/资源文件名") 不要写网站名
(3)请求方式

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

十一.多个Servlet之间数据共享实现方案:

1.数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用

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

  1. ServletContext接口(全局作用域对象)
    1.介绍:

来自于Servlet规范中的一个接口。如有有两个Servlet来自同一个网站。彼此之间通过ServletContext实现对象共享。
2.工作原理:

每一个网站都存在一个全局作用域对象。这个全局作用域对象相当于一个Map.
3.全局作用域对象生命周期

在Http服务器启动的过程中,自动为当前网站在内存中创建一个全局作用域对象.
注意:在Http服务器运行期间是,一个往回走哪只有一个全局作用域对象,Http运行期间,全局作用域对象一直处于存活

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

        //1.通过请求对象向Tomcat索要当前网站全局作用域对象
        ServletContext application = request.getServletContext();
        //2.将数据添加到全局作用域对象,作为共享数据
        application.setAttribute("key1", 100);
    }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.通过请求对象向Tomcat索要当前网站全局作用域对象
        ServletContext application = request.getServletContext();
        //2.从全局作用域对象得到指定关键字对应的值
        Integer money=(Integer)application.getAttribute("key1");
    }
  1. Cookie类(私人储存卡)
    1.介绍:

cookie来自于Servlet规范中一个工具类,存在于Tomcat提供的servlet-api.jar中
cookie存放当前用户的私人数据,在共享数据过程中提高服务质量
2.原理
用户通过浏览器第一次向MyWeb网站发送请求申请OneServlet.
OneServlet在运行期间创建一个Cookie存储于当前用户相关数据
OneServlet工作完毕后,将Cookie写入相应头
3.实现命令

public class OneServlet extends HttpServlet {

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

    }
}

public class TwoServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int jiaozi_money = 30;
        int gaifan_money = 15;
        int miantiao_money = 20;
        int money = 0, xiaofei = 0, balance = 0;
        String food, userName = null;
        Cookie cookieArray[] = null;
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        Cookie newCard = null;
        //1.读取请求头参数信息,得到用户点餐食物类型
        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) + "");
                        xiaofei = 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) + "");
                        xiaofei = miantiao_money;
                        balance = money - miantiao_money;
                    }
                } else if ("盖饭".equals(food)) {
                    if (gaifan_money > money) {
                        out.print("用户 " + userName + " 余额不足,请充值");
                    } else {
                        newCard = new Cookie("money", (money - gaifan_money) + "");// 10+"abc"="10abc"
                        xiaofei = gaifan_money;
                        balance = money - gaifan_money;
                    }
                }
            }
        }
        //4.将用户会员卡返还给用户
        response.addCookie(newCard);
        //5.将消费记录写入到响应
        out.print("用户 " + userName + "本次消费 " + xiaofei + " 余额 :" + balance);
    }
}

4.Cookie销毁时机

Cookie对象默认存放在浏览器上,因此浏览器关闭,Cookie对象就会被销毁,
在手动设置情况下,可以要求浏览器将接受的Cookie存放在客户端硬盘上。

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

3.HttpSession接口(会话作用域对象)
1.介绍:

HttpSession接口来自于Servlet规范下一个接口
如果两个Servlet来自于同样一个网站,并且为同一个浏览器、用户提供服务,此时借助于HTTPSession对象进行共享
开发人员习惯于将HttpSession接口修饰对象称为【会话作用域对象】
2.HttpSession于Cookie区别:

储存位置不同:Cookie存放在客户端的计算机(浏览器内存/硬盘)HttpSession存放在服务端计算机内存。
数据类型:Cookie对象存储共享数据只能是String,HttpSession对象可以存储任意类型的共享数据Object。
数据数量:一个Cookie对象只能存储一个共享数据,HttpSession使用map集合存储共享数据,所以储存任意数据。
参照物:Cookie相当于客户在服务器的【会员卡】,HttpSession相当于客户在服务端的【私人保险箱】。
3.命令实现:

//OneServlet代码
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();
           //session.setMaxInactiveInterval(5);
          //3.将用户选购商品添加到当前用户私人储物柜
          Integer  goodsNum = (Integer)session.getAttribute(goodsName);
          if(goodsNum == null){
              session.setAttribute(goodsName, 1);
          }else{
              session.setAttribute(goodsName, goodsNum+1);
          }
    }
}
//TwoServlet代码
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 goodsNum = (int)session.getAttribute(goodsName);
            System.out.println("商品名称 "+goodsName+" 商品数量 "+goodsNum);
        }
    }
}

4.Http服务器如何将用户与HttpSession关联起来
Cookie
5.getSession()与getSession(false)
(1)getSession(),如果当前用户在服务端拥有自己的私人储藏柜,返回当前储藏柜,如果没有创建新的私人储藏柜并且返回。
(2)getSeeion(false),如果当前客户在服务端没有私人储存柜,返回null。

6.HttpSession空闲时间手动设置
在当前网站/web/WEB-INF/web.xml

5
4.HttpServletRequest接口(请求作用域对象)
介绍:

在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】
实现命令:

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

十二.监听器接口

1.介绍:

监听器接口用于监控【作用域对象生命周期变化】以及【作用域对象共享数据变化时刻】
2.作用域对象

ServletContext:全局作用域对象。
HttpSesssion:会话作用域对象
HttpServletRequest:请求作用域对象
3.监听器接口实现类开发规范:三步

1)根据监听的实际情况,选择对应监听器接口进行实现
2)重写监听器接口声明【监听事件处理方法】
3)在web.xml文件将监听器接口实现类注册到Http服务器

4.ServletContextListener接口:
1)作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻

2)监听事件处理方法:

public void contextInitlized() 在全局作用域对象被Http服务器初始化被调用
public void contextDestory() 在全局作用域对象被Http服务器销毁时候触发调用

5.ServletContextAttributeListener接口:

监听事件处理方法:
public void contextAdd():在全局作用域对象添加共享数据
public void contextReplaced():在全局作用域对象更新共享数据
public void contextRemove():在全局作用域对象删除共享数据

6.全局作用域对象共享数据变化时刻

ServletContext application = request.getServletContext();
application.setAttribute(“key1”,100); //新增共享数据
application.setAttribute(“key1”,200); //更新共享数据
application.removeAttribute(“key1”); //删除共享数据

十三.Filter接口(过滤器接口)

1.介绍:

Filter接口实现类由开发人员负责提供,Http服务切不负责提供
Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
2.具体作用:
1)拦截Http服务器,帮助Http服务器检测当前请求合法性
2)拦截Http服务器,对当前请求进行增强操作

3.Filter接口实现类开发步骤:三步
1)创建一个Java类实现Filter接口
2)重写Filter接口中doFilter方法
3)web.xml将过滤器接口实现类注册到Http服务器

4.Filter拦截地址格式
(1) 命令格式:

<filter-mapping>
    <filter-name>oneFilter</filter-name>
	<url-pattern>拦截地址</url-pattern>
</filter-mapping>
@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("拦截请求......");
		chain.doFilter(request, response);//放行
			
		System.out.println("拦截响应......");		
	}

(2) 命令作用:
拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截

(3)要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截

<url-pattern>/img/mm.jpg</url-pattern>

(4)要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截

 <url-pattern>/img/*</url-pattern>
 

(5)要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截

<url-pattern>*.jpg</url-pattern>

(6)要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截

<url-pattern>/*</url-pattern>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值