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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...