yxhxj2006

常用链接

统计

最新评论

#

常见Map 及 ArrayList 是否有序总结

说明:此处的排序 是指:

1: 往集合中插入元素的顺序与遍历元素的顺序的关系;

2: 往对象中插入元素否会根据元素的大小排序

 

?
public class MapSortTest {
 
    public static void main(String[] args) {
         
        System.out.println("放入顺序为:a:aaa c:ccc b:bbb d:ddd ");
        System.out.println("HashMap 排序测试");
        Map map = new HashMap(); 
        map.put("a", "aaa");  
        map.put("c", "ccc");
        map.put("b", "bbb"); 
        map.put("d", "ddd"); 
        Iterator iterator = map.keySet().iterator(); 
        while (iterator.hasNext()) { 
            Object key = iterator.next(); 
            System.out.println("key:"+key+"         value:" + map.get(key)); 
        } 
        System.out.println("HashMap 进出无次序 ; key大小无次序 ");
        System.out.println("***********************************************************");
         
         
        System.out.println("Hashtable 排序测试");       
        Hashtable tab = new Hashtable(); 
        tab.put("a", "aaa"); 
        tab.put("c", "ccc");
        tab.put("b", "bbb");  
        tab.put("d", "ddd"); 
        Iterator iterator_1 = tab.keySet().iterator(); 
        while (iterator_1.hasNext()) { 
            Object key = iterator_1.next(); 
            System.out.println("key :"+key+"             value:"+ tab.get(key)); 
        } 
        System.out.println("Hashtable 进出无次序 ; key大小无次序 ");
        System.out.println("***********************************************************");
         
        System.out.println("TreeMap 排序测试");             
        TreeMap tmp = new TreeMap(); 
        tmp.put("a", "aaa"); 
        tmp.put("c", "ccc"); 
        tmp.put("b", "bbb"); 
        tmp.put("d", "ddd"); 
        Iterator iterator_2 = tmp.keySet().iterator(); 
        while (iterator_2.hasNext()) { 
            Object key = iterator_2.next(); 
            System.out.println("key:"+key+"          value:" + tmp.get(key)); 
        } 
        System.out.println("TreeMap 进出无次序 ; key大小从小到大 ");
        System.out.println("***********************************************************");
         
        System.out.println("LinkedHashMap 排序测试");               
        LinkedHashMap linkedHashMap = new LinkedHashMap(); 
        linkedHashMap.put("a", "aaa"); 
        linkedHashMap.put("c", "ccc"); 
        linkedHashMap.put("b", "bbb"); 
        linkedHashMap.put("d", "ddd"); 
        Iterator iterator2 = linkedHashMap.keySet().iterator(); 
        while (iterator2.hasNext()) { 
            Object key = iterator2.next(); 
            System.out.println("key:"+key+"          value:" + linkedHashMap.get(key)); 
        }       
        System.out.println("LinkedHashMap 先进先出; key大小无次序 ");
        System.out.println();
         
        System.out.println("ArrayList 排序测试");
        System.out.println("放入顺序为:aaa ccc bbb ddd");
        ArrayList arrayList=new ArrayList(); 
        arrayList.add("aaa"); 
        arrayList.add("ccc"); 
        arrayList.add("bbb"); 
        arrayList.add("ddd"); 
        System.out.println("ArrayList 先进先出;值大小无次序 ");
//      Collections.sort(arrayList); 
        for(int i=0;i<arrayList.size();i++){ 
            System.out.println(arrayList.get(i)); 
        } 
        System.out.println("***********************************************************");
    }
 
}

 

运行结果:

?
放入顺序为:a:aaa c:ccc b:bbb d:ddd 
HashMap 排序测试
key:d         value:ddd
key:b         value:bbb
key:c         value:ccc
key:a         value:aaa
HashMap 进出无次序 ; key大小无次序 
***********************************************************
Hashtable 排序测试
key :b             value:bbb
key :a             value:aaa
key :d             value:ddd
key :c             value:ccc
Hashtable 进出无次序 ; key大小无次序 
***********************************************************
TreeMap 排序测试
key:a          value:aaa
key:b          value:bbb
key:c          value:ccc
key:d          value:ddd
TreeMap 进出无次序 ; key大小从小到大 
***********************************************************
LinkedHashMap 排序测试
key:a          value:aaa
key:c          value:ccc
key:b          value:bbb
key:d          value:ddd
LinkedHashMap 先进先出; key大小无次序 
 
ArrayList 排序测试
放入顺序为:aaa ccc bbb ddd
LinkedHashMap 先进先出;值大小无次序 
aaa
ccc
bbb
ddd
***********************************************************

posted @ 2013-06-09 21:20 奋斗成就男人 阅读(2461) | 评论 (0)编辑 收藏

Apache Java项目全介绍

