自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 资源 (28)
  • 收藏
  • 关注

原创 java 中 BaseDao 在Hibernate中的用法

import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; public abstract class Base...

2015-01-13 15:42:03 187

原创 java 通过 SSL 发送 Post 请求(有参数)

Java代码 收藏代码 package server.admin.login; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.n...

2015-01-09 11:56:36 1620

转载 SSH三大框架的工作原理及流程

Hibernate工作原理及为什么要用? 原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件 2.由hibernate.cfg.xml中的读取并解析映射信息 3.通过config.buildSessionFactory();//创建SessionFactory 4.sessionFactory.openSe

2015-01-09 11:01:51 485

转载 微信公众平台开发教程第23篇-SAE不支持XStream框架的解决方案

问题描述 最近几天(2014年8月20日之后),突然有不少网友反应,柳峰博客中的微信公众平台开发代码在SAE上运行会报错,或者是能正常部署,但向公众号发消息没反应。以前也有一些初学者质疑过我博客中的代码是否能正常运行,最后都被我一一证明是由于他们的不理解和粗心导致,但这一次短短几天就有很多人反应同样的问题,这就引起了我的足够重视。对于这种“同样的代码以前可以正常运行,现在却不能运行”的问题,

2015-01-09 10:56:07 582

转载 微信公众平台开发教程第22篇-如何保证access_token长期有效

为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证。 access_token的有效期是7200秒(两小时),在有效期内,可以一直使用,只有当access_token

2015-01-09 10:53:05 704

转载 微信公众平台开发教程第20篇-新手解惑40则

笔者在CSDN博客频道推出微信公众平台开发教程之后,接触了许多公众平台开发爱好者,也帮助他们解决了许多实际的问题,当然这其中有很多问题都是重复的,因此,笔者将这些问题及解答整理出来,以帮助更多初学者少走弯路。 1、订阅号与服务号的主要区别是什么? 订阅号每天能群发一条消息,没有自定义菜单及高级接口权限;服务号有自定义菜单及高级接口权限,但每月只能群发一条消息。

2015-01-09 10:50:35 841

转载 微信公众平台开发教程第19篇-应用实例之人脸检测

CSDN2013年度博客之星评选活动开始,本人有幸入围参加评选,如果博客中的文章对你有所帮助,请为柳峰投上宝贵一票,非常感谢! 投票地址:http://vote.blog.csdn.net/blogstaritem/blogstar2013/lyq8479         在笔者的公众账号小q机器人(微信号:xiaoqrobot)中有一个非常好玩的功能"人脸检测",它能够检测出用户

2015-01-09 10:47:37 822

转载 微信公众帐号开发教程第18篇-应用实例之音乐搜索

引言及内容概要 微信公众平台支持向用户回复音乐消息,用户收到音乐消息后,点击即可播放音乐。通过音乐消息,公众账号可以实现音乐搜索(歌曲点播)功能,即用户输入想听的音乐名称,公众账号返回对应的音乐(歌曲)。读者可以关注xiaoqrobot体验该功能,操作指南及使用如下所示。 考虑到歌曲名称有重复的情况,用户还可以同时指定歌曲名称、演唱者搜索歌曲。下面就为读者详细介绍歌曲点播功

2015-01-09 10:45:37 630

转载 微信公众帐号开发教程第17篇-应用实例之智能翻译

内容概要 本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译API”实现的。智能翻译是指用户任意输入想要翻译的内容(单词或句子),系统能自动识别用户采用的语言,并将其翻译为其他语言,目前支持的翻译方向:中->英、英->中和日->中。下面我们来看看智能翻译最终做出来的效果:      我们通过输入关键词“翻译”或者点击菜单“翻译”能够

2015-01-09 10:43:46 580

转载 微信公众帐号开发教程第16篇-应用实例之历史上的今天

内容概要 本篇文章主要讲解如何在微信公众帐号上实现“历史上的今天”功能。这个例子本身并不复杂,但希望通过对它的学习,读者能够对正则表达式有一个新的认识,能够学会运用现有的网络资源丰富自己的公众账号。 何谓历史上的今天 回顾历史的长河,历史是生活的一面镜子;以史为鉴,可以知兴衰;历史上的每一天,都是喜忧参半;可以了解历史的这一天发生的事件,借古可以鉴今,历史是不能忘记的

2015-01-09 10:41:48 905

转载 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)

引言及内容概要 距离写上一篇文章《自定义菜单的创建及菜单事件响应》整整过了两个月的时间,那时公众平台还没有开放view类型的菜单。在不久前,微信公众平台悄悄开放了view类型的菜单,却没有在首页发布任何通知,貌似微信团队很喜欢这么干。一个偶然的机会,我留意到API文档的自定义菜单接口发生了变化,增加了对菜单view类型的说明: view(访问网页): 用户点击view类型按钮后,会

2015-01-09 10:40:34 583

转载 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应

微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号; 2)服务号可以申请自定义菜单; 3)使用QQ登录的公众号,可以升级为邮箱登录; 4)使用邮箱登录的公众号,可以修改登录邮箱; 5)编辑图文消息可选填作者; 6)群发消息可以同步到腾讯微博。

