什么是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. Oracle 巡检命令

    [grid@XXXXX ~]$ asmcmd -pASMCMD [+] > lsdg

  2. SAS 读取指定目录下文件列表宏

    OPTIONS PS=MAX LS=MAX NOCENTER SASMSTORE=SASUSER MSTORED MAUTOSOURCE;/*获取指定文件夹的指定类型的所有文件*/%MACRO GET ...

  3. mybatis缓存的设计

    继续用提问的方式来看Mybatis的缓存设计. 1.Mybatis如何开启缓存 Mybatis对查询结果进行缓存,所以缓存的对象为具体的Statement 通过在Statement上是否使用缓存来启用 ...

  4. React开发环境搭建(react,babel,webpack webpack-dev-server)

    最终效果: 配置webpack 自动编译脚本, 内容更改后浏览器页面自动刷新,提高效率. 主要靠webpack 的watch 功能. npm 全局安装的包: webpack webpack-cli w ...

  5. vb程序安装时需要在客户端安装MSSOAP30.dll,但注册不上,请问怎么处理

    現在想打包发布,在客戶沒有這個控件時,注冊一下,主要是不想在客户机器上安装SoapToolkit30.EXE文件 ?? 推荐解决方案 如果使用 InstallShield 工具来打包,安装完MSSOA ...

  6. 去除 ServiceStack.Redis 的6000次限制。

    方法一. 下载 https://github.com/ServiceStack/ServiceStack.Text 修改LicenseUtils.cs文件中的AssertValidUsage var ...

  7. OpenCV中Mat的使用

    一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...

  8. 自定义panel实现,并实现item更改和移除动画。

    原地址:https://www.cnblogs.com/yk250/p/10043694.html  无图无真相: 1,重写panel类(模拟实现一个竖直方向排列的panel,相当于默认的StackP ...

  9. 好用的treeGrid

    jquery easyui 官网:http://www.jeasyui.net/plugins/186.html  下面以学校班级情况,先贴出效果图吧! 数据库设计:红色框中为必须要有的列,右边三个为 ...

  10. json_encode($b, JSON_FORCE_OBJECT) 可以强制转换成对象

    最近在为移动端的项目提供接口,数据格式都为json,不过在过程中遇到一个小问题,代码如下: 情况一: $tmp = array('a','b','c'); echo json_encode($tmp) ...