Java
文章平均质量分 80
liuchangqing123
这个作者很懒,什么都没留下…
展开
-
spring自定义标签
如何将自定义的配置标签化是个比较通用的问题,spring已经很好的帮我们设计完成,只需要我们去实现。将繁琐的配置通过xml配置,spring自动转换成bean,整个过程比较合理。1.创建一个需要扩展的组件package com.bean;public class User { private String userName; private String email原创 2017-08-24 11:44:23 · 398 阅读 · 0 评论 -
对接alipay支付遇到的问题
在支付宝支付接入过程中遇到几个需要注意和理解的地方,记录一下。相比微信支付,支付宝流程上感觉还是简单不少,网上和官方给的文档和demo还是很全的。在我的支付逻辑中包括:发起支付请求、用户支付、支付通知(支付成功后自动发货)、订单状态更新。以下是几个问题:1).支付完成后同步通知和异步通知区别,有问题就要去好好看看支付宝文档(https://cshall.alipay.com/support原创 2015-11-21 22:37:49 · 7731 阅读 · 0 评论 -
hibernate session相关类的几个问题
1. SessionFactory从SessionFactory中获取session后需要手动关闭session,显示调用session.close方法;或者交给spring维护,详细配置如下:在 web.xml 文件里面加上下面的配置信息 osivFilter org.springframework原创 2015-10-16 13:27:16 · 594 阅读 · 0 评论 -
tomcat使用redis存储共享session
在tomcat集群环境下实现session共享有几种解决方案,这里介绍一种简单的方案。使用redis对session进行存储,配置比较简单。web服务器是tomcat61.下载jar包:commons-pool-1.6.jarjedis-2.1.0.jartomcat-redis-session-manager-tomcat6.jar2.修改tomcat/conf目原创 2015-06-11 22:55:24 · 1101 阅读 · 0 评论 -
springMVC和ckeditor图片上传
1.下载ckeditor后将文件夹放在webroot的js目录下;2.springmvc配置静态文件访问在web.xml中添加: default *.css default *.gif default *.jpg default *.png default *.js 3.在springmvc-servlet.xml配置文件原创 2015-04-25 23:48:54 · 5313 阅读 · 0 评论 -
spring quartz 集群配置
Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。在项目中有大量的后台任务需要调度执行,如构建索引、统计报表、周期同步数据等等,要求任务调度系统具备高可用性、负载均衡特性,使用Quartz 会很方便。下文是spring和quartz原创 2015-03-07 22:51:32 · 1572 阅读 · 0 评论 -
redis spring缓存配置
使用redis做缓存的思路是在spring的项目中配置拦截器,在service层做切面,在findXXX或者getXXX等方法上进行拦截判断是否缓存即可。1.环境:spring 3.1.2 + spring data redis 1.0.0+ jedis 2.1.02.spring配置文件配置:原创 2015-03-07 23:08:26 · 3931 阅读 · 0 评论 -
设计模式——命令模式
命令模式:将请求封装成对象,从而使用不同的请求、队列以及日志来参数化其他对象。命令对象支持可撤销的操作。命令对象将动作和接收者包进对象中。实现“行为请求者”与“行为实现者”解耦。要点: 命令对象中动作和接收者被绑在一起,控制器调用命令对象的execute方法。应用: 线程池、队列请求、日志请求。类图:以下程序模拟一个控制器对客厅的灯和车库的门进行控制。原创 2015-02-25 16:49:22 · 473 阅读 · 0 评论 -
设计模式——组合模式
描述: 允许你将对象组合成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致的的方式处理个别对象以及对象组合。实例: 组合菜单和菜单项。类图:以下程序演示了打印菜单项和包含菜单项的菜单组合功能。1.菜单组件抽象类package net.dp.composite.menu; public abstract class MenuCompo原创 2015-02-25 17:04:13 · 500 阅读 · 0 评论 -
设计模式——模板方法
描述:在一个方法中定义一个算法的骨架。将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。钩子:定义一个空的方法或者默认的方法,提供用户子类根据情况去覆盖实现自身的判断和功能。 通过钩子可以影响抽象类中的算法流程。在算法的某个地方是可选的就设置钩子。让子类有能力为其抽象类做一些决定。 类图:以下程序模拟制作不同饮料的过程原创 2015-02-25 16:59:52 · 675 阅读 · 0 评论 -
设计模式——装饰者模式
装饰者模式: 首先定义抽象的组件类,子类继承该类后持有抽象类的引用,在抽象类的基础上可以在调用父类方法前后分别执行自己的行为。从而实现装饰添加新的功能特性。再次强调了使用组合的好处。强调对扩展开放,对修改关闭。在Java I/O中应用了装饰者模式。 装饰者模式类图:原创 2015-02-25 16:43:59 · 643 阅读 · 0 评论 -
设计模式——单例模式
单例模式:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。但我们建立了一个简单的单例类后就可以在单例类中对要创建的对象进行自我创建,定向的向外界提供而不允许外界去创建。这样就可以实现对一些对象和资源的身份权限的验证和达到控制资源的目的。利用单例模式生成的对象是唯一的,确保外界多次引用的对象是同一个。对于一些占用资源较多的类有时候会原创 2012-03-21 20:09:09 · 1144 阅读 · 0 评论 -
设计模式——观察者
观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,他的所有的依赖者都会收到通知并自动更新;定义主题,主题的功能是持有观察者的引用,提供注册、取消注册和通知,并且有状态;观察者实现接口中的update方法,必须注册具体主题; JDK自带了对观察者的支持功能被观察者Observable对象,提供add/delete/notifyObserver()和setChanged()设原创 2015-02-25 16:36:53 · 813 阅读 · 0 评论 -
java XSS防护
1.什么是XSS攻击xss表示Cross Site Scripting(跨站脚本攻击),xss攻击通过插入恶意脚本,实现对用户游览器的控制。比较常见的是利用xss攻击获取session id从而获取网站用户权限。2.如何防护这里介绍一种使用过滤器防护的方法。使用Filter对用户提交的数据进行过滤处理,去除恶意脚本。配置过滤器:public class XSSFilte原创 2015-12-13 22:32:15 · 892 阅读 · 0 评论 -
solr实体嵌套、字段加权查询
创建索引时可能遇到实体嵌套的情况,比如学生信息中包含多个活动。在solr的data-config.xml中配置:<entity name="studentProfile" pk="ID" query="select CONCAT('studentProfile',studentProfileId) as solr_id,studentProfileId,nam原创 2016-02-27 10:12:18 · 5336 阅读 · 3 评论 -
基于servlet3实现长轮询
你可能有这样的需求:客户端需要持续访问服务端获取变化的数据,但是拉取变化的数据这个动作可能比较费时,所以并不能立刻返回结果。如果使用普通的同步请求客户端的连接会一直阻塞在服务端,服务端持有的连接也会越来越多,性能极差。短链接在请求耗时比较长的场景中效果很差,那用什么方式呢?长连接?长连接建立tcp三次握手后就会和服务器端一直保持连接直到服务端断开连接,但是连接状态会一直保存在web容器中。原创 2017-08-02 23:11:08 · 2024 阅读 · 1 评论 -
HttpClient发送请求时动态替换目标ip
问题描述:使用HttpClient进行http请求,每次请求随机使用一个target host进行请求。发http请求的时候,一般会配置数据源,设置ClientPNames.DEFAULT_HOST,这样在请求的时候目标机器host和端口就是配置的ClientPNames.DEFAULT_HOST。但是不能每次请求ClientPNames.DEFAULT_HOST,因为一个httpcl原创 2017-02-18 22:52:44 · 5169 阅读 · 0 评论 -
Netty系列-客户端启动源码分析
客户端的示例代码package com.netty.server;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.*;import io.netty.channel.nio.NioEve原创 2016-12-18 22:55:38 · 674 阅读 · 0 评论 -
Netty系列-服务器端启动源码分析
之前写了几个Netty实现服务端和客户端交互的例子,现在通过分析源码看一下服务器端和客户端启动的整个流程。1.先看下服务器端启动的流程,如之前显示服务器时间的程序package com.netty.server;import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf;import io.nett原创 2016-12-18 11:31:11 · 632 阅读 · 0 评论 -
java垃圾回收机制
深入理解java虚拟机是一本非常经典的书籍,每次阅读总能看到新的东西。当然最重要的是实践。在平时个工作过程中,我们很少有机会去调jvm启动参数所以可能对java垃圾回收的实践还是缺乏不少。理论很明白,没有实践操作还是不行的,等到线上有问题不可能直接跑到线上调试。所以平时自己写一些拿来调试分析的案例还是有必要。以下是书中的几段例子。1.java虚拟机垃圾回收使用的不是引用计数原创 2016-11-26 23:00:02 · 499 阅读 · 1 评论 -
Netty系列-使用Google Protobuf编解码
什么是编解码通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。反之,解码(Decode)/反序列化(deserialization)把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。进行远程跨进程服务调用时(例如RPC调用),需要使用特定的编原创 2016-12-12 23:54:58 · 3560 阅读 · 0 评论 -
Netty系列-TCP粘包拆包问题
还是之前的Netty输出服务端时间的例子,没有考虑TCP粘包拆包问题。LineBasedFrameDecoder和StringDecoder,这两个解码器就能解决粘包问题。原创 2016-12-08 23:29:32 · 615 阅读 · 0 评论 -
Netty系列-简单示例
还是实现发送命令到服务端获取时间的功能,这里是Netty实现。对比之前的java nio实现的方式,Netty封装的还是非常简洁。同时单纯的对比Netty的Server和Client也能看出有许多相似之处。原创 2016-12-05 23:36:08 · 661 阅读 · 0 评论 -
Netty系列-NIO入门
Netty封装了java的NIO实现了非阻塞NIO网络通信,大大提高了效率。为了更好的理解Netty中NIO的使用,还是需要对java的NIO回顾一下。从普通的socket网络通信到使用NIO的方式实现,还是有很大差别的。最关键的区别是处理IO的线程是否是阻塞的,在下面的分析中就可以看得出来。1)同步阻塞式的网络通信2)伪异步IO3)NIO实现以下的程序演示的是原创 2016-12-04 23:48:59 · 513 阅读 · 0 评论 -
Java线程上下文类加载器与SPI
线程上下文类加载器(context class loader)是从JDK 1.2开始引入的。类 java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,原创 2016-08-24 22:23:29 · 4286 阅读 · 0 评论 -
java SPI
什么是SPISPI的全名为Service Provider Interface.它是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具原创 2016-08-24 22:21:22 · 604 阅读 · 0 评论 -
java类加载器classloader
1.类加载器分类java类加载器层次结构如下:1)bootstrap classloader引导(也称为原始)类加载器,它负责加载Java的核心类。这个加载器的是非常特殊的,它不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。加载的jar文件如下:file:/C:/Program%20Files/Java/jdk1.8.0_91/jre/lib/r原创 2016-08-22 16:48:19 · 472 阅读 · 0 评论 -
设计模式——适配器模式
适配器模式:Adapter 改造现有的接口从而适应新接口的要求。 适配器中需要有要适配的对象的引用。 适配器中包装多个被适配者是外观模式。 适配器模式的意图是改变接口符合客户的期望,外观模式的意图是提供子系统的一个简化接口。 这里容易联想到外观模式。外观模式提供了一个统一的接口,用来访问子系统中的一群接口。 比较以下三者的区别装饰器 不改变接口但原创 2015-02-25 16:55:11 · 677 阅读 · 0 评论 -
设计模式——工厂模式
工厂模式:工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。1)简单工厂模式(Simple Factory):不利于产生系列产品;2)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;一·首先我们实现简单工厂模式:我们的需求是建立交通工具类,该类有移动的功能,因为交通工具有很多种具体的产原创 2012-03-21 20:00:47 · 1408 阅读 · 0 评论 -
设计模式——状态模式
描述:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。通常应用在有好多状态的流程中。类图:以下程序模拟糖果机器投币取糖果的状态流程。1.定义状态结构package net.dp.s原创 2015-02-25 17:10:02 · 519 阅读 · 0 评论 -
Java学习之路——使用DOM解析XML文档
第一种方式:使用dom获取属性的值和文本的值进行解析xmlpackage com.lcq.java.document;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.d原创 2011-10-23 16:07:53 · 4135 阅读 · 0 评论 -
java学习之路——简单的工厂模式实现
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式,属于类的创建型模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 该模式中包含的角色及其职责 工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以原创 2011-10-23 15:47:50 · 1219 阅读 · 0 评论 -
java学习之路——基于TCP的Socket网络通信实例
第一部分: 1.什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 2.重要的Socket API: java.net.Socket原创 2011-10-06 14:40:49 · 4502 阅读 · 2 评论 -
java学习之路——基于UDP的Socket网络通信实例
1: UDP协议的工作原理UDP协议是一个面向无连接的协议。其连接的建立不必像TCP那样需要服务器端侦听,也不需要有客户机请求连接,属于一种“强制”性的网络连接。UDP提供一对一或一对多的、无连接的数据报服务。该服务对消息中传输的数据提供不可靠的、最大努力的传送,这意味着它不原创 2011-10-06 15:51:45 · 6392 阅读 · 2 评论 -
java学习之路——线程3(线程之间的通信)
线程有四种状态,任何一个线程肯定处于这四种状态中的一种:1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。2) 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线原创 2011-10-05 11:00:22 · 1082 阅读 · 0 评论 -
java学习之路——小例子(实现输入年份,输出该年份的具体天数信息)
实现输入年份,输出该年份的具体天数信息。练手的代码: package com.lcq.ThreadTest;import java.util.Scanner;public class Test2 {/** * 功能:打印出输入年份的每一天的信息原创 2011-10-04 22:39:48 · 1377 阅读 · 0 评论 -
Java 学习之路——线程1
近来学习java的线程的知识。听了听张龙老师讲的课程,感觉受益匪浅。老师的视频很给力,呵呵。 自己练习了一下线程同步的实例:package com.lcq.ThreadTest;/** * 类名:ThreadText4 * 功能:用于测试多线程的同步问题原创 2011-10-04 22:30:12 · 883 阅读 · 0 评论 -
java学习之路——对象的浅复制和深复制
对象的浅复制和深复制有两种方法:第一种:通过重写clone()方法实现1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引原创 2011-10-05 14:51:03 · 1284 阅读 · 1 评论 -
java 学习之路——线程2(synchronized静态代码块)
实现同步方法的方式有两种: 1.用synchronized关键字修饰的方法可以实现线程的同步; 2.用synchronized代码块修饰的部分实现线程的同步。以下为第二种方式的实现: package com.lcq.ThreadTest;/**原创 2011-10-05 08:30:41 · 965 阅读 · 0 评论 -
javascript写的进度条结合struts的action线程判断
action:IsGoAction package com.dreamers.search;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSuppor原创 2011-08-22 20:38:44 · 841 阅读 · 0 评论