JavaEE開發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳
本篇博客我們繼續(xù)的來聊SpringMVC的東西,下方我們將會(huì)聊到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實(shí)現(xiàn)方式。當(dāng)然我們?cè)诜?wù)器推送時(shí),會(huì)用到j(luò)Query的東西,所以我們先聊一下如何加載靜態(tài)資源文件,然后我們?cè)倭娜绾螌?shí)現(xiàn)服務(wù)器推送。
下方給出了兩種實(shí)現(xiàn)服務(wù)器推送的方式,一種是SSE(Server Send Event (服務(wù)端推送事件))另一種是基于Servlet異步處理的推送,下方會(huì)給出詳細(xì)的實(shí)現(xiàn)方式,并且給出了兩者的區(qū)別。
一、靜態(tài)資源文件映射
靜態(tài)資源文件映射在SpringMVC中的配置也是比較簡單的、在我們spring的Config文件里邊配置一下即可。下方就是我們?cè)谂渲渺o態(tài)資源文件時(shí)所做的內(nèi)容。
1、映射資源文件
首先我們?cè)趕rc/main/resources包下方創(chuàng)建了衣蛾assets文件,該文件下就存放著我們工程中所使用所有的靜態(tài)資源文件。然后我們?cè)赟pring的配置文件中重寫addResourceHandlers()方法,使用該方法來配置“assets”目錄。

2、資源文件的引用
我們來創(chuàng)建一個(gè)jquery_test.jsp文件,該文件中引入了assets文件夾中js文件夾下的jquery.js文件。在jquery_test.jsp中就使用了jQuery的東西。下方就是該文件的所有內(nèi)容。當(dāng)然下方頁面的功能比較簡單,就是點(diǎn)擊按鈕,往HTML中動(dòng)態(tài)的添加新的節(jié)點(diǎn)。具體代碼如下所示:
<%@ 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">
$(document).ready(function(){
$("#click").click(function(){
$("#test").append("<h2>Hello Spring MVC</h2>");
});
});
</script>
<title>JQuery Demo</title>
</head>
<body>
<input type="button" id="click" value="JQuery-TEST-Click me"/>
<h2 id="test"></h2>
</body>
</html>
如果你想學(xué)習(xí)Java可以來這個(gè)群,首先是二二零,中間是一四二,最后是九零六,里面有大量的學(xué)習(xí)資料可以下載。
3、測試上述頁面
當(dāng)然要想訪問上述頁面,還得在Spring的配置文件中進(jìn)行路由的配置。下方代碼段就是Spring配置文件中靜態(tài)文件路由的快速配置。

下方就是我們對(duì)相應(yīng)路由的訪問結(jié)果,如下所示。通過下方示例,我們可以看到j(luò)query.js資源文件可以被正常的訪問到。

二、Server Send Event (服務(wù)端推送事件)
Server Send Event簡稱SSE,使用該技術(shù)可以實(shí)現(xiàn)服務(wù)端像瀏覽器發(fā)送事件,也就是所謂的服務(wù)端的PUSH。本篇博客所聊的服務(wù)器推送技術(shù)的實(shí)現(xiàn)原理是當(dāng)客戶端向服務(wù)端發(fā)送請(qǐng)求時(shí),服務(wù)端會(huì)抓住這個(gè)請(qǐng)求不放,等有數(shù)據(jù)更新的時(shí)候才返回給客戶端。當(dāng)客戶端接收到消息后,再向服務(wù)端發(fā)送請(qǐng)求,周而復(fù)始。
服務(wù)端推送以及客戶端發(fā)送的網(wǎng)絡(luò)請(qǐng)求都是單向通信,后面的博客我們會(huì)介紹一種雙向通信技術(shù):WebSocket。本篇我們就先聊聊服務(wù)端的推送事件。
1.創(chuàng)建SSEController
首先我們創(chuàng)建一個(gè)普通的SpringMVC的Controller,命名為SSEContrller。下方就是SSEController類的具體實(shí)現(xiàn),內(nèi)容與普通的Controller差不多。只不過相應(yīng)的方法在路由配置時(shí),將produces屬性的文本類型設(shè)置成“text/event-stream”即可。
在下方類的push()方法中,每500ms就會(huì)往客戶端發(fā)送一個(gè)消息。消息的內(nèi)容是當(dāng)前時(shí)間,如下所示:

2、創(chuàng)建請(qǐng)求的JSP頁面
創(chuàng)建好上述類后,我們就該創(chuàng)建測試上述Controller的JSP頁面了,我們?cè)谙鄳?yīng)的資源目錄中創(chuàng)建一個(gè)sse.jsp頁面。在sse.jsp頁面中,我們將會(huì)使用到JavaScript中的EventSource對(duì)象來監(jiān)聽來著“/sse”路由的事件消息,當(dāng)收到上述Controller發(fā)起的事件后,會(huì)在事件回調(diào)中做一些事情。當(dāng)然,我們做的事情就是在HTML頁面中添加新的節(jié)點(diǎn),將事件響應(yīng)的消息添加到HTML文本只能怪進(jìn)行顯示。
下方就是sse.jsp頁面的具體代碼。
<%@ 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">
if(window.EventSource){
var source = new EventSource('sse');
s = '';
source.addEventListener('message', function (e) {
s += e.data+"<br/>";
$("#msgFromSSE").html(s);
});
source.addEventListener('open', function (e) {
console.log("連接打開");
}, false);
source.addEventListener('error', function (e) {
if (e.readyState == EventSource.CLOSED) {
console.log("連接關(guān)閉");
} else {
console.log(e.readyState);
}
}, false);
} else {
console.log("瀏覽器不支持SSE");
}
</script>
<title>SSE Demo</title>
</head>
<body>
<h1>SSE-TEST</h1>
<div id="msgFromSSE"></div>
</body>
</html>
3、測試我們的SSE
上面的事件發(fā)送端以及事件監(jiān)聽端的代碼已實(shí)現(xiàn)完畢。接下來我們就要進(jìn)行測試了。在測試之前,我們還要做一件事情,就是為我們的sse.jsp頁面添加訪問路由。我們就選擇在Spring的配置文件中進(jìn)行快速配置sse.jsp頁面的路由。下方就是sse.jsp路由配置的相關(guān)代碼:
registry.addViewController("/ssetest").setViewName("/sse");
配置完上述路由后我們就可以訪問上述路由所對(duì)應(yīng)的JSP頁面了,下方就是具體的運(yùn)行效果。從下方演示效果中,我們不難看出,每隔一段時(shí)間就會(huì)收到來自服務(wù)端的消息事件,具體如下所示:

三、Servlet中的異步推送
接下來我們來使用Servlet的異步處理以及Spring的任務(wù)計(jì)劃(定時(shí)器)來實(shí)現(xiàn)事件的推送。當(dāng)然本部分的最終實(shí)現(xiàn)效果與上述效果是一樣的,只不過是實(shí)現(xiàn)方式不同。SSE是需要新式瀏覽器的支持,而Servlet的異步方法進(jìn)行推送是跨瀏覽器的。接下來我們就來好好的來實(shí)現(xiàn)該技術(shù)點(diǎn)。
1、 實(shí)現(xiàn)Servlet中的異步推送前的配置
首先我們需要在Spring的配置文件中進(jìn)行配置,是我們的Spring支持計(jì)劃任務(wù)(Scheduleing),其實(shí)就是支持定時(shí)器。因?yàn)槲覀円〞r(shí)的向客戶端進(jìn)行push,所以定時(shí)器的配置是必須的。

啟動(dòng)完定時(shí)器后,我們需要在Web初始化的類中開啟Servlet的異步支持,如下所示。

