JavaWeb学习__第3天__Servlet

原创 2013年12月05日 22:33:06

1.概述

    Servlet是SUN公司提供的用于开发动态web资源的技术,本质上是一段java小程序,能够运行在Servlet容器(Tomcat)当中。
    开发一个动态web资源的步骤:
    1).写一个类实现Servlet接口,其实是继承GenericServlet(它是Servlet的一个实现类)
        先将Servlet包加入Classpath
        javac -d . FristServlet
    2).将编译好的带包的.class放到WEB-INF/classes下以外,还要配置web应用的 web.xml注册Servlet

<servlet>
	<servlet-name>FirstServlet</servlet-name>  -- 给Servlet起一个名字,仅仅是名字而已
	<servlet-class>com.itheima.FirstServlet</servlet-class> --  具体Servlet 的类全路径名,注意不是文件名
</servlet>
<servlet-mapping>
	<servlet-name>FirstServlet</servlet-name> -- 给哪个名字的Serlvet配置对外访问路径
	<url-pattern>/servlet/first</url-pattern> --  配置通过哪个路径去访问此Servlet
</servlet-mapping>

2.Servlet运行过程

    Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
    1).Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
装载并创建该Servlet的一个实例对象。 
    2).调用Servlet实例对象的init()方法。
    3).创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
    4).WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

3.Servlet的生命周期

    通常情况下,服务器会在Servlet第一次被调用时创建该Servlet类的实例对象(servlet出生);一旦被创建出来,该Servlet实例就会驻留在内存中,为后续请求服务;直至web容器退出,servlet实例对象才会被销毁(servlet死亡)。
    在Servlet的整个生命周期内,Servlet的init方法只有在servlet被创建时被调用一次。
    而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
    servlet被销毁前,会调用destroy() 方法。

4.Servlet接口的继承结构

    Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
    Servlet接口:定义了一个servlet应该具有的方法,所有的Servlet都应该直接或间接实现此接口
        GenericServlet:对Servlet接口的默认实现,通用Servlet,这是一个抽象类,其中的大部分方法都做了默认实现,只有service方法是一个抽象方法需要继承者自己实现
        HttpServlet:是GenericServlet的实现类,对HTTP协议进行了优化的Servlet,继承自GenericServlet类,并且实现了其中的service抽象方法,默认的实现中判断了请求的请求方式,并根据请求方式的不同分别调用不同的doXXX()方法。通常我们直接继承HttpServlet即可

5.细节

    1.将Servlet映射到一个Url上面被外界访问:

<web-app>
	<servlet>
		<servlet-name>AnyName</servlet-name>
		<servlet-class>HelloServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>AnyName</servlet-name>
		<url-pattern>/demo/hello.html</url-pattern>
	</servlet-mapping>
