JavaWeb-MVC、過濾器

来源:https://www.cnblogs.com/twq46/archive/2022/07/28/16529847.html
-Advertisement-
Play Games

一、MVC架構圖 Model 業務處理:業務邏輯(Service) 數據持久層:CRUD(Dao) View 展示數據 提供連接發起Servlet請求(a,form,img....) Controller(Servlet) 接收用戶的請求:(req:請求參數,Session信息) 交給業務層處理對應 ...


一、MVC架構圖

Model

  • 業務處理:業務邏輯(Service)

  • 數據持久層:CRUD(Dao)

View

  • 展示數據

  • 提供連接發起Servlet請求(a,form,img....)

Controller(Servlet)

  • 接收用戶的請求:(req:請求參數,Session信息)

  • 交給業務層處理對應的代碼

  • 控制視圖的跳轉
    比如一個登錄流程

登錄--->接收用戶的登錄請求--->Servlet處理用戶的請求(獲取用戶登錄的參數,username,password)--->交
給業務員層處理登錄業務(判斷用戶名密碼是否正確)--->Dao層查詢用戶名和密碼是否正確-->資料庫

二、過濾器(Filter重點)

Filter:過濾器,用來過濾網站的數據;
  • 處理中文亂碼

  • 登錄驗證.....

1.Filter開發步驟

(1)導入Maven依賴

<dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <!--            作用域,一般不要-->
          <!--            <scope>provided</scope>-->
      </dependency>
      <!--JSP的依賴-->
      <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.3</version>
      </dependency>
      <!--standard標簽庫-->
      <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
      </dependency>
      <!--JSTL表達式的依賴-->
      <dependency>
          <groupId>javax.servlet.jsp.jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
      </dependency>

(2)編寫過濾器

