jQuery实现滚动条一直处于最底部

相信大家有时候在展示一些实时数据展示并且数据量很大的时候,因为无法在同一页面看到最有效的数据,所以我们需要将滚动条至于底部,以便我们看到最需要的数据和信息;这里很明显的例子那拿windows的ping来说吧,当我们长ping的时候,这时候数据会越来越多,而且还是累加的,新数据又全部在后面,所以这个时候让滚动条一直处于底部就大有作为了!

大伙可以看一下,在windows的cmd中执行ping 地址 -t,这时候就会一直ping,刚开始的时候,数据可能比较小,同一屏就能看到

但时间一长,数据就越来越多,同一屏根本就无法看到,而且最有效的数据都在最底部,所以这个时候我们应该看到的是底部最想看到的数据

只要我们把滚动条处于底部,就达到我们的效果了!!!好啦,不多说了,先给大家看一下小实例,是以textarea和div来做的demo:

<textarea id="testScroll1" style="width:300px; height: 200px;border: 1px #ccc solid; resize:none;"></textarea>
<div id="testScroll2" style="width:300px; height: 200px;border: 1px #ccc solid; overflow-y: scroll;float: left;"></div>
<input type="button" value="Start" onclick="start();">
<input type="button" value="Stop" onclick="stop();">

这是我们需要的那个模拟的html元素,接下来才是关键:

var count = 1000;
function start(){
	$("#testScroll1").html('');
	$("#testScroll2").html('');
	timeBox = setInterval(function(){
		$("#testScroll1").append('number:['+count+']--->I Love You\n')
		var scrollTop = $("#testScroll1")[0].scrollHeight;
		$("#testScroll1").scrollTop(scrollTop);
		$("#testScroll2").append('number:['+count+']--->I Love You<br/>')
		$("#testScroll2").scrollTop($("#testScroll2")[0].scrollHeight);
		count--;
		if(count == 0){
			clearInterval(timeBox);
			count = 1000;
		}
	},1000);
}

function stop(){
	count = 1000;
	clearInterval(timeBox);
}

demo中的细节没有处理,还有请各位见谅,各位理解意思就行了,总结起来就是一句话:

$("#dom_id").scrollTop($("#dom_id")[0].scrollHeight);

这里提醒一下各位,如果效果没有出来,请注意元素是否超找对了!

展示效果给大伙儿看看:

是我们想要的效果吧!谢谢大家的关注!

转载至:http://blog.csdn.net/luo201227/article/details/38385003

发表在 Java | 留下评论

你真的了解“程序猿”吗?

为什么你说“就差一个码农了”,我们是拒绝的

        根本原因是 90% 这么说的人不懂技术,不了解行业,把技术实现想太简单,以为编程就是打字。分开来说包括以下 4 个方面:不尊重程序员、不只缺一个、大大低估投入、还没到需要程序员的时候。

不尊重程序员

        要一起共事的基础是相互尊重,古语讲“礼贤下士”是有道理的,人才需要得到相应的尊重,但是很多人在发“就差一个码农”招人帖时是不注意这一点的。

        如果你需要一个程序员,而你招人的标题真的是“我们就差一个码农了”,那多半大家看了标题就会来喷的,“码农”这个称呼可以是程序员自谦或自嘲用,但是直接这么称呼一个优秀的程序员是不合适的(除非很熟),就像母校是你可以骂一千遍却不许别人骂一遍,“码农”就是程序员自己可以自称一千遍,其他人却不能直呼一遍。

        很多人会说这没什么吧,玩笑都开不起么,俏皮一点不好么,是,我们喜欢活泼,但是不喜欢撒泼。别的行业也一样,比如“设计师”不喜欢被叫做“美工”,“发型师”不喜欢被叫做“剃头的”等等。

        还有一种更加不尊重的行为――不尊重一个优秀程序员的才华,表现在当一个优秀的程序员根据自己丰富的经验和深厚的技术功底给出报价,并好心给出建议的时候,需求方会有如下言行:

                第一,由于不懂技术会不认真考虑建议,会说“那这个你看着办,应该可以”,也不转告给团队里懂技术的,即自我主义强,不懂倾听;

                第二,会用一些廉价的对比来讨价还价,会说“这个不复杂吧,要价高了点吧?如果外包给 XX 做,毛几K就可以”,那你倒是去找啊,你要知道一个优秀的程序员是可以顶十个程序员的,不要去拿三流技术的价去辱没拥有一流技术的人。

        还有就是很多需求帖子找程序员和找蓝翔技工一样,认为自己做好的东西已经很完善了,就差开发这一丢丢的工作了,总认为自己做得是核心,程序员就是工具,帖子里首先夸耀一番目前团队已经做好的,然后点出“由于我们几个都是 XX 方向或者 XX 专业,不懂技术,所以来找一位技术大牛,就差你了 balabala”,字里行间表现出自己做好了饺子,就差醋了,实际上是醋已经备好,我的饺子呢?

        曾经有技术人员帮助一个团队做挑战杯项目的网站,然后做好后由于人数限制人家认为他做的东西不是核心就把他踢出了团队。但也不是说这样的就都有问题,只是大部分是这样的。

        所以,尊重是第一步,你的言行只有尊重程序员,程序员才会尊重你的需求。

不止缺一个

        很多帖子里真的有这样的字眼“就”、“一个”,可是仔细去了解下,我的亲娘,哪里是就差一个兵啊,简直是就差一个团。

        大部分人以为程序员都该是全栈的,甚至全能的。不知道一个项目要分前后端,不懂为什么需要做 API,这样的人占了一部分(现在占比不大,以前这部分人居多),常规思维就是“所见即所得”,网站和 APP 就是设计好这些图片用代码放放上去,那一个程序员应该很容易很快做好啊。

        曾经有人需要做一个 APP,找了一个程序员来做,但是他真的以为他就差一个程序员,其他界面设计啊、交互设计啊都没的,不过看在项目简单,该程序员答应了,于是花了一个晚上画了一张交互设计图纸给他看,结果他一直以为做出来就是那样的,还怀疑人家水平。

        不过现在由于互联网的普及,更多的人是知道前后端,知道一些开发最基本的东西,但是依旧以为“因为自己的项目简单,所以再找一个程序员就够了”或者“这个不会也没事,你们学起来应该很快的吧”,他们的项目其实从技术角度都是有野心的项目,需要架构师、分析师、开发人员、测试、运维等等一个军团,但实际他们以为他们就需要一个会编程的,至少项目(看上去)不复杂啊。

        互联网产品毕竟很多东西是不那么实实在在的,盖一栋大楼,这栋楼多高多大是实实在在感受得到的,但是互联网产品不懂行的人是不知道里面信息的交互、整体的架构等复杂度的,盖大楼的 BOSS 不会傻到说“我就差两搬砖的了”。

        所以在发布需求前,不妨请懂技术的朋友帮助评估到底需要哪几方面的人才,自己不知道不要拍脑瓜,不灵的。

大大低估投入

        “这个都要 2 个月,呵呵”,“这一个外包要 5 万?!就几个页面啊!”,“只要你做得好,价钱不是问题,8 千到毛一万可以谈的嘛”…诸如这样的我们经历或者听说过好多了,很多发“我们就差一个码农”的都想找到一个活好的技术然后快速地开发出来,再给一点劳务费么好了。

        这就是大部分这类帖子的作者常犯的低估投入的问题,这里的投入包括时间和报酬。

        这个其实真的看需求方对于项目的要求有多高了,你真的只要随便一点的,去猪八戒网,去威客网,去去去,几百块一个项目大家都抢,感谢猪八戒,感谢威客,哈哈。

        但大部分都要求活要好,价要“合理”。一个做外包的团队给出现在这样的行情:

  • A要找人做一个知乎网站,预算 1w 到 3w,B报价 3w,承诺 40 天,C报价 5k,承诺 30 天,然后出来一个D报价 1k,承诺 50 天,结果A找了D
  • B想: 3w 只是为了吸引你,这种项目没有 10w 根本不可能做
  • C想: 5k 还算合理,等我拿到钱就给你下载一些模板,然后修改修改
  • D想: 1k 我也能赚,下载一个模板,然后就完了

        但事后呢?

        你想做成啥样的,你就要付怎样的代价,“就差一个码农”并不能让你花 50 块买到 LV,只会买到贴着 LV 标志的人造革。

还没到需要程序员的时候

        你的项目到了需要程序员的时候么就要“差程序员”了?

        一些招程序员的项目说是说“现在万事齐备,就差开发了”,但是看一些备好的万事,会发现,就只有 idea,只有文档,没有数据,没有思考,没有实际调研资料,全是拍出来的脑浆,流出来的水。

        你的 idea 真的有效么?解决了哪类问题呢?用户喜欢么,需要么?市场足够大么?能有商业模式么?技术上有可能实现么?核心优势是什么呢?天花板有多高?现在竞品发展如何呢?…

        这些都还没搞明白,你说什么“就差一个程序员开发了,就差技术合伙人了”呢?靠谱的项目才会吸引靠谱的程序员。

小建议

    对于需求方:

        懂得尊重,搞清楚目前自己项目的进展,做好技术实现之前的工作,提出招人不要像玩儿似的,讲明白自己情况,说清楚需要怎样的人才,然后给人才合理的时间和合理的报酬,做小生意的关注怎么降下眼前成本,做大生意的关注怎么放大长远利益。

    对于程序员:

        不是所有的“就差一个码农”都是找喷的,毕竟还有 10% 是真的差的,但是在喷“就差一个码农”的同学中 90% 是看热闹的,是来纯粹调侃的,就算给足够报酬也是做不下来的,所以提升自己的技术,避免自己是那 90%,而后再去教那 90% 的“就差一个码农”的同学怎么做事吧,你懂的。

文章摘自码农网

转载至:http://blog.csdn.net/luo201227/article/details/45716171

发表在 Java | 留下评论

Google的Java常用类库 Guava

Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。

1. 基本工具 [Basic utilities]
    让使用Java语言变得更舒适
    1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服。很多Guava工具类用快速失败拒绝null值,而不是盲目地接受
    1.2 前置条件: 让方法中的条件检查更简单
    1.3 常见Object方法: 简化Object方法实现,如hashCode()和toString()
    1.4 排序: Guava强大的”流畅风格比较器”
    1.5 Throwables:简化了异常和错误的传播与检查

