Servlet第二篇(介绍、ServletConfig;ServletContext)

什么是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
  如果文件太大,就不能用类装载器的方式去读取,会导致内存溢出

posted on 2019-03-11 21:45  诗悦网络内推有问必答  阅读(221)  评论(0编辑  收藏  举报

导航