全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

本篇博客我们继续的来聊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中动态的添加新的节点。具体代码如下所示:

<%@ 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>

如果你想学习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页面的具体代码。

<%@ 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("连接关闭");
   } 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

上面的事件发送端以及事件监听端的代码已实现完毕。接下来我们就要进行测试了。在测试之前,我们还要做一件事情,就是为我们的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”, 然后我们对该路由进行访问,下方就是访问效果,如下所示:

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# springmvc  # 消息转换器  # 文件上传  # JavaEE SpringMVC 请求传参的示例详解  # 所示  # 服务端  # 客户端  # 配置文件  # 就会  # 该文件  # 出了  # 将会  # 两种  # 要做  # 来实现  # 就该  # 创建一个  # 博客  # 都是  # 加载  # 使用了  # 在此  # 会在  # 你想 


相关文章: 如何在IIS服务器上快速部署高效网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  高端建站如何打造兼具美学与转化的品牌官网?  建站之星在线客服如何快速接入解答?  Python路径拼接规范_跨平台处理说明【指导】  如何使用Golang安装API文档生成工具_快速生成接口文档  python的本地网站制作,如何创建本地站点?  内网网站制作软件,内网的网站如何发布到外网?  建站之星如何取消后台验证码生成?  建站之星安装失败:服务器环境不兼容?  如何在Golang中指定模块版本_使用go.mod控制版本号  建站之星微信建站一键生成小程序+多端营销系统  建站之星2.7模板:企业网站建设与h5定制设计专题  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  专业商城网站制作公司有哪些,pi商城官网是哪个?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  如何通过FTP空间快速搭建安全高效网站?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  网站制作知乎推荐,想做自己的网站用什么工具比较好?  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何高效完成独享虚拟主机建站?  深入理解Android中的xmlns:tools属性  北京网站制作公司哪家好一点,北京租房网站有哪些?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  已有域名能否直接搭建网站?  山东云建站价格为何差异显著?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何在自有机房高效搭建专业网站?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何通过老薛主机一键快速建站?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  宝塔面板如何快速创建新站点?  如何通过西部数码建站助手快速创建专业网站?  设计网站制作公司有哪些,制作网页教程?  建站之星Pro快速搭建教程:模板选择与功能配置指南  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何零基础开发自助建站系统?完整教程解析  如何用景安虚拟主机手机版绑定域名建站?  建站主机是否属于云主机类型?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  已有域名和空间,如何快速搭建网站?  Swift中循环语句中的转移语句 break 和 continue  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  建站之星官网登录失败?如何快速解决? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。