Apache Java项目全介绍最近接触Jakarta-Common-BeanUtils这个东东比较 多,于是对Apache Jakarta Project产生了兴趣,上他们的官方网站上看了下感觉有用的东西好多,眼花缭乱的,又没有中文网站,又上各大论坛搜了下,也没有发现一个集中该项目的资料,于是决定自己整理翻译一下,有助于各位网友更好的了解该项目。如果有什么描述不对不全面的地方,希望各位提出来给大家分享。

Jakarta项目是ASF(The Apache Software Foundation)的一部分。ASF是一个非赢利组织,她鼓励基于开放的软件许可下进行合作、注重实效的开发,并提供各个领域的高质量软件,她涉及到 Http服务器,编译工具,类库,开发架构,服务器端Java技术,J2EE容器,数据库工具,日志工具,XML解析等等诸多领域。ASF提供的java 项目有一部分在Jakarta中,还有一些成为独立的诸如Tomcat的项目,Jakarta项目则提供了多种多样开源的java解决通用方案。

先介绍一下ASF中和Jakarta项目并列的java项目: 
Ant ——java构建工具,使用一个配置文件就可以完成java的项目的,编译、打包、测试、运行、部署、生成文档等诸多工作。 
Avalon ——是一个包括核心框架、工具、组件和容器的面向组件编程(AOP)的完整开发平台。使用关键设计模式,如反向控制模式(IoC)和分离考虑模(SoC)。 Avalon提供各种基本组件和缺省的应用程序模块,帮助你快速的建立你自己的应用程序解决方案。 
Excalibur ——集多个开源项目(Avalon Framework、LogKit和Cornerstone)于一身的轻量级可嵌入式反向控制容器。 
Gump ——是Apache组织自己也使用的一个持续集成工具,全面支持Ant和Maven,当有新的改动提交到版本控制系统,它可以检查出潜在的冲突,并及时通知项目组的所有成员并自动生成改动的详细报告。 
James ——是一套用java开发的邮件、新闻组、消息服务器,提供了比较完善的配置方案,尤其是关于邮件内容存储和用户信息存储。 支持 SMTP, POP3 , NNTP , IMAP 。 
Logging ——可靠,快速的日志工具。 
Lucene ——Java开发的高性能,全方位的文本搜索引擎。替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高, Lucen提供一组解读,过 滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自已需要自订其功能。 
Maven ——是一个潜在的基于java的apache ant的构建工具的替代者。提供了更强大的功能和易用性。 
Portals ——提供了功能全面的、具有商业价值的企业门户。门户概念:门户对企业内的各种资源如信息管理系统进行整合并通过单一接口对外提供服务,雇员、合伙人及 顾客可以通过任何装置在任何地点通过门户入口享受到企业提供的服务,分析家们预计,门户将成为下一代的桌面环境。 
Struts ——一个实现MVC model2的web应用程序开发框架。通过一个配置文件可以很好的对各种组件进行装配,结构清晰,应用的最广泛的额web开发框架。
Tapestry——类似 Struts,也是一个基于servlet的应用程序框架,支持MVC,出现的较晚,不如Struts普及,主要利用javabean和xml技术进行开发, 
Tomcat ——Serlvet容器,同时具有传统的Web服务器的功能,如:处理Html页面。能够处理动静态网页。 
Watchdog ——用来检查一个servlet或jsp容器在相应规范上的执行情况的兼容性。但是该项目已经静止了,只支持Servlet2.3、JSP1.2,相应的Serlvet容器如Tomcat也只支持Tomcat4.x。  
下面介绍下Jakarta的各个子项目:

Alexandria——已经不再开发 
BCEL ——The Byte Code Engineering Library (formerly known as JavaClass) 字节码引擎类库,它让用户方便的分析,创建,操作java的class文件成为可能。 它可以让您深入 JVM 汇编语言进行类操作的细节。 
BSF ——bean脚本框架 在java应用内对脚本语言提供了支持,通过脚本语言可以访问java的对象和方法。 
Cactus ——一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。 Cactus单元测试服务端内容包括servlet,EJB, tag librarie, filter等 
Commons ——提供很多日常开发中使用率很高的功能解决方案,已被很多著名的开源项目采用。具体的项目列表后面会有。 
ECS ——使用Java语言和面向对象方法创建标记语言文档(HTML,XML)的开源项目。 
HiveMind ——是一个服务和配置的微型内核, 一套通过简单的java对象和接口创建复杂应用的框架。 
HttpComponents ——提供了java.net包所不能提供的更多强大的、方便的http协议处理功能。 
JCS ——一个分布式的缓存系统,用来提高应用程序的性能,并且提供很多强大的额外功能。 
JMeter ——纯java开发的一套桌面应用程序。用来进行功能测试和性能测试。它可以用来测试静止资料库或者活动资料库中的服务器的运行情况,可以用来模拟对服 务器或者网络系统加以重负荷以测试它的抵抗,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换的界面用来定制数据显示,测试同步及测试 的创建和执行。 
ORO ——一套文本处理工具,能提供perl5.0兼容的正则表达式、 AWK-like正则表达式, glob 表达式。还提供替换,分割,文件名过虑等功能。 
POI ——一套用来创建,读写基于OLE 2组件文档格式的文件。使用Java来读写MS Excel ,Word文件。 
Regexp ——一套纯java的正则表达式相关的包。 
Slide ——主要模块是一个可以做为内容管理框架底层的内容仓库.它可以把内容信息存取到专门的,异质的,分布式的数据库中.Slide还增加了security, locking, versioning等特性. 
Taglibs ——一套在开发web应用时十分有用的,jsp 通用 tag包。 
Turbine ——类似 Struts,也是一个基于servlet的应用程序框架,支持MVC。提供了大量可重用的组件。此框架包中包含了大量组件,但是这些组件是离散的。 
Velocity ——是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵 循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。 Velocity将 java代码从web页面中分离出来,这样为web站点的长期维护提供了便利, 同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被 当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。 Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。 
Apache java项目全介绍2