2. 集合[Collections]
    Guava对JDK集合的扩展,这是Guava最成熟和为人所知的部分
    2.1 不可变集合: 用不变的集合进行防御性编程和性能提升。
    2.2 新集合类型: multisets, multimaps, tables, bidirectional maps等
    2.3 强大的集合工具类: 提供java.util.Collections中没有的集合工具
    2.4 扩展工具类:让实现和扩展集合类变得更容易,比如创建Collection的装饰器,或实现迭代器

3. 缓存[Caches]
    Guava Cache:本地缓存实现,支持多种缓存过期策略

4. 函数式风格[Functional idioms]
    Guava的函数式支持可以显著简化代码,但请谨慎使用它

5. 并发[Concurrency]
    强大而简单的抽象,让编写正确的并发代码更简单
    5.1 ListenableFuture:完成后触发回调的Future
    5.2 Service框架:抽象可开启和关闭的服务,帮助你维护服务的状态逻辑

6. 字符串处理[Strings]
    非常有用的字符串工具,包括分割、连接、填充等操作

7. 原生类型[Primitives]
    扩展 JDK 未提供的原生类型(如int、char)操作, 包括某些类型的无符号形式

8. 区间[Ranges]
    可比较类型的区间API,包括连续和离散类型

9. I/O
    简化I/O尤其是I/O流和文件的操作,针对Java5和6版本

10. 散列[Hash]
    提供比Object.hashCode()更复杂的散列实现,并提供布鲁姆过滤器的实现

11. 事件总线[EventBus]
    发布-订阅模式的组件通信,但组件不需要显式地注册到其他组件中

12. 数学运算[Math]
    优化的、充分测试的数学工具类

13. 反射[Reflection]
    Guava 的 Java 反射机制工具类

具体资源下载地址:http://download.csdn.net/detail/luo201227/7207227

转载至:http://blog.csdn.net/luo201227/article/details/34844591

发表在 Java | 留下评论

JavaScript实现公历转换农历

相信有人会在页面中中选择日期时,需要知道选择日期的农历!如果是Java的话,在后台一下子就可以给转换掉,但是页面上,通过JavaScript来转换的话,不知道大伙儿有没有好的想法呢?刚好,前一段时间来,朋友问了这么一个问题,然后就写了一个demo给她,还行吧!希望能帮到有需要的各位,好啦,直接上代码,不想闲扯:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>mydate.jsp</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<link rel="stylesheet" type="text/css" href="My97DatePicker/skin/WdatePicker.css">
	
	<style type="text/css">
		body {
			font-family: 微软雅黑;
			font-size: 14px;	
		}
		
	</style>
	
	<script type="text/javascript" src="My97DatePicker/calendar-converter.js"></script>
	<script type="text/javascript" src="My97DatePicker/WdatePicker.js"></script>
	<script type="text/javascript" src="jQuery/jquery-1.6.js"></script>
  </head>
  
  <body>
  	<div id="calendar">
		<div id="showCalendar"></div>
		<div><span id="showSolarCalendar"></span>[<span id="showLunarCalendar"></span>]</div>
  	</div>
  </body>
  
	<script type="text/javascript">
		function getLunarCalendar(date){
			var cc  = new CalendarConverter;
			var result = cc.solar2lunar(date);
			return result.cYear + "(" + result.lunarYear + ")年" + (result.isLeap?"闰":"") + result.lunarMonth + "月" + result.lunarDay + " " + result.lunarFestival + " 星期" + result.week;
		}
		
		var nowDate = new Date();
		document.getElementById('showSolarCalendar').innerHTML = nowDate.getFullYear() + "-" + (nowDate.getMonth() + 1) + "-" + nowDate.getDate();
		document.getElementById('showLunarCalendar').innerHTML = getLunarCalendar(nowDate);
		WdatePicker({
			eCont:'showCalendar',
			onpicked:function(dp){
				document.getElementById('showSolarCalendar').innerHTML = dp.cal.getDateStr();
				document.getElementById('showLunarCalendar').innerHTML = getLunarCalendar(new Date(dp.cal.getDateStr()));
			}
		});
	</script>
</html>

代码就已经贴上了,关键这里有一个js:calendar-converter.js,主要是用来公历转换农历的!附上该资源下载地址:http://download.csdn.net/download/luo201227/7616913

最后给大伙儿贴上几张效果图:

1:

2:

3:


转载至:http://blog.csdn.net/luo201227/article/details/37657477

发表在 Java | 留下评论

利用tomcat服务器配置https双向认证

首先请保证已经安装好jdk,并且环境变量以及配置好了

第一步、为服务器生成证书:

        使用toolkey为tomcat生成证书,假定目标机器的域名为localhost,使用如下命令生成:keytool ?genkey ?v ?aliaslocalhost_server RSA ?keystore localhost_server.store  ?validity 36500

第二步、为客户端生成证书:

       为浏览器生成证书,以便让服务器来验证它。为了能保证证书顺利导入至IE和Firefox,证书格式应该是PKCS12,因此,使用如下命令生成:keytool ?genkey ?v ?aliaslocalhost_client ?keyalg RSA ?storetype PKCS12 ?keystore localhost_client.p12。这样就产生了localhost_client.p12文件,我们只需双击localhost_client.p12文件,即可将证书导入到浏览器(客户端)。

第三步、让服务器信任客户端证书:

       由于是双向的SSL认证,服务器必须信任客户端证书,因此,必须要把客户端证书添加为服务器的信任证书。由于不能直接将PKCS12格式的证书导入,必须先把客户端证书导出为一个单独的CER文件,使用如下命令:keytool ?export ?aliaslocalhost_client?keystore localhost_client.p12 ?storetype ?storepass 123456 ?rfc?file localhost_trust.cer。下一步,是将该文件导入到服务器的证书库,添加一个信任证书,使用如下命令:keytool
?import ?v ?filelocalhost_trust.cer ?keystore localhost_server.store

通过list命令查看服务器的证书库,可以看到有两个证书,一个是服务器的证书,一个是受信任的客户端证书。

第四步、让客户端信任服务器证书:

       由于是双向SSL认证,客户端也要验证服务器证书,因此,必须把服务器证书添加到浏览器的“受信任的根证书颁发机构”。由于不能直接将keystore格式的证书库导入,必须先把服务器证书导出为一个单独的CER文件,使用如下命令:keytool ?keystorelocalhost_server.store ?export ?alias localhost_server ?file localhost_trust.cer。这样就产生了locahost_server.cer文件,我们只需双击localhost_server.cer文件,按照提示安装证书,将证书填入到“受信任的根证书颁发机构”。

第五步、配置tomcat服务器

       打开tomcat根目录下的/conf/server.xml,找到Connector port=“8443”配置段,修改为如下:

<Connectorport="8443"protocol="org.apache.coyote.http11.Http11NioProtocol"

SSLEnabled="true"maxThreads="150" scheme="https"

secure="true"clientAuth="true" sslProtocol="TLS"

keystoreFile="conf/localhost_server.keystore " keystorePass="123456"

truststoreFile="conf/localhost_server.keystore " truststorePass="123456" />

或者

<Connectorport="8443" protocol="HTTP/1.1" SSLEnabled="true"

               maxThreads="150"scheme="https" secure="true"

               clientAuth="false"sslProtocol="TLS"

               keystoreFile="conf/localhost_server.keystore"keystorePass="123456"

               truststoreFile="conf/localhost_server.keystore"truststorePass="123456"/>

(tomcat要与生成的服务端证书名一致)

属性说明:

clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证

keystoreFile:服务器证书文件路径

keystorePass:服务器证书密码

truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书

truststorePass:根证书密码

第六步、测试:

       在浏览器中输入:https://localhost:8443/,会弹出选择客户端证书界面,点击“确定”,会进入tomcat主页,地址栏后会有“锁”图标,表示本次会话已经通过HTTPS双向验证,接下来的会话过程中所传输的信息都已经过SSL信息加密。

最后给大家看看效果图,免得大家觉得有问题:

转载至:http://blog.csdn.net/luo201227/article/details/36897387

发表在 Java | 留下评论

JAXB完成XML与Java对象的互转

这段时间都老忙了,甚至连周末所有人员都在赶产品的进度,想想连续上12天班,人都有点晕了!到这会儿终于有点时间,所以准备和大家分享一下JAXB,会不会有人觉得有点陌生呢?没事,这里跟大伙儿简单的描述一下:

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

基本知识就说这么多,咱们来点实际的,准备上代码了:

/**
 * @Description: 
 *
 * @Title: Student.java
 * @Package com.joyce.bean
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-10 下午02:51:41
 * @version V2.0
 */
package com.joyce.bean;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @Description: 学生实体类
 * 
 * @ClassName: Student
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-6-10 下午02:51:41
 * @version V2.0
 */
@XmlRootElement(name="Student")
public class Student {
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 性别
	 */
	private String sex;
	/**
	 * 年龄
	 */
	private Integer age;

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	@XmlAttribute
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the sex
	 */
	public String getSex() {
		return sex;
	}

	/**
	 * @param sex
	 *            the sex to set
	 */
	@XmlElement
	public void setSex(String sex) {
		this.sex = sex;
	}

	/**
	 * @return the age
	 */
	public Integer getAge() {
		return age;
	}

	/**
	 * @param age
	 *            the age to set
	 */
	@XmlElement
	public void setAge(Integer age) {
		this.age = age;
	}

	/**
	 * @param name
	 * @param sex
	 * @param age
	 */
	public Student(String name, String sex, Integer age) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	/**
	 * 
	 */
	public Student() {
		super();
	}
}

再来一个:

/**
 * @Description: 
 *
 * @Title: Teacher.java
 * @Package com.joyce.bean
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-10 下午04:29:23
 * @version V2.0
 */
package com.joyce.bean;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @Description: 教师实体类
 * 
 * @ClassName: Teacher
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-6-10 下午04:29:23
 * @version V2.0
 */
@XmlRootElement(name="Teacher")
public class Teacher {
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 性别
	 */
	private String sex;
	/**
	 * 年龄
	 */
	private Integer age;
	/**
	 * 学生
	 */
	private List<Student> students;

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	@XmlElement
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the sex
	 */
	public String getSex() {
		return sex;
	}

	/**
	 * @param sex
	 *            the sex to set
	 */
	@XmlElement
	public void setSex(String sex) {
		this.sex = sex;
	}

