Servlet:Java服务器端小应用_ServletContext对象_域对象_文件上传_文件下载_监听器_过滤器

一、ServletContext对象

1.引入

在实际功能中,不同的用户也可能会用到相同的数据,如果使用Session来进行存储,会造成同一份数据在服务器中被存储多份,浪费空间。 ServletContext对象, 在一个web项目中只创建一次,所有用户都可以获取及使用,可以实现不同用户请求的数据共享。

2.实现

获取ServletContext对象,在JSP中也叫Application对象。

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

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

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

4.使用
1.获取ServletContext对象
//方式一:
ServletContext servletContext = this.getServletContext();

//方式二:
ServletContext servletContext1 = req.getSession().getServletContext();

//方式三:
ServletContext servletContext2 = req.getServletContext();
 2.使用ServletContext对象存储数据
//往ServletContext对象中存数据,键值对的方式
servletContext.setAttribute("name", "root");

//从ServletContext对象中获取数据
String name = (String)servletContext.getAttribute("name");
 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>
String name1 = servletContext.getInitParameter("name");
String age = servletContext.getInitParameter("age");

System.out.println("name:" + name1 + ", age:" + age);
 4.ServletContext对象的生命周期

        当服务器启动时会创建ServletContext对象。服务器关闭后该对象销毁。ServletContext对象的生命周期很长,仅存放所有用户共享的数据。

二、域对象

1.什么是域对象

域对象类似于之前学习的map集合,可以存放键值对的数据。不同的是域对象中数据的使用有一定的区域范围限制。

三大域对象:

对象名称
request域HttpServeltRequest对象请求域
session域HttpSession对象会话域
application域ServletContext对象应用域
 2.常用方法
setAttribute(key, value)向域中添加|修改数据,无则添加,有则修改
getAttribute(key)获取域中的数据
removeAttribute(key)从域中移除指定key的数据
3.resquest域
有效范围

一次请求有效

作用

流转业务数据

生命周期

创建:浏览器每次请求,服务器都会重新创建

使用:在请求的Servlet中或者请求转发后的Servlet中使用

销毁:请求响应结束后,该请求对象就会被销毁

4.Session域
有效范围

单次会话内有效,多次请求

作用

一般用来存储用户状态数据,比如:用户的登录信息等

生命周期

创建:从第一次发出请求,会话开始

使用:一次会话内,浏览器和服务器之间发生多次请求都有效

销毁:会话结束,比如:达到最大不活动时间、手动销毁

5.Application域
有效范围

 当前web项目内都有效,可以跨请求,跨会话访问

作用

一般放一些全局的和项目本身相关所有用户共享的数据,如在线人数,不建议存放业务数据

生命周期

创建:服务器启动

使用:服务器运行期间都有效

销毁:服务器关闭

三、文件上传

1.介绍

        在Servlet3.0之前的版本中如果实现文件上传需要依赖apache的Fileupload组件,在Servlet3.0以及之后的版本中提供了Part对象处理文件上传,所以不在需要额外的添加Fileupload组件。

 2.配置
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,表示没有限制。
 2.方式二

@MultipartConfig 配置

属性名类型描述
fileSizeThresholdint当数据量大于该值时,内容将被写入临时文件。
locationString存放生临时成的文件地址
maxFileSizelong允许上传的文件最大值(byte)。默认值为 -1,表示没有限制
maxRequestSizelong一个 multipart/form-data请求能携带的最大字节数(byte),默认值为 -1,表示没有限制。
3.Part对象常用方法
方法说明
long getSize()上传文件的大小
String getSubmittedFileName()上传文件的原始文件名
String getName()获取<input name="upload" ...>标签中name属性值
InputStream getInputStream()获取上传文件的输入流
void write(String path)保存文件至指定位置
 4.实现

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
    method="post":必须为post
    enctype="multipart/form-data":必须为multipart/form-data
-->
<form action="uploadServlet" enctype="multipart/form-data" method="post">
    头像:<input type="file" name="photo"> <br>
    <input type="submit">
</form>
</body>
</html>

 Servlet

@MultipartConfig
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part photo = req.getPart("photo");
        String name = photo.getSubmittedFileName();
        String upload = getServletContext().getRealPath("upload");
        File file = new File(upload);
        if (!file.exists()) {
            file.mkdirs();
        }
        photo.write(upload + "/" + name);
    }
}

四、文件下载

获取文件的输入流,通过输出流响应到浏览器。

实现

@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();
    }
}

五、监听器(Listener)

 1.监听器介绍
作用:

监听三大域对象的创建、销毁及数据的变更。

特点:
  1. 监听方法由tomcat根据监听结果来调用执行。

  2. 监听方法中的逻辑代码由我们根据需要编写。

2.监听器的使用
监听器的使用步骤:
  1. 创建一个类,实现监听器接口(Listener)。

  2. 实现里面的方法。

  3. 在web.xml中配置监听器。

接口:
  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) {

    }
}
<!--
    配置监听器,在服务器启动的时候就会创建监听器对象,监听器生效,一旦符合监听要求,
    tomcat底层会通过反射调用监听器中的方法完成处理
-->
<listener>
    <listener-class>com.bjsxt.listener.MyListener</listener-class>
</listener>

 

六、过滤器(Filter)

1.过滤器引入

目前,只要在浏览器中输入正确的url地址,不管此次请求是否合理,Tomcat服务器在接收到请求后就会直接调用对应的资源完成请求的处理。有些场景, 需要对请求进行相关处理, 处理完成后, 在访问请求的资源。 在浏览器发起请求,Tomcat服务器收到后,调用资源处理请求之前添加拦截。

拦截后发现请求不合理,可以拒绝访问;如果合理,可以进行相关的设置, 然后放行,继续访问请求的资源。

 2.过滤器的作用

Tomcat收到客户端请求后, 调用资源前会对请求进行拦截, 完成相关的处理。

 3.过滤器的编写步骤
  1. 创建一个类,实现过滤器接口(Filter)。

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

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

4. 过滤器的使用
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 {
        System.out.println("开始对请求进行判断处理!");
        filterChain.doFilter(servletRequest, servletResponse);//放行
    }

    /**
     * 销毁方法,用来做一些释放资源的操作,一般不用
     */
    @Override
    public void destroy() {
        System.out.println("过滤器被销毁!");
    }
}
<!--配置过滤器-->
<filter>
    <filter-name>CharacterFilter</filter-name>
    <!--
        配置过滤器所在的全路径,由Tomcat在启动的时候,通过放射创建该过滤器对象
    -->
    <filter-class>com.bjsxt.filter.CharacterFilter</filter-class>
</filter>

<!--配置过滤器的拦截路径,也就是对哪些请求进行拦截-->
<filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
5.过滤器链

 6.未登录不能访问主界面功能
@Filter
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        Object username = request.getSession().getAttribute("username");

        if(username == null){ //未登录
            if(request.getRequestURI().indexOf("LoginPageServlet") != -1){//用户是去登录页的
                filterChain.doFilter(request, response);
            }else if(request.getRequestURI().indexOf("LoginServlet") != -1){//用户提交的登录请求
                filterChain.doFilter(request, response);
            }else{
                response.sendRedirect(request.getContextPath() + "/LoginPageServlet");
            }
        }else{
            filterChain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {

    }
}
7.字符编码过滤器
@WebFilter("/*")
public class CharaterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //servletResponse.setContentType("text/html;charset=utf-8");
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        filterChain.doFilter(req,resp);
    }

    @Override
    public void destroy() {

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值