三大域对象
一、ServletContext对象
ServletContext对象, 在一个web项目中只创建一次,所有用户都可以获取及使用,可以实现不同用户请求的数据共享。
注意
-
-
ServletContext对象一个项目中只有一个,以任意方式获取到的都是同一个。
-
//方式一: ServletContext servletContext = this.getServletContext(); //方式二: ServletContext servletContext1 = req.getSession().getServletContext(); //方式三: ServletContext servletContext2 = req.getServletContext();
注意:这三个ServletContext对象都是同一个对象,因为一个Web项目中只创建一次
1.2 ServletContext对象存取数据
//往ServletContext对象中存数据,键值对的方式 servletContext.setAttribute("name", "root"); //从ServletContext对象中获取数据 String name = (String)servletContext.getAttribute("name");
1.3 ServletContext对象获取web.xml中配置的上下文参数
可以在web.xml中配置一些参数,可以通过ServletContext对象获取。经常出现在框架的底层。
<!--配置上下文参数--> <context-param> <param-name>name</param-name> <param-value>admin</param-value> </context-param> <context-param> <param-name>age</param-name> <param-value>18</param-value> </context-param>
所有servlet都能获取到这些参数,因为servletContext对整个web项目有效
2. 生命周期
二、域对象
域对象可以存放键值对的数据,这些数据的使用有一定的区域范围限制。
1. 三大域对象
域 | 对象 | 名称 |
---|---|---|
request域 | HttpServeltRequest对象 | 请求域 |
session域 | HttpSession对象 | 会话域 |
application域 | ServletContext对象 |
1.1 request域
有效范围:一次请求
作用:流转业务数据
生命周期:
创建:浏览器每次请求服务器都重新创建;
使用:在请求的Servlet中或者请求转发后的Servlet中使用;
销毁:请求响应结束后,该请求对象就会被销毁。
1.2 Session域
有效范围:一次会话(可以多次请求)
作用:一般用于保存用户状态数据,如用户登录信息
生命周期:
创建:从第一次发出请求,会话开始
使用:一次会话内,浏览器和服务器的多次请求都有效
销毁:会话结束、达到最大不活动时间间隔(存活时间)、手动销毁
1.3 Application域
有效范围:当前Web项目内有效,可以跨请求、跨会话(多个客户端)
作用:一般用于存放全局和项目本书相关所有用户共享的数据,如在线人数,不建议存放业务数据。
生命周期:
创建:服务器启动就创建一次,之后不在创建;
使用:服务器运行期间都有效;
销毁:服务器关闭就销毁。
2. 常用API
方法 | 作用 |
---|---|
setAttribute(key, value) | 向域中添加|修改数据,无则添加,有则修改 |
getAttribute(key) | 获取域中的数据 |
removeAttribute(key) |
二、文件上传
在Servlet3.0之前的版本中如果实现文件上传需要依赖apache的Fileupload组件,在Servlet3.0以及之后的版本中提供了Part对象处理文件上传,所以不在需要额外的添加Fileupload组件。
1. 配置
form表单设置属性:
method="post",enctype="multipart/form-data"
<form action="regist" method="post" enctype="multipart/form-data">
在Servlet3.0以及之后的版本中实现文件上传时必须要在Servlet中开启多参数配置;
1.1 方式一
web.xml 配置
<multipart-config> <file-size-threshold></file-size-threshold> <location></location> <max-file-size></max-file-size> <max-request-size></max-request-size> </multipart-config>
参数说明:
元素名 | 类型 | 描述 |
---|---|---|
<file-size-threshold> |
int | 当数据量大于该值时,内容将被写入临时文件。 |
<location> |
String | 存放生成的临时文件地址 |
<max-file-size> |
long | 允许上传的文件最大值(byte)。默认值为 -1,表示没有限制 |
<max-request-size> |
long |
配置必须有:
<multipart-config> </multipart-config>
没有就会报错。
1.2 方式二
使用注解@MultipartConfig 配置
属性名 | 类型 | 描述 |
---|---|---|
fileSizeThreshold | int | 当数据量大于该值时,内容将被写入临时文件。 |
location | String | 存放生临时成的文件地址 |
maxFileSize | long | 允许上传的文件最大值(byte)。默认值为 -1,表示没有限制 |
maxRequestSize | long |
2. Part对象常用的方法
说明 | |
---|---|
long getSize() | 上传文件的大小 |
String getSubmittedFileName() | 上传文件的原始文件名 |
String getName() | 获取<input name="upload" ...>标签中name属性值 |
InputStream getInputStream() | 获取上传文件的输入流 |
void write(String path) |
三、文件下载
获取文件的输入流,通过输出流响应到浏览器。
@WebServlet("/download") public class DownLoad extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("Content-Disposition", "attachment; filename=" + new String("aa.png")); //中文需要指定编码 //resp.setHeader("Content-Disposition", "attachment; filename=" + new String("你好.png".getBytes(),"ISO8859_1")); String upload = getServletContext().getRealPath("upload"); FileInputStream fis = new FileInputStream(upload + "/aa.png"); BufferedInputStream bis = new BufferedInputStream(fis); ServletOutputStream sos = resp.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(sos); byte[] bys = new byte[1024]; while (bis.read(bys) != -1) { bos.write(bys, 0, bys.length); } bos.close(); bis.close(); } }
四、过滤器(Filter)
1. 作用
Tomcat收到客户端请求后, 调用资源前会对请求进行拦截, 完成相关的处理。
2. 使用步骤
-
-
实现接口中的方法,编写自己的代码。
-
例:自定义字符编码过滤器
public class CharacterFilter implements Filter { public CharacterFilter() { System.out.println("过滤器被创建!"); } /** * 处理化方法,执行一些初始化的操作,一般不用 * @param filterConfig * @throws ServletException */ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("过滤器被初始化!"); } /** * 过滤器的核心方法,过滤器拦截到请求后,就是在该方法中对请求进行判断,看是否让其继续访问我们的资源 * @param servletRequest 封装的请求信息 * @param servletResponse 封装的响应对象 * @param filterChain 过滤器链,用来放行的 * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //为请求对象和响应对象设置字符编码
.......
filterChain.doFilter(servletRequest, servletResponse);//放行 } /** * 销毁方法,用来做一些释放资源的操作,一般不用 */ @Override public void destroy() { System.out.println("过滤器被销毁!"); } }
然后要配置该过滤器
<!--配置过滤器--> <filter> <filter-name>CharacterFilter</filter-name> <!-- 配置过滤器所在的全路径,由Tomcat在启动的时候,通过放射创建该过滤器对象 --> <filter-class>com.gsy.filter.CharacterFilter</filter-class> </filter> <!--配置过滤器的拦截路径,也就是对哪些请求进行拦截--> <filter-mapping> <filter-name>CharacterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. 过滤链
顺序:
请求经过:Filter1-->Filter2-->--Filter3
到达web资源,经过servlet处理返回响应
响应经过:Filter3-->Filter2-->Filter1
五、监听器
1. 简介
作用:监听三大域对象的创建、数据的变更、销毁。
2. 使用
-
-
实现里面的方法。
-
-
-
ServletRequestListenter 监听request对象的创建销毁
-
ServletRequestAttributeListener 监听request域中数据的变更
-
HttpSessionListener 监听Session对象的创建销毁
-
HttpSessionAttributeListener 监听Session对象中数据的变更
-
ServletContextListener 监听ServletContext对象的创建销毁
-
-

