Servlet
Java Web 应用程序中处理 HTTP 请求和生成 HTTP 响应的组件
Servlet 是JavaEE 规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
Maven项目 —— 设置使用范围为
provided
(编译和测试环境有效,运行环境无效)因为tomcat中含有servlet-api<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
IDEA输出中文乱码的话再设置tomcat里面的VM options一栏中输入:
-Dfile.encoding=UTF-8
webapps规范
- 在服务器wabapps目录下创建web应用程序目录--项目名称,是项目的根目录
- 在web应用程序目录下创建WEB-INF目录--web应用程序的配置目录
- 在WEB-INF目录下创建web.xml文件--web应用程序的配置文件(配置文件是用于描述请求路径和Servlet类之间的对照关系)
- 在WEB-INF目录下创建classes目录--web应用程序的类文件目录
- 在classes目录下放Servlet类的字节码文件
- 在WEB-INF目录下创建lib目录--web应用程序的依赖库目录
web.xml
配置首页
<welcome-file-list>
<welcome-file>/xxx.xx</welcome-file>
<welcome-file>/xx.xxx</welcome-file>
</welcome-file-list>
可以配置多个页面,第一个页面找不到的话从上往下找第二个页面
配置Error错误显示
<error-page>
<error-code>错误码</error-code>
<location>资源路径</location>
</error-page>
这个是配置错误的页面跳转,如:404错误,跳转到下面的资源文件
配置注册和映射
<!-- 注册Servlet -->
<servlet>
<servlet-name>名字(一般为映射的类名)</servlet-name>
<servlet-class>类所在位置</servlet-class>
<!-- 以下内容可选 -->
<load-on-startup>优先级</load-on-startup>
<init-param>
<param-name>初始化参数的名称</param-name>
<param-value>初始化参数的值</param-value>
</init-param>
<!-- 以上内容可选 -->
</servlet>
<!-- 注册映射关系 -->
<servlet-mapping>
<servlet-name>类名(跟注册的Servlet一个名称)</servlet-name>
<url-pattern>访问路径(/hello)</url-pattern>
</servlet-mapping>
优先级:为负数时在第一次访问时加载该类并创建实例化对象,为0或整数时将在服务器开启后加载该类并创建实例化对象, 值越小优先级越高
初始化:参数可以在
init
方法里面使用servletConfig.getInitParameter("参数名")
获取值这个可以让Tomcat知道请求路径和Servlet类之间的对照关系,一个Servlet可以有多个访问路径,但是一个访问路径只能对应一个Servlet
浏览器访问对应的地址的对应端口的项目名称的对应路径时,Tomcat可以通过url-pattern找到对应的Servlet类,然后创建Servlet类的实例对象,最后调用Servlet类的service()方法处理请求
实现Servlet接口
包路径:javax.servlet.Servlet
方法简介
init(ServletConfig config)
:初始化方法,Servlet对象创建时执行,只执行一次
service(ServletRequest req, ServletResponse res)
:服务方法,每次请求时执行,执行多次
destroy()
:销毁方法,Servlet对象销毁时执行,只执行一次
getServletConfig()
:获取ServletConfig对象
getServletInfo()
:获取Servlet信息
执行过程
操作 | 结果 |
---|---|
第1次访问 | 调用了init方法、service 方法和构造方法 |
第2···N次访问 | 调用了service 方法 |
关闭服务器 | 调用了destroy 方法 |
ServletConfig接口
ServletConfig对象由Tomcat创建并传递给Servlet对象
包路径:javax.servlet.ServletConfig
方法简介
getServletName()
:获取Servlet的名称 —— web.xml中<servlet-name>
标签的内容
getInitParameter(String name)
:获取初始化参数 —— web.xml中<servlet>
标签下的<init-param>
标签的内容
getInitParameterNames()
:获取所有初始化参数的名称 —— web.xml中<servlet>
标签下的所有<init-param>
标签的内容
ServletContext接口
在web应用程序启动时创建ServletContext对象,每个web应用程序只有一个ServletContext对象,所有Servlet对象共享同一个ServletContext对象 它存储web.xml中的所有信息
getInitParameter(String name)
:获取初始化参数 —— web.xml中<context-param>
标签的内容
getInitParameterNames()
:获取所有初始化参数的名称 —— web.xml中所有<context-param>
标签的内容
getRealPath(String path)
:获取web应用程序中的资源在服务器上的绝对路径 —— web应用程序目录下的资源路径
getMimeType(String file)
:获取文件的mime类型 —— 文件后缀名
getResourceAsStream(String path)
:获取资源对应的输入流 —— web应用程序目录下的资源路径
getAttribute(String name)
:根据名称获取域中保存的对象
setAttribute(String name,Object obj)
:将对象保存到域中
removeAttribute(String name)
:从域中删除对象
GenericServlet类
实现了Servlet接口,实现了init()和destroy()方法,service()方法是抽象方法,需要子类重写
方法 | 用途 |
---|---|
log | 日志对象 |
config | ServletConfig对象 |
context | ServletContext对象 |
@WebServlet()注解
属性
键 | 用途 |
---|---|
value | Servlet的访问路径 |
urlPatterns | Servlet的访问路径 |
name | Servlet的名称 |
asyncSupported | 是否支持异步请求 |
loadOnStartup | 优先级 |
initParams | 初始化参数 |
description | Servlet的描述信息 |
路径
名称 | 格式 |
---|---|
精确匹配 | ("/t") |
目录匹配 | ("/t/*") |
扩展名匹配 | ("*.扩展名") |
任意匹配 | ("/"),("/*") 使用("/")后会覆盖Tomcat中默认的DefaultServlet类(默认服务) |
HttpServlet类
继承自
GenericServlet
类,主要用于处理请求
一般只重写doPost
和doGet
这种常用方法
Servlet的实现方式
方式一:实现Servlet接口
方式二:继承GenericServlet抽象类
方式三:继承HttpServlet类 (常用)
域对象
作用:在不同的Servlet中共享数据
域对象的分类:
- request:代表一次请求,只能在一次请求中共享数据
- session:代表一次会话,只能在一次会话中共享数据
- application:代表整个web应用程序,只能在整个web应用程序中共享数据
范围大小:request < session < application
Session
作用:存储用户信息
特点:服务器端的存储技术,将用户信息存储在服务器端
获取&使用
获取 session 对象: request.getSession()
常用方法
方法名 | 说明 |
---|---|
session.setAttribute("键",值) | 设置session的键值对 |
session.getAttribute("键") | 获取session中的值 |
session.removeAttribute("键") | 删除session中的键值对 |
session.invalidate() | 销毁session对象 |
原理
- 当第一次调用request.getSession()方法时,服务器会创建一个session对象
- 服务器会将session对象的JSESSIONID使用Cookie技术存储到浏览器中
- 当浏览器再次访问服务器时,会将Cookie中的JSESSIONID发送给服务器
- 服务器会根据JSESSIONID找到对应的session对象
- 如果服务器没有找到对应的session对象,会创建一个新的session对象
- 如果服务器找到了对应的session对象,会使用该session对象
- 如果客户端禁用了Cookie,则无法正常使用session对象
注意
- 服务器关闭后,session对象销毁
- 客户端关闭后,session对象销毁
- 默认session对象的存储时间为30分钟
- 可以通过配置文件修改session对象的存储时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
生命周期
加载:Tomcat通过反射加载到对应的类
实例化:通过加载到的Class对象获取到一个(公共的无参的!!!)Constructor 对象然后调用newInstance()方法创建实例
可以使用@WebServlet注解中的loadOnStartup属性 设置加载和实例化的优先级
- 为负数时在第一次访问时加载该类并创建实例化对象
- 为0或整数时将在服务器开启后加载该类并创建实例化对象
- (loadOnStartup属性越小优先级越高)
初始化:在servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理
常用请求:get/post
- get:GET 请求对数据量有限制,通常用于请求数据,而不是发送敏感信息
- post:不会暴露在 URL 上,POST 请求没有数据量限制
服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个servlet实例,该实例随后会被Java的垃圾收集器所回收