Servlet 是 Server 与 Applet 的缩写,是服务端小程序的意思。使用 Java 语言编写的服务器端程序,可以生成动态的 WEB 页,Servlet 主要运行在服务器端,并由服务器调用执行, 是一种按照 Servlet 标 准来开发的类。
Servlet 本质:
- Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创建、使用、销毁都由 Servlet 容器进行管理(如 Tomcat)。
Servlet容器:
- 指提供了 Servlet 功能的服务器,其常见容器有很多,如 Tomcat, Jetty, WebLogic ,Server, WebSphere, JBoss 等等。
-
继承HttpServlet接口
-
重写service方法
实现请求处理的操作
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //请求处理的操作 System.out.println("servlet"); }
-
设置注解@WebServlet
//设置注解@WebServlet @WebServlet("/serv02") public class Servlet02 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("servlet"); } } "/serv02"表示的是访问该servlet的 url 映射(地址)
- 通过请求头获知浏览器访问的是哪个主机
- 再通过请求行获取访问的是哪个一个web应用
- 再通过请求行中的请求路径获知访问的是哪个资源
- 通过获取的资源路径在配置中匹配到真实的路径,
- 服务器会创建servlet对象,(如果是第一次访问时,创建servlet实例,并调用init方法进行初始化
操作)
- 调用service(request, response)方法来处理请求和响应的操作
- 调用service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以http响应的格式发送给
浏览器
- servlet执行原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zlGzdCWj-1650454206856)(JavaEE.assets/servlet执行原理(文字描述).png)]
图解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ALRtmUH-1650454206857)(JavaEE.assets/servlet执行原理.png)]
2.3 servlet 生命周期Servlet没有 main()方法,不能独立运行,它的运行完全由 Servlet 引擎来控制和调度。 所谓生命周期,指的是 servlet 容器何时创建 servlet 实例、何时调用其方法进行请求的处理、 何时并销毁其实例的整个过程。
-
实例和初始化时机
- 当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化。
- 调用init()方法在 Servlet 实例创建之后执行,只执行一次
public void init() { System.out.println("实例创建了"); } -
就绪/调用/服务阶段
- 有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用;
- service()方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求,可执行多次
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("service服务被调用了"); }[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TgxGk0rJ-1650454206858)(JavaEE.assets/1c950a7b02087bf41bc3ef042f6cff2b10dfcf73.jpeg)]
-
销毁时机
- 当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。
- destroy()方法,,Servlet 实例销毁时执行,只执行一次
public void destroy() { System.out.println("destroy销毁方法,服务已关闭"); }Servlet 的生命周期,简单的概括这就分为四步:servlet 类加载–>实例化–>服务–>销毁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7uB0loHN-1650454206859)(JavaEE.assets/1650369407186.png)]
- 解决方案
- 在获取参数前,设置request的编码:request.setCharacterEncoding(“UTF-8”);
-
特点:
- 是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
-
步骤:
- 通过request对象获取请求转发对象
@Override protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException { //请求转发到页面 if(uname.equals("admin")){ request.getRequestDispatcher("index.html").forward(request,resp); }else{ request.getRequestDispatcher("login.jsp").forward(request,resp); } //请求转发到 servlet request.getRequestDispatcher("ser07").forward(request,resp); }
通过request对象可以在一个请求中传递数据,
-
作用范围:
- 在一次请求中有效,即服务器跳转有效。
-
一般用于前后台交互,后台响应数据给客户端(设置域对象),客户端获取域对象显示数据(获取域对象)
-
常用方法:
-
// 设置域对象内容
-
request.setAttribute(String name, String value);
-
// 获取域对象内容
-
request.getAttribute(String name);
-
// 删除域对象内容
-
request.removeAttribute(String name);
-