2015-01-09 10:39:33 711

转载 微信公众帐号开发教程第13篇-图文消息全攻略

引言及内容概要 已经有几位读者抱怨“柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用”,好吧,我错了,原本以为把基础API封装完、框架搭建好,再给出一个文本消息的使用示例,大家就能够照猫画虎的,或许是因为我的绘画功底太差,画出的那只猫本来就不像猫吧…… 本篇主要介绍微信公众帐号开发中图文消息的使用,以及图文消息的几种表现形式。标题取名为“图文消息全攻略”,这绝对

2015-01-09 10:37:59 640

转载 微信公众帐号开发教程第11篇-符号表情的发送(上)

题外话(可以略过) 相信这篇文章已经让大家等的太久了,不是我故弄玄虚、吊大家胃口,而是写一篇文章真的需要花太多的时间。也许一篇文章,你们花3-5分钟就看完了、就学会掌握了,而我却要花2-3个小时的时间来完成,也许只有用心写过文章的人才能体会,希望大家能够相互体谅!   也曾经有人对我说,我写的东西太初级,都是入门级的东西。好吧,我承认众口难调,很难满足所有的读者,再加上我自己也只

2015-01-09 10:34:47 639

转载 微信公众帐号开发教程第10篇-解析接口中的消息创建时间CreateTime

从微信公众平台的消息接口指南中可以看出,每种类型的消息定义中,都包含有CreateTime参数,它表示消息的创建时间,如下图所示: 上图是消息接口指南中4.1-文本消息的定义。注意CreateTime的描述:消息创建时间(整型),重点在于这是一个整型的时间,而不是我们大家所熟悉的类似于"yyyy-MM-dd HH:mm:ss"的标准格式时间。本文主要想介绍的就是微信消息接口中定义的整

2015-01-09 10:33:56 525

转载 微信公众帐号开发教程第9篇-QQ表情的发送与接收

我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜、怒、哀、乐等表达人物心情的小图片。本文重点要介绍的内容就是如何在微信公众平台使用QQ表情,即在微信公众帐号开发模式下,如何发送QQ表情给用户,以及如何识别用户发来的是QQ表情。 QQ表情代码表 首先需要明确的是:QQ表情虽然呈现为一张张动态的表情图片,但在微信公众平

2015-01-09 10:33:14 490

转载 微信公众帐号开发教程第8篇-文本消息中使用网页超链接

本文主要介绍网页超链接的作用以及如何在文本消息中使用网页超链接。 网页超链接的作用 我想但凡是熟悉HTML的朋友,对超链接一定不会陌生。而今天我们要讨论和使用的只是超链接中的其中一种---网页超链接,即使用HTML中的标签将某段文字链接到其他网页上去,示例如下: [html] view plaincopy a href="

2015-01-09 10:31:44 597

转载 微信公众帐号开发教程第7篇-文本消息中换行符的使用

本篇文章主要介绍在文本消息中使用换行符的好处以及如何使用换行符。 最近一个月虽然抽不出时间写博客,但却一直在认真答复大家提出的问题。收到这么多的回复、关注和答谢,还是蛮有成就感的,让我觉得做这件事越来越有意义,更加坚定了我继续写下去的决心。经过前面六篇文章的讲解,相信在看文章的你,已经掌握了微信公众帐号的基础开发知识(基于Java),如框架搭建、API封装、消息接收与回复等;接下来的系列文章

2015-01-09 10:30:54 589

转载 微信公众帐号开发教程第6篇-文本消息的内容长度限制揭秘

相信不少朋友都遇到过这样的问题:当发送的文本消息内容过长时,微信将不做任何响应。那么到底微信允许的文本消息的最大长度是多少呢?我们又该如何计算文本的长度呢?为什么还有些人反应微信好像支持的文本消息最大长度在1300多呢?这篇文章会彻底解除大家的疑问。 接口文档中对消息长度限制为2048 可以看到,接口文档中写的很明确:回复的消息内容长度不超过2048字节。那为什么很

2015-01-09 10:28:22 475

转载 微信公众帐号开发教程第5篇-各种消息的接收与响应

前一篇文章里我们已经把微信公众平台接口中消息及相关操作都进行了封装,本章节将主要介绍如何接收微信服务器发送的消息并做出响应。 明确在哪接收消息 从微信公众平台接口消息指南中可以了解到,当用户向公众帐号发消息时,微信服务器会将消息通过POST方式提交给我们在接口配置信息中填写的URL,而我们就需要在URL所指向的请求处理类CoreServlet的doPost方法中接收消息、处

2015-01-09 10:25:37 598

转载 关于Mysql模糊查询的优化-全文检索和Like的使用

