首页
友链
关于
免责声明
Search
1
王者营地战绩数据王者荣耀查询网页源码
6,255 阅读
2
群晖Active Backup for Business套件备份Linux服务器教程
4,387 阅读
3
影视分享
4,317 阅读
4
(亲测)Jrebel激活破解方式2019-08-21
4,293 阅读
5
centos7 安装及卸载 jekenis
3,576 阅读
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
登录
Search
标签搜索
docker
springboot
Spring Boot
java
linux
Shiro
Graphics2D
图片
游戏账号交易
Mybatis
Spring Cloud
centos
脚本
Web Station
群辉
王者营地
战绩查询
平台对接
Spring Cloud Alibaba
nacos
绿林寻猫
累计撰写
249
篇文章
累计收到
26
条评论
首页
栏目
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
页面
友链
关于
免责声明
搜索到
237
篇与
文章
的结果
2021-12-08
jquery.lazyload.js实现图片懒加载
原文:https://blog.csdn.net/fuyifang/article/details/40474837 个人理解:将需要延迟加载的图片的src属性全部设置为一张相同尽可能小(目的是尽可能的少占宽带,节省流量,由于缓存机制,当浏览器加载了一张图片之后,相同的图片就会在缓存中拿,不会重新到服务器上拿)的图片,然后将图片的实际地址写在alt属性里,当鼠标往下滑动的时候得到当前显示区域内的img的lz-src,动态的就将各自的lz-src属性的值赋值给src属性,这样就实现了图片延迟加载,减轻服务器端的压力,节省本地带宽,提升了访问网页的速度 插件源码地址: https://raw.github.com/tuupola/jquery_lazyload/master/jquery.lazyload.js jQuery下载地址:http://jquery.com/ html页面代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <script type="text/javascript" src="js/jquery-1.4.3.min.js" ></script> <script type="text/javascript" src="js/lazyload.js"></script> <script type="text/javascript"> //初始化代码 $(document).ready(function() { $("img[name='lazy']").lazyload({ placeholder : "images/默认图片.jpg", effect : "fadeIn" }); }); </script> <title>无标题文档</title> </head> <body> <img src="images/默认图片.jpg" width="100px" height="300px" name="lazy" lz-src="images/商品图片1.jpg"/><br /> <img src="images/默认图片.jpg" width="100px" height="300px" name="lazy" lz-src="images/商品图片2.jpg"/><br /> <img src="images/默认图片.jpg" width="100px" height="300px" name="lazy" lz-src="images/商品图片3.jpg"/><br /> <img src="images/默认图片.jpg" width="100px" height="300px" name="lazy" lz-src="images/商品图片4.jpg"/><br /> <img src="images/默认图片.jpg" width="100px" height="300px" name="lazy" lz-src="images/商品图片5.jpg"/><br /> <img src="images/默认图片.jpg" width="100px" height="300px" name="lazy" lz-src="images/商品图片6.jpg"/><br /> </body> </html>
2021年12月08日
168 阅读
0 评论
0 点赞
2021-12-08
高并发量网站解决方案、性能优化
一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单。随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。 大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。这几个解决思路在一定程度上意味着更大的投入。 1、HTML静态化 其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。 除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化、有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。 同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现。比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储在数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。 2、图片服务器分离 大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的、甚至很多台的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。 在应用服务器和图片服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持、尽可能少的LoadModule,保证更高的系统消耗和执行效率。 3、数据库集群、库表散列 大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。 在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。 上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。 我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。 sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。 4、缓存 缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。 架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。 网站程序开发方面的缓存,Linux上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,.net不是很熟悉,相信也肯定有。 5、镜像 镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。 6、负载均衡 负载均衡将是大型网站解决高负荷访问和大量并发请求采用的高端解决办法。 负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。(1)、硬件四层交换 第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就像是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。 在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。“Yahoo中国”当初接近2000台服务器,只使用了三、四台Alteon就搞定了。(2)、软件四层交换 大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。 软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的强壮性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。 一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。 对于大型网站来说,前面提到的每个方法可能都会被同时使用到,这里介绍得比较浅显,具体实现过程中很多细节还需要大家慢慢熟悉和体会。有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大。 7、最新:CDN加速技术什么是CDN? CDN的全称是内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。 CDN有别于镜像,因为它比镜像更智能,或者可以做这样一个比喻:CDN=更智能的镜像+缓存+流量导流。因而,CDN可以明显提高Internet网络中信息流动的效率。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等问题,提高用户访问网站的响应速度。CDN的类型特点 CDN的实现分为三类:镜像、高速缓存、专线。 镜像站点(Mirror Site),是最常见的,它让内容直接发布,适用于静态和准动态的数据同步。但是购买和维护新服务器的费用较高,还必须在各个地区设置镜像服务器,配备专业技术人员进行管理与维护。对于大型网站来说,更新所用的带宽成本也大大提高了。 高速缓存,成本较低,适用于静态内容。Internet的统计表明,超过80%的用户经常访问的是20%的网站的内容,在这个规律下,缓存服务器可以处理大部分客户的静态请求,而原始的服务器只需处理约20%左右的非缓存请求和动态请求,于是大大加快了客户请求的响应时间,并降低了原始服务器的负载。 CDN服务一般会在全国范围内的关键节点上放置缓存服务器。 专线,让用户直接访问数据源,可以实现数据的动态同步。CDN的实例 举个例子来说,当某用户访问网站时,网站会利用全球负载均衡技术,将用户的访问指向到距离用户最近的正常工作的缓存服务器上,直接响应用户的请求。 当用户访问已经使用了CDN服务的网站时,其解析过程与传统解析方式的最大区别就在于网站的授权域名服务器不是以传统的轮询方式来响应本地DNS的解析请求,而是充分考虑用户发起请求的地点和当时网络的情况,来决定把用户的请求定向到离用户最近同时负载相对较轻的节点缓存服务器上。 通过用户定位算法和服务器健康检测算法综合后的数据,可以将用户的请求就近定向到分布在网络“边缘”的缓存服务器上,保证用户的访问能得到更及时可靠的响应。 由于大量的用户访问都由分布在网络边缘的CDN节点缓存服务器直接响应了,这就不仅提高了用户的访问质量,同时有效地降低了源服务器的负载压力。附:某CDN服务商的服务说明 采用GCDN加速方式 采用了GCDN加速方式以后,系统会在浏览用户和您的服务器之间增加一台GCDN服务器。浏览用户访问您的服务器时,一般静态数据,如图片、多媒体资料等数据将直接从GCDN服务器读取,使得从主服务器上读取静态数据的交换量大大减少。 为VIP型虚拟主机而特加的VPN高速压缩通道,使用高速压缩的电信<==>网通、电信<==>国际(HK)、网通<==>国际(HK)等跨网专线通道,智能多线,自动获取最快路径,极速的动态实时并发响应速度,实现了网站的动态脚本实时同步,对动态网站有一个更加明显的加速效果。 每个网络运营商(电信、网通、铁通、教育网)均有您服务器的GCDN服务器,无论浏览用户是来自何处,GCDN都能让您的服务器展现最快的速度!另外,我们将对您的数据进行实时备份,让您的数据更安全!
2021年12月08日
123 阅读
0 评论
0 点赞
2021-12-08
JDK开发WebServrice
前言前言摘自:https://blog.csdn.net/qq_33326449/article/details/52973297 什么是webservice?一句话概括:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用Java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法。譬如从天气预报系统中获取某个城市的天气数据在自己系统中进行展示;从证券交易系统中获取某只股票的交易信息在自己的系统中进行展示;又譬如一个商城系统中能够展示快递的跟踪信息,而这些信息就是通过webservice从具体的快递公司的系统中获取的数据。其实可以从多个角度来理解WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。二.WSDL是什么,有什么作用?WSDL是web service definition language的缩写,即web service的定义(描述)语言。怎样向别人介绍你的 web service 有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的web service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的web service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的web service生成WSDL文档,又能导入WSDL文档,生成调用相应web service的代码。Webservice服务发布之后,通过浏览器访问发布的+?wsdl即可获得wsdl文档。三.WSDL文档主要有那几部分组成,分别有什么作用?一个WSDL文档的根元素是definitions元素,WSDL文档包含7个重要的元素:types, import, message, portType, operations, binding和service元素。1、 definitions元素中一般包括若干个XML命名空间;2、 Types元素用作一个容器,定义了自定义的特殊数据类型,在声明消息部分(有效负载)的时候,messages定义使用了types元素中定义的数据类型与元素;3、 Import元素可以让当前的文档使用其他WSDL文档中指定命名空间中的定义;4、 Message元素描述了Web服务的有效负载。相当于函数调用中的参数和返回值;5、 PortType元素定义了Web服务的抽象接口,它可以由一个或者多个operation元素,每个operation元素定义了一个RPC样式或者文档样式的Web服务方法;6、 Operation元素要用一个或者多个messages消息来定义它的输入、输出以及错误;7、 Binding元素将一个抽象的portType映射到一组具体的协议(SOAP或者HTTP)、消息传递样式(RPC或者document)以及编码样式(literal或者SOAP encoding);8、 Service元素包含一个或者多个Port元素每一个Port元素对应一个不同的Web服务,port将一个URL赋予一个特定的binding,通过location实现。可以使两个或者多个port元素将不同的URL赋给相同的binding。四.SOAP是什么? SOAP是simple object access protocal的缩写,即简单对象访问协议。 是基于XML和HTTP的一种通信协议。是webservice所使用的一种传输协议,webservice之所以能够做到跨语言和跨平台,主要是因为XML和HTTP都是独立于语言和平台的。Soap的消息分为请求消息和响应消息,一条SOAP消息就是一个普通的XML文档,包含下列元素:1、 必需的 Envelope 元素,可把此XML文档标识为一条SOAP消息2、 可选的 Header 元素,包含头部信息3、 必需的 Body 元素,包含所有的调用和响应信息4、 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息 Soap请求消息 Soap响应消息 五.怎么理解UDDI?UDDI是Universal Description Discovery and Integration的缩写,即统一描述、发现和整合规范。用来注册和查找服务,把web services收集和存储起来,这样当别人访问这些信息的时候就从UDDI中查找,看有没有这个信息存在。五.Webservice的SEI指什么?WebService EndPoint Interface(webservice终端[Server端]接口)就是 WebService服务器端用来处理请求的接口六.说说你知道的webservice框架,他们都有什么特点?Webservice常用框架有JWS、Axis2、XFire以及CXF。下面分别介绍一个这几种Web Service框架的基本概念1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的。但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。3、XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。但是对Java之外的语言,没有提供相关的代码工具。XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。4、CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分。注:对于Axis2与CXF之间的关系,一个是Axis2出现的时间较早,而CXF的追赶速度快。如何抉择: 1、如果应用程序需要多语言的支持,Axis2应当是首选了;2、如果应用程序是遵循 spring哲学路线的话,Apache CXF是一种更好的选择,特别对嵌入式的Web Services来说;3、如果应用程序没有新的特性需要的话,就仍是用原来项目所用的框架,比如 Axis1,XFire,Celtrix或BEA等等厂家自己的Web Services实现,就别劳民伤财了。七.你的系统中是否有使用到webservice开发,具体是怎么实现的?如果你觉得自己掌握的不够好,对自己不够自信的可以回答为“我的系统中没有使用到webservice的开发,但是我掌握webservice开发的概念和流程”,然后可以给他讲讲相关的概念,也就是上面的这些问题的回答,这样可以绕过这个问题,因为并不是所有的系统都会涉及到webservice的开发。另一种回答即是先给他介绍一种webservice开发框架,比如CXF,然后告诉他你做的是服务端开发还是客户端开发,如果你说你做的事服务端开发,那么你就告诉他怎么定义的webservice,使用了哪些注解,怎么跟spring进行的整合,怎么发布的服务等等;如果你告诉他你做的事客户端的开发,那么你可以告诉他你怎么生成的本地代码,然后又怎么通过本地代码去调用的webservice服务。 一、开发WebService服务器端第一步:创建Java工程 ,创建相应的包(服务端)使用JDK开发(1.6以上版本)第二步:建一个接口WebServiceI,创建方法:import javax.jws.WebMethod; import javax.jws.WebService; @WebService //使用@WebService注解标注WebServiceI接口 public interface WebServiceI { /** * 根据用户名和密码得到该用户的信息 * * @param username * @param password * @return */ @WebMethod //使用WebMethod注解标注WebService接口中的方法 public String getUsersByUsernameAndPassword(String username, String password); }第三步:编写WebServiceI接口的实现类WebServiceImpl,使用@WebService注解标注实现类,并实现接口所有方法:import javax.jws.WebService; @WebService //使用@WebService注解标注WebServiceI接口的实现类 public class WebServiceImpl implements WebServiceI { @Override public String getUsersByUsernameAndPassword(String username, String password) { // TODO Auto-generated method stub //可调用dao String str ="账户:"+username+",密码:"+password; return str; } }第四步:写发布类WebServicePublish,使用Endponit(终端)类发布WebServiceimport work.javaj.WebService.service.WebServiceImpl; import javax.xml.ws.Endpoint; /** * 发布类WebServicePublish,使用Endponit(终端)类发布WebService * @author Administrator * @data 2018年9月18日 * @time 下午2:24:09 */ public class WebServicePublish { public static void main(String[] args) { //ip 为本地ip String address="http://ip:9003/WebService/UsersService"; Endpoint.publish(address, new WebServiceImpl()); System.err.println("发布成功"); } }浏览器测试:二、客户端(终端)访问WebService第一步:创建终端工程,主要用来实现接收服务端的暴露。第二步:找到客户端源代码路径(包路径) 在命令框中输入(shift+右键):wsimport -keep http://192.168.43.82:9003/WebService/UsersService?wsdl 第三步:创建Test.java测试类,在main方法中: /** *WebServiceClient测试类 * @author Administrator * @data 2018年9月18日 * @time 下午2:45:26 */ public class Test { public static void main(String[] args) { //先创建服务对象 WebServiceImplService webServiceImplService = new WebServiceImplService(); //根据服务对象得到端口 WebServiceImpl webServiceImplPort = webServiceImplService.getWebServiceImplPort(); //通过端口调用暴露的方法 String usersByUsernameAndPassword = webServiceImplPort.getUsersByUsernameAndPassword("admin", "123456"); System.out.println(usersByUsernameAndPassword); } }
2021年12月08日
143 阅读
0 评论
0 点赞
2021-12-08
Set集合排序
TreeSetTreeSet中存储的类型必须是一致的,不能一下存int,一下又存string 当向TreeSet中添加自定义对象时,有2种排序方法,1:自然排序 2、定制排序 自然排序:要求自定义类实现java.lang.Comparable接口并重写compareTo(Object obj)方法。在此方法中,指明按照自定义类的哪个属性进行排序1.自然排序 @Test public void t1(){ Set<String> s = new TreeSet<String>(); s.add("d"); s.add("a"); s.add("e"); s.add("c"); s.add("b"); System.out.println(s); }输出结果:2.倒序若想它倒序输出,可以指定一个规则让他倒序输出 @Test public void t2(){ Set<String> set = new TreeSet<String>(new MyComparator()); set.add("a"); set.add("b"); set.add("c"); set.add("d"); set.add("e"); set.add("A"); for(Iterator<String> iterator = set.iterator(); iterator.hasNext();){ System.out.print(iterator.next()+" "); } } class MyComparator implements Comparator<String> { @Override public int compare(String o1, String o2) { return o2.compareTo(o1);//降序排列 } }输出结果: 如果Set集合中放入的是我们自己定义的一个类类型呢?注意:一定要定义一个排序规则类实现Comparator接口,与上面的方法类似@Test public void t3(){ Set<Person> set = new TreeSet<Person>(new PersonComparator()); Person p1 = new Person(10); Person p2 = new Person(20); Person p3 = new Person(30); Person p4 = new Person(40); set.add(p1); set.add(p2); set.add(p3); set.add(p4); for(Iterator<Person> iterator = set.iterator();iterator.hasNext();){ System.out.print(iterator.next().score+" "); } } class Person{ int score; public Person(int score){ this.score = score; } public String toString(){ return String.valueOf(this.score); } } class PersonComparator implements Comparator<Person>{ @Override public int compare(Person o1, Person o2) { return o1.score - o2.score; } }如果按分数倒序排列,只需要更改compare方法中的o2.score-o1.score
2021年12月08日
130 阅读
0 评论
0 点赞
2021-12-08
mysql 数据库引擎
一、数据库引擎 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。二、数据库引擎任务 在数据库引擎文档中,各主题的顺序遵循用于实现使用数据库引擎进行数据存储的系统的任务的主要顺序。设计并创建数据库以保存系统所需的关系或XML文档实现系统以访问和更改数据库中存储的数据。包括实现网站或使用数据的应用程序,还包括生成使用SQL Server工具和实用工具以使用数据的过程。为单位或客户部署实现的系统提供日常管理支持以优化数据库的性能三、MySQL数据库引擎类别 你能用的数据库引擎取决于mysql在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MYSQL。在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB),也常常可以使用。ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。MYISAM MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。 MYISAM强调了快速读取操作,这可能就是为什么MYSQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。HEAP HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。INNODB和BERKLEYDB INNODB和BERKLEYDB(BDB)数据库引擎都是造就MYSQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MYISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MYISAM引擎慢很多,但是INNODB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。四、mysql数据引擎更换方式1、查看当前数据库支持的引擎和默认的数据库引擎:show engines; 我的查询结果如下:2、更改数据库引擎2.1、更改方式1:修改配置文件my.ini 将my-small.ini另存为my.ini,在[mysqld]后面添加default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB2.2、更改方式2:在建表的时候指定 建表时指定:create table mytbl( id int primary key, name varchar(50) )type=MyISAM;2.3、更改方式3:建表后更改 alter table mytbl2 type = InnoDB;3、查看修改结果 方式1:show table status from mytest; 方式2:show create table table_name五、MyIASM 和 Innodb引擎详解Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级别这篇文章。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。名词解析:ACIDA 事务的原子性(Atomicity):指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.C 事务的一致性(Consistency):指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.I 独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.D 持久性(Durability):事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚.MyIASM引擎 MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。两种引擎的选择 大尺寸的数据集趋向于选择InnoDB引擎,因为它支持事务处理和故障恢复。数据库的大小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。主键查询在InnoDB引擎下也会相当快,不过需要注意的是如果主键太长也会导致性能问题,关于这个问题我会在下文中讲到。大批的INSERT语句(在每个INSERT语句中写入多行,批量插入)在MyISAM下会快一些,但是UPDATE语句在InnoDB下则会更快一些,尤其是在并发量大的时候。Index——索引 索引(Index)是帮助MySQL高效获取数据的数据结构。MyIASM和Innodb都使用了树这种数据结构做为索引。下面我接着讲这两种引擎使用的索引结构,讲到这里,首先应该谈一下B-Tree和B+Tree。MyIASM引擎的索引结构 MyISAM引擎的索引结构为B+Tree,其中B+Tree的数据域存储的内容为实际数据的地址,也就是说它的索引和实际的数据是分开的,只不过是用索引指向了实际的数据,这种索引就是所谓的非聚集索引。如下图所示: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示: 同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。Innodb引擎的索引结构 与MyISAM引擎的索引结构同样也是B+Tree,但是Innodb的索引文件本身就是数据文件,即B+Tree的数据域存储的就是实际的数据,这种索引就是聚集索引。这个索引的key就是数据表的主键,因此InnoDB表数据文件本身就是主索引。 并且和MyISAM不同,InnoDB的辅助索引数据域存储的也是相应记录主键的值而不是地址,所以当以辅助索引查找时,会先根据辅助索引找到主键,再根据主键索引找到实际的数据。所以Innodb不建议使用过长的主键,否则会使辅助索引变得过大。建议使用自增的字段作为主键,这样B+Tree的每一个结点都会被顺序的填满,而不会频繁的分裂调整,会有效的提升插入数据的效率。两者区别: 第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。 上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。 第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引: 这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。 了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调(可能是指“非递增”的意思)的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调(可能是指“非递增”的意思)的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。转自:https://www.cnblogs.com/0201zcr/p/5296843.html
2021年12月08日
269 阅读
0 评论
0 点赞
2021-12-08
SSM整合(Spring+Spring MVC+Mybatis)
最近有空所以把以前做项目的框架做个简单的整合1.创建Maven项目,导入依赖<dependencies> <!--单元测试依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--Servlet依赖--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <scope>provided</scope> </dependency> <!--jstl依赖--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!--mysql数据库驱动依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!--c3p0依赖--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!--spring-webmvc依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.8.RELEASE</version> </dependency> <!--mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!--mybatis-spring依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <!-- jedis (一个redis client端的jar)--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!--fastjson依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version> </dependency> </dependencies> <build> <finalName>ssm_redis</finalName> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project> 2.根据个人习惯创建包 3.在resources中创建db.propertiesdb.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://127.0.0.1:3306/Bloggingplatform?characterEncoding=utf-8&allowMultiQueries=true db.user=root db.password=@838061522@ly #定义初始连接数 initPoolSize=3 #定义最大连接数 maxPoolSizes=30 4.在resources中创建spring.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--自动扫描:自动扫描com.heyang.ssm包下所有类的注解--> <context:component-scan base-package="work.javaj"/> <!--加载db.properties--> <context:property-placeholder location="classpath:db.properties"></context:property-placeholder> <!--配置数据源 从c3p0--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${db.driver}"></property> <property name="jdbcUrl" value="${db.url}"></property> <property name="user" value="${db.user}"></property> <property name="password" value="${db.password}"></property> <property name="initialPoolSize" value="${initPoolSize}"></property> <property name="maxPoolSize" value="${maxPoolSizes}"></property> </bean> <!--配置SqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--加载数据源--> <property name="dataSource" ref="dataSource"></property> <!--加载MyBatis配置文件--> <!--<property name="configLocation" value="classpath:mybatis-Config.xml"></property>--> <!--加载所有映射文件--> <property name="mapperLocations" value="classpath:work/javaj/mappers/*.xml"></property> <!--typeAliasesPackage对应实体类所在的包,这个时候会自动取包名作为别名--> <property name="typeAliasesPackage" value="work.javaj.pojo"></property> </bean> <!--配置Dao层:spring注入这个bean--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--将sqlSessionFactory注入com.zking.dao包的类中,dao包中的类直接使用sqlSessionFactory--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> <property name="basePackage" value="work.javaj.dao"></property> </bean> <!-- 事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query*" propagation="REQUIRED" read-only="true" /> <tx:method name="expand*" propagation="REQUIRED" read-only="true" /> <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/> </tx:attributes> </tx:advice> </beans> 5.在pojo中创建实体类public class Article implements Serializable{ private static final long serialVersionUID = 1L; private String aId; //文章id private String aTitle; //标题 private String aContent; //内容 private String aTitleImg; //标题图片 private String aTime; //时间 private Integer aReadingQuantity; //阅读量 private Integer aCommentnum; //评论数 private Programa programa;//栏目id 外键 private String label;//标签 private Administrator administrator;//管理员id 外键 private Integer aStatusBar; //状态 0不公开 1公开 private String aAbstract;//摘要 //此处省略setter和getter } 6.创建dao接口 ArticleDao public interface ArticleDao { /* * @Author Uncle Liu * @Description //TODO 根据id查询Article * @Date 18:36 2018/10/30 **/ Article getArticleById(String aId); } 7.创建service接口及实现类7.1 创建ArticleService public interface ArticleService { /* * @Author Uncle Liu * @Description //TODO 根据id查询Article * @Date 18:36 2018/10/30 **/ Article getArticleById(String aId); } 7.2 创建ArticleImpl@Service("articleImpl") public class ArticleImpl implements ArticleService { @Resource private ArticleDao articleDao; @Override public Article getArticleById(String aId) { return articleDao.getArticleById(aId); } } 8.在mappers中创建ArticleMapper.xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="work.javaj.dao.ArticleDao"> <!--映射Article对象的resultMap(结果映射集)--> <resultMap id="articleMapper" type="work.javaj.pojo.Article"> <id property="aId" column="a_id" /> <result property="aTitle" column="a_title" /> <result property="aContent" column="a_content" /> <result property="aTitleImg" column="a_title_img" /> <result property="aTime" column="a_time" /> <result property="aReadingQuantity" column="a_reading_quantity" /> <result property="aCommentnum" column="a_commentnum" /> <result property="aStatusBar" column="a_status_bar" /> <result property="label" column="label" /> <result property="aAbstract" column="a_abstract" /> <!--<association property="administrator" column="u_id" select="work.javaj.dao.AdministratorDao.getAdministratorById"/>--> <!--<association property="programa" column="p_id" select="work.javaj.dao.ProgramaDao.getProgramaById"/>--> </resultMap> <!--根据id查询--> <select id="getArticleById" parameterType="String" resultMap="articleMapper"> select a_abstract,a_id,a_title,a_content,a_title_img,a_time,a_reading_quantity,a_commentnum,p_id,label,a_status_bar,u_id from article where a_id=#{aId} </select> </mapper> 9.配置web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Spring整合mybatis的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <!--配置编码过滤器 防止乱码--> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--spring mvc前端控制器--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!--spring监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> 10.创建Controller@Controller @RequestMapping("/index") public class indexController { @Resource private ArticleService articleService; @RequestMapping("/a") @ResponseBody public String index(){ //根据id查询 Article article = articleService.getArticleById("91cf33d3-2b96-45e8-a66d-ffd7fabb8de8"); System.out.println(article); return "Hello"; } } 11.创建index.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <a href="/index/a.do">你好</a> </body> </html> 12.测试12.1 运行结果:12.2 控制台输出结果:12.3 页面显示
2021年12月08日
93 阅读
0 评论
0 点赞
2021-12-08
SSM 整合之文件上传
ssm整合:https://blog.csdn.net/qq_40369944/article/details/842567671.在spring.xml添加 <!--配置MultipartResolver:用于处理表单中的file--> <!-- 文件上传配置,这里id的名称固定写法 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8"></property> <!--请求的编码格式--> <property name="maxUploadSize" value="102400000"></property> <!--文件最大大小(字节) 1024*1024*50=50M--> <property name="resolveLazily" value="true"/> <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常--> <property name="uploadTempDir" value="upload"></property> <!--指定上传文件的临时文件夹,请在项目中创建好目录。--> </bean> 2.创建Controller @Controller @RequestMapping("/index") public class indexController { @RequestMapping(value = "/fileUploadPage.do", method = RequestMethod.POST) @ResponseBody public String upload(HttpServletRequest req) throws Exception{ //上传图片 MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req; MultipartFile file = mreq.getFile("file"); String fileName = file.getOriginalFilename(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String name=req.getSession().getServletContext().getRealPath("/")+ "upload\\"+sdf.format(new Date())+fileName.substring(fileName.lastIndexOf('.')); FileOutputStream fos = new FileOutputStream(name); fos.write(file.getBytes()); fos.flush(); fos.close(); return "/upload/"+sdf.format(new Date())+fileName.substring(fileName.lastIndexOf('.')); } } 3.创建index.jsp<form action="/index/fileUploadPage.do" enctype="multipart/form-data" method="post"> <input type="file" name="file" /> <input type="submit" value="上传"/> </form>4.测试4.1 运行界面:4.2 结果:返回图片存放地址可以在项目发布路径中查看图片
2021年12月08日
72 阅读
0 评论
0 点赞
2021-12-08
SSM 整合之Redis
ssm整合:https://blog.csdn.net/qq_40369944/article/details/842567671.导入依赖<spring.redis.version>1.6.0.RELEASE</spring.redis.version> <jedis.version>2.7.2</jedis.version> <commons.version>2.4.2</commons.version> <!-- config redis data and client jar--> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>${spring.redis.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>${commons.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> 2.在resources中创建redis.propertiesredis.host=47.106.8.233 redis.port=6379 redis.password= redis.maxIdle=300 redis.maxWaitMillis=1000 redis.maxTotal=600 redis.testOnBorrow=true redis.testOnReturn=true 3.在resources中创建redis-context.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--扫描redis配置文件--> <context:property-placeholder ignore-unresolvable="true" location="classpath:redis.properties"/> <!--设置连接池--> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}"/> <property name="maxTotal" value="${redis.maxTotal}" /> <property name="maxWaitMillis" value="${redis.maxWaitMillis}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> <property name="testOnReturn" value="${redis.testOnReturn}" /> </bean> <!--设置链接属性--> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:hostName="${redis.host}" p:port="${redis.port}" p:password="${redis.password}" p:pool-config-ref="poolConfig" p:timeout="100000"/> <!-- Jedis模板配置 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> </bean> </beans>4.在Spring.xml中引入配置<!-- 引入redis配置文件 --> <import resource="classpath:redis-context.xml"/> 5.创建RedisUtil@Component public class RedisUtil { @Autowired private RedisTemplate redisTemplate; /** * 删除对应的value * * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * 判断缓存中是否有对应的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 读取缓存 * * @param key * @return */ public Object get(final String key) { Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate .opsForValue(); result = operations.get(key); return result; } /** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate .opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate .opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } } 6.创建controller@Controller @RequestMapping("/index") public class indexController { @Resource private RedisUtil redisUtil; @RequestMapping("/a") @ResponseBody public String index(){ redisUtil.set("aa","123"); System.out.println( redisUtil.get("aa")); return "Hello"; } } 7.创建index.jsp<a href="/index/a.do">redis</a> 8.测试8.1运行界面8.2 结果 控制台输出:界面显示:
2021年12月08日
120 阅读
0 评论
0 点赞
2021-12-08
Base64加密方式
1.JDKsun.misc.BASE64Encoder/BASE64Decoder类不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用。测试:import org.junit.Test; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.IOException; public class Base64Test { private String src="/upload/123.jsp"; @Test public void JDKBase64(){ //加密 BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode( src.getBytes() ); System.out.println( "JDK--encode:" + encode ); //解密 BASE64Decoder decoder = new BASE64Decoder(); try { byte[] decode = decoder.decodeBuffer( encode ); System.out.println( "JDK--decode:" + new String( decode ) ); } catch( IOException e ) { e.printStackTrace(); } } }结果: 2.commons-codec导入依赖: <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency>测试:import org.apache.commons.codec.binary.Base64; import org.junit.Test; public class Base64Test { private String src="/upload/123.jsp"; @Test public void commonsCodecBase64() { //加密 byte[] encode = Base64.encodeBase64( src.getBytes() ); System.out.println( "commons--encode:" + new String( encode ) ); //解密 byte[] decode = Base64.decodeBase64( encode ); System.out.println( "commons--decode:" + new String( decode ) ); } }结果: 3.bouncycastle导入依赖: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15</artifactId> <version>1.46</version> </dependency>测试:import org.junit.Test; public class Base64Test { private String src="/upload/123.jsp"; @Test public void bouncyCastleBase64() { //加密 byte[] encode = org.bouncycastle.util.encoders.Base64.encode( src.getBytes() ); System.out.println( "bouncycastle--encode:" + new String( encode ) ); //解密 byte[] decode = org.bouncycastle.util.encoders.Base64.decode( encode ); System.out.println( "bouncycastle--decode:" + new String( decode ) ); } }结果:
2021年12月08日
296 阅读
0 评论
0 点赞
2021-12-08
org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested
redis连接报错Type Exception ReportMessage Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolDescription The server encountered an unexpected condition that prevented it from fulfilling the request. 进入Linux,修改redis配置 config set protected-mode "no"
2021年12月08日
294 阅读
0 评论
0 点赞
1
...
8
9
10
...
24