一.Servlet概述
Servlet是JavaWeb的三大组件之一,它属于动态资源。
三大组件:Servlet,filter,listener
1.Servlet的作用
Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收请求数据
- 处理请求
- 完成响应
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!每个Servlet必须实现javax.servlet.Servlet接口。
2.实现Servlet的方式
- 实现javax.servlet.Servlet接口;
- 继承javax.servlet.GenericServlet类;
- 继承javax.servlet.http.HttpServlet类;
我们现在最常用的实现Servlet的方式就是继承HttpServlet类。
3.Servlet接口
Servlet.java
public interface Servlet{
public void init(ServletConfig config) throws ServletException;
/*
* getServletConfig这个方法可以用来获取Servlet的配置信息
*/
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
/*
* getServletInfo这个方法获取Servlet的信息
*/
public String getServletInfo();
public void destroy();
}
Servlet中的方法大多数不由自己来调用,而是由Tomcat来调用。并且Servlet的对象也不由自己来创建,由Tomcat来创建!
- 生命周期方法
- void init(ServletConfig servletConfig)
这个方法会在Servlet对象创建之后马上执行,并只执行一次。初始化! - void destroy()
这个方法会在Servlet被销毁之前调用,并且只会被调用一次。 - void service(ServletRequest request, ServletResponse response)
这个方法会被调用多次,每次处理请求都是调用这方法。
- void init(ServletConfig servletConfig)
二.Servlet的生命周期
服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)
该servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行
最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。
1.浏览器访问Servlet
a.给Servlet指定一个路径,让Servlet和一个路径绑定在一起
b.浏览器访问Servlet路径
在web.xml中对Servlet进行配置
xxx
demo/cn.edu.web.servlet/AServlet.java
xxx
/AServlet
- 可以在
中给出多个
AServlet
/AServlet
/BServlet
这说明一个Servlet绑定了两个URL,无论访问/AServlet还是/BServlet,访问的都是AServlet。
- 在
中使用通配符
通配符就是星号“*”,星号可以匹配任何URL前缀或后缀,使用通配符可以命名一个Servlet绑定一组URL/servlet/*
:/servlet/a、/servlet/b,都匹配/servlet/*; :/abc/def/ghi.do、/a.do,都匹配*.do;*.do
/*
:匹配所有URL;
三.HttpServlet
1.HttpServlet概述
HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。
2.HttpServlet的方法
3.HttpServlet的原理
也就是Servlet类要继承HttpServlet,重写doGet()或doPost()方法
重写doGet()或doPost()方法,如果没有重写doGet()或doPost()方法,并且被调用了doGet()或doPost()方法,会出现405。
四.ServletContext
1.ServletContext概述
一个项目只有一个ServletContext对象,可以给多个Servlet传递数据
ServletContext对象在服务器启动时创建,在服务器关闭时销毁。
2.获取ServletContext
在void init(ServletConfig config)中:
ServletContext context = config.getServletContext();
ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;在GenericeServlet或HttpServlet中获取ServletContext对象:
GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;
3.域对象的功能
域对象就是用来在多个Servlet中传递数据。
- 域对象必须有要存数据功能
- 域对象必须要有取数据功能
域对象内部有一个Map,用来存储数据
ServletContext是JavaWeb四大域对象之一:
四大域:
- page(PageContext)
- request(ServletRequest)
- session(HttpSession)
- application(ServletContext)
4.ServletContext对象操作数据的方法
- void setAttribute(String name, Object value)
用来存储一个对象,也可以说是存储一个域属性
eg:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同 - Object getAttribute(String name)
用来获取ServletContext中的数据,在获取之前需要先去存储才行
eg:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性; - void removeAttribute(String name)
用来移除ServletContext中的域属性。一对一对的删除。如果参数name指定的域属性不存在,那么本方法什么都不做。 - Enumeration getAttributeNames()
获取所有域属性的名称
5.获取应用初始化参数
可以使用ServletContext来获取在web.xml文件中配置的应用初始化参数!注意,应用初始化参数与Servlet初始化参数不同
Servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备。
web.xml
...
paramName1
paramValue1
paramName2
paramValue2
用ServletContext获取公共的初始化参数
//获取ServletContext对象
ServletContext context =this.getServletContext();
//通过参数名获取参数值
String value1 = context.getInitParameter("paramName1");
String value2 = context.getInitParameter("paramName2");
System.out.println(value1 + ", " + value2);
//paramValue1,paramValue2
//获取所有应用初始化参数名称
Enumeration names = context.getInitParameterNames();
while (names.hasMoreElements()) {
System.out.println(names.nextElement());
}
6.使用ServletContext获取资源路径
1)获取真实路径
使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。
- 获取a.txt的真实路径:String realPath = servletContext.getRealPath(“/a.txt”),realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt
2)获取资源流
可以通过ServletContext获取资源流,即把资源以输入流的方式获取
- eg:获取a.txt资源流:
InputStream in = servletContext.getResourceAsStream(“/a.txt”);
3)获取当前路径下所有资源的路径
使用ServletContext获取指定目录下所有资源路径,例如获取/WEB-INF下所有资源的路径
Set set = context.getResourcePaths("/WEB-INF");
System.out.println(set);
//[/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/b.txt, /WEB-INF/web.xml]