什么是Serlvet?

  Servlet其实就是一个遵循Servlet开发的java类。Serlvet是由服务器调用的,运行在服务器端。

为什么要用到Serlvet?

  我们编写java程序想要在网上实现 聊天、发帖、这样一些的交互功能,普通的java技术是非常难完成的。sun公司就提供了Serlvet这种技术供我们使用。

Servlet的作用

  处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。

JavaWeb目录结构   

  • bbs目录代表一个web应用
  • bbs目录下的html,jsp文件可以直接被浏览器访问
  • WEB-INF目录下的资源是不能直接被浏览器访问的
  •  web.xml文件是web程序的主要配置文件
  •  所有的classes文件都放在classes目录下
  • jar文件放在lib目录下

实现Servlet接口编写Servlet程序

  • 配置Tomcat
  • 编写Servlet程序的步骤
  • 创建一个自定义类,实现Serlvet接口
  • 我们发现有5个方法需要重写,有init【初始化】,destroy【销毁】,service【服务】,ServletConfig【Servlet配置】,getServletInfo【Serlvet信息】。
  • service()方法是最有可能是写逻辑代码的地方。
  • 调用ServletResponse对象的方法向浏览器输出HelloWorld
  • 配置xml文件,光写了Servlet是不行的,Tomcat还要知道浏览器怎么访问这个Servlet

Serlvet生命周期

  • 加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
  • 初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
  • 处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
  • 销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
  • 卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。
  • 简单总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。 destroy()只有在Tomcat关闭的时候才会被调用。

继承HttpServlet编写Servlet程序

  • HttpServlet类已经实现了Servlet接口的所有方法,编写Servlet时,只需要继承HttpServlet,重写你需要的方法即可,并且它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。
  • 重写doGet()和doPost()方法的。对于idea而言,创建Servlet的时候已经帮你重写好了

