Servlet浅谈(三)

一、三种作用域

  作用域:web开发中用于存储和获得数据。

  1、request

    一次请求有效,在forward跳转时可用request作用域传递数据。

  2、session

    client不变,session不变。用于标记用户状态、存储用户数据、验证码、购物车等。

  3、ServletContext

    web应用不变,ServletContext不变,ServletContext代表的是整个web应用。一般用于储存全web单例的重量级资源。

    ServletContext对象通过session获得,ServletContext ctx = session.getServletContext();

二、连接池

  作用:原有JDBC的开发过程中,通过Class.forName等代码创建的连接,是现用现创建,系统效率低(Connection等资源的创建需要开启IO,只要涉及到IO操作,其效率一般都相对比较低下),所以产生了连接池。本质上就是预先创建一些连接存储起来,用户需要访问数据时,直接从连接池中获得已经创建好的连接,用完之后再归还到连接池。这样就减少了连接创建过程中的性能损失,提高系统的运行效率。

  1、tomcat的连接池的弊端

    不能应用main测试,也不能应用junit测试。测试代价太大。

  2、项目中使用的连接池,一定不是web容器连接池(tomcat、weblogic等),建议使用第三方连接池:框架连接池。

三、Filter过滤器

  作用:Filter解决的是多个Servlet中所存在的公有代码的冗余问题,引入Filter之后,把多个Servlet的冗余代码,提取到Filter中,那样用户的请求就会先经过Filter,然后再访问后续的Servlet。既能保证用户功能的完成,同时也解决了代码的冗余问题。

  1、开发步骤

    a、implements Filter  实现Filter接口

public class MyFilger implements Filter{

    @Override
    public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){
        System.out.println("--------MyFilter invoke before request-------");
        chain.doFilter(request,response);
        System.out.println("--------MyFilter invoke after response--------");
    }
}

    Filter不仅可以拦截request,还可以拦截reponse。在doFilter()方法中有一个参数为FilterChain对象,FilterChain.doFilter(request,response)方法意味着将request传递给后续的Servlet,所以,在该方法之间的代码会在request之前执行,而Servlet所相应的response,也会在执行完Filter中的该方法之后的代码后才响应回client。

    b、在web.xml中配置Filter

<servlet>
    <servlet-name>targetServlet</servlet-name>
    <servlet-class>com.liquidxu.servlet.TargetServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>targetServlet</servlet-name>
    <url-pattern>/target</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.liquid.filter.MyFilter</filter-class>
</filter>
<filter-mappine>
    <filter-name>myFilter</filter-name>
    <url-pattern>target</url-pattern>
