JavaEE開發之SpringMVC中的自定義消息轉換器與文件上傳

来源:http://www.cnblogs.com/chcse/archive/2017/04/28/6782642.html
-Advertisement-
Play Games

本篇博客我們繼續的來聊SpringMVC的東西,下方我們將會聊到js、css這些靜態文件的載入配置,以及伺服器推送的兩種實現方式。當然我們在伺服器推送時,會用到jQuery的東西,所以我們先聊一下如何載入靜態資源文件,然後我們再聊如何實現伺服器推送。 下方給出了兩種實現伺服器推送的方式,一種是SSE ...


本篇博客我們繼續的來聊SpringMVC的東西,下方我們將會聊到js、css這些靜態文件的載入配置,以及伺服器推送的兩種實現方式。當然我們在伺服器推送時,會用到jQuery的東西,所以我們先聊一下如何載入靜態資源文件,然後我們再聊如何實現伺服器推送。

下方給出了兩種實現伺服器推送的方式,一種是SSE(Server Send Event (服務端推送事件))另一種是基於Servlet非同步處理的推送,下方會給出詳細的實現方式,並且給出了兩者的區別。

 

一、靜態資源文件映射

靜態資源文件映射在SpringMVC中的配置也是比較簡單的、在我們spring的Config文件裡邊配置一下即可。下方就是我們在配置靜態資源文件時所做的內容。

 

1、映射資源文件

首先我們在src/main/resources包下方創建了衣蛾assets文件,該文件下就存放著我們工程中所使用所有的靜態資源文件。然後我們在Spring的配置文件中重寫addResourceHandlers()方法,使用該方法來配置“assets”目錄。

  

 

 

2、資源文件的引用

我們來創建一個jquery_test.jsp文件,該文件中引入了assets文件夾中js文件夾下的jquery.js文件。在jquery_test.jsp中就使用了jQuery的東西。下方就是該文件的所有內容。當然下方頁面的功能比較簡單,就是點擊按鈕,往HTML中動態的添加新的節點。具體代碼如下所示:

 
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <script type="text/javascript" src="assets/js/jquery.js"></script>
 8 <script type="text/javascript">
 9     $(document).ready(function(){
10       $("#click").click(function(){
11           $("#test").append("<h2>Hello Spring MVC</h2>");
12       });
13     });
14     
15 </script>
16 <title>JQuery Demo</title>
17 </head>
18 <body>
19 <input type="button" id="click" value="JQuery-TEST-Click me"/>
20 <h2 id="test"></h2>
21 </body>
22 </html>
 

 如果你想學習Java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裡面有大量的學習資料可以下載。

3、測試上述頁面

當然要想訪問上述頁面,還得在Spring的配置文件中進行路由的配置。下方代碼段就是Spring配置文件中靜態文件路由的快速配置。

  

 

下方就是我們對相應路由的訪問結果,如下所示。通過下方示例,我們可以看到jquery.js資源文件可以被正常的訪問到。

  

 

 

 

二、Server Send Event (服務端推送事件)

Server Send Event簡稱SSE,使用該技術可以實現服務端像瀏覽器發送事件,也就是所謂的服務端的PUSH。本篇博客所聊的伺服器推送技術的實現原理是當客戶端向服務端發送請求時,服務端會抓住這個請求不放,等有數據更新的時候才返回給客戶端。當客戶端接收到消息後,再向服務端發送請求,周而複始。

服務端推送以及客戶端發送的網路請求都是單向通信,後面的博客我們會介紹一種雙向通信技術:WebSocket。本篇我們就先聊聊服務端的推送事件。

 

1.創建SSEController

首先我們創建一個普通的SpringMVC的Controller,命名為SSEContrller。下方就是SSEController類的具體實現,內容與普通的Controller差不多。只不過相應的方法在路由配置時,將produces屬性的文本類型設置成“text/event-stream”即可。

在下方類的push()方法中,每500ms就會往客戶端發送一個消息。消息的內容是當前時間,如下所示:

  

 

 

2、創建請求的JSP頁面

創建好上述類後,我們就該創建測試上述Controller的JSP頁面了,我們在相應的資源目錄中創建一個sse.jsp頁面。在sse.jsp頁面中,我們將會使用到JavaScript中的EventSource對象來監聽來著“/sse”路由的事件消息,當收到上述Controller發起的事件後,會在事件回調中做一些事情。當然,我們做的事情就是在HTML頁面中添加新的節點,將事件響應的消息添加到HTML文本只能怪進行顯示。

下方就是sse.jsp頁面的具體代碼。

 
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <script type="text/javascript" src="assets/js/jquery.js"></script>
 8 <script type="text/javascript">
 9      if(window.EventSource){
10         var source = new EventSource('sse');
11         s = '';
12         source.addEventListener('message', function (e) {
13             s += e.data+"<br/>";
14             $("#msgFromSSE").html(s);
15         });
16 
17         source.addEventListener('open', function (e) {
18             console.log("連接打開");
19         }, false);
20 
21         source.addEventListener('error', function (e) {
22             if (e.readyState == EventSource.CLOSED) {
23                 console.log("連接關閉");
24             } else {
25                 console.log(e.readyState);
26             }
27         }, false);
28     } else {
29         console.log("瀏覽器不支持SSE");
30     } 
31 </script>
32 <title>SSE Demo</title>
33 </head>
34 <body>
35 <h1>SSE-TEST</h1>
36 <div id="msgFromSSE"></div>
37 </body>
38 </html>
 

 

3、測試我們的SSE

上面的事件發送端以及事件監聽端的代碼已實現完畢。接下來我們就要進行測試了。在測試之前,我們還要做一件事情,就是為我們的sse.jsp頁面添加訪問路由。我們就選擇在Spring的配置文件中進行快速配置sse.jsp頁面的路由。下方就是sse.jsp路由配置的相關代碼:

