Servlet Filter Listener是JavaWeb的三大组件。
Servlet原理
概念:是一个Java类,没有主方法,运行在服务器端的小程序,由Tomcat执行。
本质:是一个接口,定义了Java类被服务器识别的规则。我们需要自定义类,实现Servlet接口,重写方法。
快速入门(实现一个Servlet类):
-
创建JavaEE模块;
-
定义一个类,实现Servlet接口,重写方法
-
配置Servlet,在WEB-INF中的web.xml文件中
注意,放在
<web-app>
标签内<!--配置servlet--> <!--给servlet起一个名--> <servlet> <servlet-name>demo1</servlet-name> <servlet-class>baidu.servlet.ServletDemo1</servlet-class> </servlet> <!--servlet的映射路径--> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping>
Tomcat执行原理(Tomcat要访问Servlet的实现类,用到反射机制):
- 服务器收到客户端的请求,解析URL,获取访问Servlet的资源路径;
- 查找web.xml文件,找到对应的全类名;
- 将全类名对应的字节码文件加载进内存,并创建其对象;
- 调用其中的方法。
Servlet方法
五个方法:
void init()
初始化方法,服务器开启时执行,加载资源void destroy()
销毁方法,服务器正常关闭时执行,释放资源void service()
提供服务方法,每次都执行ServletConfig getServletConfig()
获取ServletConfig对象String getServletInfo()
获取Servlet信息,一般不用。
Servlet生命周期
- 被创建:执行init方法,只执行一次
- 被销毁:执行destroy方法,只执行一次
- 提供服务:执行service方法,执行多次
init()
-
执行时刻:(可以在web.xml中的servlet标签下配置)
-
启动服务器时创建(默认):
<load-on-startup>0或正数<load-on-startup>
-
第一次访问时创建:
<load-on-startup>负数<load-on-startup>
-
-
多个用户访问时,可能存在线程安全问题:
- 解决方法:尽量不要定义成员变量 或修改
Servlet3.0
好处:
- 支持注解配置,可以不用web.xml
步骤:
- 创建JavaEE项目,选择Servlet的版本在3.0以上,不用选web.xml文件。
- 定义一个类,实现servlet接口,重写方法
- 在类上使用
@WebServlet("/demo")
注解,其中/demo表示资源路径名
注意:
- 一个servlet可以定义多个访问路径:
@WebServlet({"/demo1", "/demo2"})
- 两层路径:
@WebServlet("/demo/*")
,其中星号表示所有字符串都可以
IDEA与Tomcat项目
- IDEA会为每一个web项目单独建立一份配置文件:
- 具体位置:查看控制台的log:
Using CATALINA_BASE: "C:Users..."
- IDEA在run->edit config->tomcat的Deployment界面可实现配置
- 具体位置:查看控制台的log:
- IDEA的
项目工作空间
和Tomcat部署的web项目
分离:- Tomcat访问
Tomcat部署的web项目
Tomcat部署的web项目
(在项目out文件夹内)对应着项目工作空间
的web目录下所有资源- WEB-INF目录下的资源不能被浏览器直接访问。
- Tomcat访问
Servlet体系结构
servlet接口的实现类:
- GenericServlet:只需要重写service方法,其他方法已经默认空实现。
- HttpServlet:对http协议的封装,简化操作:(推荐使用)
- 定义类继承HttpServlet
- 重写doGet/doPost方法
原因:
servlet中的service方法是为了处理http请求,第一步就要判断http请求是那种协议:
get/post等一共7中,所以,我们要在HttpServlet继承类中重写常用的doGet/doPost方法。