</filter-mapping>

    filter的写法跟servlet的写法基本一致,但是需要注意的是,servlet的url-pattern是该servlet的访问路径,而filter想拦截哪个servlet,就将自己的url-pattern写的跟该servlet的url-pattern一致即可。

    如果该filter想拦截所有的请求,该filter的url-pattern写成/*即可。

    如果该filter想批量拦截对Servlet的请求,则需要修改Servlet的url-pattern。例如,Servlet1的url-pattern为/admin/targer1,Servlet2的url-pattern为/admin/target2,这样将该filter的url-pattern写成/admin/*,这样就可以同时过滤到Servlet1和Servlet2了。

  2、存在的问题

    Filter默认只过滤用户的直接请求或者redirect的请求,而不过滤forward跳转。

    解决方案:

      

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>target</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

    只需在filter-mapping节点下加入此内容即可。

四、Servlet内容拾遗

  1、Servlet的创建

    Servlet对象为一种类型只创建一个对象提供服务,所以Serlvet对象为单例。

    好处就是多线程访问的情况,servlet可以保证线程是安全的。

  2、Servlet的生命周期

    a、默认用户第一次访问的时候会创建Servlet。

    b、Tomcat启动的时候Servlet也可能会被创建,不过需要配置web.xml文件如下:

<servlet>
    <serlvet-name>targetServlet</servlet-name>
    <servlet-class>com.liquidxu.servlet.TargetServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

    c、Servlet创建以后,会调用一次init方法,完成初始化处理。

    d、Servlet的service方法对外提供服务,每一次请求都会调用。

    e、Servlet会在销毁之前调用destory方法。

  3、Servlet规范组件的启动顺序

    ServletContextListener----->Filter----->Servlet

  4、Servlet的核心实现原理

    用户请求该Servlet的时候,tomcat通过用户请求的url-pattern通过查找web.xml文件中的内容,获得该url-pattern所对应的Servlet的全限定名。然后利用该Servlet类的全限定名便可以通过反射创建出该Servlet类的对象,之后便调用该Servlet类的service方法来进行服务。

      

  

时间: 2024-08-06 20:03:40

Servlet浅谈(三)的相关文章

Servlet浅谈(二)

1.forward(请求的转发)和redirect(重定向) 目的:都是为了把一个Servlet的功能,拆分到多个Servlet中,便于后续代码的维护. a.forward(请求转发) (1).如何在多个Servlet之间跳转 request.getRequestDispatcher("/url-pattern").forward(request,response). ps.路径只用填写web.xml中配置的sevlet路径即可 (2).request作用域传递数据 存数据: requ

浅谈“三次握手与四次挥手”

之前在张神的QQ群里偶尔间聊到了关于这个的问题,我这里写一下我所认知的三次握手&四次挥手,若有错误之处,请路过的大佬们指正. 首先简单的科普一下什么是三次握手,什么是四次挥手. 1.三次握手: C-->S:[SYN]   在么                                                                syn:synchronization(同步) S-->C:[SYN,ACK]   在                        

浅谈 产品经理、研发、测试,三个冤家如何高效沟通

浅谈 产品经理.研发.测试,三个冤家的那点事(1) 算上实习时间,参加工作已经五年了,一直在从事软件开发和测试的工作,期间也兼职干过一部分产品经理的事情,对这三者之间的微妙关系,颇有感悟. 1. 先来解读一下这三个岗位的"痛点" 聚会的时候,经常碰到以下几种情况,事后想起来,经常会有逗乐的感脚. 做开发的GG们是这样的: 一聊到自己的项目,两眼开始冒光,同时开启了狂喷模式,blabla一堆高大上的专业术语,一方面骂测试人员不懂技术,提的bug根本就不是关键问题,高级的bug他们根本就发

浅谈Kotlin(三):类

浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 前言: 已经学习了前两篇文章,对Kotlin有了一个基本的认识,往后的文章开始深入介绍Kotlin的实战使用. 本篇介绍Kotlin中类的使用. 一.表现形式 首先看一段Java中定义类的形式,定义三个属性,每一个属性对应一个get.set方法,有一个toString()方法 /* * @author xqx * @emil [email protected] * create

浅谈单例的三种实现--C#

传统的double check : public sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (i

浅谈DevExpress&lt;三&gt;:在GridView中加载动态图片

今天的演示效果如下:在GridView中的下拉框中选中一种颜色,则后面的加载相应的图片,如下图: 1. 2. 3. 下面说下实现方法:首先在项目中拉一个GirdControl,在里面创建4列:ID,Name,Color,Image,并将Color和Image分别创建repositoryItemComboBox和repositoryItemPictureEdit控件,如下图: 将一个图片文件夹放到程序的启动目录中: 文件夹中包含如下图片: 接下来进行创建数据模板,先创建一个Datetable,添加

蚂蚁变大象:浅谈常规网站是如何从小变大的(三)(转)

原文:http://blog.sina.com.cn/s/blog_6203dcd60100xon9.html          [第七阶段 : 拆分] 到上面一个阶段,我们初步接触到了逻辑.存储等的多机模式.这样的结构,对于逻辑不是特别复杂的网站,足以撑起千万级的压力.所以大多数网站,只要能够用好上面的结构就可以很好的应对服务压力了.只不过还有很多细节的工作需要精细化,比如:多机的运维.稳定性的监控.日志的管理.请求的分析与挖掘等. 如果流量持续增长,或者是业务持续的扩展,上述的架构可能又将面

浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色

浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色 本篇文章是系列文章中的第三篇,前两篇的地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 简介 在简单恢复模式下,日志文件的作用仅仅是保证了SQL Server事务的ACID属性.并不承担具体的恢复数据的角色.正如”简单”这个词的字面意思一样,数据的备份和恢复仅仅是依赖于手动备份和恢复.在开始文章之前,首先

浅谈Tomcat和Servlet

本文浅谈下对Tomcat和Servlet总体的理解,初学时有用过一段时间,但当时疲于应对如何xml配置和使用,对他们的理解就像是一个黑匣子.现在回顾一下帮助自己加深网络的理解.开始还是先推荐我看的文章和书. https://www.cnblogs.com/zhouyuqin/p/5143121.html 以下都是IBM Developer上的文章,该网站上还是有很多优质文章. https://www.ibm.com/developerworks/cn/java/j-lo-servlet/  Se