Servlet的映射

  • 同一个Servlet可以被映射到多个URL上。 无论我访问的是http://localhost:8080/Demo1还是http://localhost:8080/ouzicheng。我访问的都是Demo1。
  • Servlet映射的URL可以使用通配符

  *.扩展名
    *.扩展名的优先级最低
  正斜杠(/)开头并以“/*”结尾。
作用
  隐藏网站是用什么编程语言写的【.php,.net,.asp实际上访问的都是同一个资源】
  用特定的后缀声明版权【公司缩写】

Servlet是单例的

  • 为什么Servlet是单例的

  浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。

  • 每次访问请求对象和响应对象都是新的

  对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

  • 线程安全问题

  当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。
原则
  如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}
  如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题

load-on-startup

  如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
  作用
    为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据
    完成一些定时的任务【定时写日志,定时备份数据】

在web访问任何资源都是在访问Servlet

  无论在web中访问什么资源【包括JSP】,都是在访问Servlet。没有手工配置缺省Servlet的时候,你访问静态图片,静态网页,缺省Servlet会在你web站点中寻找该图片或网页,如果有就返回给浏览器,没有就报404错误

  什么叫做缺省Servlet?

    凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求

  总结:无论在web中访问什么资源【包括JSP】,都是在访问Servlet。没有手工配置缺省Servlet的时候,你访问静态图片,静态网页,缺省Servlet会在你web站点中寻找该图片或网页,如果有就返回给浏览器,没有就报404错误

ServletConfig对象

ServletConfig对象有什么用?
  通过此对象可以读取web.xml中配置的初始化参数。
    为什么我们要把参数信息放到web.xml文件中呢?我们可以直接在程序中都可以定义参数信息,搞到web.xml文件中又有什么好处呢?
    好处就是:能够让你的程序更加灵活【更换需求,更改配置文件web.xml即可,程序代码不用改】

获取web.xml文件配置的参数信息
为Demo1这个Servlet配置一个参数,参数名是name,值是yolo

<init-param>         

   <param-name>name</param-name>         

   <param-value>yolo</param-value>       

</init-param>

在Servlet中获取ServletConfig对象,通过ServletConfig对象获取在web.xml文件配置的参数

  ServletConfig servletConfig=this.getServletConfig();
  String value=servletConfig.getInitParameter("name");
  System.out.println(value);

ServletContext对象

什么是ServletContext对象?
当Tomcat启动的时候,就会创建一个ServletContext对象。它代表着当前web站点
ServletContext有什么用?

  •   ServletContext既然代表着当前web站点,那么所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。
  •   ServletConfig获取的是配置的是单个Servlet的参数信息,ServletContext可以获取的是配置整个web站点的参数信息
  •   利用ServletContext读取web站点的资源文件
  •   实现Servlet的转发【用ServletContext转发不多,主要用request转发】

Servlet之间实现通讯

  ServletContext对象可以被称之为域对象
    可以简单理解成一个容器【类似于Map集合】
  实现Servlet之间通讯就要用到ServletContext的setAttribute(String name,Object obj)方法第一个参数是关键字,第二个参数是你要存储的对象,以及getAttribute("name");

获取web站点配置的信息
  让所有的Servlet都能够获取到连接数据库的信息,不可能在web.xml文件中每个Servlet中都配置一下,这样代码量太大

 <context-param>

       <param-name>name</param-name>

       <param-value>yolo</param-value>

   </context-param>

然后调用servletContext.getInitParameter();

  • 读取资源文件

  第一种方式:
    根据web的目录规范,Servlet编译后的class文件是存放在WEB-INF\classes文件夹中的
    ServletContext读取就可以避免修改代码的情况,因为ServletContext对象是根据当前web站点而生成的
      用servletContext.getResourceAsStream("/WEB-INF/classes/zhongfucheng/web/1.png");
      如果我的文件放在web目录下,那么就简单得多了!,直接通过文件名称就能获取
第二种方式
  通过类装载器读取资源文件。
  我的文件放在了src目录下【也叫做类目录】
    classLoader.getResourceAsStream
  如果文件太大,就不能用类装载器的方式去读取,会导致内存溢出

Servlet第二篇(介绍、ServletConfig;ServletContext)的更多相关文章

  1. Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】

    Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...

  2. Servlet(八):ServletContext对象和ServletConfig对象

    ServletContext 对象:问题: Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,那么不同的用户的数据共享该怎么办呢?解决: 使用 Serv ...

  3. Servlet学习(二):ServletConfig获取参数;ServletContext应用:请求转发,参数获取,资源读取;类装载器读取文件

    转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件 ...

  4. JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前 ...

  5. (转)JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前 ...

  6. Servlet开发(三)之ServletConfig,ServletContext

    1. ServletConfig Servlet是开发动态web的技术,而web.xml是Tomcat工程中最基础也最重要的配置文件,Tomcat启动项目的时候会加载并读取这个文件,其中web.xml ...

  7. JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response

    1.  ServletConfig  有一些东西不合适在程序中写死,应该写在web.xml中,比如 文字怎么显示, 访问数据库名 和 密码, servlet要读取的配置文件 等等.. l在Servle ...

  8. Server,Servlet,ServletConfig,ServletContext,Session,Request,Response

    Server流程 解析URL->找到应用->找到Servlet->实例化Servlet->调用init->调用service->返回响应->调用destroy ...

  9. Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

    Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ​ 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...

随机推荐

  1. vim YouCompleteMe 遇到的问题及解决

    问题1: 补充,升级gcc,g++ 到4.7以上的版本才能安装成功 github 官网 github https://github.com/Valloric/YouCompleteMe#ubuntu- ...

  2. 2018-2019-2 20175236实验二《Java面向对象程序设计》实验报告

    实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 没有Linux基础的同学建议先学习<Lin ...

  3. 为什么比特币和以太坊未必真得比EOS更去中心化?

    在区块链行业里,有两派人一直在争论:一个是以比特币和以太坊为首的社群,另一个是以EOS为首的社群.这两群人一直在争论谁才是真正的未来,双方都认为自己这边更有未来.其中EOS抗争的重点就是100万TPS ...

  4. log4j2 实际使用详解

    转载至: https://blog.csdn.net/vbirdbest/article/details/71751835 如下是maven项目中的实例: 首先pom.xml中引入如下依赖,注意看都是 ...

  5. Oracle列自增-12c

    在ORACLE 12C以前的版本中,如果要实现列自增长,需要通过序列+触发器实现,到了12C ORACLE 引进了Identity Columns新特性,从而实现了列自增长功能. 一.Identity ...

  6. 分析RedisRDB和AOF两种持久化机制的工作原理及优劣势

    一.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only(追加)的模式写入一个日志文件中,在redi ...

  7. 调试dump文件

    1.设置好pdb文件和源代码路径 为了能正确分析Dump文件,我们必须要指定和程序一起出来的PDB文件,如果程序重新被编译了一次,即使代码没有任何变化,之前的PDB文件我们不能再继续使用.

  8. Linux java进程无故被kill

    这两天,演示环境的java应用无端端就被停止了.在这里记录一下原因和排查过程: 发现应用挂掉以后,第一时间登陆centos,发现进程没有了.于是重新启动应用. 但是启动不起来,去看业务日志,没有找到任 ...

  9. SVN:linux下搭建svn服务器

    转载:https://www.cnblogs.com/puloieswind/p/5856326.html 1. 安装SVN服务器: 检查是否已安装 # rpm -qa subversion 安装SV ...

  10. Kafka(2)--kafka基本原理之消息的分发与接收

    关于 Topic 和 Partition Topic 在 kafka 中,topic 是一个存储消息的逻辑概念,可以认为是一个消息集合.每条消息发送到 kafka 集群的消息都有一个类别.物理上来说, ...