设计模式

Java动态代理的异常处理问题

今天在使用Java动态代理时出现了一个很棘手的问题,实现类里抛出了一个自定义异常,但外面捕获不到。 虽然使用printStack可以输出调试信息,但通过getMessage获取不到提示,因为项目需求是捕捉到同一种自定义异常的不同异常情况,通过 getMessage获取异常提示反馈给用户,但因为使用了动态代理所以出现了异常捕获不到的情况。 具体原因是因为我们通过动态代理最终捕获到的异常时经过加工了的,也就是捕获的已不再是最开始我们希望抛出的异常,加工抛出的异常有两种: java.lang.reflect.UndeclaredThrowableException java.lang.reflect.InvocationTargetException 经过实验,最终的解决办法为: 在动态代理的方法执行时捕获异常,然后抛出exception.getCause() 这样,就能抛出你所希望抛出的那个异常里。 try{ method.invoke(fun, args); } catch(

  • zgljl2012
1 min read
Java

【Java基础】InputStream 、 InputStreamReader和BufferedReader

在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法。 * InputStream : 是所有字节输入流的超类,一般使用它的子类:FileInputStream等,它能输出字节流; * InputStreamReader : 是字节流与字符流之间的桥梁,能将字节流输出为字符流,并且能为字节流指定字符集,可输出一个个的字符; * BufferedReader : 提供通用的缓冲方式文本读取,readLine读取一个文本行, 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 下面有三个Demo(Demo访问百度主页获取字节流然后输出)来分别说明三个类的作用: -------------------------------------------------------------------------------- * InputStream package 数据流; import java.io.IOException; import java.

  • zgljl2012
4 min read
nodejs

Node.js转化GBK编码 - iconv-lite

node当使用node获取GBK编码的数据时,nodejs只支持utf-8,node没有提供转换编码的原生支持,有倒是有一个模块iconv能干这个事,但需要本地方法,VC++库的支持。国外有个大牛写了一个纯粹用Javascript解码的模块:iconv-lite,可以实现编码转换,使用方法如下: var http = require("http"); var iconv = require("iconv-lite"); var url = "http://hq.sinajs.cn/list=sh600595"; var req = http.request(url, function(

  • zgljl2012
1 min read
nodejs

【Node.js基础篇】(八)安装Express 3.2框架以及ejs模板

Html模板以及路由文件等服务器必备的功能虽然我们都可以自己实现,但在稳定性、可靠性、全面性方面肯定是有所遗漏的,所以,从今天起,Node的学习就进入了框架学习部分。 > 维基百科: 框架就是制定一套规范或者规则(思想),大家(程序员)在该规范或者规则(思想)下工作。或者说使用别人搭好的舞台来做编剧和表演。 第一个要学习的框架是在Node中被广泛应用的框架——Express。 安装Express 如果你使用的Node开发环境是WebStorm的话,在新建工程的时候可以直接选新建Node工程,它会给你安装好Express框架(但可能模板渲染使用的是jade)。虽然这的确很方便,但还是建议你使用npm包管理工具来安装Express,因为这个工具以后会常用到。我们使用第二个方法安装Express框架,然后使用WebStorm管理文件。 第一步:进入Node的文件夹,打开cmd进入当前页面 输入:npm

  • zgljl2012
4 min read
nodejs

【Node.js基础篇】(七)Node异步编程之事件发射器

事件发射器是Node里除了回调函数外的另一十分重要的异步编程技术。 在MFC等图形界面编程库中,事件发射器是非常常见的,比如,鼠标点击事件,点击了鼠标后,就会触发鼠标点击后的函数——事件发射器触发事件,并且在事件被触发后处理它们。在Node API组件中,如HTTP服务器、TCP服务器等都被做成了事件发射器,所以掌握事件发射器的编程方法,是非常重要的。 使用on添加监听器 步骤: 1. 声明事件发射器类 2. 创建事件发射器对象 3. 使用on添加事件发射器 4. 使用emit发射事件 //事件发射器类声明 var EventEmitter = require("events").EventEmitter; //创建事件发射器 var

  • zgljl2012
2 min read
nodejs

【Node.js基础篇】(六)实现如同jsp标签的HTML模板

一、概述 在上一篇中,我们已经可以使用mime类型模块以及文件传输模块为客户端返回任何类型的文件,但目前能返回的只有静态的HTML,css等文件,而jsp等服务器端语言却可以通过<% %>标签来实现java的扩张,根据请求来指定返回给客户端的html,从而只需要有一个html模板,就可以返回无数个html页面,而不用一个一个页面的编写,然后根据请求路由各个HTML。 今天,我们要实现的就是类似jsp这样的html模板文件(当然,远没有jsp那般强大)。首先,得先介绍一下JSON(JavaScript Object Notation) 二、JSON JSON是一种轻量级的数据交换格式,可用来替代xml成为服务端和客户端之间数据交换格式。程序解析起JSON数据来也非常快。下面是JSON的语法和一段示例: * 数据在名称/值对中 * 数据由逗号分隔 * 花括号保存对象 * 方括号保存数组

  • zgljl2012
5 min read
nodejs

【Node.js基础篇】(五)使用mime模块来响应css、js文件的请求

1.概述 上一篇 [http://www.zgljl2012.com/node-jsji-chu-pian-si-node-jsshi-xian-wen-jian-lu-you-gong-neng/] 中我们实现了客户端的路由请求,包括直接使用js返回内容响应和使用html文件响应,但上一篇 [http://www.zgljl2012.com/node-jsji-chu-pian-si-node-jsshi-xian-wen-jian-lu-you-gong-neng/] 中最后的显示结果只是一个很普通的html文件,不能使用css样式和js文件,今天我们就通过设置响应文件的mime类型来实现不同文件的响应。 文章会先介绍什么是mime类型,然后介绍两种设置mime类型的方法,第一种是通过后缀名判断文件类型,从而进行响应;第二种是使用第三方mime模块进行响应。 示例是在上一篇 [http://www.zgljl2012.com/node-jsji-chu-pian-si-node-jsshi-xian-wen-jian-lu-you-gong-neng/] 的基础上扩展的。 2

  • zgljl2012
5 min read
nodejs

【Node.js基础篇】(四)Node.js实现文件路由功能

昨天创建的服务器只是在浏览器请求时简单响应了一下,而今天要创建的服务器是可以根据不同的URL请求响应不同的文件,也就是所谓的文件路由:根据不同的文件请求响应不同的“路”。 -------------------------------------------------------------------------------- 第一步:创建文件Luyou.js,在里面声明引用模块的变量和需响应的文件路由 //获取http模块 var http = require("http"); //文件模块 var fs = require('fs'); //主页路由模块,file文件夹里的index.js文件 var index = require('./file/index'); //错误处理文件路径 var error = "./file/

  • zgljl2012
3 min read
nodejs

【Node.js基础篇】(三)Node.js创建HTTP服务器

作为一种强大的服务端开发技术,Node.js最本职的工作还是开发Web应用,下面介绍一下如何使用Node.js的核心模块来开发一个HTTP服务器,示例如下: /** * Created by Administrator on 2015/3/25. */ //1.获取内嵌的http模块(提供http服务器和客户端) var http = require('http'); //2.创建HTTP服务器 var server = http.createServer(function(req,res){ if(req.url == '/

  • zgljl2012
1 min read
nodejs

【Node.js基础篇】(二)Node模块的使用

类似于C++的头文件,Java的引用类,Node.js也有一种将功能拆分、封装、组合的工具,就是模块。 Node.js里的模块的用法与头文件、引用类等有所不同,它使用的是JavaScript的风格,一个模块就是一个对象,可以var一个变量来引用, 具体如下例: //module.js //Node.js创建模块 //module模块里的方法 exports.sayHello = function(){ console.log("床前明月光"); }; //module模块里的变量 exports.hello = "疑是地上霜"; 上述是模块文件,里面定义了一个方法和一个变量, var

  • zgljl2012
1 min read
nodejs

【Node.js基础篇】(一)Hello World和事件驱动编程

Node.js是基于Google的V8引擎的一个事件驱动I/O服务端JavaScript环境。它在2009年由Ryan Dahl发布,此后,迅速崛起成为一种新型服务端语言。 下面就逐步介绍Node.js。(有关Node.js的安装等过程就不介绍了,另外,建议大家的IDE使用WebStrom,真的很不错。) 和其它语言的入门一样,先得把Hello,World输出来(熟悉的感觉会增强信心) console.log("Hello World"); Node.js是我学过的语言中写“Hello,World”最容易的了,不需要头文件,不需要包,也不需要标签。console是它的一个内嵌对象,log是 console的方法,

  • zgljl2012
2 min read
postgresql

【PostgreSQL】存取jsonb

从PostgreSQL 9.3开始,json就成了postgres里的一种数据类型,也就是和varchar、int一样,我们表里的一个字段的类型可以为json了。 与此同时,postgres还提供了jsonb格式,jsonb格式是json的二进制形式,二者的区别在于json写入快,读取慢,jsonb写入慢,读取快,但在操作上,二者是没有区别的。下面以jsonb为例。 创建表 假设我们要存储的json数据是这样的: { "id": ID "name":"名字", "age":年龄 } 建表语句如下: create table if not exists name_age

  • zgljl2012
2 min read
zgljl2012@gmail.com