下面介绍一下Jakarta下的Commons:一个csdn网友描述得很贴切,Commons就好比一个java百宝箱。
commons分为3部分Commons Proper、Commons Sandbox和Commons Dormant。
Commons Proper:提供了设计良好可重用的java组件,并都经过了广泛、严格的测试。
Commons Sandbox:处于实验、测试阶段的组件。
Commons Dormant:处于停滞状态,从Sandbox退出的,不活跃的组件,谨慎使用。

Commons Proper组件:

Attributes—— 支持源代码级的元数据。 
BeanUtils——提供对 Java 反射和自省API的包装,处理javabean的工具。 
Betwixt——将JavaBeans与XML相互转换。 
Chain——对Chain of Responsibility(责任链)设计模式的实现。使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 
CLI——处理命令行的命令的解析。 
Codec——包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL encoder。 
Collections——扩展和增加标准的 Java Collection框架。 
Configuration——操作各种格式的配置文件。Properties文件 /XML文件 /JNDI /JDBC 数据源 /System properties /Applet parameters / Servlet parameters 
Daemon——创建类似unix守护线程的java代码,可以安全地执行一些后台操作,线程不被某个应用程序控制,而是由操作系统控制类似windows的service,可以设置一个服务依赖于另一个服务,一个服务关闭前必须先执行另一个服务。 
DBCP——一个数据库连接池 
DbUtils——一个JDBC的工具类,比如可以将ResultSets生成javabean。 
Digester——基于规则的XML文档解析,主要用于XML到Java对象的映射. 
Discovery——提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。 
EL——JSP 2.0引入的表达式 
Email——处理e-mail 
FileUpload——web应用中的文件上传组件 
HttpClient——使用HTTP协议的客户端开发框架 
IO——帮助进行IO功能开发 
Jelly ——Jelly能够把XML转换成可执行代码,所以Jelly是一个基于XML与Java的脚本和处理引擎。 Jelly借鉴了JSP定指标签,Velocity, Cocoon和Xdoclet中的脚本引擎的许多优点。Jelly可以用在命令行,Ant或者Servlet之中。 
Jexl——Jexl是一个表达式语言,通过借鉴来自于Velocity的经验扩展了JSTL定义的表达式语言。 
JXPath——使用XPath语法操作javabean的工具。 
Lang——提供对java.lang包的扩展。 
Launcher——跨平台的java程序的启动 
Logging ——提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现. 
Math——Math 是一个轻量的,自包含的数学和统计组件,解决了许多非常通用但没有及时出现在Java标准语言中的实践问题. 
Modeler—— 支持兼容JMX规范的MBeans开发。 
Net——集合了网络工具和协议工具的实现 
Pool——Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现。 
Primitives——对java原始类型的支持。 
SCXML——处理SCXML 
Transaction——事务处理,实现了多层次锁、事务集合、事务文件的访问。 
Validator——提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则。支持校验规则的和错误消息的国际化。 
VFS——访问各种文件系统,可以是本地文件、HTTP服务器上的文件、zip中的文件。 
Commons Sandbox组件:

Compress——处理压缩文件如tar, zip 和 bzip2 格式。 
CSV——处理CSV文件 
Exec——安全地处理外部进程 
Finder——实现类似UNIX find命令的功能 
I18n——处理软件的I18n功能 
Id——生成id号功能 
Javaflow——捕捉程序运行状态 
JCI——java编译接口 
OpenPGP——处理加密方法OpenPGP. 
Pipeline——处理类似工作队列的管道工具 
Proxy——生成动态代理 

posted @ 2013-05-29 23:16 奋斗成就男人 阅读(204) | 评论 (0)编辑 收藏

