1、什么是Servlet
- Servlet是JavaWeb的三大组件之一(Servlet,Listener,Filter),它的工作就是:接受客户端的请求数据;完成请求;返回响应。
- Servlet是和平台无关的服务器端组件,它运行在Servlet容器中(如:Tomcat Servlet容器负责Servlet和客户的通信以及调用Servlet的方法)
- 它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
2、如何编写一个Servelt
有三种方法:
* 实现javax.servlet.Servlet接口 继承
* javax.servlet.GenerlcServlet类继承
* javax.servlet.http.HttpServlet类 (通常使用的方法)
Servlet中的方法大多数不由我们来调用,而是由Tomcat调用。并且Servlet的对象也不是由我们来创建,由Tomcat创建。
3、如何让浏览器能够访问Servlet?
需要给Servlet指定一个Servlet路径(让Servlet与一个路径绑定在一起)
给Servlet配置Servlet路径,这需要在web.xml中对Servlet进行配置
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>cn.itcast.servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/跟servlet绑定路径</url-pattern>
注意:
a>给类AServlet起个名字叫xxx,注意:写servlet类的全名
b>先得有名为xxx的servlet,然后要给xxx配置什么路径,在mapping中完成
c>说明:
这个绑定的路径一旦被访问,实际上是访问名为xxx的servlet,而这个servlet的类是cn.itcast.servlet.AServlet。得到这个字符串,服务器根据反射机制,会自动创建该类的对象,执行该类的方法。
4、Servlet的生命周期
- 加载和实例化
Servlet容器负责加载和实例化Servlet,容器是通过Java的反射API(使用类加载器加载servlet类)来创建Servlet实例,调用的是Servlet的默认构造方法,所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。 - init:只被调用一次。在创建好实例后立即被调用。
- service:每次请求都会调用,实际用于响应请求
- destory:只被调用一次。当前Servlet所在的web应用被卸载前调用,用于释放当前Servlet所占用的资源
5、Servlet接口中的方法
void init(ServletConfig arg0) //Servlet对象创建之后执 (做一些初始化操作)
void service(ServletRequest request, ServletResponse response)//每次处理请求都是处理这个方法
void destroy() //Servlet被销毁之前调用,只执行一次(释放那些非内存资源)
ServletConfig getServletConfig()://获取Servlet的配置信息
String getServletInfo()://获取Servlet的信息
6、load-on-startup参数
用以指定Servlet被创建的时机。若为负数,则在第一次请求时被创建。若为0或正数,则在当前web应用被Servlet容器加载时创建,且数组越小越早被创建。
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.ithings.servlet.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
7、serlvet-mapping通配符
可以用匹配符配置,但是要注意,必须是.do或者 /开头的以/* 结束的路径。
对于如下的一些映射关系:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应.
【Servlet引擎将调用Servlet1。】
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应.
【Servlet引擎将调用Servlet3。】
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应.
【Servlet引擎将调用Servlet1。】
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应.
【Servlet引擎将调用Servlet2。】
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应.
【Servlet引擎将调用Servlet2。】
8、ServletConfig接口
- 1个ServletConfig对象,对应一段web.xml中servlet的配置信息
- ServletConfig接口的方法;
1、ServletContext getServletCOntext() //获取Servlet上下文对象
2、String getServletName() //获取的是<servlet-name>中的内容
3、String getInitParameter(String name) //通过名称获取指定初始化参数的值
4、Enumeration getInitParamenterNames() //获取所有初始化参数的名称
9、ServletContext对象(重要)
代表当前web应用,可从中获取当前web应用的各个信息。一个项目就一个ServletContext对象。我们可以在N多个servlet中来获取这个唯一的对象,使用它来给多个Servlet传递数据(可以用它来完成共享数据)
①概述
ServletContext对象的创建是在服务器启动时,销毁时服务器关闭时。(与服务器同生死)
作用:
不同Servlet之间传递共享数据(域对象)
②获取ServletContext
在void init(ServletConfig config)中,getServletContext()方法可以获取到
ServletContext context=config.getServletContext();
GenericServlet或HttpServlet中获取ServletContext
GenericServlet类中有ServletContext()方法。使用this.getServletContext()
③域对象功能
域对象可以理解为:域对象就是用来在多个Servlet中传递数据
** javaweb有四大域对象
PageContext
ServletRequest
HttpSession
ServletContext
所有域对象都有存取数据的功能。因为域对象内部有一个Map,用来存储数据,
** ServletContext操作数据的方法:(同时也是域对象的基本方法)
** void setAttribute(String name ,object value)
//用来存储一个对象,可以称之为存储一个域属性,使用键值对的方式。
** object getAttribute(String name):
获取ServletContext中的数据。
** void removeAtteibute(String name):
移除ServletContext中的域属性
** Enumeration getAttributeNames();
获取所有域属性的名称
④全局应用参数
可以配置公共的初始化参数,为所有的Servlet而用,使用<context-param>
标签
<context-param>
<param-name>name</param-name>
<param-vlaue>value</param-vlaue>
</context-param>
⑤获取相关资源的方法
1、获取部署在服务器上的绝对路径
servletContext.getRealPath("");
2、获取当前web应用的名称
getContextPath()
2、获取资源流
InputStram is=servletContext.getResourceAsStream("");
3、获取指定目录下所有资源路径
Set set=servletContext.getRescourcePaths("")