* 實現Filter介面 * 重寫方法 ~~~java package com.tang.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {
//初始化:web伺服器啟動,就已經初始化了,隨時等待過濾器對象出現
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("characterEncoding初始化");
}
/*
* chain 鏈
* 1.過濾其中所有代碼,在過濾特定請求
* (特定請求:比如在Servlet中會在web.xml中進行註冊,同理過濾器也一樣需要註冊和添加映射)的時候都會執行
* 2.必須要讓過濾器繼續通行
* chain.doFilter(request,response);*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-16");//寫utf-8得寫setContentType為text/html,否則還會亂碼因此我直接寫utf-16
response.setCharacterEncoding("utf-16");
response.setContentType("text/html;charset=UTF-8");

    System.out.println("setCharacterEncoding執行前。。。");
    chain.doFilter(request,response);//對過濾器起一個放行的作用,如果不寫程式到這裡就被攔截停止
    System.out.println("setCharacterEncoding執行後。。。");
}
//銷毀:web伺服器關閉的時候,過濾器會銷毀
public void destroy() {
    System.out.println("characterEncoding銷毀");
}

}

<h4>(3)在web.xml中配置filter

~~~xml
 <servlet>
      <servlet-name>showservlet</servlet-name>
      <servlet-class>com.tang.servlet.ShowServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>showservlet</servlet-name>
      <url-pattern>/servlet/show</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
      <servlet-name>showservlet</servlet-name>
      <!--一個請求設置兩個訪問路徑-->
      <url-pattern>/show</url-pattern>
  </servlet-mapping>
  <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>com.tang.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <!--只要是/servlet的任何請求都會經過這個過濾器-->
      <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>

ShowServlet代碼如下

package com.tang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ShowServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //resp.setCharacterEncoding("UTF-16");
        resp.getWriter().write("唐三是掛,誰惹誰掛");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

運行結果圖
同一個請求,以servlet開頭的訪問會被過濾,另一個去訪問則不會被過濾,結果如下

2.常見應用

(1)用戶登錄之後才能進入主頁!用戶註銷後就不能進入主頁了,用過濾器實現
LoginServlet代碼

package com.tang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //獲取前端請求的參數
        System.out.println("進入了登錄");
        //String username = req.getParameter("username");
        if(req.getParameter("username").equals("admin")){//登錄成功
            System.out.println("登錄成功");
            //USER_SESSION為一個常量,通常自己新建util包,並放在新建constant的類中
            req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
            resp.sendRedirect("/Filter_war/sys/success.jsp");

        }else {
            resp.sendRedirect("/Filter_war/error.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

login.jsp代碼

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登錄</h1>
<%--這裡如果用post方式提交會出現在前端頁面輸入信息,但是卻得不到前端請求的參數值--%>
<form action="/Filter_war/servlet/login" method="get">
    <input type="text" name="username">
    <input type="submit">
</form>
</body>
</html>

LogoutServlet代碼

package com.tang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user_session = (String) req.getSession().getAttribute("USER_SESSION");
        if(user_session != null){//說明用戶處於登錄狀態,因為只有登錄狀態USER_SESSION不為空也即user_session不為空
            req.getSession().removeAttribute("USER_SESSION");//將該登錄狀態的用戶移除
            resp.sendRedirect("/Filter_war/login.jsp");//註銷之後進入登錄界面

        }else{
            resp.sendRedirect("/Filter_war/login.jsp");//註銷為空也回到該頁面
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

success.jsp主界面代碼


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    Object user_session = request.getSession().getAttribute("USER_SESSION");
    if(user_session == null){//用戶沒有登錄就不能進如主界面
        response.sendRedirect("/Filter_war/login.jsp");
    }
%>
<h1>主頁</h1>
<p><a href="/Filter_war/servlet/logout">註銷</a></p>
</body>
</html>

error.jsp代碼

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>錯誤</h1>
用戶名或者密碼錯誤
<a href="/Filter_war/login.jsp">返回登錄界面</a>
</body>
</html>

web.xm代碼如下

<servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.tang.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/servlet/login</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>logoutServlet</servlet-name>
        <servlet-class>com.tang.servlet.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>logoutServlet</servlet-name>
        <url-pattern>/servlet/logout</url-pattern>
    </servlet-mapping>

運行結果圖


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一種:在main.js中直接註冊 //引入 import FixedTop from '@/components/FixedTop //註冊為全局組件 Vue.componet('FixedTop',FixedTop) //頁面直接使用 <FixedTop /> 缺點:如果我們需要註冊的全局組件非 ...
  • vue 組件通信方式 父組件將自己的狀態分享給子組件使用; 方法:父組件通過子標簽傳遞數據,子組件通過 props 接收 子組件改變父組件的狀態; 方法:父組件在子標簽上通過@abc 提供一個改變自身狀態的方法,子組件通過$emit("abc", payload)觸發這個函數 父組件直接改變子組件的 ...
  • 記錄下項目中使用的新方法,之前只知道改變show屬性來改變實體的顯示和隱藏,昨天遇到要動態綁定顯隱屬性。查找方法後找到了需要使用 cesium的SampledProperty這個方法。 下麵是簡單的代碼展示 let showProperty = new Cesium.SampledProperty( ...
  • 說明:這裡的vue代理是指用vue靜態伺服器做代理。使用的是 http-proxy-middleware 這個模塊(這個模塊相當於是node.js的一個插件)。 版本: vue-cli 3.0以上 修改文件位置:根目錄下的vue.config.js 代碼: devServer: { proxy: { ...
  • // js console console.clear(); console.log("console.log,show message, last recommand is console.clear"); console.info("console.info,other name for con ...
  • 作為一個開發人員,都想寫出一手好的代碼,而不是別人稱的“屎山”,設計模式提供了一系列常見問題的解決方案,通過利用設計模式來儘可能統一規範,可以提高代碼的可維護性、可讀性、可擴展性。 ...
  • 更多精彩內容,歡迎關註公眾號:邏魔代碼 前言 用了多年的 MacOS 做開發,一系列諸如 Alfred、Item2、Oh-my-zsh 之類的工具,大大地提升了工作的效率和使用舒適度。新工作不給配 Mac 電腦,自己帶電腦每天背著實在麻煩,就花時間研究了下如何在 Windows 上配置一個高效的開發 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...