当前位置: 首页 > 科技观察

VersionHistory&CodeExamples-WebSocket,JSTL

时间:2023-03-22 13:00:53 科技观察

前言大家好,我是方同学(你的蝙蝠侠)。如果不清楚什么是JavaEE,可以先看这里:什么是JavaEE?继一篇Servlet、JSP、EL表达式的文章后,本文尝试梳理WebSocket和JSTL。所属专栏BATutopia-JavaEE相关下载项目源码:https://github.com/yourbatman/BATutopia-java-ee【NuwaKnife-Initializr项目】访问地址:http://152.136.106.14:8761Java开发软件包(Mac):https://wangpan.yourbatman.cn/s/rEH0提取码:javakit程序员专用网盘上线,开放注册送1G超小容量,帮你练减法:https://王盘。yourbatman.cn版本约定JavaEE:6,7,8JakartaEE:8,9,9.1文本WebSocketWebSocket是一种通过单个TCP连接进行全双工通信的协议。随着HTML5的诞生,WebSocket通信协议在2011年被IETF定义为标准RFC6455,并辅以RFC7936。WebSocketAPI也由W3C标准化。WebSocket协议本质上是一个基于TCP的协议,由通信协议和编程API组成。WebSocket可以在浏览器和服务器之间建立双向连接,并以基于事件的方式赋予浏览器实时通信的能力。WebSocket使得客户端和服务器之间的数据交换更加容易,允许服务器主动向客户端推送数据。在WebSocketAPI中,浏览器和服务器只需要完成一次握手,两者之间就可以直接建立持久连接,进行双向数据传输。工作流程如下:JavaAPIforWebSocket是一个Javawebsocket,2013年6月随JavaEE7(1.0版)一起推出,JavaEE8升级到1.1版。注意:WebSocket的客户端可以是浏览器,也可以是WebSocket的终端(如Java应用、Go应用)。javax.websocketjavax.websocket-api1.1providedjakarta.websocketjakarta.websocket-api2.0.0provided另外,一般情况下我们可以直接使用web容器提供的Jar,比如Tomcatorg.apache.tomcat.embedtomcat-embed-websocketTomcat版本号org.apache.tomcattomcat-websocketTomcat版本号</dependency>Versionhistoryservlet-3.1版本开始支持WebSocket1.1和1.0版本,完全向下兼容,只在javax.websocket.Session中增加了两个方法:voidaddMessageHandler(Classclazz,MessageHandler.Partialhandler)throwsIllegalStateException;voidaddMessageHandler(Classclazz,MessageHandler.Wholehandler)throwsIllegalStateException;作为Http协议的“补充”,现状弥补了它的不足。实时推送,又称Realtime技术。该技术大大提升了交互体验,应用场景广泛:在线聊天(如网页版微信)、在线客服系统、评论系统等。总的来说,作为新贵,WebSocket生存的很好地位和光明的未来。WebSocket的实现(框架)其实是建立在Http协议之上的,所以对于Java语言来说,还是由Web容器来实现的。概念区分:Web容器不一定是Servlet容器,Servlet容器一定是Web容器另外还有独立的实现:客户端实现:org.eclipse.jetty.websocket:javax-websocket-client-impl服务器端实现:org.eclipse.jetty.websocket:javax-websocket-server-impl对于Client,一般是浏览器。前面代码示例中提到,WebSocket的客户端可以是浏览器(现代浏览器100%支持该协议,如果需要考虑浏览器兼容性问题(比如国外还有老版本的IE浏览器)),可以使用socketio框架),也可以是Java应用。这个例子增加了一点“难度”,使用Java应用程序作为WebSocket客户端。当然,服务器也必须是Java应用程序。创建一个demo工程,结构如下:客户端为jar,服务端为war。编写服务器端代码并??提供服务端点:/***在这里添加备注**@authorYourBatman.Sendemailtome*@sitehttps://yourbatman.cn*@date2021/9/1215:29*@since0.0.1*/@ServerEndpoint("/websocket/chat")publicclassWsServer{//来自当前连接的连接(每个连接都是一个WsServerDemo实例,包括一个Session会话)privatestaticSetwebSocketSet=newCopyOnWriteArraySet<>();//SessionprivateSessionsession;/***连接成功回调*/@OnOpenpublicvoidonOpen(Sessionsession){this.session=session;webSocketSet.add(this);//保存当前连接System.out.println("服务器有新连接!当前在线人数为"+webSocketSet.size());}/***调用关闭连接的方法*/@OnClosepublicvoidonClose(){webSocketSet.remove(this);System.out.println("Serverhasaconnectionclosed!当前在线人数为"+webSocketSet.size());}/***receivin后调用的方法g客户端消息*/@OnMessagepublicvoidonMessage(Stringmessage)throwsIOException////=======群消息=========//for(WsServerDemoitem:webSocketSet){//try{//item.sendMessage(message);//}catch(IOExceptione){//continue;////}}/***出错时调用发生*/@OnErrorpublicvoidonError(Throwableerror){System.out.println("Serverhasanerror:"+error.getMessage());}/***发送消息*/publicvoidsendMessage(Stringmessage)throwsIOException{this.session.getBasicRemote().sendText(message);}}为了简单起见,我直接使用web容器实现,有兴趣/想研究websocket的同学,可以使用org.eclipse.jetty.websocket:javax-websocket-server-impl通过API启动Server,本文只演示如何通过这种方式启动client,所以两者都用。编程编写客户端代码:/***Addremarkshere**@authorYourBatman.Sendemailtome*@sitehttps://yourbatman.cn*@date2021/9/1215:31*@since0.0.1*/@ClientEndpointpublicclassWsClient{//session(与服务器建立的session)privateSessionsession;/***连接成功的回调*/@OnOpenpublicvoidonOpen(Sessionsession)throwsIOException{this.session=session;System.out.println("客户端成功连接到服务器,会话ID:"+session.getId());sendMessage("这是客户端的消息,session["+session.getId()+"]的消息");}@OnMessagepublicvoidonMessage(Stringmessage){System.out.println("客户端收到消息:"+message);}@OnClosepublicvoidonClose(){System.out.println("Clientsession"+session.getId()+"Disconnected");}/***发送消息*/publicvoidsendMessage(Stringmessage)throwsIOException{this.session.getBasicRemote().sendText(message);}}使用main方法启动客户端,连接到服务器并发送消息:publicclassClientApp{privatestaticURIuri=URI.create("ws://localhost:8080/websocket/聊天");privatestaticSessionSession;publicstaticvoidmain(String[]args)throwsDeploymentException,IOException,InterruptedException{WebSocketContainercontainer=ContainerProvider.getWebSocketContainer();//依次执行5个session,在端口后建立新的sessionfor(inti=0;i<5;i++){session=container.connectToServer(WsClient.class,uri);session.close();TimeUnit.SECONDS.sleep(2);}}}客户端控制台日志:客户端成功连接到服务器,会话ID:1客户端收到Receivedmessage:收到来自session[0]的消息,内容为:这是一条来自客户端的消息,session[1]Clientsession1hasbeendisconnectedClient成功连接到服务器,sessionID:2客户端收到themessage:session[1]的消息已经收到,内容是:这是一条来自客户端的消息,session[2]Clientsession2hasbeendisconnectedClient成功连接到服务器,sessionID:3客户端收到消息:session[2]的消息已经收到,内容是:这是来自客户端的消息,session[3]Clientsession3hasbeen...serverconsolelog:Serverhasanewconnection!当前在线人数为1Server'smessagefromtheclient:Thisisamessagefromclient,session[1]Serverhasaconnectionclosed!当前在线人数为0服务器有新连接加入!当前在线用户数为1Server'smessagefromclient:Thisisamessagefromclient,session[2]Serverhasaconnectionclosed!当前在线人数为0服务器有新连接加入!当前在线用户数为1Server'smessagefromclient:Thisisamessagefromclient,session[3]Serverhasaconnectionclosed!当前在线人数为0说明:本文特意使用Java应用作为客户端,让大家更深入的了解WebSocket的用法。实际场景中,大多是B/S模式,使用JavaScript作为客户端建立连接(比较简单)项目源码:https://github.com/yourbatman/BATutopia-java-eeJSTLJava服务器页面标准标签库,即JSP标准标签库。它主要为JavaWeb开发者提供了一个标准的、通用的标签库。开发者可以使用这些标签来替换JSP页面上的Java代码,从而提高程序的可读性,降低程序维护的难度。JSTL强烈依赖于JSP的存在。JSTL和EL表达式的目的是一样的:替换写在JSP页面上的Java代码。它比EL更强大,可以完成一些结构化的逻辑任务,如:迭代、条件判断、XML文档操作、国际化、SQL等。下面简单介绍一下它的主要标签。核心标签:也是大名鼎鼎的C标签。在JSP文件开头引入c标签<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>。支持的常用函数有:1.:用于在页面输出-2.:逻辑判断-bodycontent3.:逻辑判断。when和otherwise的父标签4.::-bodycontent...正文内容5.:-bodycontent6.:使用可选查询参数创建URL地址7.:设置数据8.:删除数据格式化标签:可以格式化数字、日期和时间等。<%@taglibprefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt"%>,主要功能:1.:格式编号2.:将字符串解析为数字、货币和百分比3.:4.:JSTL函数:一般用于辅助标签控制行为。<%@taglibprefix="fn"uri="http://java.sun.com/jsp/jstl/functions"%>,主要功能:1.fn:contains:判断一个字符串是否包含另一个字符串-2.fn:indexOf:子串在父串中出现的位置-${fn:indexOf(name,'-')}3.fn:toLowerCase:转换为小写-${fn.toLowerCase(product.name)}SQL标签,<%@taglibprefix="sql"uri="http://java.sun.com/jsp/jstl/sql"%>。主要功能:1.,,XML标签,<%@taglibprefix="x"uri="http://java.sun.com/jsp/jstl/xml"%>.主要功能:1.,,此外,它还提供了一个扩展点:自定义标签。1.2.7本版本命名空间与javax相同-->javax.servlet.jsp.jstljstl-api1.2jakarta.servlet.jsp.jstljakarta.servlet.jsp.jstl-api2.0.0说明:之前可能有两个Jars,jstl.jar和standard.jar,但是1.2版本以后这个GAV就够用了。当然99.99%的情况是不需要导入jar的,由web容器负责版本处理。JSTL也依赖于JSP,所以和JSP版本有很强的关系。JSTL1.2版本可以断定是最后一个版本,因为JSP已经走到了尽头,所以也就随之消亡了。生存状态与JSP一样。实现(框架)与Servlet相同的Web容器,Web容器提供解析能力。如tomcat的标签库实现:http://tomcat.apache.org/taglibs代码示例实在没有应用场景,从略。项目源码:https://github.com/yourbatman/BATutopia-java-ee总结WebSocket作为长连接的轻量级解决方案,将成为B/S的新宠,取代之前的长轮训等解决方案一举成名。滚滚长江东流,或许证明科技在进步,时代在发展。作为老一辈的程序员,我对EL表达式、JSTL等技术还有记忆,但新时代的程序员可能不需要再接触了。本文将作为私密封存本次学习的回忆。本文转载自微信公众号《BAT的乌托邦》

最新推荐
猜你喜欢