目录
1.Servlet介绍
1.1什么是Servlet
1.2Servlet的使用方法
1.3Servlet接口的继承结构
2.Servlet快速入门
2.1创建javaweb项目
2.1.1创建maven工程
2.1.2添加webapp目录
2.2添加依赖
2.3创建servlet实例
2.4配置servlet
2.5设置打包方式
2.6部署web项目
3.servlet的生命周期
3.1什么是servlet的生命周期
3.2servlet生命周期中重要的方法
3.3tomcat服务器内部执行代码的原理
3.4测试servlet的声明周期
1.Servlet介绍
1.1什么是Servlet
Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
1.2Servlet的使用方法
Servlet技术的核心是Servlet接口,定义了Servlet与Servlet容器之间的契约,Servlet容器将Servlet类载入内存,生成Servlet实例并调用它具体的方法,所以它是所有Servlet类必须直接或者间接实现的一个接口。
1.3Servlet接口的继承结构
-
Servlet接口:只负责定义Servlet程序的访问规范;
-
GenericServlet抽象类:实现了Servlet接口,做了很多空实现,并持有一个ServletConfig类的引用,并提供了一些ServletConfig的使用方法;
-
HttpServlet抽象类:实现了service方法,并实现了请求分发处理;
2.Servlet快速入门
2.1创建javaweb项目
2.1.1创建maven工程
2.1.2添加webapp目录
(1)右击项目,选择Add Frameworks Support
(2)选择Web Application,再点击OK
(3)将web目录拖拽到main目录下,并改名为webapp
-
webapp:静态资源比如 html css js可以定义在web下面
-
WEB-INF:里面的资源不能直接被外界访问 web.xml 是web项目的核心配置文件
-
index.jsp:web项目的访问首页,在默认情况我们访问的首页就是index.jsp
2.1.3idea没有此选项问题
但有的新版idea右击项目没有这个,需要自己添加。
然后点击右下角的这个按钮即可
2.2添加依赖
在pom.xml添加依赖
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version>
</dependency>
2.3创建servlet实例
创建一个.java实现Servlet接口
package com.by.servlet;import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse servletResponse) throws ServletException, IOException {servletResponse.setContentType("text/html;charset=utf-8");servletResponse.getWriter().write("<h1>hello<h1>");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}
2.4配置servlet
找到Wab.xml进行配置
<!--配置Servletservlet-name:servlet的名称servlet-class:servlet的全类名url-pattern: 访问servlet的url-->
<servlet><servlet-name>hello</servlet-name><!-- servlet-name要和servlet-mapping所对应,映射的关系--><servlet-class>com.by.servlet.HelloServlet</servlet-class>
</servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern>
</servlet-mapping>
-
servlet-name:servlet的名称
-
servlet-class:servlet的全类名
-
url-pattern: 访问servlet的url
servlet-name必须一样
注解方式配置:
@WebServlet("/hello")
public class HelloServlet implements Servlet {}
2.5设置打包方式
修改pom.xml
2.6部署web项目
①点击“Edit Configurations”
②点击"+"
③点击Tomcat Server中的Local
④配置Tomcat路径
⑤部署web项目
⑥启动tomcat
3.servlet的生命周期
3.1什么是servlet的生命周期
Servlet的生命周期就是servlet类对象什么时候创建?什么时候调用对应的方法,什么时候销毁。
对象的生命周期:
Student student = new Student(); //创建对象
student.setName("eric"); // 使用对象
student.show();// 使用对象
student = null; // 销毁对象
也就是说自定义对象的生命周期由我们程序员自己手动控制。但是!!!Servlet它不是一个普通的java类。是一个被tomcat服务器调用的。所以Servlet是生命周期是被tomcat服务器去控制的。
3.2servlet生命周期中重要的方法
-
构造方法:创建servlet的时候调用。默认情况下,第一次访问servlet的时候,会创建servlet对象。此时会有且只会调用1次构造函数,证明了servlet对象是单实例的。
-
init方法:创建完servlet对象之后调用,也只是会调用1次。
-
service方法:提供服务的方法,接收用户的请求,并处理用户的请求,然后响应用户的请求。每次发送请求,都会调用service方法。调用几次,service方法会执行几次。
-
destroy方法:销毁的方法。销毁servlet对象的时候调用。比如我们停止tomcat服务器或者重新部署tomcat服务器,都会销毁servlet对象,只会调用1次。
3.3tomcat服务器内部执行代码的原理
1、用户发送请求,tomcat服务器会根据用户发送的请求,解析web.xml配置文件,获取servlet-class的全限定名路径(com.by.servlet.ServletDemo)
2、获取字节码对象,然后通过字节码对象获取对应的实例对象
Class clazz = Class.forName("com.by.servlet.ServletDemo");
Object o = clazz.newInstance();
3、创建ServletConfig对象,然后调用init方法
Method method = clazz.getDeclaredMethod("init",ServletConfig.class);// 获取方法对象
method.invoke(o,config);
4、创建request对象,创建response对象,然后调用service方法
Method m = clazz.getDeclaredMethod("service",ServletRequest.class,ServletResponse.class);
m.invoke(o,request,response);
5、销毁servlet实例对象,也是通过反射的机制实现的
Method m1 = clazz.getDeclaredMethod("destroy",null);
m1.invoke(o,null);
3.4测试servlet的声明周期
public class LifeCycleServlet implements Servlet {public ServletDemo(){System.out.println("LifeCycleServlet has run........");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init method has run........");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service method has run........");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("destroy method has run........");}
}