public class MyListener implements ServletRequestListener, ServletRequestAttributeListener, HttpSessionListener, HttpSessionAttributeListener, ServletContextListener, ServletContextAttributeListener { //监听ServletContext对象中数据的添加 @Override public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) { } //监听ServletContext对象中数据的删除 @Override public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) { } //监听ServletContext对象中数据的修改 @Override public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) { } //监听ServletContext对象的初始化 @Override public void contextInitialized(ServletContextEvent servletContextEvent) { } //监听ServletContext对象的销毁 @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } //监听ServletRequest对象中数据的添加 @Override public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) { System.out.println("request对象中添加的数据!"); } //监听ServletRequest对象中数据的删除 @Override public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) { System.out.println("request对象中删除了数据!"); } //监听ServletRequest对象中数据的修改 @Override public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) { System.out.println("request对象中修改了数据!"); } //监听ServletRequest对象中数据的销毁 @Override public void requestDestroyed(ServletRequestEvent servletRequestEvent) { System.out.println("request对象被销毁!"); } //监听ServletRequest对象的初始化 @Override public void requestInitialized(ServletRequestEvent servletRequestEvent) { System.out.println("request对象被初始化!"); } //监听HttpSession对象中数据的添加 @Override public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) { } //监听HttpSession对象中数据的删除 @Override public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) { } //监听HttpSession对象中数据的修改 @Override public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) { } //监听HttpSession对象的创建 @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { } //监听HttpSession对象的销毁 @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异