	/**
	 * @return the age
	 */
	public Integer getAge() {
		return age;
	}

	/**
	 * @param age
	 *            the age to set
	 */
	@XmlElement
	public void setAge(Integer age) {
		this.age = age;
	}

	/**
	 * @return the students
	 */
	public List<Student> getStudents() {
		return students;
	}

	/**
	 * @param students
	 *            the students to set
	 */
	@XmlElement(name="Student")
	public void setStudents(List<Student> students) {
		this.students = students;
	}

	/**
	 * 
	 */
	public Teacher() {
		super();
	}

	/**
	 * @param name
	 * @param sex
	 * @param age
	 */
	public Teacher(String name, String sex, Integer age) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	/**
	 * @param name
	 * @param sex
	 * @param age
	 * @param students
	 */
	public Teacher(String name, String sex, Integer age, List<Student> students) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.students = students;
	}
}

哈哈,这两个对象一出来,是不是感觉很熟悉呢!对的,我们这里封装对象,为后面实现Java对象和XML的转换提供很好的基础。OK,关键代码要来了哈:

/**
 * @Description: 
 *
 * @Title: JAXBUtil.java
 * @Package com.joyce.util
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-10 下午02:54:40
 * @version V2.0
 */
package com.joyce.util;

import java.io.ByteArrayOutputStream;
import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

/**
 * @Description:JAXB对象和XML转换util
 * 
 * @ClassName: JAXBUtil
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-6-10 下午02:54:40
 * @version V2.0
 */
public class JAXBUtil {
	
	/**
	 * @Description: 将对象转换为XML
	 *
	 * @param obj
	 * @param beanClass
	 * @return
	 * @throws Exception
	 *
	 * @Title: JAXBUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-6-10 下午04:23:45
	 * @version V2.0
	 */
	@SuppressWarnings("unchecked")
	public String objectToXmlStr(Object obj, Class beanClass) throws Exception {
		JAXBContext context = JAXBContext.newInstance(beanClass);
		// 根据上下文获取marshaller对象
		Marshaller marshaller = context.createMarshaller();
		// 设置编码字符集
		marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
		// 格式化XML输出,有分行和缩进
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
		// 打印到控制台
		marshaller.marshal(obj, System.out);

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		marshaller.marshal(obj, baos);
		String xmlObj = new String(baos.toByteArray());
		return xmlObj.replace(" standalone=\"yes\"", "");
	}
	
	/**
	 * @Description: 将对象转换为XML并且写入文件
	 *
	 * @param obj
	 * @param beanClass
	 * @param file
	 * @throws Exception
	 *
	 * @Title: JAXBUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-6-10 下午04:24:13
	 * @version V2.0
	 */
	@SuppressWarnings("unchecked")
	public void objectToXmlStr(Object obj, Class beanClass, File file) throws Exception {
		JAXBContext context = JAXBContext.newInstance(beanClass);
		// 根据上下文获取marshaller对象
		Marshaller marshaller = context.createMarshaller();
		// 设置编码字符集
		marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
		// 格式化XML输出,有分行和缩进
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
		// 打印到控制台
		marshaller.marshal(obj, System.out);
		marshaller.marshal(obj, file);
	}
	
	/**
	 * @Description: XML转换为对象
	 *
	 * @param <T>
	 * @param file
	 * @param beanClass
	 * @return
	 * @throws Exception
	 *
	 * @Title: JAXBUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-6-10 下午04:24:50
	 * @version V2.0
	 */
	@SuppressWarnings("unchecked")
	public <T> T xmlStrToObject(File file, Class<T> beanClass) throws Exception {
		T bean = beanClass.newInstance();
		JAXBContext context = JAXBContext.newInstance(beanClass);
		Unmarshaller unmarshaller = context.createUnmarshaller();
		bean = (T) unmarshaller.unmarshal(file);
		return bean;
	}
}

这其实都是Java中的基础,没事的时候都可以看看Java的源码和Jdk API等等,会看到你可能想都没有想过的东西!马上上测试类:

/**
 * @Description: 
 *
 * @Title: JAXBTest.java
 * @Package com.joyce.test
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-10 下午03:04:05
 * @version V2.0
 */
package com.joyce.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.joyce.bean.Student;
import com.joyce.bean.Teacher;
import com.joyce.util.JAXBUtil;

/**
 * @Description: 测试类
 *
 * @ClassName: JAXBTest
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-10 下午03:04:05
 * @version V2.0
 */
