三大域对象

一、ServletContext对象

ServletContext对象, 在一个web项目中只创建一次,所有用户都可以获取及使用,可以实现不同用户请求的数据共享。

注意

  1. ServletContext对象由Tomcat服务器在启动加载项目的时候完成创建。

  2. ServletContext对象一个项目中只有一个,以任意方式获取到的都是同一个。

  3. ServletContext对象中保存的数据是所有用户共享的。

1. 使用

1.1 获取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. 生命周期

当服务器启动时会创建ServletContext对象。服务器关闭后该对象销毁。

ServletContext对象的生命周期很长,仅存放所有用户共享的数据。

二、域对象

域对象可以存放键值对的数据,这些数据的使用有一定的区域范围限制。

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) 从域中移除指定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/form-data请求能携带的最大字节数(byte),默认值为 -1,表示没有限制。

配置必须有:

<multipart-config>
</multipart-config>

没有就会报错。

1.2 方式二

使用注解@MultipartConfig 配置

属性名类型描述
fileSizeThreshold int 当数据量大于该值时,内容将被写入临时文件。
location String 存放生临时成的文件地址
maxFileSize long 允许上传的文件最大值(byte)。默认值为 -1,表示没有限制
maxRequestSize long 一个 multipart/form-data请求能携带的最大字节数(byte),默认值为 -1,表示没有限制。

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. 使用步骤

  1. 创建一个类,实现过滤器接口(javax.servlet.Filter)

  2. 实现接口中的方法,编写自己的代码。

  3. 在web.xml中配置过滤器或通过注解配置。

例:自定义字符编码过滤器

复制代码
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. 使用

  1. 创建一个类,实现监听器接口(Listener)。

  2. 实现里面的方法。

  3. 在web.xml中配置监听器(或注解@WebListener)。

  4. 监听器接口:

    1. ServletRequestListenter 监听request对象的创建销毁

    2. ServletRequestAttributeListener 监听request域中数据的变更

    3. HttpSessionListener 监听Session对象的创建销毁

    4. HttpSessionAttributeListener 监听Session对象中数据的变更

    5. ServletContextListener 监听ServletContext对象的创建销毁

    6. ServletContextAttributeListener 监听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) {

    }
}
实现监听器所有接口
复制代码

 

posted @   ygdgg  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示