Servlet: 运行在服务器上的小程序。
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则,我们也可以自定义来实现这个接口。
整个JavaWeb的核心体系都是围绕着Servlet来转的。
使用Servlet
首先新建Tomcat的项目,
然后创建ServletDemo01继承Servlet接口
public class ServletDemo01 implements Servlet {
/***
* 初始化方法
* 在Servlet被创建时,只会执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.....");
}
/**
* 获取Servlet的一些信息,版本,作者等等... (一般不会用)
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务的方法
* 每一次Servlet被访问时,执行
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service.....");
}
/**
* 获取ServletConfig对象
* ServletConfig: Servlet的配置对象
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 在Servlet被杀死时执行 (服务器正常关闭时执行),只执行一次
*/
@Override
public void destroy() {
System.out.println("destroy.....");
}
}
在web.xml中添加配置
<!--配置Servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.heiko.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1_path</url-pattern>
</servlet-mapping>
点击运行
浏览器url中增加url-pattern
比如http://localhost:8080/MyTomcatTest_war_exploded2/demo1_path
,回车
可以看到logcat中打印了日志
init.....
service.....
Servlet的生命周期
1.被创建:执行init方法,只执行一次
* 指定Servlet的创建时机
1.第一次被访问时,的值为负数
2.在服务器启动时,的值为0或正整数
* Servlet的init方法,只执行一次,说明一个servlet在内存中只存在一个对象,servlet是单例的
多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要修改值
2.提供服务:执行service方法,可以执行多次(刷新)
3.被销毁:执行destroy方法,只执行一次
Sevlet执行原理
- 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问对应的Servlet类
- tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
Servlet3.0
Servlet3.0支持用注解的方式,可以不用xml配置。
新建类,添加注解
@WebServlet("/demo2")
public class ServletDemo implements Servlet {
//...省略
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service!!!!");
}
}
访问页面
http://localhost:8080/MyServletTest_war_exploded/demo2
看到打印日志
service!!!!
Servlet体系结构
- servlet - 接口
- GenericServlet - 抽象类 : 只需实现service方法
- HttpServlet - 抽象类 : 对HTTP协议的封装和描述 doGet()、doPost() 等
- GenericServlet - 抽象类 : 只需实现service方法
@WebServlet("/demo3_path")
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
System.out.println("doGet...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
System.out.println("doPost...");
}
}
Servlet相关配置
- @WebServlet: 设置访问路径
- 一个Servlet可以定义多个路径: @WebServlet({"/S1","/SS2","/SSS3"})
- 路径定义规则
- /xxx : 普通方式
- /xxx/xxx : 多层路径,目录结构
- *.do : 比如 http://localhost/demo4.do