目录--“供自己回看的粗略笔记”
!!是markdown文件导入,存在格式问题,可直接看附件文档
Servlet概述
servlet简介
Servlet是运行在Servlet容器中的Java类,能处理Web客户端的HTTP请求,并产生HTTP响应
servlet 请求和访问过程
(servlet本身不做业务处理,通过调用其他类处理)
步骤:
- 接收HHTP请求
- 取得请求信息,包括请求头部信息和请求参数数据
- 调用其他Java类方法,完全具体的业务功能
- 实现到其他Web组件的跳转(包括重定向或请求转发)
- 生成HTTP响应(包括HTML或非HTML响应)
servlet特点
高效、方便、功能强大、可移植性好
servlet是Java EE(java 企业级的开发技术,一套规范)的基础,随Java EE规范一起发布,是Java EE的一部分。
页面跳转
-
(主要)请求转发:jsp不能直接传值,需要通过HttpServletRequest request对象传值,forward
-
重定向:response对象提供的:重定向redirect
servlet容器
servlet容器也就是Servlet所运行的环境
-
servlet容器先接受请求,通过请求找到对应的servlet,再实例化servlet类对象(servlet不需要手动实例化,容器可以自动实例化 )
-
tomcat是servlet容器之一
-
servlet运行需要在容器里运行
Serlvet API
servlet是使用Serlvet API(应用程序设计接口)及相关类和方法的Java程序
Serlvet API 包含两个软件包:
- javax.servlet包
- javax.servlet.http包
接口
javax.servlet.Servlet
所有的Servlet都必须直接或间接地实现javax.servlet.Servlet接口(继承父类)
❗❗Servlet接口中的重要方法
跟生命周期相关的方法重要!
-
init方法初始化:在servlet实例化后,由**servlet容器调用的对servlet进行初始化;servlet实例只能被调用一次**
-
service方法:处理用户请求的方法,然后判断调用什么方法
-
destroy方法销毁方法:servlet一旦被实例化之后就一直在内存当中,容器在终止servlet服务前调用此方法(tomcat正常停止运行后)
…config:调用servlet配置信息
javax.servlet.http.HttpServlet
HttpServlet指能够处理HTTP请求的Sevlet,它在原有Servlet接口上添加了对HTTP协议的处理
HttpServlet中的重要方法
service
doGet
doPost
❗❗servlet生命周期
Servlet生命周期是指Servlet实例从创建到响应客户请求,直至销毁的过程.
Servlet程序本身不直接在Java虚拟机上运行,由Servlet容器负责管理其整个生命周期
❗这些方法在哪执行,执行几次要会
-
构造方法:执行一次
-
inti():执行一次
-
sevice()可能被多次调用:执行多次
-
destroy():执行一次
可划分为四个阶段:加载和实例化、初始化、处理请求、销毁!!!!!!
简单来说,实例化调用servlet构造方法,初始化调用init方法,合为servlet创建过程
当请求到了tomcat里tom会先找对象,没找到就实例化,然后实例化
请求处理完毕之后,不会立即销毁,先存放在容器之中,后续可能还会访问到
service:会为每个用户的请求创建一个线程(每一个请求都在一个线程调用一次service)(一个实例多线程)
测试例子
重写方法,加个输出
右键 - > Gennerate - > override
TestServlet.java
package com.example.web_demo3;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "TestServlet", value = "/test")
public class TestServlet extends HttpServlet {
//重写这些方法,加一个打印输出让我看到这些方法运行过程
public TestServlet() {
super();
System.out.println("TestServlet Constructor");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
System.out.println("Service method");
}
//一般在这一般不会调用,停止tomcat时会执行
@Override
public void destroy() {
System.out.println("Destroy method");
super.destroy();
}
@Override
public void init() throws ServletException {
System.out.println("Init method");
super.init();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet...");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
Servlet的声明配置
声明配置的实现
通过这个注解@WebServlet实现声明配置
或者将声明配置通过web.xml(在WEB-INF里)里实现
WEB-INF这个文件名不能改!!改了就不是配置文件了
@WebServlet的属性
loadOnStartup:之前实例化是在第一次请求访问servlet路径时,loadOnStartup可以通过配置在容器一启动就实例化(更改顺序)
Servlet应用与特性
发带参数的请求(超链接)
链接文本
请求转发
请求转发是指将请求再转发到其他地址,转发过程中使用的是同一个request请求,转发后浏览器地址栏内容不变。
你访问XXX(路径是XXX),实际上你跳转的是xxx(内容是xxx)
request.getRequestDispatcher().forword()
重定向
重定向是指原请求地址重新定位到某个新地址,原有的request请求失效,客户端看到的是新Request请求的响应结果,客户端浏览器地址栏变为新请求地址
response.sendRedirect()
请求转发和重定向的区别:
请求转发(大部分页面跳转都用这个,因为它发的请求的次数少):
request.getRequestDispatcher("/hello.jsp").forword(request,response);
-
地址栏:http://localhost:8080/test
-
源文件和目标文件,是同一个request对象(共用同一个Request)
-
跳转在服务器端进行,只有一次请求
-
只能在当前web应用的内部(本地-文件)做跳转,不能跳转到其他应用(不同服务器,同一服务器不同应用也不行)
重定向:
response.sendRedirect("/hello.jsp");
-
地址栏:http://localhost:8080/hello.jsp
-
源文件和目标文件,不是同一个request对象(每一次请求,生成一个心新的request对象)
-
返回目标文件地址,客户端重新发送请求到目标文件,有两次请求
-
可以跳转到另外一台服务器上(访问不是存在本地的“网页”)
Servlet接口
ServletContext接口
ServletContext(Servlet上下文)–代表当前servlet运行环境
xxxcontext也就是xxx上下文
所用用户,请求、页面都可以,所有对象可用。全局可用
例:网站访问次数计数(不管是不是不同用户,访问了也能再访问,只记次数)
ServletContext