</web-app>
    2.使用*号通配符来进行配置,但是只能是下面两种固定的写法
        以/开通并以/*结尾的路径
        以*.后缀的方式配置的路径
        匹配原理:,哪个最像找哪个,*.后缀优先级最低。
    3.配置load-on-startup ,使Servlet随着服务器的启动web应用加载后立即创建

<servlet>
	<servlet-name>invoker</servlet-name>
	<servlet-class>
		org.apache.catalina.servlets.InvokerServlet
	</servlet-class>
	<load-on-startup>2</load-on-startup><!--使invoker这个Servlet在web应用创建的时候就被装载-->
</servlet>
    用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。 

    4.缺省Servlet
    如果将某个Servlet的对外访问路径配置为一根正斜杠,则这个Serlvet就是缺省Servlet了,特点是:其他Servlet都不处理的请求,由它来处理.
    注:其实,浏览器在访问静态资源、错误提示页面时,都是由conf/web.xml(爸爸web.xml)中配置的缺省Servlet在进行输出,所以平常自己就不要配置缺省Servlet,否则会导致静态资源、错误页面无法正确访问。
    5.线程安全
    由于默认情况下Servlet的对象在内存中只有一个,多个浏览器并发访问时可能具有线程安全问题,我们可以使用锁机制来解决线程安全问题,但是容易造成程序的阻塞,效率降低,也可以使用SingleThreadModel接口,但是这个接口并不能真的防止线程安全问题已经被废弃。
    所以,我们以后再设计Servlet时,应该尽量的不要使用类成员变量和静态成员变量,如果一定要使用,则还是要用锁机制来访问线程安全问题,但是要注意,尽量的晚锁,尽量的早开锁,减少程序阻塞的时间。

6.ServletConfig/ServletContext

    ServletConfig:代表当前Servlet在web.xml中的配置信息
    当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
    用途:(1)获取Servlet在web.xml中配置的名字
          (2)获取web.xml中配置的Servlet的初始化信息
          (3)获取ServletContext对象
    ServletContext:代表当前web应用,唯一对应当前web应用
    生命周期:服务器启动,web应用加载后,立即创建代表当前web应用的ServletContext对象,创建出来后驻留在内存中。当服务器关闭或web应用被移除出容器时,随着web应用的销毁,ServletContext对象销毁。
    获取方法:this.getServletConfig().getServletContext();
              this.getServletContext();
    一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
    ServletContext的应用:
    1). 在整个web应用范围内共享数据
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
    2).获取WEB应用的初始化参数
    在web.xml文件的根目录下,可以配置整个web应用的初始化信息

<context-param>
	<param-name>encode</param-name>
	<param-value>utf-8</param-value>
</context-param>
String encode = context.getInitParameter("encode");
利用ServletContext对象身上的方法,可以非常方便的获取这些信息,从而可以把一些信息配置在web.xml文件中了。

    3).实现请求转发
        this.getServletContext().getRequestDispatcher("/servlet/Demo9Servlet").forward(request, response);
    4).用来读取资源文件
    web应用中,读取文件时,如果使用 相对路径/绝对路径,则到tomcat/bin目录下去找资源
    如果使用 硬盘路径 ,可以找到文件,但是一旦换了一个发布环境,所有的路径可能都是错的
    使用ServletContext.getRealPath("") -- 此方法,会在传入的路径之前拼接当前web应用的硬盘路径,从而得到当前资源的硬盘路径,从而读取资源
    如果WEB应用里面有的类不是Servlet类,通过类加载器也可以帮我们加载资源:
        Classloader.getResource("").getPath();
        此路径要小心,当前程序从哪个目录加载类,这个方法就从哪个目录加载给定路径的资源







JavaWeb学习篇之----Servlet

今天来继续学习JavaWeb的相关知识,之前都是都介绍一些基本知识,从今天开始我们来说一下如何在服务器编写程序,这里就需要来介绍一下Servlet的相关知识了。Servlet就是一个能够运行在服务器端...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年04月01日 13:37
  • 6569

《30天自制操作系统》 第三天

程序: 本次的程序,汇编语言:; haribote-os ; TAB=4 ORG 0xc200 ; 这个程序将要被装载到内存的什么地方呢? MOV AL,0x13 ; VGA显...
  • e891377
  • e891377
  • 2016年09月26日 23:42
  • 302

Servlet编程---总体大纲与学习

Servlet学习的大纲: l 1. servlet概念及相关接口简介 l 2. servet 执行过程 l 3. servlet路径映射 l 4. 缺省servlet          --应用 ...
  • yanghui07216
  • yanghui07216
  • 2016年12月26日 11:36
  • 326

spring cloud 微服务框架 第三天

第三天,关注服务注册与发现,本文涉及到的项目: 开源项目:http://git.oschina.net/zhou666/spring-cloud-7simplecloud-eureka-serv...
  • qq_26562641
  • qq_26562641
  • 2016年12月01日 14:56
  • 1631

Java WEB之Servlet学习之路(一)一个最简单的Servlet应用

好久没有更新博客了,有点冷清,主要是最近忙着看Java WEb前段时间都是基础,一些http理论和WEB容器理论,没有什么实践性代码,所以没写代码,现在终于正式开始Servlet编程了,下面就得好好的...
  • a352193394
  • a352193394
  • 2011年11月26日 20:03
  • 1848

<30天自制操作系统>第三天

在第三天中,在原来的基础上添加了部分功能。; haribote-ipl ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址; 以下这段是标准FAT12...
  • talent_CYJ
  • talent_CYJ
  • 2016年07月21日 18:22
  • 573

【备注】【C15】《21天学通Java(第6版)》 .(美)Rogers.Cadenhead著 PDF下载

第1周课程 Java语言 第1章 Java基础  1.1 Java语言  1.1.1 Java的历史  1.1.2 Java概述  1.1.3 选择开发工具  1....
  • shiheweijigan
  • shiheweijigan
  • 2016年11月26日 19:59
  • 85

Java web 学习路线

JSP -> Servlet -> Java SSH Framework Web Container方面,一般Tomcat就够用了,要是想上JBoss也随意。。。这方面有本书《JBoss in A...
  • happydevil2010
  • happydevil2010
  • 2015年11月26日 23:38
  • 9874

第3天学习

迭代器访问集合元素的一种方式,从对象的第一个元素开始访问,知道所有的元素被访问结束。迭代器只能往前不能后退,迭代器最大的优点是不要求事先准备好整个迭代过程中的所有元素。仅仅在迭代到某个元素时才计算该元...
  • wangwenjie2500
  • wangwenjie2500
  • 2017年03月08日 14:52
  • 112

<30天自制操作系统>第四天

第四天内容主要是基于第三天的图形界面显示更进了一步。主要是更复杂的显示,而不是单纯的切换到显示模式。对显卡内存进行数据写入,从而显示出我们想要的画面。想要画东西,只要往VRAM里写数据即可,先看以下程...
  • talent_CYJ
  • talent_CYJ
  • 2016年07月22日 14:03
  • 580
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaWeb学习__第3天__Servlet
举报原因:
原因补充:

(最多只允许输入30个字)