让HTML中的文本框中的文字垂直居中 .

当你自己定义了 Text 的 height 属性时,在 Text 中输入的文字都不是垂直居中的,不过你可以添加CSS来控制它,让输入的文字垂直居中,使网页更完美。

<html>
<head>
<style type="text/css">
    #text {
        height:20px;
        vertical-align:middle;
        line-height:20px;  /*line-height must be equal to height*/    
    }
</style>
</head>
<body>
    <table>
        <input type="text" id="text">
    </table>
</body>
</html>

加入 verticla-align、line-height 两个属性后,文本框中的文字就在文本框中垂直居中了,要注意的是 line-height 必须要等于 height 。


posted @ 2013-05-14 19:25 奋斗成就男人 阅读(6902) | 评论 (3)编辑 收藏

利用BeanUtils在对象间复制属性

commons-beanutils是jakarta commons子项目中的一个软件包,其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度(什么,你的薪水按代码行数计算?那千万别让老板看到此帖哦)

BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:

public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
  
throws java.lang.IllegalAccessException,
         java.lang.reflect.InvocationTargetException

如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值: 
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());

//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
而使用BeanUtils后,代码就大大改观了,如下所示: 
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的copyProperties()后还要加上一句: 
teacher.setModifyDate(new Date());
怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:
  • java.lang.BigDecimal
  • java.lang.BigInteger
  • boolean and java.lang.Boolean
  • byte and java.lang.Byte
  • char and java.lang.Character
  • java.lang.Class
  • double and java.lang.Double
  • float and java.lang.Float
  • int and java.lang.Integer
  • long and java.lang.Long
  • short and java.lang.Short
  • java.lang.String
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

本文地址:http://www.cnblogs.com/bjzhanghao/archive/2004/07/30/28607.html

 

posted @ 2013-05-07 01:19 奋斗成就男人 阅读(154) | 评论 (0)编辑 收藏

Java 12小时和24小时制时间format

12小时制: dff = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
24小时制: dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

posted @ 2013-04-15 14:56 奋斗成就男人 阅读(548) | 评论 (0)编辑 收藏

String、data、Calendar、Timestamp 之间的转换


String、data、Calendar、Timestamp 之间的转换 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1.Calendar 转化 String 
//获取当前时间的具体情况,如年,月,日,week,date,分,秒等 
        Calendar calendat = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(calendar.getTime());

2.String 转化Calendar
String str="2010-5-27";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date date =sdf.parse(str);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

3.Date 转化String
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
String dateStr=sdf.format(new Date());

4.String 转化Date
String str="2010-5-27";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date birthday = sdf.parse(str);

5.Date 转化Calendar
Calendar calendar = Calendar.getInstance();
calendar.setTime(new java.util.Date());

6.Calendar转化Date
Calendar calendar = Calendar.getInstance();
java.util.Date date =calendar.getTime();

7.Date 转成 String
System.out.println(sdf.format(new Date())); 
8.String 转成 Timestamp
Timestamp ts = Timestamp.valueOf("2011-1-14 08:11:00");

9.Timestamp 转成 String
sdf.format(ts);

Timestamp和Date多数用法是一样的。
10.Date 转 TimeStamp
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(new Date());
Timestamp ts = Timestamp.valueOf(time);

11.日期比较大小
String ti="2010-11-25 20:11:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date time=sdf.parse(ti);
String ti2="2011-11-26 20:11:00";
Date time2=sdf.parse(ti2);
int c=ti2.compareTo(ti);
if(c>0){
    System.out.println(ti+"大");
}else if(c==0){
    System.out.println("一样大");
}else{
    System.out.println(ti2+"大");
}

12.Date/ Timestamp 转成 Calendar 
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
calendar.add(Calendar.YEAR, 2);   //日期加2年
System.out.println(calendar.getTime());
calendar.add(Calendar.DATE, -30);     //日期加30天
System.out.println(calendar.getTime());
calendar.add(Calendar.MONTH, 3);  //日期加3个月
System.out.println(calendar.getTime());
Date date=new Date();
DateFormat df=DateFormat.getDayeInstance();
ps.setString(4,df.format(date))
Date date = new Date(); 
SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
String times = from.format(date);
public class Test1 {
public static void main(String[] args) {
  long   m=System.currentTimeMillis();
  System.out.println(new Date(m) );
}

posted @ 2013-04-15 14:38 奋斗成就男人 阅读(271) | 评论 (0)编辑 收藏

Linux面试题大全

