在这个博客中,我们将继续讨论SpringMVC。下面,我们将讨论静态文件(如js和css)的加载配置,以及服务器推送的两个实现。当然,在服务器上推送的时候,我们会用到jQuery,那么我们先来说说如何加载静态资源文件,然后再来说说如何在服务器上推送。
下面给出了两种实现服务器推送的方法,一种是SSE(Server Send Event),另一种是基于Servlet异步处理的推送。下面给出了详细的实现方法,并给出了它们之间的区别。
首先,静态资源文件映射
springMVC中静态资源文件映射的配置也比较简单,只需在我们的Spring Config文件中配置即可。下面是我们在配置静态资源文件时所做的。
1.映射资源文件
首先,我们在src/main/resources包下创建了一个Lymantria断言文件,在该文件下存储了我们项目中使用的所有静态资源文件。然后我们在Spring的配置文件中重写addResourceHandlers()方法,并使用这个方法来配置“资产”目录。
2.参考资源文件
让我们创建一个jquery_test.jsp文件,它在assets文件夹的js文件夹中引入jquery.js文件。在jQuery_test.jsp中,使用了jQuery。下面是文件的全部内容。当然,下页的功能比较简单,就是点击按钮,动态地给HTML添加新的节点。具体代码如下:
% @ page language=' Java ' ContentType=' text/html;charset=UTF-8 ' page encoding=' UTF-8 ' %!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN ' ' http://www . w3 . org/TR/HTML 4/loose . DTD ' htmlhearteta http-equiv=' Content-Type ' Content=' text/HTML;charset=UTF-8 ' script type=' text/JavaScript ' src=' http : assets/js/jquery . js '/script script type=' text/JavaScript ' $(文档)。ready(function(){ $('# click '))。单击(function(){ $('#test '))。追加(' H2Hello Spring MVC/H2 ');});});/script title jquery demo/title/head dyinput type=' button ' id=' click ' value=' jquery-test-click me '/H2 id=' test '/H2/body/html如果你想学习Java,可以来这个群,首先是220,中间是142,最后是906,里面有很多学习资料。
3.测试上面的页面
当然,如果您想访问上面的页面,您必须在Spring配置文件中配置路由。以下代码段是Spring配置文件中静态文件路由的快速配置。
下面是我们访问相应路线的结果,如下所示。通过下面的例子,我们可以看到jquery.js资源文件可以正常访问。
第二,服务器发送事件(服务器推送事件)
服务器发送事件简称为SSE。使用这种技术,服务器可以像浏览器一样发送事件,这被称为服务器的PUSH。本博客讨论的服务器推送技术的实现原理是,当客户端向服务器发送请求时,服务器会保留该请求,并在有数据更新时返回给客户端。当客户端收到消息时,它会向服务器发送一个请求,这个过程会一直持续下去。
服务器推送和客户端发送的网络请求是单向通信。我们将在下面的博客中介绍一种双向通信技术:WebSocket。在本文中,我们将首先讨论服务器端的推送事件。
1.创建SSEController
首先,我们创建一个普通的SpringMVC控制器,名为SSEContrller。下面是SSEController类的具体实现,类似于普通的Controller。在路由配置期间,只有相应的方法可以将produces属性的文本类型设置为“text/event-stream”。
在低级别的push()方法中,每500ms向客户端发送一条消息。消息的内容是当前时间,如下所示:
2.创建请求的JSP页面
在创建了上面的类之后,我们应该创建一个JSP页面来测试上面的Controller,我们将在相应的资源目录中创建一个sse.jsp页面。在sse.jsp页面中,我们将使用JavaScript中的EventSource对象来监听“/sse”路由的事件消息。收到上面控制器发起的事件后,我们会在事件回调中做一些事情。当然,我们做的是在HTML页面中添加新的节点。将事件响应的消息添加到HTML文本中只能显示。
下面是sse.jsp页面的具体代码。
% @ page language=' Java ' ContentType=' text/html;charset=UTF-8 ' page encoding=' UTF-8 ' %!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN ' ' http://www . w3 . org/TR/HTML 4/loose . DTD ' htmlhearteta http-equiv=' Content-Type ' Content=' text/HTML;charset=UTF-8 ' script type=' text/JavaScript ' src=' http : assets/js/jquery . js '/script script type=' text/JavaScript ' if(window。event source){ var source=new event source(' SSE ');s=source . addeventlistener(' message ',function(e){ s=e . data ' br/';$('#msgFromSSE ')。html});来源。addeventlistener ('open '),函数(e){ console . log(' connection open ');},false);Source.addeventlistener ('error ',function(e){ if(e . readystate==event source . closed){ console . log('连接关闭');} else { console . log(e . readystate);} },false);} else {console.log('浏览器不支持SSE ');}/script titles demo/title/headsdyh1sse-test/h1 div id=' msgfromsse '/div/body/html 3,测试我们的sse
事件发送器和事件监听器的上述代码已经实现。接下来,我们将测试它。在测试之前,我们需要向我们的sse.jsp页面添加一个访问路径。我们选择在Spring的配置文件中快速配置sse.jsp页面的路由。以下是sse.jsp路由配置的相关代码:
registry . addview controller('/ssetest ')。setViewName('/SSE ');
配置好上述路由后,我们就可以访问上述路由对应的JSP页面,具体运行效果如下图所示。从下面的演示效果中不难看出,消息事件将定期从服务器接收,如下所示:
第三,Servlet中的异步推送
接下来,我们使用Servlet和Spring的任务计划(计时器)的异步处理来推送事件。当然,这部分的最终实现效果与上述效果相同,但实现方式不同。SSE需要新浏览器的支持,而Servlet的异步推送方式是跨浏览器的。接下来,我们将很好地实现这个技术点。
1.在Servlet中实现异步推送前的配置
首先,我们需要在Spring的配置文件中进行配置。我们的Spring支持调度,它实际上支持计时器。因为我们需要定时推送到客户端,所以需要配置定时器。
启动定时器后,我们需要在Web初始化的类中启动对Servlet的异步支持,如下所示。
2.创建推送服务
完成相关配置后,我们接下来需要做的是创建我们的推送服务。该服务负责将事件推送到客户端。推送服务的类对象是我们相应控制器的依赖对象。稍后,我们将把这种依赖注入到相应的控制器来推送事件。
下面是PushService类的具体代码实现,需要用@Service修饰。然后实例化一个DeferredResult对象来传递事件消息。我们使用@Scheduled注释来设置每次推送的时间间隔。
上面使用了@Service注释,因此我们可以点击查看Service注释中的内容。从它的源代码中,我们很容易看出@Service和@Component的用法是一致的。@Service注释的实现如下:
3.创建一个调用推送服务的控制器
创建推送服务后,创建一个调用推送服务的控制器类。下面的ServletAsyncController是负责调用推送服务对象的控制器。@Autowired注释用于声明依赖注射的注射点。然后,通过路由,它可以被路由到调用PushService的方法。DeferredResultString是推送事件的载体,消息类型为String。具体实现如下:
4.接收事件的JSP页面的实现
在创建推送服务和负责推送的控制器之后,我们应该创建接收推送的客户端代码。下面的代码比较简单,主要是用jQuery接收推送事件。然后将推送的内容追加到html中进行显示,如下所示:
% @ page language=' Java ' ContentType=' text/html;charset=UTF-8 ' page encoding=' UTF-8 ' %!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN ' ' http://www . w3 . org/TR/HTML 4/loose . DTD ' htmlhearteta http-equiv=' Content-Type ' Content=' text/HTML;charset=UTF-8 ' script type=' text/JavaScript ' src=' http : assets/js/jquery . js '/script script type=' text/JavaScript ' delivered();函数delivered(){ $。get('servlet_push ',函数(数据){ $('#content ')。追加(数据“br/”);递延();});}/script title servlet _ async/title/head body div id=' content '/div/body/html这里省略了为上述JSP页面配置路由的代码。和之前一样,在SpringConfig文件中为上面的JSP页面配置一个路由,这里是“/async_push”,然后我们访问这个路由,访问效果如下图所示:
以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!