registry.addViewController("/ssetest").setViewName("/sse");

 

配置完上述路由後我們就可以訪問上述路由所對應的JSP頁面了,下方就是具體的運行效果。從下方演示效果中,我們不難看出,每隔一段時間就會收到來自服務端的消息事件,具體如下所示:

  

 

 

 

三、Servlet中的非同步推送

接下來我們來使用Servlet的非同步處理以及Spring的任務計劃(定時器)來實現事件的推送。當然本部分的最終實現效果與上述效果是一樣的,只不過是實現方式不同。SSE是需要新式瀏覽器的支持,而Servlet的非同步方法進行推送是跨瀏覽器的。接下來我們就來好好的來實現該技術點。

 

1、 實現Servlet中的非同步推送前的配置

首先我們需要在Spring的配置文件中進行配置,是我們的Spring支持計劃任務(Scheduleing),其實就是支持定時器。因為我們要定時的向客戶端進行push,所以定時器的配置是必須的。

  

 

啟動完定時器後,我們需要在Web初始化的類中開啟Servlet的非同步支持,如下所示。 

  

 

 

2、創建Push Service

相關配置完成後,接下來我們要做的就是創建我們的Push Service。該Service就負責往客戶端進行Push事件,Push Service的類對象就是我們相應Controller的依賴對象 ,稍後,我們將會將該依賴註入到相應的Controller中進行事件的Push。

下方就是PushService類的具體代碼實現,需要使用@Service進行修飾。然後實例化一個DeferredResult對象負責傳遞事件消息。我們用到了@Scheduled註解來設定每次推送的間隔。

  

 

上面用到了@Service註解,我們可以點進去看一下Service註解中的內容。從其源碼中我們不難看出其實@Service和@Component用法是一至的。@Service註解的實現如下所示:

  

 

 

3、創建調用PushService的Controller

創建完PushService後,接著就創建一個調用PushService的Controller類。下方這個ServletAsyncController就是負責調用PushService對象的Controller。其中使用了@Autowired註解來聲明依賴註入的註入點。然後通過路由,路由到調用PushService的方法中即可。DeferredResult<String>就是推送事件的載體、而消息的類型是String類型。具體實現如下所示:

  

 

 

4、接收事件的JSP頁面的實現

創建完Push Service以及負責推送的Controller後,接下來我們就該創建接收推送的客戶端代碼了。下方的代碼比較簡單,主要是使用jQuery來接收的推送事件。然後將推送的內容append到html中進行顯示,如下所示:

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="assets/js/jquery.js"></script>
<script type="text/javascript">

    deferred();

    function deferred() {
        $.get('servlet_push', function (data) {
            $("#content").append(data+'<br/>');
            deferred();
        });
    }
</script>
<title>Servlet_Async</title>
</head>
<body>
    <div id='content'></div>
</body>
</html>
 

 

給上述JSP頁面配置路由的代碼在此就省略了,和之前一樣,給上述JSP頁面在SpringConfig文件中配置一個路由,此處是“/async_push”, 然後我們對該路由進行訪問,下方就是訪問效果,如下所:

  

碼源:mingli

有興趣的朋友們可以前往球球哦~一起分享學習技術:2042849237


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

-Advertisement-
Play Games
更多相關文章
  • //設置頁眉頁腳 tempSheet.Header.Center = "2017-04-27"; tempSheet.Footer.Center = "√" + " 正常 " + "×" + " 故障 " + "○" + " 其他 "; //設置單元格邊線ICellStyle style = wb1 ...
  • NetMQ是ZeroMQ的C#移植版本,它是對標準socket介面的擴展。它提供了一種非同步消息隊列,多消息模式,消息過濾(訂閱),對多種傳輸協議的無縫訪問。本文記錄了NetMQ的源碼進行學習並分析理解。 ...
  • 1.1Spring框架的概述 1.1.1什麼是Spring Spring是分層的JavaSE和JavaEES一站式輕量級開源框架。 分層: SUN提供的EE的三層結構:web層、業務層、數據訪問層(持久層、集成層)。 Struts2是web層基於MVC設計模式框架。 Hibernate是持久層的一個 ...
  • 正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。 re 模塊使 Python 語言擁有全部的正則表達式功能。 compile 函數根據一個模式字元串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。 re 模塊也提供了與這些方法功 ...
  • 當我們的一個對象可能代表一個單一的實體,或者一個組合的實體,但是仍然需要通過同樣的方式被使用時,這種情形則適合使用組合模式的設計。 ...
  • 預計分數:100+50+50 實際分數:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 題目描述 提供一個背包,它最多能負載重量為W的物品。 現在給出N種物品:對於第i類物品,一共有Ci件物品;對於每一件物品,重量為Wi,價值為Vi。 找出一種裝載方 ...
  • 知乎指南 知乎讓我增長了見識, 看到了很多真實故事, 喝了百樣的雞湯, 所以我決定以後不看知乎了 知乎給我的錯覺:階段性 第一周 我打開了新的大門, 很多有意思的段子, 看上去很有內涵, 不過都很老套 有很多故事, 大家似乎都願意講他們的故事, 看客很多, 會屏蔽666, 老鐵, 233之類的評論 ...
  • 裝飾器模式詳解地址 原文總結 定義: 在不必改變原類文件和使用繼承的情況下, 動態的擴展一個對象的功能. 通過創建一個包裝對象, 也就是裝飾來包裹真實的對象 部分詳解提示 看了一些文檔, 裝飾器模式非常依賴構造器 與 重寫方法 裝飾器模式的特點: 不改變原來的類 , 不使用繼承 , 動態擴展 流這塊 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...