     摘要: 一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 。 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。 3. Linux文件系统中每个文件用 i节点 来标识。 4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 i节点表块 和数据存储块。 5. 链接分为: 硬链接 和 符号链接 。 ...  阅读全文

posted @ 2013-04-01 00:57 奋斗成就男人 阅读(515) | 评论 (0)编辑 收藏

从1.5k到18k, 一个程序员的5年成长之路 .

昨天收到了心仪企业的口头offer, 回首当初什么都不会开始学编程, 到现在恰好五年. 整天在社区晃悠, 看了不少的总结, 在这个时间点, 我也写一份自己的总结吧.

我一直在社区分享, 所以, 这篇总结也是本着一种分享的态度, 希望相比我还年轻的同学们, 可以从中找到一些让自己成长更快的文字.


先介绍下背景:
1. 2008年3月开始学习编程, 目前2013年3月;
2. 2009年6月计算机专业本科毕业;
3. 大学期间, 基本稳拿班级倒数第一, 高考英语49分, 大学英语除了补考没及格过.


接着, 是一份总结:
1. 5年间60%以上的时间, 每天凌晨2-4点睡觉;
2. 为学习编程花费的总时间超过6000小时;
3. 手写了超过50万行代码;
4. 记录了超过100万字学习笔记;
5. 录制了两份视频教程;
6. 翻译了小型技术文档5份以上, 5个php扩展的官方文档, jqueryui官方文档一份, 书籍<php扩展和嵌入式>
7. 供职过4家公司;
8. 获得两次优秀员工;


下面是这几年的流水, 本人没有过硬的文采, 只是以流水的方式记录, 希望可以激励到别人, 仅此而已:

2008年03月 -- 2008年10月, 一个偶然的机会, 看到了北京尚学堂的java视频教程, 以此为起点, 我开始了自己的编程学习之路. 5月份汶川地震, 我在甘肃, 学校给通宵电, 在这段时间, 我就基本很少去学校上课了, 每天晚上学习到凌晨5-6点, 接着睡到10-11点, 每天两袋1.3元的方便面, 其余所有的时间都用来学习. 这段时间, 我学会了基本的程序设计, 更重要的是, 视频中, 马士兵老是给我灌输了影响我后来最重要的两个观念: 1) 不要怕英文, 出错信息, 文档, 都是学习英文的机会; 2) 不要怕出错, 出错就是学习的机会. 在后来的5年中, 我一直坚持, 我是从基本每个英文单词都要查翻译软件, 到现在能翻译一些东西的. 同样, 我在碰到问题的时候, 都是自己跟踪源代码去解决. 这两个观念直接决定了我今天可以进入自己心仪的企业.


2008年10月 -- 2009年1月, 这段时间, 宿舍搬到了校本部, 没有通宵电了. 学校一位老师找我们帮他做项目, 他为我们提供了他的宿舍, 很烂, 但我依然搬进去了, 就为了通宵电, 我住进了这个阴森森的宿舍, 恐惧缠绕着我, 但我依旧坚持. 白天帮老师做项目, 晚上继续自己的学习. 同样, 我也很感谢这位老师, 虽然他只给了我们很少的报酬, 但是, 我知道, 我得到的远远不是这些报酬可以比拟的. 这里这种很容易满足的心里也是很重要的, 我奉劝各位职场新人, 刚开始不要期望什么, 放低身段, 去做自己的积累就好了. (想起从社区里看到的一句话: 现在的你, 凭什么翘着二郎腿, 你应该放下你的腿, 身体前倾, 时刻保持战斗姿态)


2009年02月, 一个小插曲, 我独自一人来到北京, 开始了第一次真正意义的独立, 我来找工作. 我开始在网上投了10多份简历, 没有回信. 接着我就急了, 直接从网上找招聘的公司, 查地图, 直接去公司面试, 一般都还是会给面试机会的. 最好的成绩是一家表示能给到3000左右, 但后来也没信了. 这段时间, 我有两个收获: 1) 我打印了一整本的<Java数据结构与算法>, 20天的时间, 把基础的数据结构与算法读了一遍; 2) 在一个完全陌生的城市, 我独自一人, 查招聘信息, 查地图, 找公司, 厚颜无耻的霸王面, 这一切都是对我处世能力的极大提升.


2009年03月 -- 2009年06月, 回到学校, 仍然没有工作. 我继续在老师的小黑屋, 实现了所有我找工作时学习的数据结构与算法. 接着, 就进入了毕业季, 每天都泡在酒精中, 浑浑噩噩. 这段时间, 老婆把工作签到了山东淄博, 我也联系了一家淄博的公司, 准备毕业后去面试. 这段时间, 和高中的毕业季一样, 是值得怀念的, 放松, 惬意.


