JavaWeb小习题-下载图片、随机数验证码、重定向与转发、过滤器与监听器

1、Response常见应用-下载文件

  1. 步骤

    1. 得到文件路径与文件名称
    2. 让浏览器支持文件的下载
    3. 获取文件输入流
    4. 获取缓冲区
    5. 使用输出流将文件输出到网页界面
  2. java代码

package org.westos.Response;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

public class FilesDowload extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取文件的下载地址
        String filePath = "F:\\Java program\\JavaWeb\\javaweb-01\\src\\main\\resources\\pictures\\dingding.png";
        //2.得到下载的文件名
        String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
        //3.让浏览器支持下载我们的资源
        //URLEncoder.encode(fileName,"UTF-8"),给文件名转码
        resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        //4.获取文件下载的输入流
        FileInputStream in = new FileInputStream(filePath);
        //5.创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        //6.获得文件OutputStream对象
        ServletOutputStream out = resp.getOutputStream();

        //7.将使用in将数据写入缓冲区中,再将缓冲区中的数据写入到out中,输出到客户端
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        //8.关闭资源
        in.close();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  1. web.xml配置
    <servlet>
        <servlet-name>FilesDowload</servlet-name>
        <servlet-class>org.westos.Response.FilesDowload</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FilesDowload</servlet-name>
        <url-pattern>/dowload</url-pattern>
    </servlet-mapping>

