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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章