2009年06月 -- 2010年03月, 我来到了淄博, 找到了之前联系的公司, 面试没有通过. 淄博是一个小城市, 做软件开发的没有几家, 还好, 山东人好, 虽然没有面试通过, 但我依然可以借宿在公司宿舍找工作, 就这样, 我放下了所有的尊严, 在别人的宿舍借住, 15天后, 我找到了我的第一家公司. 公司有30人左右, 做国家电网的项目, 老板人很好, 我还得到了一台笔记本电脑, 并且可以带回家. 我每天加班到9点, 然后回家继续学习大凌晨2点左右. 公司的工作相对轻松, 当然, 工资也很少, 只有1.5k. 老婆每周末都过来, 我们虽然没有钱, 经常要靠吃方便面度日, 但我们很幸福. 这段时间, 我学习了python, javascript, 翻译了jqueryui的文档, 录制了一套python的视频教程, 录制了一份fullcalendar的视频教程, 我的生活非常的充实, 当然, 我还有另一个收获: 我学会了吃苦. 冬天, 我住的小屋窗户基本起不到保暖作用, 买个小电暖也起不了多少作用, 屋里水龙头都已经结冰, 我很长时间每天需要吃两包方便面, 但我依然坚持学习, 因为我知道有一天我将不再这样.


2010年03月 -- 2011年03月, 从后来很多次建议来看, 不得不说老婆很有眼光. 她建议我去北京找工作, 我请了3天假, 再一次来到了北京, 不同于上一次, 我现在有大半年经验, 我翻译过文档, 录制过视频教程, 有一定资本了. 然而, 事情并不是那么顺利, 当时期望的用友并没有通过, 在用友面试完后, 我就觉得自己一无是处. 无奈, 只能退而求其次, 来到一家刚创业的游戏公司. 跟这家公司谈完薪水后, 我先给妈妈打了电话, 5.5k, 已经到了妈妈不能相信的地步. 就这样, 我正式的踏入了北京的土地. 一年中, 我更多的是为公司付出, 自己以javascript研发进入, 后来页面制作也的我搞, php后来我也要做, 服务器我还要搞, 不得不说, 非常锻炼人. 还是前面的态度, 我觉得这种锻炼就是我最大的收获, 从这里开始, 我正式的转向php开发.到2011年3月的时候, 已经觉得公司很不行了, 又碰巧老婆怀孕, 不得不考虑结婚的事情, 因此, 我就辞职, 回家结婚.


2011年04月 -- 2012年03月, 婚后的生活很好, 我又找到了一份工作, 这家公司相对比较大, 2000+的规模. 不过有一些体制内的特质, 我进入的薪资是6k, 全年能拿到18薪以上, 公司的福利待遇都很完善, 工作也相对轻松, 我的领导人也很好, 技术也很好, 就这样, 在这家公司, 我又开始了自己的学习之路. 我继续每天凌晨2-3点睡觉, 完成了这几年最重要的积累: unix环境高级编程, unix网络编程, php内核和扩展, shell/awk/sed等等最基础的东西. 同样, 在大公司中, 我也学会了更多的团队协作, 同事关系方面的东西. 2012年03月, 公司一位副总跳槽, 就这样, 我们小组集体来到了下一家公司.


2012年03月 -- 2013年03月, 新的公司, 项目还没有上线, 已有的东西问题诸多, 我们被委以重任, 6.1日上线. 旧的团队存在诸多问题, 士气不振, 技术水平不足. 我们在6.1之前完成了很重要的几件事: 1) 提升团队士气; 2) 整理旧的框架不好的东西; 3) 修改大量的bug; 4) 规范工作流程; 5) 规划未来的技术框架. 虽然后来看做的东西一般, 但在这么短的时间完成这一切, 我觉得实在难得. 虽然我一直自我感觉对自己更多的提升是自己业余时间的学习, 但不可否认, 在这家公司的一年中, 我在团队建设, 团队管理, 团队协作方面也有了质的变化. 在这家公司, 我的薪资得到了很大的提升, 达到了18K, 这是我从来都没有想过的事情. 所以, 我想给诸位职场新人说, 你不要一开始就想要这要那, 只要你做的够好, 终有一天, 你会发现你得到的远比失去的要多.
后面这两家公司中, 我觉得更重要的是我学会了一种处世方式, 首先学会听别人说话, 然后自己做感悟, 做提升.


流水的结束, 就是在昨天, 我收到了自己心仪公司的口头offer, 并且也已经给现在的公司提出了离职. 和leader聊了一会儿, 大家都还挺开心.


在前5年中, 我用的网名是selfimpr, 是self-improvement简写而来, 含义是: 自强不息. 5年中, 我从所有可能激励我的地方去激励自己, 让自己可以一直坚持走到今天. 这几天, 我在考虑, 用一个词总结我的前5年. 我想, 这个词就是"积累".
这也正是我想给这个行业的后来者说的, "积累", 并且要是不计回报的积累, 因为你一旦太过计较回报, 你的心就很难平静, 往往就会半途而废.
此外, 还有一点要说的是, 比我基础更差的同学估计也很难找了, 所以, 能不能学有所成, 关键不在你是否有基础, 而在于你付出了多少.


