servlet定义
- Servlet是javaweb开发的基石,与平台无关的服务器组件,运行在Tomcat中,负责与客户端通信。
- servlet本质就是一个遵循servlet接口的java类,专门用于服务器的类。
HTTP协议
- 超文本传输协议(HTTP)是互联网上应用最广泛的一种网络协议。所有的www文件都必须遵守这个标准。它是tcp/ip协议的一个应用层协议。简单来说,HTTP协议就是客户端和服务器交互的一种通讯的格式
- 例如在浏览器打开一个链接,浏览器为我打开这个链接的网页。原理是:当在浏览器中点击这个链接时,浏览器会向服务器发送一段文本,告诉服务器请求打开的是哪一个网页。服务器收到请求后,就会返回一段文本给浏览器,浏览器会将文本解析,然后显示出来。这段文本是遵循HTTP协议的。
- 在HTTP1.0中,客户端与web服务器建立连接后,只能获得一个web资源【短连接,获取资源后就断开连接】
- 在HTTP1.1中,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源【保持连接】
servlet的作用
- 创建并返回基于客户请求的动态html页面
- 与数据库进行通信
servlet 的基本使用和配置
- servlet本身是一组接口,自定义一个类,并且实现servlet接口,这个类就具备了接收客户端请求以及作出响应的功能。
import javax.servlet.*;
import java.io.IOException;
public class MyServlet 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 {
String id = servletRequest.getParameter("id");
System.out.println("我是Servlet,我已经接收到了客户端发来的请求,参数是"+id);
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write("客户端你好,我已接收到你的请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
-
浏览器不能直接访问 Servlet ⽂件,只能通过映射的⽅式来间接访问 Servlet,映射需要开发者⼿动配置,有两种配置⽅式。
基于 XML ⽂件的配置方式
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.southwind.servlet.HelloServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
基于注解的方式
@WebServlet("/demo2")
public class HelloServlet implements Servlet {
}
- 上述两种配置⽅式结果完全⼀致,将 demo2 与 HelloServlet 进⾏映射,即在浏览器地址栏中直接访问demo 就可以映射到 HelloServlet。
servlet的生命周期
1、当浏览器访问 Servlet 的时候,Tomcat 会查询当前 Servlet 的实例化对象是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执⾏第 3 步。
2、调⽤ init ⽅法完成初始化操作。
3、调⽤ service ⽅法完成业务逻辑操作。
4、关闭 Tomcat 时,会调⽤ destory ⽅法,释放当前对象所占⽤的资源
Servlet的生命周期方法:无参构造方法,init,service,destory
- ⽆参构造函数只调⽤⼀次,创建对象。
- init 只调⽤⼀次,初始化对象。
- service 调⽤ N 次,执⾏业务⽅法
- destory 只调⽤⼀次,卸载对象
ServletConfig与ServletContext
- ServletConfig接口是用来Servlet 的基本信息的。
getServletName() 返回 Servlet 的名称,全类名(带着包名的类名)
getInitParameter(String key) 获取 init 参数的值(web.xml)
getInitParameterNames() 返回所有的 initParamter 的 name 值,⼀般⽤作遍历初始化参数
- ServletContext
getServletContext() 返回 ServletContext 对象,它是 Servlet 的上下⽂,整个 Servlet 的管理者
-
ServletConfig 和 ServletContext 的区别:
ServletConfig 作⽤于某个 Servlet 实例,每个 Servlet 都有对应的 ServletConfig,ServletContext 作⽤于整个 Web 应⽤,⼀个 Web 应⽤对应⼀个 ServletContext,多个 Servlet 实例对应⼀个 ServletContext。
⼀个是局部对象,⼀个是全局对象
servlet的子类HttpServlet
- Servlet —》GenericServlet —〉HttpServlet
- HTTP 请求有很多种类型,常⽤的有四种:
GET 读取
POST 保存
PUT 修改
DELETE 删除 - GenericServlet 实现 Servlet 接⼝,同时为它的⼦类屏蔽了不常⽤的⽅法,⼦类只需要重写 service ⽅
法即可。 - HttpServlet 继承 GenericServlet,根据请求类型进⾏分发处理,GET 进⼊ doGET ⽅法,POST 进⼊
doPOST ⽅法。 - 开发者⾃定义的 Servlet 类只需要继承 HttpServlet 即可,重新 doGET 和 doPOST
package com.southwind.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("GET");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("POST");
}
}