1.什么是Servlet?
Servlet(Servlet Applet),官方解释是运行在服务器端的小程序。
严格来说,Servlet就是一个接口,里面定义了JAVA类被浏览器访问到(被TOMCAT识别)的规则。
Servlet接口里面有5个抽象方法,类实现这个接口的方法就可以被访问,从而提供动态数据。
类似这样:
public class ServletDemo implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { return null; } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
2.Servlet接口的几个方法有什么用
(1)void init() 初始化方法,在Servlet被创建时执行,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
(2)ServletConfig getServletConfig() 获取Servlet的配置对象。
(3)void service() 提供服务方法,每一次Servlet被访问时都会执行,可以执行多次。
(4)String getServletInfo() 获取Servlet的一些信息,版本,作者等。
(5)void destroy() 销毁方法,在服务器正常关闭时执行,执行一次,只有服务器正常关闭时,才会执行destroy方法,而且destroy方法在Servlet被销毁之前执行的。
可以看出,基本上用的比较多的就是void service()。其他的基本没太大用处。
3.Servlet3.0以前的Servlet配置
一个类实现了Servlet接口,但是我们应该访问什么URL才能到达这个类呢?这时候需要对Servlet进行配置。而且Servlet3.0(JAVAEE 6)以前的配置十分麻烦。
首先要说下一般JAVAEE的项目目录:
-- 项目的根目录
--静态资源(html等)
-- WEB-INF目录:
-- web.xml:web项目的核心配置文件
-- classes目录:放置字节码文件的目录
-- lib目录:放置依赖的jar包
Servlet3.0的配置就是在web.xml里面修改的。
<!--配置Servlet --> <servlet> <servlet-name>demo</servlet-name> <servlet-class>com.pr.web.servlet.ServletDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo</servlet-name> <url-pattern>/demo</url-pattern> </servlet-mapping>
当我们访问localhost:8080/demo时就可以到达ServletDemo类了。
执行原理如下:
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存(Class.forName("com.pr.web.servlet.ServletDemo")),并且创建其对象(clazz.newInstance())
5. 调用其方法
关于配置文件,还有一个比较常用的配置项:
* 可以配置执行Servlet的创建时机。
* 在<servlet>标签下配置
1. 第一次被访问时,创建
* <load-on-startup>的值为负数
2. 在服务器启动时,创建
* <load-on-startup>的值为0或正整数
4.Servlet3.0以后的Servlet配置(Servlet注解配置)
在类上使用@WebServlet注解,进行配置。
@WebServlet("资源路径")
类......
原理:
@WebServlet 里面的全部配置都有默认值,urlPatterns是一个数组,默认值为空。
故可以写成:@WebServlet(urlPatterns = "/demo")
当然也可以写多个。
看源码发现有个value。代表的是最重要的属性,故可以写成:
@WebServlet(value = "/demo")
value又可以省略,故可以写成:
@WebServlet("/demo")
5.GenericServlet与HttpServlet
Servlet -- 接口
|
GenericServlet -- 抽象类
|
HttpServlet -- 抽象类
* GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
* 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
* HttpServlet:对http协议的一种封装,简化操作
1. 定义类继承HttpServlet
2. 复写doGet/doPost方法
所以一般项目开发直接重写HttpServlet抽象类的doGet()或者doPost()方法即可。如果用GenericServlet抽象类,虽然只需要实现service方法,但是还要对请求进行判断,判断是get请求还是post请求。