接下来, 我已经更换了自己的网名goosman, 是从swan goose演化而来, 我不知道"鸿鹄"用英语怎么说, 就用了这个单词, 希望我可以像书中所说, 利用自己前5年的积累, 一展鸿鹄之志.  

posted @ 2013-03-09 01:28 奋斗成就男人 阅读(191) | 评论 (0)编辑 收藏

javamail发送邮件

今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题。为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用。呵呵 

以下三段代码是我的全部代码,朋友们如果想用,直接复制即可。jar包因为我不知道怎么传到javaeye上,所以朋友们回去自己打吧。 
我的代码有三个类: 
第一个类:MailSenderInfo.java  
package com.util.mail;
/** 
* 发送邮件需要使用的基本信息 
*/ 
import java.util.Properties; 
public class MailSenderInfo { 
// 发送邮件的服务器的IP和端口 
private String mailServerHost; 
private String mailServerPort = "25"; 
// 邮件发送者的地址 
private String fromAddress; 
// 邮件接收者的地址 
private String toAddress; 
// 登陆邮件发送服务器的用户名和密码 
private String userName; 
private String password; 
// 是否需要身份验证 
private boolean validate = false; 
// 邮件主题 
private String subject; 
// 邮件的文本内容 
private String content; 
// 邮件附件的文件名 
private String[] attachFileNames;
/** 
 * 获得邮件会话属性 
 */ 
public Properties getProperties(){ 
 Properties p = new Properties(); 
 p.put("mail.smtp.host", this.mailServerHost); 
 p.put("mail.smtp.port", this.mailServerPort); 
 p.put("mail.smtp.auth", validate ? "true" : "false"); 
 return p; 
public String getMailServerHost() { 
 return mailServerHost; 
public void setMailServerHost(String mailServerHost) { 
 this.mailServerHost = mailServerHost; 
}
public String getMailServerPort() { 
 return mailServerPort; 
}
public void setMailServerPort(String mailServerPort) { 
 this.mailServerPort = mailServerPort; 
}
public boolean isValidate() { 
 return validate; 
}
public void setValidate(boolean validate) { 
 this.validate = validate; 
}
public String[] getAttachFileNames() { 
 return attachFileNames; 
}
public void setAttachFileNames(String[] fileNames) { 
 this.attachFileNames = fileNames; 
}
public String getFromAddress() { 
 return fromAddress; 
public void setFromAddress(String fromAddress) { 
 this.fromAddress = fromAddress; 
}
public String getPassword() { 
 return password; 
}
public void setPassword(String password) { 
 this.password = password; 
}
public String getToAddress() { 
 return toAddress; 
public void setToAddress(String toAddress) { 
 this.toAddress = toAddress; 
public String getUserName() { 
 return userName; 
}
public void setUserName(String userName) { 
 this.userName = userName; 
}
public String getSubject() { 
 return subject; 
}
public void setSubject(String subject) { 
 this.subject = subject; 
}
public String getContent() { 
 return content; 
}
public void setContent(String textContent) { 
 this.content = textContent; 

第二个类:SimpleMailSender.java  
package com.util.mail;

import java.util.Date; 
import java.util.Properties;
import javax.mail.Address; 
import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

/** 
* 简单邮件(不带附件的邮件)发送器 
*/ 
public class SimpleMailSender  { 
/** 
  * 以文本格式发送邮件 
  * 
@param mailInfo 待发送的邮件的信息 
  
*/ 
    public boolean sendTextMail(MailSenderInfo mailInfo) { 
      // 判断是否需要身份认证 
      MyAuthenticator authenticator = null
      Properties pro = mailInfo.getProperties();
      if (mailInfo.isValidate()) { 
      // 如果需要身份认证,则创建一个密码验证器 
        authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); 
      }
      // 根据邮件会话属性和密码验证器构造一个发送邮件的session 
      Session sendMailSession = Session.getDefaultInstance(pro,authenticator); 
      try { 
      // 根据session创建一个邮件消息 
      Message mailMessage = new MimeMessage(sendMailSession); 
      // 创建邮件发送者地址 
      Address from = new InternetAddress(mailInfo.getFromAddress()); 
      // 设置邮件消息的发送者 
      mailMessage.setFrom(from); 
      // 创建邮件的接收者地址,并设置到邮件消息中 
      Address to = new InternetAddress(mailInfo.getToAddress()); 
      mailMessage.setRecipient(Message.RecipientType.TO,to); 
      // 设置邮件消息的主题 
      mailMessage.setSubject(mailInfo.getSubject()); 
      // 设置邮件消息发送的时间 
      mailMessage.setSentDate(new Date()); 
      // 设置邮件消息的主要内容 
      String mailContent = mailInfo.getContent(); 
      mailMessage.setText(mailContent); 
      // 发送邮件 
      Transport.send(mailMessage);
      return true
      } catch (MessagingException ex) { 
          ex.printStackTrace(); 
      } 
      return false
    } 
    
    /** 
      * 以HTML格式发送邮件 
      * 
@param mailInfo 待发送的邮件信息 
      
*/ 
    public static boolean sendHtmlMail(MailSenderInfo mailInfo){ 
      // 判断是否需要身份认证 
      MyAuthenticator authenticator = null;
      Properties pro = mailInfo.getProperties();
      //如果需要身份认证,则创建一个密码验证器  
      if (mailInfo.isValidate()) { 
        authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
      } 
      // 根据邮件会话属性和密码验证器构造一个发送邮件的session 
      Session sendMailSession = Session.getDefaultInstance(pro,authenticator); 
      try { 
      // 根据session创建一个邮件消息 
      Message mailMessage = new MimeMessage(sendMailSession); 
      // 创建邮件发送者地址 
      Address from = new InternetAddress(mailInfo.getFromAddress()); 
      // 设置邮件消息的发送者 
      mailMessage.setFrom(from); 
      // 创建邮件的接收者地址,并设置到邮件消息中 
      Address to = new InternetAddress(mailInfo.getToAddress()); 
      // Message.RecipientType.TO属性表示接收者的类型为TO 
      mailMessage.setRecipient(Message.RecipientType.TO,to); 
      // 设置邮件消息的主题 
      mailMessage.setSubject(mailInfo.getSubject()); 
      // 设置邮件消息发送的时间 
      mailMessage.setSentDate(new Date()); 
      // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象 
      Multipart mainPart = new MimeMultipart(); 
      // 创建一个包含HTML内容的MimeBodyPart 
      BodyPart html = new MimeBodyPart(); 
      // 设置HTML内容 
      html.setContent(mailInfo.getContent(), "text/html; charset=utf-8"); 
      mainPart.addBodyPart(html); 
      // 将MiniMultipart对象设置为邮件内容 
      mailMessage.setContent(mainPart); 
      // 发送邮件 
      Transport.send(mailMessage); 
      return true
      } catch (MessagingException ex) { 
          ex.printStackTrace(); 
      } 
      return false
    } 

第三个类:MyAuthenticator.java  
package com.util.mail;

import javax.mail.*;
  
public class MyAuthenticator extends Authenticator{
    String userName=null;
    String password=null;
     
    public MyAuthenticator(){
    }
    public MyAuthenticator(String username, String password) { 
        this.userName = username; 
        this.password = password; 
    } 
    protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(userName, password);
    }
}

 下面给出使用上面三个类的代码: 
public static void main(String[] args){
         //这个类主要是设置邮件
      MailSenderInfo mailInfo = new MailSenderInfo(); 
      mailInfo.setMailServerHost("smtp.163.com"); 
      mailInfo.setMailServerPort("25"); 
      mailInfo.setValidate(true); 
      mailInfo.setUserName("han2000lei@163.com"); 
      mailInfo.setPassword("**********");//您的邮箱密码 
      mailInfo.setFromAddress("han2000lei@163.com"); 
      mailInfo.setToAddress("han2000lei@163.com"); 
      mailInfo.setSubject("设置邮箱标题"); 
      mailInfo.setContent("设置邮箱内容"); 
         //这个类主要来发送邮件
      SimpleMailSender sms = new SimpleMailSender();
          sms.sendTextMail(mailInfo);//发送文体格式 
          sms.sendHtmlMail(mailInfo);//发送html格式
    }

最后,给出朋友们几个注意的地方: 
1、使用此代码你可以完成你的javamail的邮件发送功能。三个类缺一不可。 
2、这三个类我打包是用的com.util.mail包,如果不喜欢,你可以自己改,但三个类文件必须在同一个包中 
3、不要使用你刚刚注册过的邮箱在程序中发邮件,如果你的163邮箱是刚注册不久,那你就不要使用“smtp.163.com”。因为你发不出去。刚注册的邮箱是不会给你这种权限的,也就是你不能通过验证。要使用你经常用的邮箱,而且时间比较长的。 
4、另一个问题就是mailInfo.setMailServerHost("smtp.163.com");mailInfo.setFromAddress("han2000lei@163.com");这两句话。即如果你使用163smtp服务器,那么发送邮件地址就必须用163的邮箱,如果不的话,是不会发送成功的。  

posted @ 2013-03-09 01:00 奋斗成就男人 阅读(355) | 评论 (0)编辑 收藏

JAVA邮件发送的简单实现

     摘要: JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。JavaMail可以到http://www.oracle.com/technetwork/java/javamail/index-138643.html进行下载,并将ma...  阅读全文

posted @ 2013-03-09 00:29 奋斗成就男人 阅读(320) | 评论 (0)编辑 收藏

仅列出标题
共23页: First 上一页 8 9 10 11 12 13 14 15 16 下一页 Last