servlet 简介
servlet(server applet) 概念
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
(1)servlet (server applet),运行在服务端的小程序
(2)servlet 就是一个接口,定义了java类被浏览器访问到(tomcat识别)的规则
servlet 与CGI(Common Gateway Interface,公共网关接口)比较:
1.性能明显更好。
2.Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
3. Servlet 是独立于平台的,因为它们是用 Java 编写的。
4. 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
5. Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
快速入门
1 定义一个类,实现servlet接口
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 {
System.out.println("Hello world");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2 配置web.xml
<servlet>
<servlet-name>FristServlet</servlet-name>
<servlet-class>com.hello.com.FristServlet</servlet-class>
</servlet>
<!--映射Servlet -- >
<servlet-mapping>
<servlet-name>FristServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
servlet 执行原理
1 浏览器向服务器发出GET请求
2 服务器上的Tomcat接收到该url,根据该url判断为Servlet请求,此时Tomcat将产生两个对象:请求对象(HttpServletRequest)和响应对象(HttpServletResponce)
3 Tomcat根据url找到目标Servlet,且创建一个线程
4 Tomcat将刚才创建的请求对象和响应对象传递给该线程
5 Tomcat调用Servlet的service()方法
6.service()方法根据请求类型(本示例为GET请求)调用doGet()(本示例调用doGet())或doPost()方法
7.doGet()执行完后,将结果返回给Tomcat
8 线程被销毁或被放在线程池中
servlet 的生命周期
1 创建 : 执行 init 方法,只执行一次,用于加载资源
什么时候被创建?
默认情况是第一次访问时候,servlet被创建。
可以配置执行servlet执行的创建时机。
在<servlet>标签下配置
<load-on-startup>标签下配置
1 . 第一次访问的时候创建
<load-on-startup> 的值为负数
2. 在服务器启动时,创建
<load-on-startup> 的值为 0 或者正整数。
servlet的init方法,只执行一次,说明servlet 在内存中只存在一个对象,servlet是单例对象
1 多个用户同时访问,可能存在线程安全问题。
解决方法:尽量不要在servlet 中定义成员变量,即使定义了成员变量,也不要对其修改。
2 提供服务:执行service 方法,调用一次执行一次
每次访问servlet方法时候都会调用一次
3 销毁:执行destroy 方法,只执行一次()
1 servlet被销毁的时候执行.服务器关闭时候,servlet被销毁。
2 只有 服务器正常关闭时候执行
3 destroy 方法 在servlet被销毁之前执行。一般用于释放资源
servlet 3.0
好处:
支持注解配置,可以不需要web.xml
使用步骤
- 创建 web项目,选择 servlet3.0以上 版本,可以不创建 web.xml
- 定义一个类,实现servlet 接口
- 复写方法
- 在类上加注解 @WebServlet
@WebServlet(“资源路径”)
实例:
下面展示一些内联代码片
。
@WebServlet(urlPatterns = "/demo")
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 {
System.out.println("Hello world");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
servlet 的体系结构
Servlet --- (接口) 一个标准
|
GenericServlet --- (抽象类) 是Servlet接口子类
|
HttpServlet -- - (抽象类) 是GenericServlet子类,一个专门处理Http请求的Servlet
- GenericServlet : 讲接口中的其他方法做了默认空实现,只将service()方法作为抽象
要定义servlet类时,只需要继承 GenericServlet ,实现 service 方法; - HttpServlet :对协议Http 的一种封装,操作简单
后期我们一般都使用 HttpServlet 方法
HttpServlet 方法的使用
实例:
@WebServlet("/demo")
public class HttpServletDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("+++++++++++++++++doGet方法+++++++");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("+++++++++++++++++doPost方法+++++++");
}
}