public class JAXBTest {
	public static void main(String[] args) {
		try {
			Teacher teacher = new Teacher("JuanJuan", "女", 22);
			Student student = new Student("Joyce.Luo", "男", 21);
			Student student2 = new Student("Phang.Law", "男", 18);
			JAXBUtil util = new JAXBUtil();
			List<Student> stuList = new ArrayList<Student>();
			stuList.add(student);
			stuList.add(student2);
			teacher.setStudents(stuList);
			String xmlTeaStr = util.objectToXmlStr(teacher, Teacher.class);
			System.out.println("\n包含集合的对象转换为XML:\n" + xmlTeaStr);
			String xmlStr = util.objectToXmlStr(student, Student.class);
			System.out.println("\n对象转换为XML:\n" + xmlStr);
			
			File file = new File("str.xml");
			System.out.println("文件是否存在:" + file.exists());
//			util.objectToXmlStr(student, Student.class, file);
			Student stu = util.xmlStrToObject(file, Student.class);
			System.out.println("\nXML转换为对象:\n" + stu.getName() + "\t" + stu.getSex() + "\t" + stu.getAge());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

结果展示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Teacher>
    <age>22</age>
    <name>JuanJuan</name>
    <sex>女</sex>
    <Student name="Joyce.Luo">
        <age>21</age>
        <sex>男</sex>
    </Student>
    <Student name="Phang.Law">
        <age>18</age>
        <sex>男</sex>
    </Student>
</Teacher>

包含集合的对象转换为XML:
<?xml version="1.0" encoding="UTF-8"?>
<Teacher>
    <age>22</age>
    <name>JuanJuan</name>
    <sex>女</sex>
    <Student name="Joyce.Luo">
        <age>21</age>
        <sex>男</sex>
    </Student>
    <Student name="Phang.Law">
        <age>18</age>
        <sex>男</sex>
    </Student>
</Teacher>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Student name="Joyce.Luo">
    <age>21</age>
    <sex>男</sex>
</Student>

对象转换为XML:
<?xml version="1.0" encoding="UTF-8"?>
<Student name="Joyce.Luo">
    <age>21</age>
    <sex>男</sex>
</Student>

文件是否存在:true

XML转换为对象:
Joyce.Luo	男	21

各位有什么好建议,欢迎提哦!完整资源下载地址:
http://download.csdn.net/download/luo201227/7505479

转载至:http://blog.csdn.net/luo201227/article/details/31374849

发表在 Java | 留下评论

基于Linux环境Tomcat-MySQL的服务器搭建

在开发日趋激烈的今天,我们可不能再只会编码了,这样搞不好,就成了一辈子的码奴!所以这里简单的分享一下服务器的搭建,由于Linux的安全性等一切因素让它成为了服务器平台的首选环境!今天跟大家分享的是Java项目的服务器搭建,好啦,步骤来了:

1、下载jdk

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

2、下载tomcat

wget
http://apache.etoak.com/tomcat/tomcat-7/v7.0.42/bin/apache-tomcat-7.0.42.tar.gz

3、解压jdk和tomcat

mkdir /nac/www
mkdir /nac/www
cd  /nac/www
tar zxvf jdk-7u25-linux-i586.gz  
tar zxvf apache-tomcat-7.0.42.tar.gz

chmod ?R 755  /nac

mv jdk1.7.0_25/  jdk
mv apache-tomcat-7.0.42  tomcat 

4、配置环境变量

vi /etc/profile
export JAVA_HOME=/nac/www/jdk
export PATH=$JAVA_HOME/bin:$JRE_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$LCASSPATH
export CATALINA_HOME=/nac/www/tomcat
export CLASSPATH=.:$JAVA_HOME/lib:$CATALINA_HOME/lib
export PATH=$PATH:$CATALINA_HOME/bin

刷新配置
source /etc/profile

5、修改*.sh权限和执行脚本

cd /apache-tomcat/bin/
chmod 777 *.sh
bash catalina.sh start

bash /apache-tomcat/bin/catalina.sh start

6、修改iptables

vi /etc/sysconfig/iptables

在里面添加

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT    //添加mysql
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT    //添加tomcat

7、修改mysql和tomcat开机启动

Chkconfig mysqld on
 Chkconfig mysqld ?list  检查开机启动
修改vi /etc/rc.d/rc.local
/apache-tomcat/bin/catalina.sh start

8、添加mysql的用户名和密码

Mysql ?u root

GRANT ALL PRIVILEGES ON *.* TO hupu@"%" IDENTIFIED BY 'hupu' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO hupu@localhost IDENTIFIED BY 'hupu' WITH GRANT OPTION;



GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY 'root' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'root' WITH GRANT OPTION;

9、在浏览器输入服务器的ip:8080,如下:“10.10.2.221:8080”,

当看到这里页面的时候,说明一切都ok了,就这样可以运行部署Java项目的服务器就搭建好了!

转载至:http://blog.csdn.net/luo201227/article/details/32111067

发表在 Java | 留下评论

在Eclipse/MyEclipse中安装spket插件

Spket ide是强大的工具包为了JavaScript和XML的开发,这个强大的编辑器对JavaScript, XUL/XBLand Yahoo! Widget的开发都有全面的支持 ,例如代码完成,语法高亮和内容概要,帮助开发有成效,创造高效率的javascript代码。

小巧的身躯,强大杀伤力,足以具备紫色装备的特点。

这款利器,专门为 使用 Ext, killer级的AjaxUI设计开发人员配备。

spket是一个开发JavaScript和Ext等的开发工具,它可以 是独立的IDE,也可以作为Eclipse/MyEclipse的插件使用,下面介绍如何在Eclipse/MyEclipse中安装spket插件:

1、上官网 http://www.spket.com 中下载spket包,我这里下载的是:spket-1.6.23,为了避免有些人无法访问国外网站而下载不了资源,这里把本人的资源下载地址也链接上:spket-1.6.23

2、解压spket-1.6.23.zip会看到一个spket-1.6.23文件夹,下面有plugins和features两个文件夹,将这skpet-1.6.23文件夹拷到Eclipse/MyEclipse安装包下的dropins文件夹中;

3、启动Eclipse/MyEclipse,在 window中打开preferences,在左边会看到Spket,

4、打开Spket下的JavaScript Profile,里面并没有Ext,点击 New,添加Ext

5、点击Ext,选择右边的Add Library,选择 ExtJS,会出现

6、6.选中ExtJS,选择右边的Add File,找到ext包中的source文件夹下的 sdk.jsb3,或者*.jsb*此类文件

7、这时会出现很到包,我是全选了,然后将ExtJs默认(default),点击ok就安装好了,

8、当你最后看到是如下的效果就正确了

基本的配置就介绍到这里了!

转载至:http://blog.csdn.net/luo201227/article/details/34095015

发表在 Java | 留下评论

Google的Guava之Collection升华

至于Guava这个这里就不多说了,上一篇已经讲得很详细了!这次主要是分享一下Guava对集合的一些升华处理,好啦,不多说,直接上代码:

package com.joyce.guava.bean;

/**
 * 学生实体类
 * 
 * @author Joyce.Luo
 * @date 2014-6-19 下午02:37:19
 */
public class Student {
	/**
	 * 学号
	 */
	private Integer stuId;
	/**
	 * 姓名
	 */
	private String stuName;
	/**
	 * 年龄
	 */
	private Integer stuAge;

	/**
	 * @return the stuId
	 */
	public Integer getStuId() {
		return stuId;
	}

	/**
	 * @param stuId
	 *            the stuId to set
	 */
	public void setStuId(Integer stuId) {
		this.stuId = stuId;
	}

	/**
	 * @return the stuName
	 */
	public String getStuName() {
		return stuName;
	}

	/**
	 * @param stuName
	 *            the stuName to set
	 */
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}

	/**
	 * @return the stuAge
	 */
	public Integer getStuAge() {
		return stuAge;
	}

	/**
	 * @param stuAge
	 *            the stuAge to set
	 */
	public void setStuAge(Integer stuAge) {
		this.stuAge = stuAge;
	}

	/**
	 * 
	 */
	public Student() {
		super();
	}

	/**
	 * @param stuId
	 * @param stuName
	 * @param stuAge
	 */
	public Student(Integer stuId, String stuName, Integer stuAge) {
		super();
		this.stuId = stuId;
		this.stuName = stuName;
		this.stuAge = stuAge;
	}
}

实体类有了,主要是为了在集合中使用提供方便!关键在于:

/**
 * @Description: 
 *
 * @Title: SetGuava.java
 * @Package com.joyce.guava.main
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 上午11:03:53
 * @version V2.0
 */
package com.joyce.guava.main;

import java.util.Collections;
import java.util.List;
import java.util.Map;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.BiMap;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.MutableClassToInstanceMap;
import com.google.common.collect.Ordering;
import com.google.common.collect.Table;
import com.joyce.guava.bean.Student;

/**
 * @Description: Guava的集合
 * 
 * @ClassName: SetGuava
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-6-26 上午11:03:53
 * @version V2.0
 */
public class SetGuava {
	public static void main(String[] args) {
		/**
		 * Guava API 提供了有用的新的集合类型, 协同已经存在的java集合工作的很好。 分别是 Multimap, Multiset,
		 * Table, BiMap, ClassToInstanceMap
		 */
		System.out.println("Multimap:一种key可以重复的map,子类有ListMultimap和SetMultimap,对应的通过key分别得到list和set");
		testMultimap();
		System.out.println("Multiset:不是集合,可以增加重复的元素,并且可以统计出重复元素的个数");
		testMulitiset();
		System.out.println("Table:相当于有两个key的map");
		testTable();
		System.out.println("BiMap: 是一个一一映射,可以通过key得到value,也可以通过value得到key");
		testBitMap();
		System.out.println("ClassToInstanceMap:map的key并不是只是一种类型");
		testClassToInstanceMap();
		System.out.println("排序,是guava一份非常灵活的比较类,可以被用来操作,扩展,当作比较器,排序提供了集合排序的很多控制 ");
		testOrder();
	}

	/**
	 * @Description: Multimap:一种key可以重复的map,子类有ListMultimap和SetMultimap,对应的通过key分别得到list和set
	 * 
	 * 
	 * @Title: SetGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 上午11:19:50
	 * @version V2.0
	 */
	private static void testMultimap() {
		Multimap<String, Student> customersByType = ArrayListMultimap.create();
		customersByType.put("abc", new Student(1, "Joyce", 20));
		customersByType.put("abc", new Student(1, "Joyce One", 20));
		customersByType.put("abc", new Student(1, "Joyce Two", 20));
		customersByType.put("abc", new Student(1, "Joyce Three", 20));
		customersByType.put("abcd", new Student(1, "Joyce Four", 20));
		customersByType.put("abcde", new Student(1, "Joyce Five", 20));
		System.out.println(customersByType.get("abc").size());
		for (Student stu : customersByType.get("abc")) {
			System.out.println(stu.getStuName());
		}
	}

	/**
	 * @Description: Multiset:不是集合,可以增加重复的元素,并且可以统计出重复元素的个数
	 * 
	 * 
	 * @Title: SetGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 上午11:19:59
	 * @version V2.0
	 */
	private static void testMulitiset() {
		Multiset<Integer> multiSet = HashMultiset.create();
		multiSet.add(10);
		multiSet.add(30);
		multiSet.add(30);
		multiSet.add(40);
		System.out.println(multiSet.count(30)); // 2 -- 统计XX出现的次数
		System.out.println(multiSet.size()); // 4 -- 元素的个数
	}

	/**
	 * @Description: Table:相当于有两个key的map
	 * 
	 * 
	 * @Title: SetGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 上午11:24:43
	 * @version V2.0
	 */
	private static void testTable() {
		Table<Integer, Integer, Student> personTable = HashBasedTable.create();
		personTable.put(1, 20, new Student(1, "46546", 20));
		personTable.put(0, 30, new Student(2, "46546", 30));
		personTable.put(0, 25, new Student(3, "46546", 25));
		personTable.put(1, 50, new Student(4, "46546", 50));
		personTable.put(0, 27, new Student(5, "46546", 27));
		personTable.put(1, 29, new Student(6, "46546", 29));
		personTable.put(0, 38, new Student(7, "46546", 38));
		personTable.put(1, 66, new Student(8, "46546", 66));

		// 得到行集合
		Map<Integer, Student> rowMap = personTable.row(0);
		Integer rowMax = Collections.max(rowMap.keySet());
		System.out.println(rowMax);
	}

	/**
	 * @Description: BiMap: 是一个一一映射,可以通过key得到value,也可以通过value得到key
	 * 
	 * 
	 * @Title: SetGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 上午11:36:59
	 * @version V2.0
	 */
	private static void testBitMap() {
		// 双向map
		BiMap<Integer, String> biMap = HashBiMap.create();
		biMap.put(1, "hello");
		biMap.put(2, "helloa");
		biMap.put(3, "world");
		biMap.put(4, "worldb");
		biMap.put(5, "my");
		biMap.put(6, "myc");
		// 通过key取value
		String value = biMap.get(5);
		System.out.println("key -- [5] ; value -- [" + value + "]");
		// 通过value取key
		Integer key = biMap.inverse().get("my");
		System.out.println("value -- [my] ; key -- [" + key + "]");
	}

	/**
	 * @Description: ClassToInstanceMap:有的时候,你的map的key并不是一种类型,他们是很多类型,你想通过映射他们得到这种类型,
	 *               guava提供了ClassToInstanceMap满足了这个目的。
	 * 
	 *               除了继承自Map接口,ClassToInstaceMap提供了方法 T getInstance(Class<T>) 和
	 *               T putInstance(Class<T>, T),消除了强制类型转换。
	 * 
	 *               该类有一个简单类型的参数,通常称为B,代表了map控制的上层绑定,例如:
	 *               ClassToInstanceMap<Number> numberDefaults =
	 *               MutableClassToInstanceMap.create();
	 *               numberDefaults.putInstance(Integer.class,
	 *               Integer.valueOf(0));
	 * 
	 *               从技术上来说,ClassToInstanceMap<B> 实现了Map<Class<? extends B>,
	 *               B>,或者说,这是一个从B的子类到B对象的映射,这可能使得ClassToInstanceMap的泛型轻度混乱,
	 *               但是只要记住B总是Map的上层绑定类型,通常来说B只是一个对象。 guava提供了有用的实现,
	 *               MutableClassToInstanceMap 和 ImmutableClassToInstanceMap.
	 *               重点:像其他的Map<Class,Object>,ClassToInstanceMap
	 *               含有的原生类型的项目,一个原生类型和他的相应的包装类可以映射到不同的值;
	 * 
	 * 
	 * 
	 * @Title: SetGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 上午11:42:52
	 * @version V2.0
	 */
	private static void testClassToInstanceMap() {
		ClassToInstanceMap<Student> classToInstanceMap = MutableClassToInstanceMap.create();
		Student stu = new Student(1, "Joyce", 20);
		classToInstanceMap.putInstance(Student.class, stu);
		Student stuObj = classToInstanceMap.getInstance(Student.class);
		System.out.println(stuObj.getStuName());
	}
	
	/**
	 * @Description:排序,是guava一份非常灵活的比较类,可以被用来操作,扩展,当作比较器,排序提供了集合排序的很多控制 
	 *
	 *
	 * @Title: SetGuava.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-6-26 上午11:49:30
	 * @version V2.0
	 */
	private static void testOrder(){
		List<Integer> numberList = Lists.newArrayList(30, 20, 60, 80, 10);
		System.out.println(Ordering.natural().sortedCopy(numberList)); //10,20,30,60,80
		System.out.println(Ordering.natural().reverse().sortedCopy(numberList)); //80,60,30,20,10
		System.out.println(Ordering.natural().min(numberList));//10
		System.out.println(Ordering.natural().max(numberList));//80
		numberList =  Lists.newArrayList(30, 20, 60, 80, null, 10);
		System.out.println(Ordering.natural().nullsLast().sortedCopy(numberList));//10, 20,30,60,80,null
		System.out.println(Ordering.natural().nullsFirst().sortedCopy(numberList));//null,10,20,30,60,80
	}
}

效果如图:

相信大家伙对上面的代码如果理解深入了的话,会明白了的!!!其实Guava在集合上面还提供了其他方法,这里就不一一分享了,有兴趣的大伙儿可以自己是私底下去好好研究一下!Guava资源下载地址:http://download.csdn.net/detail/luo201227/7207227,附上本人demo资源下载地址:http://download.csdn.net/download/luo201227/7581845!!!Ok,今天就到这里了!下次有机会再跟大家分享一下Guava中的其它升华。。。

转载至:http://blog.csdn.net/luo201227/article/details/34856603

发表在 Java | 留下评论

Google的Guava之IO升华

程序猿在开发过程中,使用文件的几率是相当大的,有时候,我们甚至需要几十秒内读取一下IO流中的数据,但是原生态的文件流的读写,一旦操作不当,就有可能出现内存溢出和打开文件数过多的异常错误,这一点在Linux环境下表现得尤其突出,所以使用好原生态的读写文件流真的很重要!好啦,这里着重来讲一下Google的Guava对IO的操作升级,上一篇讲的Guava对Collection的优化,魅力之处尽在不言中了!Ok,咱就上代码了!这里使用文件来做Demo:

/**
 * @Description: 
 *
 * @Title: FileGuava.java
 * @Package com.joyce.guava.main
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午01:18:18
 * @version V2.0
 */
package com.joyce.guava.main;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.google.common.base.Charsets;
import com.google.common.io.Files;

/**
 * @Description:Guava的文件
 * 
 * @ClassName: FileGuava
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-6-26 下午01:18:18
 * @version V2.0
 */
public class FileGuava {
	public static void main(String[] args) {
		try {
			File readFile = new File(System.getProperty("user.dir") + "/src/resources/showarp.txt");
			StringBuilder content = new StringBuilder();
			if (readFile.exists()) {
				List<String> lines = readFile(readFile);
				for (String string : lines) {
					System.out.println(string);
					content.append(string + "\n");
				}
			}
			File writeFile = new File(System.getProperty("user.dir") + "/src/resources/showarp" + new SimpleDateFormat("yyyyMMdd").format(new Date())+ ".txt");
			writeFile(content.toString(), writeFile);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Description: Guava文件读取
	 * 
	 * @param file
	 * @return
	 * 
	 * @Title: FileGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午01:20:50
	 * @version V2.0
	 */
	private static List<String> readFile(File file) throws Exception {
		if (!file.exists()) {
			return null;
		}
		return Files.readLines(file, Charsets.UTF_8);
	}
	
	/**
	 * @Description: 从文件中获取有规则的数据 
	 *
	 * @param file
	 * @return
	 *
	 * @Title: FileGuava.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午01:56:42
	 * @version V2.0
	 */
	public List<String[]> readFileData(File file) throws Exception {
		List<String[]> list = new ArrayList<String[]>();
		for (String rLine : readFile(file)) {
			list.add(rLine.split("\\s+"));
		}
		return list;
	}

	/**
	 * @Description: Guava写文件
	 * 
	 * @param content
	 * @param file
	 * 
	 * @Title: FileGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午01:32:06
	 * @version V2.0
	 */
	private static void writeFile(String content, File file) throws Exception {
		if (!file.exists()) {
			file.createNewFile();
		}
		Files.write(content, file, Charsets.UTF_8);
	}
}

文件中的内容为:

代码执行后的效果:

并且将内容写到了另外一个文件中,用起来是不是很easy呢!

这领域真的是好东西特别多,就看大伙儿肯不肯动手动脑多学学!!!附上本人资源下载地址:http://download.csdn.net/download/luo201227/7581845

转载至:http://blog.csdn.net/luo201227/article/details/36413279

发表在 Java | 留下评论

任务调度开源框架Quartz动态添加、修改和删除定时任务

        Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。并且还能和Spring配置整合使用。Quartz在功能上远远超越了JDK自带的Timer,很好很强大!好啦,直接上代码:

/**
 * @Description: 
 *
 * @Title: QuartzManager.java
 * @Package com.joyce.quartz
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:15:52
 * @version V2.0
 */
package com.joyce.quartz;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @Description: 定时任务管理类
 * 
 * @ClassName: QuartzManager
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:15:52
 * @version V2.0
 */
public class QuartzManager {
	private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
	private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
	private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";

	/**
	 * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
	 * 
	 * @param jobName
	 *            任务名
	 * @param cls
	 *            任务
	 * @param time
	 *            时间设置,参考quartz说明文档
	 * 
	 * @Title: QuartzManager.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午03:47:44
	 * @version V2.0
	 */
	@SuppressWarnings("unchecked")
	public static void addJob(String jobName, Class cls, String time) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类
			// 触发器
			CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组
			trigger.setCronExpression(time);// 触发器时间设定
			sched.scheduleJob(jobDetail, trigger);
			// 启动
			if (!sched.isShutdown()) {
				sched.start();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description: 添加一个定时任务
	 * 
	 * @param jobName
	 *            任务名
	 * @param jobGroupName
	 *            任务组名
	 * @param triggerName
	 *            触发器名
	 * @param triggerGroupName
	 *            触发器组名
	 * @param jobClass
	 *            任务
	 * @param time
	 *            时间设置,参考quartz说明文档
	 * 
	 * @Title: QuartzManager.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午03:48:15
	 * @version V2.0
	 */
	@SuppressWarnings("unchecked")
	public static void addJob(String jobName, String jobGroupName,
			String triggerName, String triggerGroupName, Class jobClass,
			String time) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类
			// 触发器
			CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组
			trigger.setCronExpression(time);// 触发器时间设定
			sched.scheduleJob(jobDetail, trigger);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
	 * 
	 * @param jobName
	 * @param time
	 * 
	 * @Title: QuartzManager.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午03:49:21
	 * @version V2.0
	 */
	@SuppressWarnings("unchecked")
	public static void modifyJobTime(String jobName, String time) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);
			if (trigger == null) {
				return;
			}
			String oldTime = trigger.getCronExpression();
			if (!oldTime.equalsIgnoreCase(time)) {
				JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);
				Class objJobClass = jobDetail.getJobClass();
				removeJob(jobName);
				addJob(jobName, objJobClass, time);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description: 修改一个任务的触发时间
	 * 
	 * @param triggerName
	 * @param triggerGroupName
	 * @param time
	 * 
	 * @Title: QuartzManager.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午03:49:37
	 * @version V2.0
	 */
	public static void modifyJobTime(String triggerName,
			String triggerGroupName, String time) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);
			if (trigger == null) {
				return;
			}
			String oldTime = trigger.getCronExpression();
			if (!oldTime.equalsIgnoreCase(time)) {
				CronTrigger ct = (CronTrigger) trigger;
				// 修改时间
				ct.setCronExpression(time);
				// 重启触发器
				sched.resumeTrigger(triggerName, triggerGroupName);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
	 * 
	 * @param jobName
	 * 
	 * @Title: QuartzManager.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午03:49:51
	 * @version V2.0
	 */
	public static void removeJob(String jobName) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器
			sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
			sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description: 移除一个任务
	 * 
	 * @param jobName
	 * @param jobGroupName
	 * @param triggerName
	 * @param triggerGroupName
	 * 
	 * @Title: QuartzManager.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午03:50:01
	 * @version V2.0
	 */
	public static void removeJob(String jobName, String jobGroupName,
			String triggerName, String triggerGroupName) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器
			sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器
			sched.deleteJob(jobName, jobGroupName);// 删除任务
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description:启动所有定时任务
	 * 
	 * 
	 * @Title: QuartzManager.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午03:50:18
	 * @version V2.0
	 */
	public static void startJobs() {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			sched.start();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description:关闭所有定时任务
	 * 
	 * 
	 * @Title: QuartzManager.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午03:50:26
	 * @version V2.0
	 */
	public static void shutdownJobs() {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			if (!sched.isShutdown()) {
				sched.shutdown();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

以上就是quartz任务调度对于任务的常用操作,封装起来以便在外部调用!这样我们就需要任务的执行了:

/**
 * @Description: 
 *
 * @Title: QuartzJob.java
 * @Package com.joyce.quartz
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:37:11
 * @version V2.0
 */
package com.joyce.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @Description: 任务执行类
 *
 * @ClassName: QuartzJob
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:37:11
 * @version V2.0
 */
public class QuartzJob implements Job {

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ "★★★★★★★★★★★");  
	}
}

Ok,我们来测试一下:

/**
 * @Description: 
 *
 * @Title: QuartzTest.java
 * @Package com.joyce.quartz.main
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:35:05
 * @version V2.0
 */
package com.joyce.quartz.main;

import com.joyce.quartz.QuartzJob;
import com.joyce.quartz.QuartzManager;

/**
 * @Description: 测试类
 *
 * @ClassName: QuartzTest
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:35:05
 * @version V2.0
 */
public class QuartzTest {
	public static void main(String[] args) {
		try {
			String job_name = "动态任务调度";
			System.out.println("【系统启动】开始(每1秒输出一次)...");  
			QuartzManager.addJob(job_name, QuartzJob.class, "0/1 * * * * ?");  
			
			Thread.sleep(5000);  
			System.out.println("【修改时间】开始(每2秒输出一次)...");  
			QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");  
			Thread.sleep(6000);  
			System.out.println("【移除定时】开始...");  
			QuartzManager.removeJob(job_name);  
			System.out.println("【移除定时】成功");  
			
			System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");  
			QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");  
			Thread.sleep(60000);  
			System.out.println("【移除定时】开始...");  
			QuartzManager.removeJob(job_name);  
			System.out.println("【移除定时】成功");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

运行一下,看看效果图:

至于定时的配置的话,有兴趣的各位可以去看看Quartz的cron表达式,这里就不给大伙儿介绍了哈!问问度娘,这资料很全面地!最后来给附上本人的资源下载地址:http://download.csdn.net/download/luo201227/7603633

转载至:http://blog.csdn.net/luo201227/article/details/37511137

发表在 Java | 留下评论

String的split()方法探索和大揭秘

        其实没打算写这么一篇博文的,但是昨天在逛论坛的时候,发现一帖子,然后我又把帖子的内容在群里发了一通,结果出现了让人惊讶的结果,所以这里简单的给大家分享一下split()方法,免得大伙儿以后还会出现这种基本知识错误!

        接着说一下,昨天看到的帖子内容:

String[] str1 = ";;;".split(";");
String[] str2 = ";a;;".split(";");
String[] str3 = ";;a;".split(";");
System.out.println(str1.length);
System.out.println(str2.length);
System.out.println(str3.length);

大伙儿也可以先说说自己心里第一反应的答案是什么,记录下来,然后再慢慢得往下看,最后比一下结果!这种问题,在好多的面试过程中,面试技术的人都会问这种很具有代表性的基础知识!

如果大家经常看jdk api的话,这种问题应该不会犯错!

public String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。 
该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。 

例如,字符串 "boo:and:foo" 使用这些表达式可生成以下结果: 

Regex 结果 
: { "boo", "and", "foo" } 
o { "b", "", ":and:f" } 


参数:
regex - 定界正则表达式 
返回:
字符串数组,它是根据给定正则表达式的匹配拆分此字符串确定的 
抛出: 
PatternSyntaxException - 如果正则表达式的语法无效

这里面已经介绍的很清楚了,不知道有没有细心的人发现了这句很重要的话!

最终的结果是:

str1的长度是:0

str2的长度是:2

str3的长度是:3

你的答案对了吗?这里不多说了,答案就在“所得数组中不包括结尾空字符串”,自个慢慢理解一下!

转载至:http://blog.csdn.net/luo201227/article/details/37563503

发表在 Java | 留下评论

Java使用LdAP获取AD域用户

随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下!

先简单的讲讲AD域和LdAP目录访问协议:AD(active directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的服务器称为DC域控制器,存储整个域的对象的信息并周期性更新!其中的对象分为三大类――资源(如印表机)、服务(如电子邮件)、和人物(即帐户或用户,以及组)。 

LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址被使用,不过根据组织者的需要,它可以做得更加强大。
LDAP其实是一个电话簿,类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络目录,也类似于你在花园中所看到的树木。

不少LDAP开发人员喜欢把LDAP与关系数据库相比,认为是另一种的存贮方式,然后在读性能上进行比较。实际上,这种对比的基础是错误的。LDAP和关系数据库是两种不同层次的概念,后者是存贮方式(同一层次如网络数据库,对象数据库),前者是存贮模式和访问协议。LDAP是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言SQL属同一级别。LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。AD域和LdAP目录访问协议就介绍到这里!下面来看看简单的demo吧!

/**
 * @Description: 
 *
 * @Title: LdAPTest.java
 * @Package com.joyce.itext.main
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-8-7 上午10:20:22
 * @version V2.0
 */
package com.joyce.itext.main;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

/**
 * @Description:拉取AD域账户
 * 
 * @ClassName: LdAPTest
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-8-7 上午10:20:22
 * @version V2.0
 */
public class LdAPTest {
	public static void main(String[] args) {
		Properties env = new Properties();
		String adminName = "administrator@2003.com";//username@domain
		String adminPassword = "admin";//password
		String ldapURL = "LDAP://10.10.2.153:389";//ip:port
		env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.SECURITY_AUTHENTICATION, "simple");//"none","simple","strong"
		env.put(Context.SECURITY_PRINCIPAL, adminName);
		env.put(Context.SECURITY_CREDENTIALS, adminPassword);
		env.put(Context.PROVIDER_URL, ldapURL);
		try {
			LdapContext ctx = new InitialLdapContext(env, null);
			SearchControls searchCtls = new SearchControls();
			searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
			String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
			String searchBase = "DC=2003,DC=com";
			String returnedAtts[] = {"memberOf"};
			searchCtls.setReturningAttributes(returnedAtts);
			NamingEnumeration<SearchResult> answer = ctx.search(searchBase, searchFilter,searchCtls);
			while (answer.hasMoreElements()) {
				SearchResult sr = (SearchResult) answer.next();
				System.out.println("<<<::[" + sr.getName()+"]::>>>>");
			}
			ctx.close();
		}catch (NamingException e) {
			e.printStackTrace();
			System.err.println("Problem searching directory: " + e);
		}
	}
}

以上就是从AD域上拉取域账号!当然现在Java还有许多其他的jar也能操作AD域,这里不就不多介绍了,有兴趣的同伴可以去百度、谷歌!最后给大伙儿看看效果图:

还想多说一句,其实Java原生态的API老好了,所以能用原生态的最好,因为别人提供的jar包如果没有处理好的话,还不如原生态的呢!感谢大家的关注

转载至:http://blog.csdn.net/luo201227/article/details/38419285

发表在 Java | 留下评论

关于Ldap对AD域账户的增删改查

今天心情很不爽,不扯别的啦,来讲讲Ldap对AD域账户的操作吧!至于Ldap和ad今天就不做详细解释了,有兴趣的朋友可以看看上一篇博文,里面有详细的介绍!直接上代码:

/**
 * @Description: 
 *
 * @Title: LdapByUser.java
 * @Package com.joyce.ad
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-8-8 上午10:39:35
 * @version V2.0
 */
package com.joyce.ad;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;

/**
 * @Description:
 * 
 * @ClassName: LdapByUser
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-8-8 上午10:39:35
 * @version V2.0
 */
public class LdapByUser {
	DirContext dc = null;
	String root = "DC=2003,DC=com"; // LDAP的根节点的DC
	
	/**
	 * @Description: 程序主入口
	 *
	 * @param args
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-11 上午10:27:15
	 * @version V2.0
	 */
	public static void main(String[] args) {
		LdapByUser ldap = new LdapByUser();
//		ldap.delete("CN=涛涛,OU=研发部,DC=2003,DC=com");
//		ldap.renameEntry("CN=joyce.luo,OU=test,DC=2003,DC=com", "CN=joyce.luo,OU=研发部,DC=2003,DC=com");
		SearchResult sr = ldap.searchByUserName(ldap.root, "joyce.luo");
		System.out.println(sr.getName());
//		ldap.modifyInformation(sr.getName(), "test");
		ldap.searchInformation(ldap.root);
		ldap.close();
	}
	
	/**
	 * 
	 */
	public LdapByUser() {
		super();
		init();
	}

	/**
	 * @Description: Ldap连接
	 *
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:32:15
	 * @version V2.0
	 */
	public void init() {
		Properties env = new Properties();
		String adminName = "administrator@2003.com";// username@domain
		String adminPassword = "admin";// password
		String ldapURL = "LDAP://10.10.2.153:389";// ip:port
		env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.SECURITY_AUTHENTICATION, "simple");// "none","simple","strong"
		env.put(Context.SECURITY_PRINCIPAL, adminName);
		env.put(Context.SECURITY_CREDENTIALS, adminPassword);
		env.put(Context.PROVIDER_URL, ldapURL);
		try {
			dc = new InitialLdapContext(env, null);
			System.out.println("认证成功");
		} catch (Exception e) {
			System.out.println("认证失败");
			e.printStackTrace();
		}
	}
	
	/**
	 * @Description:关闭Ldap连接 
	 *
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:31:44
	 * @version V2.0
	 */
	public void close() {
		if (dc != null) {
			try {
				dc.close();
			} catch (NamingException e) {
				System.out.println("NamingException in close():" + e);
			}
		}
	}


	/**
	 * @Description: 新增域账号
	 *
	 * @param newUserName
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:32:50
	 * @version V2.0
	 */
	public void add(String newUserName) {
		try {
			BasicAttributes attrs = new BasicAttributes();
			BasicAttribute objclassSet = new BasicAttribute("objectClass");
			objclassSet.add("sAMAccountName");
			objclassSet.add("employeeID");
			attrs.put(objclassSet);
			attrs.put("ou", newUserName);
			dc.createSubcontext("ou=" + newUserName + "," + root, attrs);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Exception in add():" + e);
		}
	}

	/**
	 * 删除
	 * 
	 * @param dn
	 */
	public void delete(String dn) {
		try {
			dc.destroySubcontext(dn);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Exception in delete():" + e);
		}
	}

	/**
	 * @Description: 重命名节点
	 *
	 * @param oldDN
	 * @param newDN
	 * @return
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:31:14
	 * @version V2.0
	 */
	public boolean renameEntry(String oldDN, String newDN) {
		try {
			dc.rename(oldDN, newDN);
			return true;
		} catch (NamingException ne) {
			System.err.println("Error: " + ne.getMessage());
			return false;
		}
	}

	/**
	 * @Description:修改 
	 *
	 * @param dn
	 * @param employeeID
	 * @return
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:31:30
	 * @version V2.0
	 */
	public boolean modifyInformation(String dn, String employeeID) {
		try {
			System.out.println("updating...\n");
			ModificationItem[] mods = new ModificationItem[1];  
			// 修改属性
			Attribute attr0 = new BasicAttribute("OU",employeeID);  
			mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr0);  
			/* 修改属性 */  
			dc.modifyAttributes(dn+",DC=2003,DC=com", mods); 
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("Error: " + e.getMessage());
			return false;
		}
	}

	/**
	 * @Description:搜索节点
	 * 
	 * @param searchBase
	 * 
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-8-8 上午11:26:49
	 * @version V2.0
	 */
	public void searchInformation(String searchBase) {
		try {
			SearchControls searchCtls = new SearchControls();
			searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
			String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
			String returnedAtts[] = { "memberOf" };
			searchCtls.setReturningAttributes(returnedAtts);
			NamingEnumeration<SearchResult> answer = dc.search(searchBase,
					searchFilter, searchCtls);
			while (answer.hasMoreElements()) {
				SearchResult sr = (SearchResult) answer.next();
				System.out.println("<<<::[" + sr.getName() + "]::>>>>");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Description: 指定搜索节点搜索制定域用户
	 * 
	 * @param searchBase
	 * @param userName
	 * @return
	 * 
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-8-8 上午11:55:25
	 * @version V2.0
	 */
	public SearchResult searchByUserName(String searchBase, String userName) {
		SearchControls searchCtls = new SearchControls();
		searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
		String searchFilter = "sAMAccountName=" + userName;
		String returnedAtts[] = { "memberOf" }; // 定制返回属性
		searchCtls.setReturningAttributes(returnedAtts); // 设置返回属性集
		try {
			NamingEnumeration<SearchResult> answer = dc.search(searchBase,
					searchFilter, searchCtls);
			return answer.next();
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("Throw Exception : " + e);
		}
		return null;
	}
}

这些代码都亲测可行,如有不懂,请留言!!!祝各位工作愉快!!!

转载至:http://blog.csdn.net/luo201227/article/details/38491385

发表在 Java | 留下评论

Java利用jcifs集成AD域用户认证

最近一段时间发现AD这东西老火了,尤其是涉及到安全这一方面的,所以AD域用户认证成了现在网络安全方面的产品必备!这里就简单的分享一下,Java通过jcifs集成AD域用户实现认证,以实现网络安全!

我们通过一个demo来看看jcifs实现SSO,SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。

第一步:把jcifs-1.3.15.jar放到tomcat的webapp目录。

第二步:在web.xml中配置:

<filter>
	<filter-name>NtlmHttpFilter</filter-name>
	<filter-class>jcifs.http.NtlmHttpFilter</filter-class>
	<init-param>
		<param-name>jcifs.http.domainController</param-name>
		<!-- 域服务器IP -->
		<param-value>10.10.2.153</param-value>
	</init-param>
	<init-param>
		<param-name>jcifs.util.loglevel</param-name>
		<!-- 日志等级 -->
		<param-value>6</param-value>
	</init-param>
	<init-param> 
		<param-name>jcifs.smb.lmCompatibility</param-name> 
		<param-value>0</param-value> 
	</init-param> 
	<init-param> 
		<param-name>jcifs.smb.client.useExtendedSecurity</param-name> 
		<param-value>false</param-value> 
	</init-param>
	<init-param>
		<param-name>jcifs.smb.client.username</param-name>
		<!-- 账号 -->
		<param-value>administrator</param-value>
	</init-param>
	<init-param>
		<param-name>jcifs.smb.client.password</param-name>
		<!-- 密码 -->
		<param-value>admin</param-value>
	</init-param> 
</filter>
<filter-mapping>
	<filter-name>NtlmHttpFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

第三步:部署重启服务,看看效果

如果不在此处输入域用户和密码并且域用户和密码不正确的话,你就无法访问到其他的数据!

转载至:http://blog.csdn.net/luo201227/article/details/38491627

发表在 Java | 留下评论

Java对Cookie的添加和查询

在Web开发过程中,难免会使用到Cookie,虽然Cookie可以被用户禁止使用,但是不可否认也是我们开发人员实现需求方法中的一点,所以这里简单的分享一下Java后台代码对Cookie的操作处理,好啦,直接上代码:

/**
 * @Description: 
 *
 * @Title: CookieUtil.java
 * @Package com.hupu.nac.util
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-1-15 上午10:17:51
 * @version V2.0
 */
package com.hupu.nac.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description: Cookie读写
 *
 * @ClassName: CookieUtil
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-1-15 上午10:17:51
 * @version V2.0
 */
public class CookieUtil {
	
	/**
	 * @Description: 添加cookie 
	 *
	 * @param response
	 * @param name
	 * @param value
	 * @param maxAge
	 * @return
	 *
	 * @Title: CookieUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-1-15 上午10:29:29
	 * @version V2.0
	 */
	public static Cookie addCookie(HttpServletResponse response,String name,String value,int maxAge){
	    Cookie cookie = new Cookie(name,value);
		cookie.setPath("/");
	    if(maxAge > 0){
	    	cookie.setMaxAge(maxAge);
	    }
	    response.addCookie(cookie);
	    return cookie;
	}
	
	/**
	 * @Description: 根据key获取Cookie对象
	 *
	 * @param request
	 * @param key
	 * @return
	 *
	 * @Title: CookieUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-1-15 上午10:29:44
	 * @version V2.0
	 */
	public static Cookie getCookieByName(HttpServletRequest request,String key){
	    Map<String,Cookie> cookieMap = readCookieMap(request);
	    if(cookieMap.containsKey(key)){
	        Cookie cookie = (Cookie)cookieMap.get(key);
	        return cookie;
	    }else{
	        return null;
	    }   
	}
	
	/**
	 * @Description: 封装Cookie读取方法
	 *
	 * @param request
	 * @return
	 *
	 * @Title: CookieUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-1-15 上午10:30:05
	 * @version V2.0
	 */
	private static Map<String,Cookie> readCookieMap(HttpServletRequest request){  
	    Map<String,Cookie> cookieMap = new HashMap<String,Cookie>();
	    Cookie[] cookies = request.getCookies();
	    if(null != cookies){
	        for(Cookie cookie : cookies){
	            cookieMap.put(cookie.getName(), cookie);
	        }
	    }
	    return cookieMap;
	}
}

这样就可以很方便我们在开发过程中后台对Cookie的调用!昨天因为客户的需求,产品进行了一次升级,为那些奋斗到凌晨的战士们致敬,不过我不是其中的一位,刚好昨天休假了!

转载至:http://blog.csdn.net/luo201227/article/details/39077143

发表在 Java | 留下评论

遍历Map的四种方式

在Java编程中,对集合遍历无时无刻不在使用,简单的写写Map遍历的几种方式:

public static void main(String[] args) {
	Map<String, String> map = new HashMap<String, String>();
	map.put("1", "value1");
	map.put("2", "value2");
	map.put("3", "value3");

	// 第一种:普遍使用,二次取值
	System.out.println("通过Map.keySet遍历key和value:");
	for (String key : map.keySet()) {
		System.out.println("key= " + key + " and value= " + map.get(key));
	}

	// 第二种
	System.out.println("通过Map.entrySet使用iterator遍历key和value:");
	Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
	while (it.hasNext()) {
		Map.Entry<String, String> entry = it.next();
		System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
	}

	// 第三种:推荐,尤其是容量大时
	System.out.println("通过Map.entrySet遍历key和value");
	for (Map.Entry<String, String> entry : map.entrySet()) {
		System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
	}

	// 第四种
	System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
	for (String v : map.values()) {
		System.out.println("value= " + v);
	}
}

转载至:http://blog.csdn.net/luo201227/article/details/44650863

发表在 Java | 留下评论

Spring3和Quartz2的应用实例

/**
 * 任务调度类
 * @author Joyce.Luo
 * @date 2015-3-31 下午03:32:04
 * @version V3.0
 * @since Tomcat6.0,Jdk1.6
 * @copyright Copyright (c) 2015
 */
public class QuartzJob {
    /**
     * 任务ID
     */
    private Integer jobId;
    /**
     * 任务名称
     */
    private String jobName;
    /**
     * 任务分组
     */
    private String jobGroup;
    /**
     * 任务状态 0禁用 1启用 2删除
     */
    private Integer jobStatus;
    /**
     * 任务运行时间表达式
     */
    private String cronExpression;
    /**
     * @return the jobId
     */
    public Integer getJobId() {
        return jobId;
    }
    /**
     * @param jobId
     *            the jobId to set
     */
    public void setJobId(Integer jobId) {
        this.jobId = jobId;
    }
    /**
     * @return the jobName
     */
    public String getJobName() {
        return jobName;
    }
    /**
     * @param jobName
     *            the jobName to set
     */
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
    /**
     * @return the jobGroup
     */
    public String getJobGroup() {
        return jobGroup;
    }
    /**
     * @param jobGroup
     *            the jobGroup to set
     */
    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }
    /**
     * @return the jobStatus
     */
    public Integer getJobStatus() {
        return jobStatus;
    }
    /**
     * @param jobStatus
     *            the jobStatus to set
     */
    public void setJobStatus(Integer jobStatus) {
        this.jobStatus = jobStatus;
    }
    /**
     * @return the cronExpression
     */
    public String getCronExpression() {
        return cronExpression;
    }
    /**
     * @param cronExpression
     *            the cronExpression to set
     */
    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }
}

import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.hupu.nac.biz.IAuthPolicyClientBiz;
/**
 * 客户端长连接断开任务调度工厂类
 * @author Joyce.Luo
 * @date 2015-3-31 下午03:38:35
 * @version V3.0
 * @since Tomcat6.0,Jdk1.6
 * @copyright Copyright (c) 2015
 */
public class LinkDisconnectQuartzJobFactory implements Job {
    private static final Logger logger = Logger.getLogger(LinkDisconnectQuartzJobFactory.class);
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        QuartzJob scheduleJob = (QuartzJob)context.getMergedJobDataMap().get("linkDisconnectJob");
        logger.info("客户端长连接断开定时任务开始执行,任务名称[" + scheduleJob.getJobName() + "]");
    }
}

import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdScheduler;

/**
 * 客户端长连接断开任务调度管理类
 * @author Joyce.Luo
 * @date 2015-3-31 下午03:42:30
 * @version V3.0
 * @since Tomcat6.0,Jdk1.6
 * @copyright Copyright (c) 2015
 */
public class LinkDisconnectQuartzManager {
    private static final Logger logger = Logger.getLogger(LinkDisconnectQuartzManager.class);
    private StdScheduler scheduler;
    
    /**
     * @param scheduler the scheduler to set
     */
    public void setScheduler(StdScheduler scheduler) {
        this.scheduler = scheduler;
    }
    
    /**
     * 初始化任务调度
     * @author Joyce.Luo
     * @date 2015-3-31 下午03:48:55
     * @version V3.0
     * @since Tomcat6.0,Jdk1.6
     * @copyright Copyright (c) 2015
     */
    public void initJob(){
        logger.info("初始化客户端长连接断开任务调度");
        QuartzJob job = new QuartzJob();
        job.setJobName("link_disconnect_job");
        job.setJobGroup("link_disconnect_group");
        job.setJobStatus(1);
        job.setCronExpression("0 0/1 * * * ?");
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (null == trigger) {
                addQuartzJob(job, trigger);
            }
        } catch (Exception e) {
            logger.error("初始化客户端长连接断开任务调度异常!" + e.getMessage(), e);
        }
    }
    
    /**
     * 向任务调度中添加定时任务
     * @param job 定时任务信息
     * @param trigger 定时调度触发器
     * @author Joyce.Luo
     * @date 2015-3-31 下午04:04:58
     * @version V3.0
     * @since Tomcat6.0,Jdk1.6
     * @copyright Copyright (c) 2015
     */
    private void addQuartzJob(QuartzJob job, CronTrigger trigger){
        logger.info("向任务调度中添加定时任务");
        try {
            JobDetail jobDetail = JobBuilder.newJob(LinkDisconnectQuartzJobFactory.class)
                .withIdentity(job.getJobName(), job.getJobGroup()).build();
            jobDetail.getJobDataMap().put("linkDisconnectJob", job);
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
            trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())
                .withSchedule(scheduleBuilder).build();
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (Exception e) {
            logger.error("向任务调度中添加定时任务异常!" + e.getMessage(), e);
        }
    }
    
    /**
     * 立即运行定时任务
     * @param job 定时任务信息
     * @author Joyce.Luo
     * @date 2015-4-20 下午02:08:41
     * @version V3.0
     * @since Tomcat6.0,Jdk1.6
     * @copyright Copyright (c) 2015
     */
    void runJob(QuartzJob job){
        logger.info("立即运行任务调度中的定时任务");
        try {
            if (null == job) {
                logger.info("定时任务信息为空,无法立即运行");
                return;
            }
            JobKey jobKey = JobKey.jobKey(job.getJobName(), job.getJobGroup());
            if(null == jobKey){
                logger.info("任务调度中不存在[" + job.getJobName() + "]定时任务,不予立即运行!");
                return;
            }
            scheduler.triggerJob(jobKey);
        } catch (Exception e) {
            logger.error("立即运行任务调度中的定时任务异常!" + e.getMessage(), e);
        }
    }
    
    /**
     * 修改任务调度中的定时任务
     * @param job 定时任务信息
     * @param triggerKey 定时调度触发键
     * @param trigger 定时调度触发器
     * @author Joyce.Luo
     * @date 2015-3-31 下午04:16:54
     * @version V3.0
     * @since Tomcat6.0,Jdk1.6
     * @copyright Copyright (c) 2015
     */
    void updateQuartzJob(QuartzJob job, TriggerKey triggerKey, CronTrigger trigger){
        logger.info("修改任务调度中的定时任务");
        try {
            if (null == job || null == triggerKey || null == trigger) {
                logger.info("修改调度任务参数不正常!");
                return;
            }
            logger.info("原始任务表达式:" + trigger.getCronExpression()
                    + ",现在任务表达式:" + job.getCronExpression());
            if (trigger.getCronExpression().equals(job.getCronExpression())) {
                logger.info("任务调度表达式一致,不予进行修改!");
                return;
            }
            logger.info("任务调度表达式不一致,进行修改");
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (Exception e) {
            logger.error("修改任务调度中的定时任务异常!" + e.getMessage(), e);
        }
    }
    
    /**
     * 暂停任务调度中的定时任务
     * @param job 定时任务信息
     * @author Joyce.Luo
     * @date 2015-4-20 下午02:22:53
     * @version V3.0
     * @since Tomcat6.0,Jdk1.6
     * @copyright Copyright (c) 2015
     */
    void pauseJob(QuartzJob job){
        logger.info("暂停任务调度中的定时任务");
        try {
            if (null == job) {
                logger.info("暂停调度任务参数不正常!");
                return;
            }
            JobKey jobKey = JobKey.jobKey(job.getJobName(), job.getJobGroup());
            if(null == jobKey){
                logger.info("任务调度中不存在[" + job.getJobName() + "]定时任务,不予进行暂停!");
                return;
            }
            scheduler.pauseJob(jobKey);
        } catch (Exception e) {
            logger.error("暂停任务调度中的定时任务异常!" + e.getMessage(), e);
        }
    }
    
    /**
     * 恢复任务调度中的定时任务
     * @param job 定时任务信息
     * @author Joyce.Luo
     * @date 2015-4-20 下午02:26:08
     * @version V3.0
     * @since Tomcat6.0,Jdk1.6
     * @copyright Copyright (c) 2015
     */
    void resumeJob(QuartzJob job){
        logger.info("恢复任务调度中的定时任务");
        try {
            if (null == job) {
                logger.info("恢复调度任务参数不正常!");
                return;
            }
            JobKey jobKey = JobKey.jobKey(job.getJobName(), job.getJobGroup());
            if(null == jobKey){
                logger.info("任务调度中不存在[" + job.getJobName() + "]定时任务,不予进行恢复!");
                return;
            }
            scheduler.resumeJob(jobKey);
        } catch (Exception e) {
            logger.error("恢复任务调度中的定时任务异常!" + e.getMessage(), e);
        }
    }
    
    /**
     * 删除任务调度中的定时任务
     * @param job 定时任务信息
     * @author Joyce.Luo
     * @date 2015-3-31 下午04:30:03
     * @version V3.0
     * @since Tomcat6.0,Jdk1.6
     * @copyright Copyright (c) 2015
     */
    void deleteJob(QuartzJob job){
        logger.info("删除任务调度中的定时任务");
        try {
            if (null == job) {
                logger.info("删除调度任务参数不正常!");
                return;
            }
            JobKey jobKey = JobKey.jobKey(job.getJobName(), job.getJobGroup());
            if(null == jobKey){
                logger.info("任务调度中不存在[" + job.getJobName() + "]定时任务,不予进行删除!");
                return;
            }
            scheduler.deleteJob(jobKey);
        } catch (Exception e) {
            logger.error("删除任务调度中的定时任务异常!" + e.getMessage(), e);
        }
    }
    
    /**
     * 删除任务调度定时器
     * @param triggerKey
     * @author Joyce.Luo
     * @date 2015-3-31 下午04:35:33
     * @version V3.0
     * @since Tomcat6.0,Jdk1.6
     * @copyright Copyright (c) 2015
     */
    void deleteJob(TriggerKey triggerKey){
        logger.info("删除任务调度定时器");
        try {
            if(null == triggerKey){
                logger.info("停止任务定时器参数不正常,不予进行停止!");
                return;
            }
            logger.info("停止任务定时器");
            scheduler.pauseTrigger(triggerKey);
            scheduler.unscheduleJob(triggerKey);
        } catch (Exception e) {
            logger.info("删除任务调度定时器异常!" + e.getMessage() ,e);
        }
    }
}

<bean id="linkDisconnectScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
    
<bean id="linkDisconnectQuartzManager" class="com.hupu.nac.timertask.LinkDisconnectQuartzManager" init-method="initJob">
    <property name="scheduler" ref="linkDisconnectScheduler"></property>
</bean> 

转载至:http://blog.csdn.net/luo201227/article/details/44830891

发表在 Java | 留下评论

Java汉字转拼音pinyin4j

package com.joyce.pinyin4j;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
/**
 * PinYin4j
 * @author Joyce.Luo
 * @date 2015-5-14 下午01:04:38
 * @version V3.0
 * @since Tomcat6.0,Jdk1.6
 * @copyright Copyright (c) 2015
 */
public class PinyinUtil {
	public static void main(String[] args) {
		String str1 = PinyinUtil.toPinyinString('张');
		System.out.println("chinese char --> " + str1);
		String str2 = PinyinUtil.toPinyinString('c');
		System.out.println("english char --> " + str2);
		String str3 = PinyinUtil.toPinyinString("张三");
		System.out.println("chinese string --> " + str3);
		String str4 = PinyinUtil.toPinyinString("Hello World");
		System.out.println("english string --> " + str4);
		String str5 = PinyinUtil.toPinyinString("Hi 张三,hello world!");
		System.out.println("chinese and english --> " + str5);
	}
	
	/**
	 * 获取Pinyin输出格式
	 * @return Pinyin输出格式
	 * @author Joyce.Luo
	 * @date 2015-5-14 下午01:40:10
	 * @version V3.0
	 * @since Tomcat6.0,Jdk1.6
	 * @copyright Copyright (c) 2015
	 */
	private static HanyuPinyinOutputFormat getPinyinFormat(){
		HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
		/*
		 * UPPERCASE:大写 (ZHONG)
		 * LOWERCASE:小写 (zhong)
		 */
		format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		/*
		 * WITHOUT_TONE:无音标 (zhong)
		 * WITH_TONE_NUMBER:1-4数字表示英标 (zhong4)
		 * WITH_TONE_MARK:直接用音标符(必须WITH_U_UNICODE否则异常) (zhòng)
		 */
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		/*
		 * WITH_V:用v表示ü (nv)
		 * WITH_U_AND_COLON:用"u:"表示ü (nu:)
		 * WITH_U_UNICODE:直接用ü (nü)
		 */
		format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
		
		// 返回输出格式
		return format;
	}
	
	/**
	 * 将字符转换为Pinyin
	 * 若为英文字符,则直接输出
	 * 若字符为多音字,则取第一个
	 * @param c 待转换字符
	 * @return 转换后字符串
	 * @author Joyce.Luo
	 * @date 2015-5-14 下午01:34:55
	 * @version V3.0
	 * @since Tomcat6.0,Jdk1.6
	 * @copyright Copyright (c) 2015
	 */
	public static String toPinyinString(char c) {
		HanyuPinyinOutputFormat format = PinyinUtil.getPinyinFormat();
		try {
			String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format);
			if (null == pinyin || pinyin.length < 1) {
				return String.valueOf(c);
			}
			return pinyin[0];
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 字符串转换为Pinyin
	 * @param str 待转换字符串
	 * @return 转换后字符串
	 * @author Joyce.Luo
	 * @date 2015-5-14 下午01:38:17
	 * @version V3.0
	 * @since Tomcat6.0,Jdk1.6
	 * @copyright Copyright (c) 2015
	 */
	public static String toPinyinString(String str){
		if (null == str || "".equals(str)) {
			return null;
		}
		StringBuilder sb = new StringBuilder();
		String tempPinyin = null;
		for (int i = 0; i < str.length(); i++) {
			tempPinyin = PinyinUtil.toPinyinString(str.charAt(i));
			sb.append(tempPinyin);
		}
		return sb.toString();
	}
}

转载至:http://blog.csdn.net/luo201227/article/details/46515885

发表在 Java | 留下评论

lc-archivers升级

lc-archivers

仿Discuz! Archiver, 生成一个全静态的文章存档与站点地图. Lc.Archivers 是一个纯文字版、简洁版的博客内容浏览工具。

是大神柳城写的一款非常好用的wp插件。

实际使用过程中发现还有一些小的地方可以优化。

1:无图版好是好,但是实际上对于百度来说图文并茂的文章才是百度更爱的,所以新版本图片还是加上了。

如:http://www.cadgj.com/archivers/p6791.html

2:增加了百度地图功能,方便百度蜘蛛采集。

 如:http://www.cadgj.com/archivers/sitemap_baidu.xml

下载:lc-archivers

发表在 网站建设 | 标签为 | 留下评论