2、創(chuàng)建Push Service
相關(guān)配置完成后,接下來我們要做的就是創(chuàng)建我們的Push Service。該Service就負(fù)責(zé)往客戶端進(jìn)行Push事件,Push Service的類對(duì)象就是我們相應(yīng)Controller的依賴對(duì)象 ,稍后,我們將會(huì)將該依賴注入到相應(yīng)的Controller中進(jìn)行事件的Push。
下方就是PushService類的具體代碼實(shí)現(xiàn),需要使用@Service進(jìn)行修飾。然后實(shí)例化一個(gè)DeferredResult對(duì)象負(fù)責(zé)傳遞事件消息。我們用到了@Scheduled注解來設(shè)定每次推送的間隔。

上面用到了@Service注解,我們可以點(diǎn)進(jìn)去看一下Service注解中的內(nèi)容。從其源碼中我們不難看出其實(shí)@Service和@Component用法是一至的。@Service注解的實(shí)現(xiàn)如下所示:

3、創(chuàng)建調(diào)用PushService的Controller
創(chuàng)建完P(guān)ushService后,接著就創(chuàng)建一個(gè)調(diào)用PushService的Controller類。下方這個(gè)ServletAsyncController就是負(fù)責(zé)調(diào)用PushService對(duì)象的Controller。其中使用了@Autowired注解來聲明依賴注入的注入點(diǎn)。然后通過路由,路由到調(diào)用PushService的方法中即可。DeferredResult<String>就是推送事件的載體、而消息的類型是String類型。具體實(shí)現(xiàn)如下所示:

4、接收事件的JSP頁面的實(shí)現(xiàn)
創(chuàng)建完P(guān)ush Service以及負(fù)責(zé)推送的Controller后,接下來我們就該創(chuàng)建接收推送的客戶端代碼了。下方的代碼比較簡單,主要是使用jQuery來接收的推送事件。然后將推送的內(nèi)容append到html中進(jìn)行顯示,如下所示:
<%@ 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文件中配置一個(gè)路由,此處是“/async_push”, 然后我們對(duì)該路由進(jìn)行訪問,下方就是訪問效果,如下所示:

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
Springboot整合ActiveMQ實(shí)現(xiàn)消息隊(duì)列的過程淺析
昨天仔細(xì)研究了activeMQ消息隊(duì)列,也遇到了些坑,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合ActiveMQ的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
使用HttpClient調(diào)用接口的實(shí)例講解
下面小編就為大家?guī)硪黄褂肏ttpClient調(diào)用接口的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
Java語言實(shí)現(xiàn)簡單FTP軟件 FTP軟件主界面(4)
這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡單FTP軟件,F(xiàn)TP軟件主界面編寫的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Spring Boot和Vue跨域請(qǐng)求問題原理解析
這篇文章主要介紹了Spring Boot和Vue跨域請(qǐng)求問題原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Java實(shí)現(xiàn)自動(dòng)壓縮文件并加密的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)自動(dòng)壓縮文件并加密的方法,涉及java針對(duì)文件進(jìn)行zip壓縮并加密的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(31)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07
Java異常繼承結(jié)構(gòu)解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java異常繼承結(jié)構(gòu)解析的相關(guān)知識(shí),需要的朋友可以參考下2017-04-04
一篇文章帶你入門Springboot沙箱環(huán)境支付寶支付(附源碼)
螞蟻沙箱環(huán)境 (Beta) 是協(xié)助開發(fā)者進(jìn)行接口功能開發(fā)及主要功能聯(lián)調(diào)的輔助環(huán)境。沙箱環(huán)境模擬了開放平臺(tái)部分產(chǎn)品的主要功能和主要邏輯2021-06-06
Springboot之idea之pom文件圖標(biāo)不對(duì)問題
這篇文章主要介紹了Springboot之idea之pom文件圖標(biāo)不對(duì)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
java如何實(shí)現(xiàn)判斷文件的真實(shí)類型
本篇文章主要介紹了java如何實(shí)現(xiàn)判斷文件的真實(shí)類型,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08