2、Response-验证码功能

  1. 步骤

    1. 设置浏览器刷新频率
    2. 绘制背景图片
    3. 生成随机数
    4. 绘制随机数(验证码)
    5. 将图片写到浏览器响应上
  2. Java代码

    package org.westos.Response;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    
    public class VerificationCode extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.设置浏览器刷新频率,三秒刷新一次
            resp.setHeader("refresh", "3");
            //2.在内存中创建一个图片
            BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
            //3.得到绘制的笔,所有的背景及验证码都是由这支笔画出来的
            Graphics2D graphics = (Graphics2D) image.getGraphics();
            //4.用笔绘制图片的背景色
            graphics.setColor(Color.WHITE);
            graphics.fillRect(0, 0, 80, 20);
            //5.使用笔绘制随机数
            graphics.setColor(Color.RED);//设置颜色
            graphics.setFont(new Font(null, Font.BOLD, 20));//设置字体
            graphics.drawString(getRandom(), 0, 20);
            //6.告诉浏览器请求的打开方式是图片
            resp.setContentType("image/jpeg");
            //7.不让浏览器缓存
            resp.setDateHeader("expires", -1);
            resp.setHeader("Cache-Control", "no-cache");
            resp.setHeader("Pragma", "no-cache");
            //8.将图片写给响应的浏览器
            ImageIO.write(image, "jpg", resp.getOutputStream());
    
        }
    
        /*
        生成随机数的方法
         */
        private String getRandom() {
            Random random = new Random();
            String num = random.nextInt(9999999) + "";
            StringBuffer buffer = new StringBuffer();
            for (int i = 0; i < 7 - num.length(); i++) {
                //保证随机数位数不变
                buffer.append("0");
            }
            return buffer.toString() + num;
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
  3. web.xml配置

        <servlet>
            <servlet-name>VerificationCode</servlet-name>
            <servlet-class>org.westos.Response.VerificationCode</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>VerificationCode</servlet-name>
            <url-pattern>/code</url-pattern>
        </servlet-mapping>

3、登录-请求重定向

  1. 程序思路

    在loginDemo.jsp界面表单进行提交数据,提交到RedirectTest,在RedirectTest进行账号密码核验,如果符合就跳转至success.jsp页面

  2. loginDemo.jsp代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录</title>
    </head>
    <body>
    
    <form action="${pageContext.request.contextPath}/redirect1" method="get">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit">
    </form>
    
    </body>
    </html>
    
  3. RedirectTest类

    package org.westos.Response;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class RedirectTest extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //得到请求中的账号密码
            String username = req.getParameter("username");
            String password = req.getParameter("password");
    
            //进行匹配,应该是从数据库中的数据进行匹配
            if (username.equals("admin") && password.equals("123456")) {
                resp.sendRedirect("/hello/success.jsp");
            } else {
                PrintWriter out = resp.getWriter();
                out.write("账号或密码错误");
                out.close();
            }
    
            //设置编码
            resp.setContentType("html/text");
            resp.setCharacterEncoding("utf-8");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
  4. success.jsp页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录成功</title>
    </head>
    <body>
    
    <h1>登陆成功</h1>
    
    </body>
    </html>
    
  5. web.xml配置

        <servlet>
            <servlet-name>RedirectTest</servlet-name>
            <servlet-class>org.westos.Response.RedirectTest</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>RedirectTest</servlet-name>
            <url-pattern>/redirect1</url-pattern>
        </servlet-mapping>

4、登录-请求转发

  1. 程序步骤

    在loginDemo2.jsp页面登录,提交到ForwardTest处理,账号密码正确转发到success.jsp页面

  2. loginDemo2.jsp代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录</title>
    </head>
    <body>
    
    <h1>登录</h1>
    
    <div style="text-align: center">
        <%--以post的方式提交表单到login请求--%>
        <form action="${pageContext.request.contextPath}/forward" method="post">
            用户名:<input type="text" name="username"><br>
            密码:<input type="password" name="password"><br>
            爱好:
            <input type="checkbox" name="hobby" value="乒乓球">乒乓球
            <input type="checkbox" name="hobby" value="听歌">听歌
            <input type="checkbox" name="hobby" value="敲代码">敲代码
            <input type="checkbox" name="hobby" value="电影">电影
            <br>
            <input type="submit">
        </form>
    </div>
    
    </body>
    </html>
    
    
  3. ForwardTest代码

    package org.westos.Response;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class ForwardTest extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置编码
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
    
            //得到请求的参数
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String hobby = req.getParameter("hobby");
    
            //进行匹配,应该是从数据库中的数据进行匹配
            if (username.equals("admin") && password.equals("123456")) {
                req.getRequestDispatcher("/success.jsp").forward(req, resp);
            } else {
                PrintWriter out = resp.getWriter();
                out.write("账号或密码错误");
                out.close();
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
  4. success.jsp界面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录成功</title>
    </head>
    <body>
    
    <h1>登陆成功</h1>
    
    </body>
    </html>
    

5、MVC三层架构

M:Model,模型,进行具体业务逻辑处理

V:view,视图,就是前端页面,用来展示数据

C:Controller,控制器,就是Servlet/Service,用来处理用户的请求,给客户端响应等

顺序:视图—>控制器—>模型—>数据库

6、过滤器Filter

Filter:用来过滤网站的数据

比如:中文乱码、登陆验证、处理垃圾请求等

  1. 过滤器类

    package org.westos.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    
    //实现Filter接口
    public class FilterTest implements Filter {
    
        //初始化方法,Web服务器一启动就开始初始化了,开始工作
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("初始化方法的执行");
        }
    
        //过滤方法
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            //处理编码问题,每一个进来的请求都会执行
            servletRequest.setCharacterEncoding("uft-8");
            servletResponse.setCharacterEncoding("utf-8");
            servletResponse.setContentType("text/html;charset-utf-8");
    
            //让过滤链继续往下走
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        //销毁方法,等待Web浏览器关闭的时候执行
        public void destroy() {
            System.out.println("销毁方法的执行");
        }
    }
  2. web.xml配置

        <filter>
            <filter-name>FilterTest</filter-name>
            <filter-class>org.westos.filter.FilterTest</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>FilterTest</filter-name>
            <!--需要经过过滤器的路径-->
            <url-pattern>/*</url-pattern>
        </filter-mapping>

7、监听器

都间接的继承自EventListener接口

  1. Java代码

    package org.westos.listener;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    /**
     * @BelongsProject: javaweb-01
     * @BelongsPackage: org.westos.listener
     * @Author: 北风
     * @CreateTime: 2020-02-18 22:36
     * @Description: ${Description}
     */
    //所有的监听器都间接的继承自EventListener接口
    public class OnlineCountListener implements HttpSessionListener {
    
        //会话创建方法,一旦创建会话就会触发该事件
        public void sessionCreated(HttpSessionEvent se) {
            //得到Servlet的上下文
            ServletContext servletContext = se.getSession().getServletContext();
    
            //打印每次创建的会话的sessionId
            System.out.println(se.getSession().getId());
    
            //得到Session的在线数
            Integer onlineCount = (Integer) servletContext.getAttribute("OnlineCount");
    
            //进行判断,对Session在线数进行累加
            if (onlineCount == null) {
                onlineCount = new Integer(1);
            } else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count + 1);
            }
    
            //将Session的在线数重新赋值
            servletContext.setAttribute("OnlineCount", onlineCount);
        }
    
        //会话销毁方法
        //销毁Session会触发该事件
        //session销毁分为手动销毁(getSession().invalidate()方法)和自动销毁
        public void sessionDestroyed(HttpSessionEvent se) {
            ServletContext servletContext = se.getSession().getServletContext();
    
            Integer onlineCount = (Integer) servletContext.getAttribute("OnlineCount");
    
            if (onlineCount == null) {
                onlineCount = new Integer(0);
            } else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count - 1);
            }
            servletContext.setAttribute("OnlineCount", onlineCount);
        }
    }
  2. web.xml配置

        <!--注册监听器-->
        <listener>
            <listener-class>org.westos.listener.OnlineCountListener</listener-class>
        </listener>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章