Servlet 基础
什么是Servlet?
- 运行在web服务器或应用服务器的java程序
- 在web上创建动态内容的有效而强大的解决方案
- 由容器来管理生命周期与web容器进行交互
- 由sun规范了其功能
Servlet规范的组成
- web应用程序
Servlet 与 HTTPServlet :Servlet 用于创建动态的网页,HTTPServlet 天生就支持http。
过滤器 : Servlet 2.3 版本后引入了过滤器的概念,http所有请求都可以设置让他经过过滤器。
安全 : Servlet使用了JVM提供的安全功能。
国际化 : 一个程序能在各个语言环境下都可以使用。 properties文件。 :表示能够开发任何语言的内容,来自于java平台的国际化和本地支持。
Servlet 的API结构
Servlet API 就是专门用于开发Servlet的java类和接口。web容器和Servlet之间用API进行通信。
一个Servlet就是运行在服务器端的一个Servlet API的java类。定义了与容器的一些规范。
javax.servlet.GenericServlet 当前类实现servlet的基本特征和功能,是一个普通的servlet。
javax.servlet.http.HTTPServlet 实现了GenericServlet。 他也是一个servlet,还对http进行了支持。
当我们启动服务器的时候,用户访问servlet ,容器会自动将http请求数据封装到httpServletRequest,也会产生一个HTTPServletResponse对象。
每位请求都会到达service()方法,容器自动调用的。
接口: ServletConfig Servlet 类: GenericServlet(普通Servlet,不能处理http) http处理: HttpServlet (能处理http请求)
Servlet如何运行?
容器一旦启动,会调用应用程序里面的web.xml文件
请求过来的内容会自动调用service方法。
servlet专门设计了 javax.servlet.http.HTTPServlet 中有七个方法。其中 doGet和doPost是我们常用的。
doGet 和 doPost 是service的代理,service会根据具体的方法,将权利转交给相应的方法进行处理,他只需要控制。
Servlet 路径匹配
<!-- 注册servlet 在底层会new TestServlet() 通过反射的方式 -->
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.lovo.servlet.TestServlet</servlet-class>
</servlet>
<!-- 映射url地址,映射多个地址可以再写一个url-pattern 或者 servlet-mapping -->
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
精确匹配:必须通过名字才能访问当前这个servlet
以扩展名匹配: *. xxx 不管前面是什么,只要是以 .xxx 结尾都可以访问。尽量避免用html结尾的,前面也不能加/。 会优先访问这个,而不访问其他的html。
路径映射(模糊匹配):/* 不管后面是什么,只要工程文件夹正确,就访问这个
默认匹配:直接写一个/ (叫缺省的servlet,表示任何没有匹配到的servlet都会进入这个里面)
精确匹配 > 路径映射 > 以扩展名匹配 (精确度大小)
匹配的精确度有关系,谁最像就匹配谁
Servlet 生命周期
容器装载并实例化Servlet
容器触发init()方法装载资源
请求达到触发service服务方法,处理请求产生相应
容器丢弃Servlet调用destroy()方法
生命周期执行的步骤:
启动容器,默认的配置不会调用init()方法,第一次访问才会调用init()方法。
以后每次访问都进入service方法,自动创建多线程。
当容器关闭的时候,容器自动销毁servlet。
init() 和 destroy()只会执行一次,service 可以执行多次
<load-on-startup>1</load-on-startup>
中间的参数可以控制当前servlet是否在容器启动的时候加载,如果是负数就是在第一次访问的时候才进行加载。如果是0,或者正数,就表示启动容器就加载,数字越小,优先级越高,最高就是0了。
Servlet全局配置
<context-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</context-param>
意思是:全局的配置,所有的servlet都要设置请求或者响应编码集
ServletContext :
容器一旦启动,容器会自动创建一个上下文对象(servletContext),用于描述servlet运行环境的信息。是的servlet可以和容器进行通信。代表当前的web应用。
servletConfig对象维护了servletContext的引用。 可以通过 配置对象.getServletContext() 获取到上下文对象[初始化存在的话就只能用config.getServletContext()] ; 也可以通过直接在类中用this.getServletContext()方法[但是必须需要没有重写初始化方法]获得。
一个web应用中的所有servlet共享一个servletContext。每个servlet之间可以通过servletContext对象来进行通信。servletContext对象也被称为context域对象。
所有的用户也共享一个servletContext