表A: CREATE TABLE `tableA` ( `id` int(11) NOT NULL auto_increment, `content` varchar(256) default NULL, PRIMARY KEY  (`id`), 如果我要在content中进行模糊查询,那么使用like的话,肯定要这样写: select * from tableA from con

2015-01-09 09:34:51 8443

转载 在web.xm里配置了OpenSessionInViewFilter引起Hibernate session问题

OpenSessionInViewFilter的原理,作用,配置就不说了;   我项目的 OpenSessionInViewFilter是配置在web.xm里的,如下:   lazyLoadingFilter       org.springframework.orm.hibernate3.support.OpenSessionInViewFilter      

2015-01-09 09:32:44 600

转载 【微信公众平台改版后】Java模拟登录微信平台,主动推送消息给用户

一、简要说明 在博文《Java模拟登录微信公众平台,主动推送图文消息给用户》中提到使用Java语言登录微信公众平台,然后发送图文消息给用户,基本可以符合使用要求,但是在今年10月23日,微信公众平台的界面有所变化,所以,上一篇博文的代码不再适用,很多朋友留言,不能使用了怎么办,这篇文章针对新版本做了处理,并且加入了新的功能,代码上要感谢trprebel这位朋友。 再备注:如果遇到获取粉

2015-01-08 17:19:41 5227 4

转载 [028] 微信公众帐号开发教程第4篇-消息及消息处理工具的封装

工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用。这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平台接收到,然后微信平台会将该消息转给你在开发模式接口配置中指定的URL地址。 微信公众平台消息接口 要接收微信平台发送的消息,我们需要先熟悉微信公众平台API中消息接口部分,点此进入,点击后将进入到

2015-01-08 15:07:24 646

转载 微信公众平台开发之基于百度 BAE3.0 的开发环境搭建(MyEclipse + SVN)

转载请标明出处,谢谢!  版本说明:     V1:          2014-3-30 版 前言: 因为要进行微信开发,就必须要成为微信开发者,要想成为微信开发者,就必须要有服务器响应微信的 Token 验证,如果没有公网服务器环境,可以去了解下BAE、SAE或阿里云,这里以 BAE 为例。 前提条件:     (1)拥有微信公众平台帐号(申请

2015-01-08 09:59:30 1409 1

龙果 java并发编程原理实战

龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解00:21:56分钟 | 第6节线程的初始化,中断以及其源码讲解00:21:26分钟 | 第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发的支持:Spring的异步任务00:11:10分钟 | 第10节使用jdk8提供的lambda进行并行计算00:14:22分钟 | 第11节了解多线程所带来的安全风险00:13:16分钟 | 第12节从线程的优先级看饥饿问题00:18:42分钟 | 第13节从Java字节码的角度看线程安全性问题00:25:43分钟 | 第14节synchronized保证线程安全的原理(理论层面) 00:13:59分钟 | 第15节synchronized保证线程安全的原理(jvm层面)00:25:03分钟 | 第16节单例问题与线程安全性深入解析00:27:15分钟 | 第17节理解自旋锁,死锁与重入锁00:24:58分钟 | 第18节深入理解volatile原理与使用00:28:30分钟 | 第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23节使用AQS重写自己的锁00:31:04分钟 | 第24节重入锁原理与演示00:12:24分钟 | 第25节读写锁认识与原理00:18:04分钟 | 第26节细读ReentrantReadWriteLock源码00:30:38分钟 | 第27节ReentrantReadWriteLock锁降级详解00:13:32分钟 | 第28节线程安全性问题简单总结00:15:34分钟 | 第29节线程之间的通信之wait/notify00:32:12分钟 | 第30节通过生产者消费者模型理解等待唤醒机制00:20:50分钟 | 第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析00:10:17分钟 | 第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57分钟 | 第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:11:07分钟 | 第51节并发容器ConcurrentHashMap原理与使用00:38:22分钟 | 第52节线程池的原理与使用00:42:49分钟 | 第53节Executor框架详解00:36:54分钟 | 第54节实战:简易web服务器(一)00:55:34分钟 | 第55节实战:简易web服务器(二)00:24:36分钟 | 第56节JDK8的新增原子操作类LongAddr原理与使用00:17:45分钟 | 第57节JDK8新增锁StampedLock详解00:29:37分钟 | 第58节重排序问题00:23:19分钟 | 第59节happens-before简单概述00:15:17分钟 | 第60节锁的内存语义00:13:54分钟 | 第61节volatile内存语义00:12:04分钟 | 第62节final域的内存语义00:34:07分钟 | 第63节实战:问题定位00:07:48分钟

2018-02-02

实战Java高并发程序设计 中文pdf版下载

实战Java高并发程序设计主要介绍基于Java的并行程序设计基础、思路、方法和实战。首先,立足于并发程序基础,详细介绍Java中进行并行程序设计的基本方法。第二,进一步详细介绍JDK中对并行程序的强大支持,帮助读者快速、稳健地进行并行程序开发。第三,详细讨论有关“锁”的优化和提高并行程序性能级别的方法和思路。第四,介绍并行的基本设计模式及Java8对并行程序的支持和改进。第五,介绍高并发框架Akka的使用方法。最后,详细介绍并行程序的调试方法。 实战Java高并发程序设计内容丰富,实例典型,实用性强,适合有一定Java基础的技术开发人员阅读。

2018-01-24

hadoop-eclipse-plugin-2.6.0.jar

It takes me two days to find the root cause for the exceptions and finally generate this jar file for hadoop 2.6.0. 1.use hadoop 2.6.0. 2.change the hadoop_home and path to point to hadoop 2.6.0 3.include one more jar file htrace-core-3.0.4.jar compared with previous versions. Tested with eclipse-jee-luna-R-win32-x86_64. Any problem,please let me know.

2017-02-16

HighchartsDemo案例

Highcharts是一个制作图表的纯Javascript类库,主要特性如下: 兼容性:兼容当今所有的浏览器,包括iPhone、IE和火狐等等; 对个人用户完全免费; 纯JS,无BS; 支持大部分的图表类型:直线图,曲线图、区域图、区域曲线图、柱状图、饼装图、散布图; 跨语言:不管是PHP、Asp.net还是Java都可以使用,它只需要三个文件:一个是Highcharts的核心文件highcharts.js,还有a canvas emulator for IE和Jquery类库或者MooTools类库; 提示功能:鼠标移动到图表的某一点上有提示信息; 放大功能:选中图表部分放大,近距离观察图表; 易用性:无需要特殊的开发技能,只需要设置一下选项就可以制作适合自己的图表; 时间轴:可以精确到毫秒;

2017-02-08

SSH2+XFire的框架整合

SSH2+XFire的框架整合

2016-05-06

JasperReport+SSH

JasperReport+struts+spring+hibernate+extjs4.1

2015-11-12

struts2.0 hibernate spring考勤管理系统

struts2.0 hibernate spring考勤管理系统

2015-10-30

jackson-core-2.2.3.jar

spring Android中MappingJackson2HttpMessageConverter()需要此包和jackson-annotations-2.2.3.jar和jackson-databind-2.2.3.jar

2015-10-13

jackson-databind-2.2.3.jar

spring Android中需要此包jackson-databind-2.2.3.jar,还需要jackson-annotations-2.2.3.jar和jackson-core-2.2.3.jar

2015-10-13

jackson-annotations-2.2.3.jar

springandroid中需要此包\jackson-annotations-2.2.3.jar ,还需要jackson-databind-2.2.3.jar和jackson-core-2.2.3.jar

2015-10-13

httpclient-4.5 jar

commons-codec-1.9.jar commons-logging-1.2.jar fluent-hc-4.5.jar httpclient-4.5.jar httpclient-cache-4.5.jar httpclient-win-4.5.jar httpcore-4.4.1.jar httpmine-4.5.jar jna-4.1.0.jar jna-platform-4.1.0.jar

2015-10-13

JAVA上传图片源代码

JAVA上传源代码,包含检查文件格式、大小等功能。已做成项目,经测试没问题!打包上传到资源中,下载后解压缩即可使用!

2015-10-13

上传图片预览java代码

图片上传预览是一种在图片上传之前对图片进行本地预览的技术。 使用户选择图片后能立即查看图片,而不需上传服务器,提高用户体验。 但随着浏览器安全性的提高,要实现图片上传预览也越来越困难。 不过群众的智慧是无限的,网上已经有很多变通或先进的方法来实现。 例如ie7/ie8的滤镜预览法,firefox 3的getAsDataURL方法。 但在opera、safari和chrome还是没有办法实现本地预览,只能通过后台来支持预览。 兼容:ie6/7/8, firefox 3.5.5 后台支持下还兼容:opera 10.10, safari 4.0.4, chrome 3.0 程序说明 【基本原理】 图片预览主要包括两个部分:从file表单控件获取图像数据,根据数据显示预览图像。 程序的file和img属性就是用来保存file控件和显示预览图像的容器的,而img还必须是img元素。 程序有以下几种预览方式: simple模式:直接从file的value获取图片路径来显示预览,适用于ie6; filter模式:通过selection获取file的图片路径,再用滤镜来显示预览,适用于ie7/8; domfile模式:调用file的getAsDataURL方法获取Data URI数据来显示预览,适用于ff3; remote模式:最后的办法,把file提交后台处理后返回图片数据来显示预览,全适用。 程序定义时就自动根据浏览器设置MODE属性: ImagePreview.MODE = $$B.ie7 || $$B.ie8 ? "filter" : $$B.firefox ? "domfile" : $$B.opera || $$B.chrome || $$B.safari ? "remote" : "simple"; 如果用能力检测会比较麻烦,所以只用了浏览器检测。 由于浏览器对应的默认模式是不会变的,这个值会保存到函数属性中作为公用属性。 ps:ie6也可以用filter模式,不过它有更好的simple模式。 【获取数据】 调用preview方法,就会执行预览程序: if ( this.file && false !== this.onCheck() ) { this._preview( this._getData() ); } 在通过检测后,再调用_getData获取数据,并作为_preview的参数进入下一步。 程序初始化时就会根据mode来设置_getData数据获取程序: this._getData = this._getDataFun(opt.mode); mode的默认值是ImagePreview.MODE,也可以在可选参数中自定义。 由于兼容性问题,一般应保留默认值,除非是使用全兼容的remote模式。 在_getDataFun里面,根据mode返回数据获取程序: 代码 switch (mode) { case "filter" : return this._filterData; case "domfile" : return this._domfileData; case "remote" : return this._remoteData; case "simple" : default : return this._simpleData; } 不同的模式有不同的数据获取程序: 滤镜数据获取程序: this.file.select(); try{ return document.selection.createRange().text; } finally { document.selection.empty(); } 一般用在ie7/8,在file控件select后再通过selection对象获得文件本地路径。 此时file控件不能隐藏,否则不能被select,不过一般能选择文件就肯定能被select了。 确实要隐藏也可以在获取数据之后再隐藏。 domfile数据获取程序: return this.file.files[0].getAsDataURL(); 用getAsDataURL从file控件获取数据,这个方法暂时只有ff3支持。 远程数据获取程序: this._setUpload(); this._upload && this._upload.upload(); 用_upload上传文件对象把数据提交后台,根据返回的数据再显示。 这个方法不属于本地预览,是没有办法中的办法。 一般数据获取程序: return this.file.value; 最原始的方法,现在只有ie6还支持从file的value直接获取本地路径。 获取数据后,作为_preview预览程序的参数,再进行处理: if ( !!data && data !== this._data ) { this._data = data; this._show(); } 首先排除空值或相同值的情况,再执行_show程序进行显示预览,其中_data属性用来保存当前的图片数据。 图片使用Data URI数据时可能会设置一个很大的src值,在ie8获取很大的src值会出现“无效指针”的错误。 使用_data属性保存这个值可以避免从src取值而触发这个错误。 远程数据获取程序没有返回值,因为它需要等待返回数据,在_preview中会自动排除。 【显示预览】 程序初始化时就会根据mode来设置_show预览显示程序: this._show = opt.mode !== "filter" ? this._simpleShow : this._filterShow; 除了filter模式,都是使用_simpleShow显示程序来显示预览图片的。 里面会先调用_simplePreload方法设置一般预载图片对象: 代码 if ( !this._preload ) { var preload = this._preload = new Image(), oThis = this, onload = function(){ oThis._imgShow( oThis._data, this.width, this.height ); }; this._onload = function(){ this.onload = null; onload.call(this); } preload.onload = $$B.ie ? this._onload : onload; preload.onerror = function(){ oThis._error(); }; } else if ( $$B.ie ) { this._preload.onload = this._onload; } 预载图片对象保存在_preload属性中,主要用来判断图像能否加载成功并获取图片原始尺寸。 要实现这些功能使用Image对象就足够了。 在onload中执行_imgShow显示预览,在onerror中进行出错处理。 ps:ff、chrome和safari的图片对象还有naturalHeight和naturalWidth属性可以获取图片的原始尺寸,即使图片尺寸已经修改过。 这里要注意ie6/7的gif图片载入bug,测试以下代码: 代码 <!DOCTYPE html><body><img id="img" /><div id="div"></div></body> <script> img.onload = function(){ div.innerHTML += this.complete + ", "; }; img.src = "http://tuan.pcpop.com/image/my/loading.gif"; </script> 一般图片执行一次onload后并不会重复执行,但ie6/7的gif每次循环播放都会执行一次onload。 ps:ie8在非标准(怪辟)模式下也有相同的问题。 可以在onload的时候,判断complete是否为false来判断是否重复加载。 ps:除了ie,其他浏览器在onload时complete就已经为true了。 问题是选择另一个图片时这个complete仍然是true,这样就没有意义了。 所以只好在onload里面重置onload为null,并在每次选择文件重设onload了。 然后设置_preload的src预载图片,如果成功预载就会执行_imgShow显示预览。 要注意src的设置要在onload/onerror的设置之后,否则设置之前就加载完成的话就触发不了事件了。 _imgShow需要三个参数,包括要预览图片的src值,图片原始宽度和图片原始高度。 在_imgShow里面首先设置预览图片的尺寸: 代码 var img = this.img, style = img.style, ratio = Math.max( 0, this.ratio ) || Math.min( 1, Math.max( 0, this.maxWidth ) / width || 1, Math.max( 0, this.maxHeight ) / height || 1 ); style.width = Math.round( width * ratio ) + "px"; style.height = Math.round( height * ratio ) + "px"; 这里的关键是获取ratio比例值,如果自定义的ratio大于0就直接使用自定义的比例,否则就根据参数自动计算。 自动计算首先要确保maxWidth最大宽度和maxHeight最大高度大于等于0。 然后分别跟原始宽高做“/”运算得到比例,如果比例为0表示不限制,那么比例就自动改为1。 最后取比较小的比例来计算,程序设定了比例最大值为1,这样就不会自动放大图片了。 当然比例的计算可以根据需要自行修改。 ps:style的优先级比属性(width/height)高,所以要用style设置。 最后设置img的src就可以实现预览了。 【remote模式】 remote模式会先提交file控件到后台,通过返回的数据来显示图片。 它跟其他模式最大的区别就是获取数据的部分。 在_remoteData远程数据获取程序中,会调用_setUpload来设置上传文件对象。 如果设置了action,并存在QuickUpload函数,就会实例化一个上传文件对象保存到_upload中: 代码 var oThis = this; this._upload = new QuickUpload(this.file, { onReady: function(){ this.action = oThis.action; this.timeout = oThis.timeout; var parameter = this.parameter; parameter.ratio = oThis.ratio; parameter.width = oThis.maxWidth; parameter.height = oThis.maxHeight; }, onFinish: function(iframe){ try{ oThis._preview( iframe.contentWindow.document.body.innerHTML ); }catch(e){ oThis._error("remote error"); } }, onTimeout: function(){ oThis._error("timeout error"); } }); 这里使用的QuickUpload就是简便无刷新文件上传程序。 在onReady中设置参数,在onFinish中处理返回数据,onTimeout进行出错处理。 返回的数据可以是图片的地址或对应的Data URI数据,然后给_preview处理。 当然针对不同的后台输出,数据处理的方式也不同,可以按照需要修改。 后台最好先根据传递的参数缩小图片,尽量减少返回数据来提高预览速度。 【filter模式】 filter模式在_filterData程序中得到文件本地路径,但ie7/8都不允许直接使用本地路径显示图片。 不过还是可以通过滤镜,用本地路径来做预览图片效果。 filter模式使用_filterShow方法来显示预览图片。 里面先调用_filterPreload方法来设置滤镜预载图片对象。 跟一般预载图片对象不同,滤镜预载对象是用滤镜来显示图片,所以并不一定要图像元素。 程序就使用了div元素作为滤镜预载对象: 代码 var preload = this._preload = document.createElement("div"); $$D.setStyle( preload, { width: "1px", height: "1px", visibility: "hidden", position: "absolute", left: "-9999px", top: "-9999px", filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='image')" }); var body = document.body; body.insertBefore( preload, body.childNodes[0] ); 在样式设置中隐藏元素并添加滤镜,要使滤镜生效width和height必须设置一个值。 由于要获取尺寸,只能用visibility来隐藏并插入body,关于AlphaImageLoader滤镜后面再介绍。 然后在_filterShow中预载图片: try{ preload.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = data; }catch(e){ this._error("filter error"); return; } 成功的话,再给img载入图片: this.img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src=\"" + data + "\")"; 注意,如果路径中有“)”,“%”这类字符的话,直接拼接到滤镜字符串中会出现类似sql注入的问题。 程序会先对这些敏感字符进行escape编码: data = this._data.replace(/[)'"%]/g, function(s){ return escape(escape(s)); }); 为什么要做两次escape编码呢?测试时发现“%”只转一次的话,遇到“%40”之类的字符时还是会出问题。 所以我推测,字符在使用前会进行两次unescape解码,于是对应的做两次escape编码果然没问题了。 虽然预载对象是直接设置滤镜的src属性,但也有“%”的拼接字问题,所以也要escape编码。 ps:虽然单引号和双引号这里并不是必要,还是一起替换掉安心点。 还要注意预览对象不要用filters.item的方式设置滤镜。 因为元素插入文档之前,并不能通过filters.item获取滤镜对象,但能通过style预先设置filter。 所以在不确定元素位置的情况下,只能用style来设置filter了。 最后调用_imgShow设置尺寸: this._imgShow( ImagePreview.TRANSPARENT, preload.offsetWidth, preload.offsetHeight ); 由于img是一个图片对象,默认会显示一个小图标,为了去掉这个小图标,可以让它显示一个透明图片。 程序传递了ImagePreview.TRANSPARENT来设置透明图片,具体数据在Data URI 和 MHTML再说明。 ps:当然也可以在filter模式用div做预览图片对象就没有小图标了,但这样兼容起来会麻烦很多。 【AlphaImageLoader滤镜】 filter模式使用的是AlphaImageLoader滤镜。 它的作用是在对象容器边界内,在对象的背景和内容之间显示一张图片。 如果载入的是png图片,其透明度会被支持,因此它更多地用来解决png的兼容问题。 详细参考msdn的AlphaImageLoader Filter和“Microsoft.AlphaImageLoader滤镜讲解”。 它包括三个属性:enabled(滤镜是否激活),sizingMethod(图像显示方式)和src(图像路径)。 程序主要使用后面两个属性。 sizingMethod有三种方式: crop:剪切图片以适应对象尺寸; image:默认值。增大或减小对象的尺寸边界以适应图片的尺寸; scale:缩放图片以适应对象的尺寸边界。 预载图片对象_preload,需要获取图片的原始尺寸,所以要用image方式。 而预览图片对象img,则要按设定尺寸显示图片,所以要用scale方式。 而src属性设置的路径还支持本地路径,是实现filter模式的关键所在。 还好滤镜并没有像file控件那样提高安全性,否则ie7/8就没有办法实现本地预览了。 【nsIDOMFile接口】 ff从3.0(或许更早)开始,就不能通过file控件的value属性获取文件本地路径,也不支持直接用本地路径显示图片。 不过欣喜的是,它同时也提供了nsIDOMFile接口,能更好地获取文件数据。 在ff的file控件有一个FileList对象,包含了带nsIDOMFile接口的File对象。 ps:FileList对象貌似是一个NodeList集合,但目前只能用第一个,可能是为了将来实现一个file控件选择多个文件的功能预留的。 这个File对象有三个获取文件数据的方法: getAsText:获取文件的文本数据,可以通过参数设置编码; getAsDataURL:获取文件的Data URI(URL?)数据; getAsBinary:获取文件的二进制数据。 其中getAsDataURL获得的Data URI数据可以用于显示图片,_domfileData中就是用它来获取数据的。 File对象还支持两个属性:fileName(文件名,不包括路径)和fileSize(文件大小)。 相关具体说明参考mozilla的File和nsIDOMFile。 【Data URI 和 MHTML】 上面已经多次提到Data URI,详细介绍请看秦歌的“Data URI 和 MHTML”。 Data URI的主要作用是以字符代替数据,从而把文件“嵌”在代码里。 除了ie,其他浏览器基本都很好的支持了Data URI。 ie8也有限度地支持,详细参考msdn的data Protocol。 由于opera,safari和chrome需要remote模式的浏览器都支持Data URI,所以程序返回的是Data URI形式的数据。 相比返回路径的方法,返回Data URI不需要创建文件,还少一次HTTP请求。 ps:ie8只支持32k的Data URI数据,在ie8使用时要注意数据大小。 在filter模式需要一个透明图片来去掉img默认显示的小图标,一般的方法需要一个图片文件。 为了“省下”这个文件,可以使用Data URI来做一个1*1的透明图片: data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== 支持Data URI的情况下,只要把img的src设置为这个值就可以显示一个透明图片了。 虽然ie6/7不支持Data URI,但还有mhtml可以使。 在ImagePreviewd.js开头有一段注释了的代码: 代码 Content-Type: multipart/related; boundary="_CLOUDGAMER" --_CLOUDGAMER Content-Location:blankImage Content-Transfer-Encoding:base64 R0lGODlhAQABAJEAAAAAAP///////wAAACH5BAEAAAIALAAAAAABAAEAAAICVAEAOw== 其中boundary的值是分隔符标识,说明用于分隔数据段的字符。 Content-Location说明关联引用位置,可以用作数据段的标识。 Content-Transfer-Encoding就是字符编码形式。 后面的代码就是1*1的透明图片的base64编码数据。 然后在代码中这样调用(例如设置img元素的src属性): mhtml:文件完整路径!blankImage 就可以链接到一个透明图片了。 接着就要解决如何获得script(js文件)的完整路径(包含http开头的路径)的问题了。 首先要在脚本运行时获取,当前运行的script肯定是document.scripts的最后一个: document.scripts[document.scripts.length - 1] ps:ff不支持document.scripts,可以用getElementsByTagName("script")来兼容。 接着可以利用getAttribute从src获取script的完整路径: document.scripts[document.scripts.length - 1].getAttribute("src", 4) ie6/7的getAttribute支持第二个参数,设为4表示返回完整路径的url地址,详细参考msdn的getAttribute Method。 结合Data URI 和 MHTML可以这样得到透明图片数据: ImagePreview.TRANSPARENT = $$B.ie7 || $$B.ie6 ? "mhtml:" + document.scripts[document.scripts.length - 1].getAttribute("src", 4) + "!blankImage" : "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="; 使用时要注意: 脚本必须单独另存为一个文件,作为mhtml需要的文件路径。 要自动获取完整路径需要用script标签链接文件。 【超空间】 程序还有一个dispose方法用于销毁程序。 包括这几个部分: _upload上传文件对象:它本身已经有一个dispose方法来销毁程序; _preload预载图片对象:先清除它的onload/onerror事件再移除元素; file和img属性:直接设为null,由于不是程序创建的元素,留给使用者来移除。 说到移除元素,顺便说一下超空间(DOM hyperspace),这是从“ppk谈javascript”中看到的。 大概指的是当元素不在dom里面,而js又有关联时,元素并不会消失,而是保存在一个称为“超空间”的地方。 详细参考书的DOM 超空间部分。 书中还说可以根据是否有parentNode来判断元素是否在超空间,但测试以下代码: <body></body> <script> var elm = document.createElement("div"); alert(elm.parentNode); document.body.removeChild(document.body.appendChild(elm)); alert(elm.parentNode); </script> 第一次parentNode都是null,没有问题,按理第二次也应该是null,但ie却是一个object。 经测试,这个object的nodeType是11,也就是一个碎片对象(FRAGMENT)。 而且各个被removeChild移除的元素的parentNode都不相同,即会生成不同的碎片对象。 这种情况算不算在“超空间”呢,不过书中也只是说“一般来说”,也不用太考究。 那么用innerHTML清除呢?再测试以下代码: <body><div id="test"></div></body> <script> var elm = document.getElementById("test"); document.body.innerHTML = ""; alert(elm.parentNode); </script> 结果在ie也是null了,看来removeChild和innerHTML在清除元素时产生了不同的结果。 那个碎片对象貌似没什么用(难道为了保证有parentNode?),那是不是innerHTML就一定比removeChild好呢? 再测试以下代码: 代码 <body> <style>div{border:1px solid #000; height:20px;}</style> <span><div id="test1">test1</div></span> <span><div id="test2">test2</div></span> </body> <script> var div1 = document.getElementById("test1"), parent1 = div1.parentNode; parent1.removeChild(div1); alert(div1.tagName + ":" + div1.innerHTML); parent1.appendChild(div1); var div2 = document.getElementById("test2"), parent2 = div2.parentNode; parent2.innerHTML = ""; alert(div2.tagName + ":" + div2.innerHTML); parent2.appendChild(div2); </script> 当使用removeChild时,移除元素的结构并没有发生变化,各个浏览器的效果都一样。 而使用innerHTML清除时,其他浏览器的效果跟removeChild一样,但在ie被移除的元素就只剩下一个“外壳”了。 个人推测,ie在使用innerHTML时,被移除的元素会变成一个个单独的元素,失去了彼此的联系。 形象点说就是removeChild是直接掰断树枝,还能继续嫁接使用,而innerHTML是把需要的树叶节点取下来,再把树枝烧掉。 ps:仅仅是推测,谁有官方资料请告诉我。 那么removeChild的好处是移除的元素能再次使用,兼容性好,不好的地方是ie会产生一个没用的碎片对象。 而innerHTML的好处是不会产生多余的碎片对象,方便高效,但在ie被移除的元素基本不能再用,有兼容性问题。 那就可以根据需要使用不同的方法了,至于防止内存泄漏用那个好,感觉是innerHTML,但没有更深入研究的话还说不清楚。 使用技巧 一般来preview方法都是在onchange中调用,即选择文件后立即显示预览。 在不需要程序时最好执行一次dispose方法来销毁程序,防止内存泄漏等。 利用ImagePreview.TRANSPARENT可以显示透明图片,而不需另外隐藏或增加文件。 第二个实例中的ResetFile是用来重置file控件的,详细参考这里file的reset。 而file控件样式设置详细参考这里的file样式。 asp版本使用Persits.Jpeg组件缩放图片,测试请先安装该组件。 使用说明 实例化时,有两个必要参数,分别是file控件对象和img元素的预览显示对象: new ImagePreview( file, img ); 可选参数用来设置系统的默认属性,包括: 属性: 默认值//说明 mode: ImagePreview.MODE,//预览模式 ratio: 0,//自定义比例 maxWidth: 0,//缩略图宽度 maxHeight: 0,//缩略图高度 onCheck: function(){},//预览检测时执行 onShow: function(){},//预览图片时执行 onErr: function(){},//预览错误时执行 以下在remote模式时有效 action: undefined,//设置action timeout: 0//设置超时(0为不设置) 如果要使用remote模式必须设置一个action。 还提供了以下方法: preview:执行预览操作; dispose:销毁程序。

2015-10-13

commons-httpclient-3.1jar包

commons-httpclient-3.1jar包,有需要的请下载 本资料共包含以下附件: commons-httpclient-3.1jar包.rar

2015-09-17

java利用htmlparser抓取网页数据

可以直接运行。java利用htmlparser抓取网页数据

2015-09-17

微信订阅号java源码

导入整个工程到eclipse, 压缩包里面有hellochat.war文件部署到百度bae云平台下即可 接口配置信息 url:http://tomcat886.duapp.com/coreServlet Token:weixin 整理本源代码实现基于群主柳峰的博客http://blog.csdn.net/lyq8479/article/details/8944988 他讲的已经很详细了, 有兴趣的可以去他的博客看看。

2015-08-04

微信图书馆查书助手项目源码(java)

微信图书馆查书助手java版项目源码。使用java语言 + EasyWechat框架 开发

2015-08-04

WeiXin调试工具

微信开发本地调试工具(模拟微信客户端)微信部署需要依靠80端口,如何快速有效的调试本地微信开发程序

2015-08-04

springMvc整合源码

本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子

2015-03-12

Android高仿微信源码

Android 完美高仿的微信源码,Android 学习/入门的好代码,界面不错

2015-03-12

办公自动化系统oa

企业提供一个安全、稳定、高效、易用而快捷的网络办公环境,系统集成了包括内部电子邮件、短信息、日程安排、通讯录、考勤管理、网络硬盘、讨论区、投票、 聊天室、人事档案、工资管理、办公用品、会议管理、 车辆管理、图书管理、CRM、电话区号查询、邮政编码查询、法律法规查询、万年历、世界时间、等数十个极具价值的oa系统功能模块

2014-05-05

百度编辑器

百度编辑器很强大的,用着很牛的,赶快来下载使用吧

2014-02-22

Spring+Hibernate+Struts2整合开发

Spring+Hibernate+Struts2整合开发

2014-02-18

WebpageCaptureDemo

WebpageCaptureDemo

2014-02-18

hql批量删除

批量删除数据批量插入数据 9.4.4 直接通过JDBC API来进行批量操作 当通过JDBC API来执行SQL insert、update和delete语句时,SQL语句中涉及到的数据不会被加载到内存中,因此不会占用内存空间。 以下程序直接通过JDBC API来执行用于批量更新的SQL语句:

2014-01-24

struts2.0_zh

Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到用广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点: MVC 2模型的使用 功能齐全的标志库(Tag Library) 开放源代码

2014-01-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除