1.什么是servlet?
servlet是运行在服务器上的java程序,是sun公司提供的一种规范(接口),用来处理客户端的请求,响应给浏览器的动态资源;servlet的实质依然是java;
2.servlet中包含的三个技术点:
servlet技术,filter(过滤器)以及listener(监听器)。
3.一个简单的servlet的实现步骤:
创建类实现servlet接口,覆盖未实现的方法—service(),对web.xml进行servlet配置;
一般的实际开发中,我们通常不会采用实现servlet接口的方式来书写一个servlet,而是通过继承HttPServlet类,覆盖doget()和dopost()方法,再通过web.xml进行配置;
每次访问service()方法都会创建一对新的request和response对象,他们两个是成对存在的。
4.Servlet中的API(生命周期)
Servlet接口中的方法:
init(ServletConfig config)初始化方法,执行时期:在servlet对象创建时期执行;ServletConfig代表该servlet对象配置信息
service(ServletRequest req,ServletResponse res)
执行时期:每次访问的时候都会去执行,ServletRequest、ServletResponse分别代表请求和响应;
Destroy()销毁方法:执行时期:服务器关闭时候
HttpServlet中的方法:
Init()
doGet(HttpServletRequest req,HttpServletResponse res)
doPost(HttpServletRequest req,HttpServletResponse res)
destroy()
5.Servlet的生命周期:
Servlet什么时候被创建?
默认第一次访问servlet时创建该对象
Servlet什么时候被销毁?
服务器关闭的时候销毁
每次访问时必执行的方法
service(ServletRequest req,ServletResponse res)
如果对一个servlet访问了10次,那么我们可以得出结论:
对该servlet中的init()访问一次,destory()访问一次,service()访问10次,request对象和response对象创建了10个。
6.关于web.xml的最基本配置:
<servlet> <servlet-name>DemoServlet01</servlet-name> <servlet-class>com.servlet.DemoServlet01</servlet-class> </servlet> <servlet-mapping> <servlet-name>DemoServlet01</servlet-name> <url-pattern>/DemoServlet01</url-pattern> </servlet-mapping> |
<servlet>里面主要配置了servlet的一些信息, <servlet-name>标签定义了servlet的名称,以便在其他地方起作用;<servlet-class>指出来了servlet类的路径,<servlet-mapping>标签定义了servlet的URL路径映射信息,即在浏览器中访问该servlet的URL路径。其中<servlet-name>标签指定了要映射的servlet类,<url-pattern>标签则定义了访问该servlet的URL相对路径
其中url-pattern的配置有三种方式:
完全匹配:访问的资源与配置的资源完全相同才能访问到
<url-pattern>/DemoServlet01</url-pattern>
目录匹配:格式:虚拟的目录/* *代表目录
<url-pattern>/aa/bbb/cc/*</url-pattern>
扩展名匹配:格式:*.扩展名
<url-pattern>*.abd</url-pattern>
注意:第二种和第三种不能混用
7.服务器启动实例化servlet配置:
Servlet的创建时间:默认第一次访问的时候创建,为什么是默认?
当在servlet的配置时 加上一个配置 <load-on-startup> servlet对象在服务器启动 时就创建
缺省servlet,在url-pattern后面配置一个 / 即可;代表 servlet是缺省的servlet
什么是缺省?当你访问的资源地址所有的servlet都不存在时,缺省的servlet负责处理;其实servlet中所有的资源的响应都是由servlet来负责,包括静态资源;
8.ServletContext对象:
什么是ServletContext对象?servletContext代表一个web应用的环境对象,它的内部封装该web应用的信息,并且,在一个web应用中ServletContext对象只有一个。
比较:一个web应用可以拥有多个servlet对象,但是却只能拥有一个ServletContext对象。
9.ServletContext对象的生命周期:
创建:服务器启动或者发布web应用,web应用被加载;
销毁:服务器关闭,web应用被卸载;
如何获取ServletContext对象?
通过init中的ServletConfig config调用getServletContext获取
ServletContext servletContext = config.getServletContext();
ServletContext servletContext = this.getServletContext();
获取到web应用中全局的初始化参数
|
web.xml中配置初始化参数
![]() |
(2)获得web应用中任何资源的绝对路径
方法一:String path = context.getRealPath(相对于该web应用的相对地址);
方法二:利用类加载器的方式,注意这里需要用到的依然是相对路径(相对于classes而言的)
具体详细代码如下:
@Override
public void init(ServletConfig config) throws ServletException {
//1.获取<servlet-name>DemoServlet01</servlet-name>中的name信息
String servletName = config.getServletName();
System.out.println(servletName);//DemoServlet01
//2.获取该servlet的初始化参数
String initParameter = config.getInitParameter("url");
System.out.println(initParameter);//jdbc:mysql:///mydb
//3.获得servletcontext对象两种方式
ServletContext servletContext = config.getServletContext();
//ServletContext servletContext = this.getServletContext();
System.out.println("这一个初始化方法正在运行!");
//4.获取全局的初始化参数,不属于某一个标签里面的
String initParameter2 = servletContext.getInitParameter("driver");
System.out.println(initParameter2);//com.mysql.jdbd.Driver
//5.获取web应用中任何资源的绝对地址(方法一)
String realPathA = servletContext.getRealPath("/a.txt");
System.out.println(realPathA);
String realPathB = servletContext.getRealPath("/WEB-INF/b.txt");
System.out.println(realPathB);
String realPathC = servletContext.getRealPath("/WEB-INF/classes/c.txt");
System.out.println(realPathC);
//d.txt永远访问不到
//6.利用类加载器来获取资源中的绝对地址(方法二)
//利用类加载器getResource("c.txt"),中的变量值仍然是一个相对路径,此时的路径是相对于classes而言,上一种方式不一样,上一种是相对于web应用而言
String path = DemoServlet01.class.getClassLoader().getResource("c.txt").getPath();
System.out.println(path);
}
ServletContext是域对象。
什么是域对象以及什么是域?域,即区域;所谓的域对象就是存贮数据的区域
ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享)
域对象的通用的方法:
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);