Servlet入门
Servlet概述
Servlet(server applet):用JAVA编写的运行在服务器端的小程序,作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
- 狭义上:指java语言实现的一个接口
- 广义上:指任意一个实现了这个Servlet接口的类。
- 作用:由服务器执行对象创建,方法调用,主要用于交互式地浏览和修改数据生成Web内容,可充当MVC模式中的控制器。
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
- Model(模型) 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) 视图代表模型包含的数据的可视化。
- Controller(控制器) 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
MVC 模式以JSP+JavaBean+Servlet模式为例,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。
Servlet的创建步骤
- 创建JavaEE项目
- 定义一个类实现Servlet接口,及接口中的所有抽象方法
package cn.simplek9.web; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; public class servlet2 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 { System.out.println("Servlet来了..."); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
- 配置Servlet
路径定义规则:
- /xxx:路径匹配
- /xxx/xxx:多层路径,目录结构
- *.do:扩展名匹配
- 方法一:在项目的web/WEB-INF/web.xml的根标签中配置
<servlet> <servlet-name>demo1</servlet-name><!--给该servlet所起的名字--> <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> <!--src下的全类名--> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern><!--servlet对应的资源路径--> </servlet-mapping> ```
- 方法二:类前使用@WebServlet("资源路径")注解配置,可以不需要web.xml(需要Servlet3.0及以上)
@WebServlet("/demo2")
//@WebServlet(urlPatterns="/demo2")
//@WebServlet(value="/demo2")
//@WebServlet(urlPatterns="/d2","/dd2","/ddd2")定义多个路径
Servlet执行原理
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径 2. 查找web.xml文件,是否有对应的标签体内容。
- 如果有,则再找到对应的全类名
- tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
Servlet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
生命周期的方法
- init方法:在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。(一次)
- Servlet默认创建于用户第一次调用对应于该 Servlet 的 URL 时,但是也可以指定 Servlet 在服务器第一次启动时被加载。
- 可在web.xml的标签下配置
<!--第一次被访问时--> <load-on-startup>的值为负数 <!--在服务器启动时--> <load-on-startup>的值为0或正整数
- 可在web.xml的标签下配置
- Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
- 多个用户同时访问时,可能存在线程安全问题。
- 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
- Servlet默认创建于用户第一次调用对应于该 Servlet 的 URL 时,但是也可以指定 Servlet 在服务器第一次启动时被加载。
- service方法:每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。(多次)
- 每次访问Servlet时,Service方法都会被调用一次。
- 单实例多线程
- destroy方法:服务器关闭时,调用destroy方法释放资源,servlet对象被标记为垃圾回收,然后由JVM 的垃圾回收器销毁Servlet(一次)
- getServletConfig方法:获取ServletConfig对象,即Servlet的配置对象
- getServletInfo方法:获取Servlet的一些信息,如版本,作者等等
Servlet的体系结构
Servlet -- 接口 | GenericServlet -- 抽象类 | HttpServlet -- 抽象类
- 用继承以下两个抽象类来实现Servlet的方式可以不用初始实现接口中的所有抽象方法,选择性的只实现service方法
- GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
- 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
- HttpServlet:对http协议的一种封装,简化操作
- 定义类继承HttpServlet
- 复写doGet/doPost方法
@WebServlet("/demo4")
public class servlet4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet...");//在浏览器URL输入路径直接请求是get方式
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost...");
}
}