(一)Servlet开发与配置

1.1 开发步骤

  • 1)编写java类,继承HttpServlet类
  • 2)重新doGet和doPost方法
  • 3)Servlet程序交给tomcat服务器运行!

配置信息:

     <servlet>
<!-- Servlet 的内部名称,自定义 -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet的类全名-->
<servlet-class>com.infaraway.HelloServlet</servlet-class>
</servlet> <!--Servlet的映射配置-->
<servlet-mapping>
<!--servlet的内部名称,要和上面的保持一致-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet的映射路径(访问servlet的名称)-->
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>

           url-pattern                                    浏览器输入
精确匹配        /HelloServlet            http://localhost:8080/day10/HelloServlet
                   /path/HelloServlet    http://localhost:8080/day10/path/HelloServlet

模糊匹配        /*           http://localhost:8080/projectName/任意路径
       /path/*                http://localhost:8080/projectName/path/任意路径
        *.后缀名                 http://localhost:8080/projectName/任意路径.do
        *.do
           *.action
        *.html(伪静态)

注意:
1)url-pattern要么以 / 开头,要么以*开头。 例如, path是非法路径。
2)不能同时使用两种模糊匹配,例如 /path/*.do是非法路径
3)当有输入的URL有多个servlet同时被匹配的情况下:
    a 精确匹配优先。(长的最像优先被匹配)
    b 以后缀名结尾的模糊url-pattern优先级最低!

1.2 servlet缺省路径

servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。

问题: URL输入http://localhost:8080/projectName/index.html 如何读取文件?

  • 1)到当前projectName应用下的web.xml文件查找是否有匹配的url-pattern。
  • 2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理
  • 3)DefaultServlet程序到projectName应用的根目录下查找是存在一个名称为index.html的静态文件。
  • 4)如果找到该文件,则读取该文件内容,返回给浏览器。
  • 5)如果找不到该文件,则返回404错误页面。

(二)Servlet的生命周期

2.1 Servlet重要的四个生命周期方法

  • 构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象 只调用1次。证明servlet对象在tomcat是单实例的。
  • init方法: 创建完servlet对象的时候调用。只调用1次。
  • service方法: 每次发出请求时调用。调用n次。
  • destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

2.2 伪代码演示servlet的生命周期

Tomtcat内部代码运行:
1)通过映射找到到servlet-class的内容,字符串: com.infaraway.HelloServlet
2)通过反射构造HelloServlet对象
  2a. 得到字节码对象
    Class clazz = class.forName("com.infaraway.HelloServlet");
  2b. 调用无参数的构造方法来构造对象
    Object obj = clazz.newInstance(); ---1.servlet的构造方法被调用
3)创建ServletConfig对象,通过反射调用init方法
  3a 得到方法对象
    Method m = clazz.getDeclareMethod("init",ServletConfig.class);
  3b 调用方法
    m.invoke(obj,config); --2.servlet的init方法被调用
4)创建request,response对象,通过反射调用service方法
  4a 得到方法对象
    Method m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
  4b 调用方法
    m.invoke(obj,request,response); --3.servlet的service方法被调用
5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
  5a 得到方法对象
    Method m = clazz.getDeclareMethod("destroy",null);
  5b 调用方法
    m.invoke(obj,null); --4.servlet的destroy方法被调用

(三)Servlet相关问题

3.1. 自动加载

默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。因此,为了提高访问的速度,我们需要改变servlet创建对象的时机: 提前到加载web应用的时候!在servlet的配置信息中,加上一个<load-on-startup>即可!

即在配置Servlet的时候在配置文件中加入

     <servlet>
<!-- Servlet 的内部名称,自定义 -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet的类全名-->
<servlet-class>com.infaraway.HelloServlet</servlet-class>
<!-- 让servlet对象自动加载
7 注意: 整数值越大,创建优先级越低!!-->
8 <load-on-startup>1</load-on-startup>
</servlet>

3.2. 有参数init方法和无参数的init方法

在原来的init方法中会调用无参数的init方法;无参数的Init用来编写初始化的逻辑代码;有参数的init方法是Servlet生命周期的方法,一定会被tomcat调用。如果编写程序时,不需要覆盖有参数的init方法,只需要将初始化代码放到无参数的init方法即可;

3.3. 多线程并发问题

注意: servlet对象在tomcat服务器是单实例多线程的。

(四)ServletConfig对象

Servlet中需要学习的四个对象,其中前两个在学习Http请求的时候已经详细讲述了:具体见之前的博文:

  • HttpServletRequest 请求对象:获取请求信息
  • HttpServletResponse 响应对象: 设置响应对象
  • ServletConfig对象 servlet配置对象
  • ServletContext对象; servlet的上下文对象

作用:ServletConfig对象主要用于加载Servlet的初始化参数,在一个web应用中,可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)

创建时间:在创建完servlet对象之后,在调用init方法之前会创建ServletConfig对象

获取对象:直接从有参数的init方法中得到该对象;

其中Servlet中初始化参数的配置:

     <servlet>
<!-- Servlet 的内部名称,自定义 -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet的类全名-->
<servlet-class>com.infaraway.HelloServlet</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
8 <param-name>path</param-name>
9 <param-value>e:/b.txt</param-value>
10 </init-param>
</servlet>

注意: servlet的参数只能由当前的这个sevlet获取!

ServletConfig的API:

  • java.lang.String getInitParameter(java.lang.String name) 根据参数名获取参数值
  • java.util.Enumeration getInitParameterNames() 获取所有参数
  • ServletContext getServletContext() 得到servlet上下文对象
  • java.lang.String getServletName() 得到servlet的名称

(五)ServletContext对象

  ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。

创建时机:加载web应用时创建ServletContext对象。

获取对象: 从ServletConfig对象的getServletContext方法得到

     1)创建ServletContext对象      ServletContext  context = new ServletContext()        

     2)创建ServletConfig对象       ServetConfig config = new ServletConfig();
config.setServletContxt(context);
class ServletConfig{
ServletContext context;
public ServletContext getServletContxt(){
return contxt;
}
} public void init( ServletConfig config ){
得到ServletConfig对象
从ServletConfig对象中得到ServletContext对象
SerlvetContext context = config.getServletContext();
}

ServletContext对象的核心API

  • java.lang.String getContextPath() --得到当前web应用的路径
  • java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
  • java.util.Enumeration getInitParameterNames()
  • void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
  • java.lang.Object getAttribute(java.lang.String name)
  • void removeAttribute(java.lang.String name)
  • RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
  • java.lang.String getRealPath(java.lang.String path) --得到web应用的资源文件
  • java.io.InputStream getResourceAsStream(java.lang.String path)

Servlet基础(工作原理、生命周期)的更多相关文章

  1. Servlet的工作原理和生命周期

    Servlet的工作原理 . Web服务器加载Servlet:Web服务器启动后,它会根据每个工程的web.xml文件去查找该工程的Servlet,并且找到这些Servlet的Class文件所在的地址 ...

  2. JavaWeb之 Servlet执行过程 与 生命周期

    Servlet的概念 什么是Servlet呢? Java中有一个叫Servlet的接口,如果一个普通的类实现了这个接口,这个类就是一个Servlet.Servlet下有一个实现类叫HttpServle ...

  3. JavaEE Servlet 核心方法及生命周期

    做JavaWeb开发,免不了要和Servlet打交道.Servlet是Sun(Oracle)官方定义的一个Web开发规范,所有Servlet开发都必须遵守.自己以前也没有从头做过Web开发,所以这方面 ...

  4. [转]JavaWeb之 Servlet执行过程 与 生命周期

    https://www.cnblogs.com/vmax-tam/p/4122105.html Servlet的概念 什么是Servlet呢? Java中有一个叫Servlet的接口,如果一个普通的类 ...

  5. 【servlet】Servlet的API和生命周期]

    创建时间:6.15 一.Servlet的API(生命周期) (1)Servlet接口中的方法 1)init(ServletConfig config) 何时执行:servlet对象创建的时候执行 Se ...

  6. JSP 和 Servlet 的工作原理和生命周期

    JSP的英文名叫Java Server Pages,翻译为中文是Java服务器页面的意思,其底层就是一个简化的Servlet设计,是由sum公司主导参与建立的一种动态网页技术标准.Servlet 就是 ...

  7. JavaEE基础(01):Servlet实现方式,生命周期执行过程

    本文源码:GitHub·点这里 || GitEE·点这里 一.Servlet简介 Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用S ...

  8. JavaEE基础(01):Servlet实现方式,生命周期执行...

    一.Servlet简介Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库 ...

  9. servlet其工作原理和例子证明

    servlet简单介绍 当我们在地址栏里面输入www.baidu.com,终于呈如今我们面前的是百度搜索的页面.在这些訪问过程中,都会有一个webserver来处理这些请求以及訪问处理后的结果. 而s ...

  10. servlet入门学习之生命周期

    一. 什么是Servlet Servlet是用Java语言编写的服务器端小程序,驻留在web服务器中,并在其中运行,扩展了web服务器的动态处理功能. 用java语言编写的java类 在web容器中运 ...

随机推荐

  1. 每天学一点Docker(6)——镜像和DockerFile

    镜像的分层结构: 实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的.比如我们现在构建一个新的镜像,Dockerfile 如下: ① 新镜像不再 ...

  2. Winform应用程序实现通用遮罩层二

    之前先后发表过:<Winform应用程序实现通用遮罩层>.<Winform应用程序实现通用消息窗口>,这两款遮罩层其实都是基于弹出窗口的,今天为大家分享一个比较简单但界面相对友 ...

  3. jq选择器汇总

    $("div") //标签 $(".box") //类 $("#box") //ID $("a[href][name]" ...

  4. mysql如何执行关联查询与优化

    mysql如何执行关联查询与优化 一.前言 在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么m ...

  5. jdk8新特性(文章推荐)

    文章推荐 jdk9都已经出来了,虽然很多项目都已经使用jdk8,但是很少会用到jdk8中的新特性.本人经常用的到也就是使用Stream,Lambda,但也仅仅是使用,基本不知道什么Function,C ...

  6. android开发文章收藏

    1.activity [Android的从零单排开发日记]之入门篇(四)——Android四大组件之Activity 两分钟彻底让你明白Android Activity生命周期(图文)! 2.serv ...

  7. [转载]阿里云MySQL优化主从同步,降低数据延迟

    1. 背景 为了提高系统的可用性和数据保护,MySQL通常采用master-slave的部署结构,简单高效,master和slave之间使用binlog来复制数据. binlog支持statement ...

  8. Codeforces #452 Div2 F

    #452 Div2 F 题意 给出一个字符串, m 次操作,每次删除区间 \([l,r]\) 之间的字符 \(c\) ,输出最后得到的字符串. 分析 通过树状数组和二分,我们可以把给定的区间对应到在起 ...

  9. Spring mvc之 发邮件(qq.163...)

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  10. atom编辑器启动后文件不能编辑的解决办法

    今天更新了atom,并且安装了很多插件,突然发现所有页面不能编辑了,如图 这个光标块会自动跳到单词后面,后来发现按一下键盘的字母a就变成正常光标了,至于原因,折腾了一个小时也没发现,后来百度到用Ctr ...