fkjava

BlogJava 首页 新随笔 联系 聚合 管理
  49 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

2012年5月4日 #

 

 

一般默认情况下,Eclipse的代码提示功能是比MicrosoftVisualStudio的差很多的,主要是Eclipse本身有很多选项是默认关闭的,要开发者自己去手动配置。如果开发者不清楚的话,就不知道Eclipse的代码提示功能一样能像MicrosoftVisualStudio的代码提示功能一样强大。

先举个简单的例子说明问题所在,例如在Eclipse,代码里面,打个foreachswitch等这些,是无法得到代码提示的,其他的就更不用说了,而在MicrosoftVisualStudio里面是得到非常友好的代码提示的。实际上,Eclipse代码里面的代码提示功能默认的一般是点“.”,一般是有了点“.”才会有代码提示。

 

原理:“Auto Activation triggers for java”这个选项就是指触发代码提示的的选项,把“.”改成“.abcdefghijklmnopqrstuvwxyz(,”的意思,就是指遇到26个字母和.,(这些符号就触发代码提示功能了。增强Eclipse的代码提示功能,具体怎么样来配置?下面开始说步骤:

 

1.打开Eclipse,然后“window”→“Preferences

2.选择“java”,展开,“Editor”,选择“Content Assist”。

3.选择“Content Assist”,然后看到右边,右边的“Auto-Activation”下面的“Auto Activation triggers for java”这个选项。其实就是指触发代码提示的就是“.”这个符号.

4.Auto Activation triggers for java”这个选项,在“.”后加abc字母,方便后面的查找修改。然后“apply”,点击“OK”。

5.然后,“File”→“Export”,在弹出的窗口中选择“Perferences”,点击“下一步”。

6.选择导出文件路径,本人导出到桌面,输入“test”作为文件名,点击“保存”。

7.在桌面找到刚在保存的文件“test.epf,右键选择“用记事本打开”。

8.可以看到很多配置Eclipse的信息。

9.按“ctrl+F”快捷键,输入“.abc”,点击“查找下一个”。

10.查找到“.abc”的配置信息.

11.把“.abc”改成“.abcdefghijklmnopqrstuvwxyz(,”,保存,关闭“test.epf”。

12.回到Eclipse界面,“File”→“Import”,在弹出的窗口中选择“Perferences”,点击“下一步”,选择刚在已经修改的“test.epf”文件,点击“打开”,点击“Finish”。该步骤和上面的导出步骤类似。

13.最后当然是进行代码测试了。随便新建一个工程,新建一个类。在代码输入switchforeach等进行测试。你立即会发现,果然出了提示,而且无论是敲哪个字母都会有很多相关的提示了,很流畅很方便。

 

总结:“Auto Activation triggers for java”这个选项就是指触发代码提示的的选项,把“.”改成“.abcdefghijklmnopqrstuvwxyz(,”的意思,就是指遇到26个字母和.,(这些符号就触发代码提示功能了。顺便说一下,修改类名,接口名等以不同颜色高亮的,可以这样配置在“java”→“enditor”→“syntac”,右边展开“java”→“classes”,勾上“Enable”这个选项,选择自己喜欢的颜色即可。当然还有其他相关的颜色配置。具体就不说啦。其实,在“Preferences”这个东西,有很多可以配置的东西,使得Eclipse优化的,具体的就要各个人根据自己个人喜好去配置

您正在看的文章来自疯狂软件教育中心 www.fkjava.org

信息咨询:Q564205990               星老师

posted @ 2012-09-24 15:15 疯狂软件 阅读(370) | 评论 (0)编辑 收藏

 

首先,对编码知识进行简要的说明,请务必理解后再看下面的代码。发送中文字符请求时,如果使用get方式,运行正常;而使用post方法则会出现乱码。这是由于异步对象XMLHttpRequest在处理返回的responseText的时候,是按UTF-8编码进行解码的。

如果你原来的网页编码是gb2312的话,当然会发生编码的冲突了;如果你原来的网页编码是utf-8,那么就不会出现中文乱码的问题了。

出现了中文乱码该怎么办呢?通常的解决办法是用escape()对发送的数据进行编码,然后在返回的responseText上再用unescape()进行解码。然而在JavaScript编程中通常不推荐使用escape()unescape(),而推荐使用encodeURI()decodeURI()。请看下面的“表单验证实例”,或许对你学习编码知识有一定的帮助。

 

第一、jQueryload(url,[data],[callback])方法

 

语法说明:url为异步请求的地址,data用来向服务器传送请求数据,为可选参数。一旦data参数启用,整个请求过程将以post的方式进行,否则默认为get方式。如果希望在get方式下也传递数据,可以在url地址后面用类似“dataname1=data1&dataName2=data2”的方法。

callbackAjax加载成功后运行的回调函数。另外使用load()方法返回的数据,不再需要考虑是文本还是XMLjQuery都会自动进行处理。好了,下面马上使用load()方法实现“自动表单验证”实例。首先是,html框架,5个例子都是一样的,如下:

1. <form>  

2. 用户昵称:<input type="text" onblur="startCheck(this)" name="User" id="User"><span id="UserResult"></span><br />  

3. 输入密码:<input type="password" name="passwd1"><br />  

4. 确认密码:</td><td><input type="password" name="passwd2"><br />  

5. <input type="submit" value="注册" class="button">  

6. <input type="reset" value="重置" class="button">  

7. </form> 

必要说明:

1onblur="startCheck(this)" 这是JavaScript代码(简称js) ,意思是text文本框失去焦点时触发自定义函数startCheck(),this是指代text文本框的值。

2<span id="UserResult"></span>用来存放异步对象返回的结果。

1. jQuery代码如下: 

2. 

3. <script language="javascript" src="jquery.min.js"></script>  

4. <script language="javascript">  

5. function startCheck(oInput){  

6.     //首先判断是否有输入,没有输入直接返回,并提示  

7.     if(!oInput.value){  

8.         oInput.focus(); //聚焦到用户名的输入框  

9.         document.getElementById("UserResult").innerHTML = "User cannot be empty.";  

10.         return;  

11.     }  

12.     oInput=$.trim(oInput.value); //使用jQuery$.trim()方法过滤左右空格  

13.     var sUrl = "action.asp?user=" + oInput;  

14.     sUrl=encodeURI(sUrl); //使用encodeURI()编码,解决中文乱码问题  

15.     $("#UserResult").load(sUrl,function(data){  

16.         $("#UserResult").html(decodeURI(data)); //使用decodeURI()解码  

17.         }  

18.     );  

19. }  

20. </script> 

必要说明:

1、使用jQuery时,都必须加载jquery.min.js文件,可以到http://jquery.com/官网下载最新的版本。

2、判断是否有输入时,用的全是JavaScript语法。

3、对传递给“处理页”的参数进行encodeURI编码,以解决中文乱码问题。

4load()中的function函数是为了对返回结果进行decodeURI解码,以解决中文乱码问题。

5、对$.trim()$("#UserResult")htmljQuery语法不理解的,可以参考jQuery中文手册。本站提供下载。

1. action.asp处理页代码如下: 

2. 

3. <%  

4. if(Request("user")="eko") then  

5. Response.Write "Sorry, " & Request("user") & " already exists."  

6. else  

7. Response.Write Request("user")&" is ok."  

8. end if  

9. %>

必要说明:

1action.asp处理页的编码是GB2312,如果把"Sorry..already exists..is ik"等英文改为中文,请看下面的说明。

2、使用post方法会出现乱码,这是由于异步对象XMLHttpRequest在处理返回的responseText的时候,是按UTF-8编码进行解码的。

3、所以post方式的话,必须把action.asp页另存为时,第三项的编码由 ANST 改为 UTF-8 (请务必记住!!)

 

第二、使用$.get(url,[data],[callback])$.post(url,[data],[callback])方法

 

语法说明:尽管load()方法可以实现getpost两种方式,但很多时候开发者还是希望能够指定发送方式,并且处理服务器返回的值。jQuery提供了$.get()$.post()两种方法,分别针对这两种请求方式。

其中,url为请求地址,data为请求数据的列表,是可选参数,callback为请求成功后的回调函数,该函数接受两个参数,第一个参数为服务器返回的数据,第二个参数为服务器的状态,是可选参数。$.post()中的type为请求数据的类型,可以是htmlxmljson等。 “可自动校验表单实例”的jQuery代码如下,html如上所述。

1. <script language="javascript" src="jquery.min.js"></script>  

2. <script language="javascript">  

3. function createQueryString(){  

4.     var username=$("#User").val();  

5.     //组合成对象的形式  

6.     var queryString={user:username};  

7.     return queryString;  

8.     }  

9. function startCheck(oInput){  

10.     //首先判断是否有输入,没有输入直接返回,并提示  

11.     if(!oInput.value){  

12.         oInput.focus(); //聚焦到用户名的输入框  

13.         document.getElementById("UserResult").innerHTML = "User cannot be empty.";  

14.         return;  

15.     }  

16.     oInput=$.trim(oInput.value); //使用jQuery$.trim()方法过滤左右空格  

17.     $.get("action.asp",createQueryString(),  

18.         function(data){  

19.             $("#UserResult").html(data);  

20.     });  

21. }  

22. </script>

必要说明:

1、对$.trim()$("#UserResult")htmlval()jQuery语法不理解的,可以参考jQuery中文手册。本站提供下载。

2、自定义函数createQueryString(),是对传入“处理页”的参数,进行处理。一种常规的方法。

3、因为是以get方式处理,说明这里不需要进行编码和解码。下面以post方式处理,则需要编码和解码了,代码如下

1. function createQueryString(){  

2.     //使用encodeURI()编码解决中文乱码问题  

3.     var username=encodeURI($("#User").val());  

4.     //组合成对象的形式  

5.     var queryString={user:username};  

6.     return queryString;  

7.     }  

8. function startCheck(oInput){  

9.     //首先判断是否有输入,没有输入直接返回,并提示  

10.     if(!oInput.value){  

11.         oInput.focus(); //聚焦到用户名的输入框  

12.         document.getElementById("UserResult").innerHTML = "User cannot be empty.";  

13.         return;  

14.     }  

15.     oInput=$.trim(oInput.value); //使用jQuery$.trim()方法过滤左右空格  

16.     $.post("action.asp",createQueryString(),  

17.         function(data){  

18.             $("#UserResult").html(decodeURI(data));  

19.     });  

20. }  

21. </script>

 

第三、使用$.ajax()方法

 

语法说明:尽管load()$.get()$.post()非常方便实用,但却不能控制错误和很多交互的细节,可以说这3种方法对Ajax的可控性较差。jQuery提供了一个强大的函数$.ajax(options)来设置Ajax访问服务器的各个细节,它的语法十分简单,就是设置Ajax的各个选项,然后指定相应的值。“可自动校验表单”实例代码如下:

1. <script language="javascript" src="jquery.min.js"></script>  

2. <script language="javascript">  

3. function createQueryString(){  

4.    //使用encodeURI()编码解决中文乱码问题  

5.     var username=encodeURI($("#User").val());  

6.     //组合成对象的形式  

7.     var queryString={user:username};  

8.     return queryString;  

9. }  

10. function startCheck(oInput){  

11.     //首先判断是否有输入,没有输入直接返回,并提示  

12.     if(!oInput.value){  

13.     oInput.focus(); //聚焦到用户名的输入框  

14.     document.getElementById("UserResult").innerHTML = "User cannot be empty.";  

15.     return;  

16.     }  

17.     oInput=$.trim(oInput.value); //使用jQuery$.trim()方法过滤左右空格  

18.     $.ajax({  

19.         type: "GET",  

20.         url: "action.asp",  

21.         data: createQueryString(),  

22.         success: function(data){  

23.             $("#UserResult").html(decodeURI(data));  

24.         }  

25.     });  

26. }  

27. </script>

必要说明:

1、代码基本同上,只是$.ajax(options)稍有不同,对于其参数不理解可以参考jQuery中文手册。

2、给个建议,无论是get方式还是post方式,都习惯进行编码,以防出现中文乱码的问题。

3、再强调一下,无论使用哪种程序,如果遇到问题了,都可以参考相关的手册说明,这是建站所必需的。

上面的实例使用了jQueryload()方法、$.get()$.post()$.ajax()4种方法,都要考虑中文乱码的问题,下面推荐一个方法,进一步简化jQuery代码,呵呵。

 

第四、表单插件

 

表单插件(Form Plugin)是一款功能非常强大的插件,在jQuery官方网站上目前为4星级推荐,下载后为jquery.form.js文件。该插件提供获取表单数据、重置表单项目、使用Ajax提交数据等一系列功能,深受开发人员的喜爱。使用表单插件,再次重写“表单校验实例”,完整代码如下:

1. <form id="myform" action="action.asp">  

2. 用户昵称:<input type="text" onblur="startCheck(this)" name="User" id="User"><input type="button" value=" " class="button"><span id="UserResult"></span><br />  

3. 输入密码:<input type="password" name="passwd1"><br />  

4. 确认密码:</td><td><input type="password" name="passwd2"><br /><br />  

5. <input type="submit" value="注册" class="button"><input type="reset" value="重置" class="button">  

6. </form>

HTML框架加了一个“检查”的按钮(使用手动校验的方法)jQuery如下:

1. <script language="javascript" src="jquery.min.js"></script>  

2. <script language="javascript" src="jquery.form.js"></script>  

3. <script language="javascript">  

4. function startCheck(oInput){  

5.     //首先判断是否有输入,没有输入直接返回,并提示  

6.     if(!oInput.value){  

7.         oInput.focus(); //聚焦到用户名的输入框  

8.         document.getElementById("UserResult").innerHTML = "User cannot be empty.";  

9.         return;  

10.     }  

11. }  

12. $(function(){  

13.     $("input[type=button]").click(function(){  

14.         var options={  

15.             target: "#UserResult"  

16.         };  

17.         //表单的Ajax  

18.         $("#myform").ajaxSubmit(options);  

19.     });  

20. });  

21. </script>

必要说明:

 

1、使用表单插件,必须加载jquery.form.js文件。

 

2、按Ajax方式提交数据,可以使用表单插件的ajaxSubmit(options)来按照Ajax的方式直接提交表单或者使用ajaxform(options)方法,通常在页面加载完成时执行,用来将表单统一Ajax化,并且提交表单依然使用传统的submit按钮,只不过进行的是Ajax提交。其中参数options$.ajax(options)的参数基本相同。

   您正在看的文章来自疯狂软件教育中心 www.fkjava.org

   信息咨询:Q564205990               星老师

posted @ 2012-09-22 11:22 疯狂软件 阅读(992) | 评论 (0)编辑 收藏

Java中常见的违规编码

 

 一、Eclipse编译器提供源代码格式输入

    Eclipse提供自动源码格式选项,并且组织输入(删除未使用的代码)。你可以使用下面的这些快捷键进行操作。

    Ctrl + Shift + F--源代码格式

    Ctrl + Shift + O--组织输入并删除未使用的代码

    代替手动调用这两个函数,只需根据Eclipse自动格式和自动组织选项,可以随时保存文件。

    操作步骤,在Eclipse中进入Window -> Preferences -> Java -> Editor -> Save Actions,然后以选定的方式保存,最后检查Format source code + Organize imports.

    二、避免多个返回(退出点)

    依照你的方法,确保只有一个退出点。不要在同一个地方或多个地方使用返回。比如,下面的代码,NOT RECOMMENDED(不建议),这是因为有多个退出点(返回语句)。

    1.private boolean isEligibleint age{

    2. ifage > 18{

    3.    return true;

    4. }else{

    5.    return false;

    6. }

    7.}

    下面的代码有所提升,这是更高版本的。

    1.private boolean isEligibleint age{

    2. boolean result;

    3. ifage > 18{

    4.    result = true;

    5. }else{

    6.    result = false;

   7. }

    8. return result;

    9.}

三、简化if-else

    我写了几个实用的方法作为参考,检查语句条件并且基于该条件返回值。比如,考虑到isEligible方法,正如你之前所看到的:

    1.private boolean isEligibleint age{

    2. boolean result;

    3. ifage > 18{

    4.    result = true;

    5. }else{

    6.    result = false;

    7. }

    8. return result;

    9.}

    整个方法以一个单一的return语句重新编写:

    1.private boolean isEligibleint age{

    2.3.return age > 18;

    4.5.}

    四、不要给Boolean, Integer或者String创建新的实例

    避免给Boolean,Integer,String创建新的实例。比如,使用new Booleantrue),Boolean,valueOftrue)。修改后的语句与之前的效果基本相同,除了在性能上有所提升。

    五、使用大括号模块语句

    永远别忘了使用大括号模块语句比如ifforwhile.这样做的好处是当你在修改模块级语句时减少了模糊代码并且避免引进bug的机会。

    不建议:

    1.ifage > 18

    2. result = true;

    3.else

    4. result = false;

    建议:

    1.ifage > 18{

    2. result = true;

    3.}else{

    4. result = false;

    5.}

    六、以final类型标记方法参数,任何时候都适用

    请记住,以final类型标记方法参数,任何时候都适用。这样做的好处在于当你不小心修改参数值时,编译器会给你警告,同时它还能以更好的方式优化编译器代码字节。

    建议:

    private boolean isEligiblefinal int age{ }

    七、在UPPERCASE中命名public static final字段

    UPPERCASE中命名public static final字段(通常也被称之为常量)。这个可以让你轻松区分常量字段和局部变量之间的不同。

    不建议:

    public static final String testAccountNo = "12345678";

    建议:

    public static final String TEST_ACCOUNT_NO = "12345678";,

    八、组合成单一的if语句

    在尽可能多的情况下,把多个if语句组合成单一的if语句,比如下面的代码:

    1.ifage > 18{

    2. if voted == false{

    3.    // eligible to vote.

    4. }

    5.}

    合并成单一的if语句:

    1.ifage > 18 && !voted{

    2. // eligible to vote

    3.}

    九、Switch应该有default

    始终给Switch语句添加default.

    十、使用常量来避免重复定义相同的字符串值

    如果你在多个地方必须使用字符串,那么使用常量来避免重复定义拥有相同值的字符串。

    比如,看下面的代码:

    1.private void someMethod(){

    2. logger.log"My Application" + e);

    3. …

    4. …

    5. logger.log"My Application" + f);

    6.}

    string literal"我的应用"可以作为常量并且能在代码中使用。

    1.public static final String MY_APP = "My Application";

    2.

    3.private void someMethod(){

    4. logger.logMY_APP + e);

    5. …

    6. …

    7. logger.logMY_APP + f);

8.}

    您正在看的文章来自疯狂软件教育中心 www.fkjava.org

    信息咨询:Q564205990               星老师

posted @ 2012-09-21 14:45 疯狂软件 阅读(186) | 评论 (0)编辑 收藏

 

2012年中国移动互联网大会上,欧朋浏览器总经理宋麟在名为“移动互联网的未来”的主题演讲中表示,新一代网络标准HTML5对于移动浏览器性能和用户体验的提升有重要意义,虽然目前国内HTML5存在一定虚火,但最晚到明年年中HTML5技术会趋向成熟。伴随着HTML5标准的普及,或将带来整个浏览器行业的重新洗牌。

  “HTML5作为一个技术而言,是最符合互联网精神的一项技术。”宋麟说。作为一个开放的网络标准,HTML5具有跨平台、多设备、及时更新等多项优势,在统一的HTML5标准下,移动浏览器可以在不同平台、不同设备上实现一致的用户体验。对开发者和用户而言,HTML5都能带来极大便利;同时,HTML5的开放性使其不会被任何一家企业垄断,有利于促进整个行业的良性发展。

  虽然HTML5目前存在性能不够完善、盈利模式不清晰等许多争议,但宋麟认为HTML5与移动互联网的未来密切相关,伴随HTML5技术标准的成熟,移动浏览器将更好地承担平台的功能。

  从去年年底到今年年中,国内主流移动浏览器厂商先后推出支持HTML5标准的产品,并展开在HTML5跑分上的比拼。“现阶段HTML5在国内有点被过度吹捧。”宋麟认为,“主要表现在目前HTML5技术无论是用户体验还是性能支持上都还不是十分成熟。”作为HTML5标准的发明人,Opera欧朋与全球其他领先企业都把HTML5研发作为现阶段的重点,预计到明年年中,HTML5标准将得到初步的普及。

谈及HTML5标准普及对移动互联网市场竞争带来的影响,宋麟认为HTML5既是全行业的机会,也会对现有市场格局带来冲击。“变局中有人会跑赢,也会有被淘汰。”宋麟表示。         您正在看的文章来自疯狂软件教育中心 www.fkjava.org

信息咨询:Q564205990              星老师

posted @ 2012-09-20 11:26 疯狂软件 阅读(173) | 评论 (0)编辑 收藏

 最近,经过几次课,算是复习,也算是学习吧。修补了一些,以前自学时的漏洞,熟悉了一些关于JAVA的基础知识。以下是,这几天的一个简单的总结。

1.Java的环境JDK(Java development Kit)

Sun公司http//www.oracle.com的网页上有各种版本的Jdk,供用户下载使用。安装jdk后,一定要修改环境变量。就实际上而言,说修改不如说是添加环境变量。最后进入cmd界面验证JDK首安装成功!若安装不成功,oracle公司的网页上也有一些列的解决方案。

2.Java的类名

Java是大小写敏感的一种语言,只能以字母开头,可以含有下划线和数字,不能使用关键字和保留字。

Java 关键字列表 (依字母排序 51):

abstract, assert,boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum,extends, final, finally, float, for, if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while

Java 保留字列表 (依字母排序 14) : Java保留字是指现有Java版本尚未使用 但以后版本可能会作为关键字使用。

byValue, cast, false, future, generic, inner, operator, outer, rest, true, var goto const,null

类名在使用中习惯将每个单词首字母大写。且于文件名相同。

3.Java的数据类型

一般而言,Java的数据类型可分为基本类型和引用类型

基本类型:

boolean 布尔值,作二元判断 true, false

byte 8位有符号整数 最小值-128,最大值127

short 16位有符号整数 最小值-32768,最大值32767

int 32位有符号整数 最小值-2147483648,最大值2147483647

long 64位有符号整数 最小值-9223372036854775808,最大值 9223372036854775807

float 32位浮点数 1.4E-45~3.4028235E38

double 64位浮点数 4.9E-324~1.7976931348623157E308

char 16Unicode字符 不适用

基本类型(Primitive Types)也称作内置类型,是其他类型的基础。所有的其他类型(包括Java核心库和用户自定义类型)都是通过基本类型扩展而来的。这些类型是我们描述对象最基本的方式。比如:判断是否使用boolean;衡量大小、长度使用各种整型(包括short, int, long)和浮点数(floatdouble);表达字符使用char;而处理二进制数据块使用byte

引用类型

有数组和对象,究其根本数组也是对象

最后不得不提一下String

String s="abc";//s不为对象

String s=new String("abc");//s为一个对象

4.对象与类

类:类似于生物界的门纲目科属种的分类,在Java语言中,只有类这个概念,而可以通过父类和子类的方式来表达这种层次家哪的关系。比如,我们可以说食物是一个类,而面食就是一个子类。

对象:就像是一个类的一个实例,比如我们说电脑,这就是一个类,泛指电脑这类东西,而我们说,这台电脑,这就是一个实例了,就是一个对象。当然,类也可以是看不见摸不着的东西,比如说语言就是一个类,而中国普通话就是一个对象。

类名 对象名=new 类名();//实例化对象的格式

总之,类相当于一个概念,而类就是这个概念下的一个实体。

5.参数传递

Java中参数传递的方式和C中一样,可分为两类:值传递和引用传递

值传递

int a=10;//定义一个变量

fun b=new fun();//假设已有一个类为fun,实例化一个对象b;

b.function(a);//a的值传递给b的方法

值传递中,只会传递原有变量的值,传递之后,会有一块新的你内存存储变量值,其后的一切动作均与原来变量无关。

引用传递

fun f1=new fun();//实例化一个对象b

fun f2=new fun();//实例化一个对象b

f1=f2;//f2的值赋给f1

引用传递中f1f2相当于C中指针,分别指向一个对象的首地址。f1=f2则是将f2指向的地址赋给f1。传递了一个地址。

6.构造方法

构造方法是在实例化对象时,由系统自动运行的函数,且只运行一次。每一个对象均有其构造方法,系统自动为类配有一个无参的构造方法,若程序员自己写有构造方法,则系统的构造方法失效。

7.方法的重载

public class student{

public void student(){};

public void student(Book book){};

public void student(Book book,Computer computer){};

}

这里有三个方法的名字相同,可是他们却可以执行不用的功能,只要参数的个数,类型,次序不同就可以写出一个新的名字相同的方法。这就是一种重载,当然前面所提到的构造方法,也可以重载。

8.this关键字

public class student{

String name;

public void setName(String name){

this.name=name;

}

}

这里的this关键字就指向类的头。不同的类的this关键字指向自身的头。

   您正在看的文章来自疯狂软件教育中心 www.fkjava.org

   信息咨询:Q   564205990           星老师

posted @ 2012-09-18 15:49 疯狂软件 阅读(201) | 评论 (0)编辑 收藏

 

package sy;

 

import java.awt.Color;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

 

import javax.imageio.ImageIO;

import javax.swing.BorderFactory;

import javax.swing.JPanel;

 

public class PanelTest extends JPanel {

public BufferedImage image;

   @Override

protected void paintComponent(Graphics g) {

// TODO Auto-generated method stub

super.paintComponent(g);

BufferedImage subImage=this.image.getSubimage(30, 30, 100, 100);

g.drawImage(subImage,100,100,100,100,null);

int color_point=subImage.getRGB(24, 4);

        Color color=new Color(color_point);

        System.out.println(color_point);

        System.out.print(color.getGreen());

}

   public PanelTest()

   {

   try {

this.image=ImageIO.read(new File("D:/black.jpg"));

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

   this.setSize(300, 200);

   this.setLocation(100, 100);

   this.setBorder(BorderFactory.createTitledBorder("title"));

 // repaint();

   }

}

posted @ 2012-09-17 17:19 疯狂软件 阅读(1781) | 评论 (0)编辑 收藏

 

   Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Command(命令模式)模式是比较常用的一个模式.

   Command命令模式: Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。将一个请求封装为一个对象,从而使你不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

   优点: 解耦了调用者和接受者之间联系。调用者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,调用者无需知道接受者任何接口。

   缺点: 造成出现过多的具体命令类

 

   在此写了7java类来描述说明Command设计模式的实现方式;

 1 Control.java        命令控制者对象类 (命令控制器在这里至关重要,相当于遥控器的作用)

 2 Tv.java             命令接收者对象类

 3 Command.java        命令接口类

 4 CommandChannel.java 频道切换命令类

 5 CommandOff.java     关机命令类

 6 CommandOn.java      开机命令类

 7 CommandTest.java    带有main方法的测试类(命令发送者)

 

===============   1 Control.java

package command;

//命令控制者

public class Control {

 private Command onCommand, offCommand, changeChannel;

 public Control(Command on, Command off, Command channel) {

    onCommand = on;

    offCommand = off;

    changeChannel = channel;

 }

 public void turnOn() {

    onCommand.execute();

 }

 public void turnOff() {

    offCommand.execute();

 }

 public void changeChannel() {

    changeChannel.execute();

 }

}

===============   1 end

 

===============   2 Tv.java

package command;

//命令接收者

public class Tv {

 public int currentChannel = 0;

 public void turnOn() {

    System.out.println("The televisino is on.");

 }

 public void turnOff() {

    System.out.println("The television is off.");

 }

 public void changeChannel(int channel) {

    this.currentChannel = channel;

    System.out.println("Now TV channel is " + channel);

 }

}

===============   2 end

 

===============   3 Command.java

package command;

//命令接口

public interface Command {

 void execute();

}

===============   3 end

 

===============   4 CommandChannel.java

package command;

//频道切换命令

public class CommandChannel implements Command {

 private Tv myTv;

 private int channel;

 public CommandChannel(Tv tv, int channel) {

    myTv = tv;

    this.channel = channel;

 }

 public void execute() {

    myTv.changeChannel(channel);

 }

}

===============   4 end

 

===============   5 CommandOff.java

package command;

//关机命令

public class CommandOff implements Command {

 private Tv myTv;

 public CommandOff(Tv tv) {

    myTv = tv;

 }

 public void execute() {

    myTv.turnOff();

 }

}

===============   5 end

 

===============   6 CommandOn.java

package command;

//开机命令

public class CommandOn implements Command {

 private Tv myTv;

 public CommandOn(Tv tv) {

    myTv = tv;

 }

 public void execute() {

    myTv.turnOn();

 }

}

===============   6 end

 

===============   7 CommandTest.java

package command;

//命令发送者

public class CommandTest{

 public static void main(String[] args){

    //命令接收者

    Tv myTv = new Tv();

    //开机命令

    CommandOn on = new CommandOn(myTv);

    //关机命令

    CommandOff off = new CommandOff(myTv);

    //频道切换命令

    CommandChannel channel = new CommandChannel(myTv, 2);

    //命令控制对象

    Control control = new Control( on, off, channel);

    //开机

    control.turnOn();

    //切换频道

    control.changeChannel();

    //关机

    control.turnOff();

 }

}

===============   7 end

 

 Command模式通常可应用到以下场景:

 1 Multi-level undo(多级undo操作)

    如果系统需要实现多级回退操作,这时如果所有用户的操作都以command对象的形式实现,系统可以简

    单地用stack来保存最近执行的命令,如果用户需要执行undo操作,系统只需简单地popup一个最近的

    command对象然后执行它的undo()方法既可。

 

 2 Transactional behavior(原子事务行为)

    借助command模式,可以简单地实现一个具有原子事务的行为。当一个事务失败时,往往需要回退到执

    行前的状态,可以借助command对象保存这种状态,简单地处理回退操作。

 

 3 Progress bars(状态条)

    假如系统需要按顺序执行一系列的命令操作,如果每个command对象都提供一个

    getEstimatedDuration()方法,那么系统可以简单地评估执行状态并显示出合适的状态条。

 

 4 Wizards(导航)

    通常一个使用多个wizard页面来共同完成一个简单动作。一个自然的方法是使用一个command对象来封

    wizard过程,该command对象在第一个wizard页面显示时被创建,每个wizard页面接收用户输入并设

    置到该command对象中,当最后一个wizard页面用户按下“Finish”按钮时,可以简单地触发一个事件

    调用execute()方法执行整个动作。通过这种方法,command类不包含任何跟用户界面有关的代码,可以

    分离用户界面与具体的处理逻辑。

 

 5 GUI buttons and menu itemsGUI按钮与菜单条等等)

    Swing系统里,用户可以通过工具条按钮,菜单按钮执行命令,可以用command对象来封装命令的执行。

 

 6 Thread pools(线程池)

    通常一个典型的线程池实现类可能有一个名为addTask()public方法,用来添加一项工作任务到任务

    队列中。该任务队列中的所有任务可以用command对象来封装,通常这些command对象会实现一个通用的

    接口比如java.lang.Runnable

 

 7 Macro recording(宏纪录)

    可以用command对象来封装用户的一个操作,这样系统可以简单通过队列保存一系列的command对象的状

    态就可以记录用户的连续操作。这样通过执行队列中的command对象,就可以完成"Play back"操作了。

 

 8 Networking

    通过网络发送command命令到其他机器上运行。

 

 9 Parallel Processing(并发处理)

    当一个调用共享某个资源并被多个线程并发处理时。

    您正在看的文章来自疯狂软件教育中心 www.fkjava.org

    信息咨询:Q564205990             星老师

posted @ 2012-09-16 17:36 疯狂软件 阅读(466) | 评论 (0)编辑 收藏

 

 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小总结一下,主要叙述的是spring读取配置文件的方法。

  一、读取xml配置文件

  ()新建一个java bean

  package chb.demo.vo;

  public class HelloBean {

  private String helloWorld;

  public String getHelloWorld() {

  return helloWorld;

  }

  public void setHelloWorld(String helloWorld) {

  this.helloWorld = helloWorld;

  }

  }

  ()构造一个配置文件

  

  

  

  

  

  Hello!chb!

  

  

  

  ()读取xml文件

  1.利用ClassPathXmlApplicationContext

  ApplicationContext context = new ClassPathXmlApplicationContext("beanConfig.xml");

  HelloBean helloBean = (HelloBean)context.getBean("helloBean");

  System.out.println(helloBean.getHelloWorld());

  2.利用FileSystemResource读取

  Resource rs = new FileSystemResource("D:/software/tomcat/webapps/springWebDemo/WEB-INF/classes/beanConfig.xml");

  BeanFactory factory = new XmlBeanFactory(rs);

  HelloBean helloBean = (HelloBean)factory.getBean("helloBean");

  System.out.println(helloBean.getHelloWorld());

  值得注意的是:利用FileSystemResource,则配置文件必须放在project直接目录下,或者写明绝对路径,否则就会抛出找不到文件的异常

  二、读取properties配置文件

  这里介绍两种技术:利用spring读取properties 文件和利用java.util.Properties读取

  ()利用spring读取properties 文件

  我们还利用上面的HelloBean.java文件,构造如下beanConfig.properties文件:

  helloBean.class=chb.demo.vo.HelloBean

  helloBean.helloWorld=Hello!chb!

  属性文件中的"helloBean"名称即是Bean的别名设定,.class用于指定类来源。

  然后利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文件

  BeanDefinitionRegistry reg = new DefaultListableBeanFactory();

  PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(reg);

  reader.loadBeanDefinitions(new ClassPathResource("beanConfig.properties"));

  BeanFactory factory = (BeanFactory)reg;

  HelloBean helloBean = (HelloBean)factory.getBean("helloBean");

  System.out.println(helloBean.getHelloWorld());

  ()利用java.util.Properties读取属性文件

  比如,我们构造一个ipConfig.properties来保存服务器ip地址和端口,如:

  ip=192.168.0.1

  port=8080

  则,我们可以用如下程序来获得服务器配置信息:

  InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("ipConfig.properties");

  Properties p = new Properties();

  try {

  p.load(inputStream);

  } catch (IOException e1) {

  e1.printStackTrace();

  }

System.out.println("ip:"+p.getProperty("ip")+",port:"+p.getProperty("port"));

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990           星老师

posted @ 2012-09-15 16:30 疯狂软件 阅读(182) | 评论 (0)编辑 收藏

 

1,byte[]的长度

   

    写了一个从文件里读字符串的函数:

   

    public static String readFileString fFileName{//, String fEncoding {

   

    char[] buffer = new char[1024];

   

    StringBuilder text = new StringBuilder();

   

    InputStreamReader reader = null;

   

    try {

   

    reader = new InputStreamReadernew FileInputStreamfFileName));

   

    while reader.readbuffer, 0, 1024)!=-1{

   

    text.appendbuffer); <==有错

   

    }

   

    }

   

    catchException e{

   

    e.printStackTrace();

   

    }

   

    finally{

   

    ifreader!=null{

   

    try {

   

    reader.close();

   

    } catch IOException e {

   

    // TODO Auto-generated catch block

   

    e.printStackTrace();

   

    }

   

    }

   

    }

   

    return text.toString();

   

    }

   

    粗看这段代码没有问题。但是读出的字符总比实际要多。问题在text.appendbuffer)。 buffer是一个1024char数组。每次append固定的1024char.改成就好了。

   

    reader = new InputStreamReadernew FileInputStreamfFileName));

   

    int readed;

   

    while ((readed = reader.readbuffer, 0, 1024))!=-1{

   

    text.appendnew Stringbuffer, 0, readed));

   

    }

   

    2,优先级的错误

   

    Log.dTAG, "location="+where+", "+locationService==null?"null":locationService.getLocation());

   

    这行代码的本意是如果locationService==null,就输出"null",避免NullPointerException.但实际上仍然发生NullPointerException.原来"+"的优先级大于"?",所以上面代码实际上是:

   

    Log.dTAG, "location="+where+", "+locationService==null?"null":locationService.getLocation())

   

    括号里的当然不会是null.改成

   

    Log.dTAG, "location="+where+", "+locationService==null?"null":locationService.getLocation()));

   

就好了。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

         信息咨询:Q564205990                星老师

posted @ 2012-09-14 14:15 疯狂软件 阅读(265) | 评论 (0)编辑 收藏

 当一个web页面带有image/jpeg (或者其他的图像格式)的MIME类型被发送时,你的浏览器将那个返回结果当作一个图像,然后浏览器显示图像,作为页面的一部分或者完全作为图像自身。要为你的jsp页面设置MIME类型,你需要设置页面的contentType属性:

   

    <%@ page contentType=“image/jpeg” … %>

   

    然后你需要创建一个BufferedImage绘制你的动态图像:

   

    BufferedImage image = new BufferedImagewidth,height, BufferedImage.TYPE_INT_RGB);

   

    创建完一个BufferedImage后,你需要得到图形环境进行绘制,一个Graphics或者Graphics2D对象:

   

    Graphics g = image.getGraphics();

   

    // or Graphics2d g2d = image.createGraphics();

   

    从现在起你就可以绘制图像内容了。对图形环境绘制就会画到BufferedImage.最开始这个图像都是黑色的,因此用你希望的背景颜色填充图像是一个不错的主意,然后,当你完成图像的绘制,你需要dispose图形环境:

   

    g.dispose();

   

    // or g2d.dispose();

   

    一旦完成图像的绘制,你在response中返回那个图像。你可以使用非标准的com.sun.image.codec.jpeg包中的JPEGImageEncoder类编码图像,或者如果你使用JDK1.4,你可以使用标准的ImageIO类。在使用JPEGImageEncoder时有一个技巧,你必须从ServletResponse取来ServletOutputStream而不能使用隐含的JSP输出变量out.

   

    ServletOutputStream sos = response.getOutputStream();

   

    JPEGImageEncoder encoder =JPEGCodec.createJPEGEncodersos);

   

    encoder.encodeimage);

   

    // or ImageIO.writeimage, JPEG, out);

   

    这里有一个从所有的可能方案中(例如g.dispose();或者g2d.dispose();)选取的一个完整的范例。这个例子使用Graphics对象绘制一个随机的多边形,图像通过JPEGImageEncoder绘制,你可以自由设置多边形的顶点数得到更复杂的形状,换言之,有更多顶点和边。

   

要运行这个范例,将从“<%@”到最后一个“%>”之间的jsp代码放到一个名为image.jsp的文件中,将那个文件放到你的web服务器可以找到的地方。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990             星老师

posted @ 2012-09-13 13:52 疯狂软件 阅读(186) | 评论 (0)编辑 收藏

 

 Hibernate持久层缓存的级别:

  

    1)事务级别

  

    该级别缓存中的缓存对象只能被当前事务使用,每个事务都有各自的缓存,缓存中的数据通常以关联对象的形式保存。同时被缓存对象的生命周期依赖于当前事务的生命周期,当前事务结束时,该缓存中缓存对象的生命周期也会结束。事务级别的缓存通常使用内存作为保存缓存对象的存储介质,Hibernate的一级缓存(Session缓存)即该级别的缓存。

  

    2)应用(进程)级别

  

    该级别缓存中对象可以被当前应用(进程)内的所有事务共享访问,被缓存对象的生命周期与当前应用相同。当应用结束时,缓存对象的生命周期结束。如果当前应用是一个分布式应用,则不能使用该级别的缓存,这种级别的缓存使用内存或硬盘作为缓存对象的存储介质。

  

    3)分布式级别

  

    如果当前应用部署在多台服务器的分布式(集群)环境下,则当前应用可以使用分布式级别的缓存缓存持久化对象。分布式缓存中缓存的数据会被一台或者多台服务器共享。如果缓存数据发生变化,则更新后的缓存数据会同步到集群中的每台服务器中,进而保证缓存数据的一致性。

  

    Hibernate的二级缓存可以是应用级别或者分布式级别的缓存,完全依赖于第三方缓存组件的具体实现。

  

    Hibernate没有提供自身产品级别的二级缓存,而是在设计上利用第三方成熟的缓存组件实现。为了集成不同的第三方缓存组件

  

    Hibernate提供了org.hibernate.cache.CacheProvider接口用来作为缓存组件与Hibernate之间的适配器。在实际开发中,

  

    Hibernate二级缓存组件如表:

  

    缓存名称

  

    对应的适配器类

  

    Hashtable

  

    org.hibernate.cache.HashtableCacheProvider

  

    EHCache

  

    org.hibernate.cache.EhCacheProvider

  

    OSCache

  

    org.hibernate.cache.OSCacheProvider

  

    SwarmCache

  

    org.hibernate.cache.SwarmCacheProvider

  

    JBoss Cache 1.x

  

    org.hibernate.cache.TreeCacheProvider

  

    Jboss Cache 2

  

org.hibernate.cache.jbc2.JBossCacheRegionFactory

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990           星老师

posted @ 2012-09-10 17:35 疯狂软件 阅读(132) | 评论 (0)编辑 收藏

 

public class Sort2

   

    {

   

    //交换排序之--最简单的冒泡排序法

   

    public static void BubbleSortint[] a

   

    {

   

    int i,j,temp;

   

    int n = a.length;

   

    fori=0;i<n;i++

   

    {

   

    forj=i+1;j<n;j++

   

    {

   

    if a[i]>a[j]

   

    {

   

    temp = a[i];

   

    a[i] = a[j];

   

    a[j] = temp;

   

    }

   

    }

   

    }

   

    }

   

    //插入排序-- 直接插入排序

   

    public static void InsertSortint[] a

   

    {

   

    int i,j,temp;

    

    int n = a.length;

   

    fori=1;i<n;i++

   

    {

   

    temp = a[i];

   

    j=i-1;

   

    while((a[j]>temp&&j>=0))

   

    {

   

    a[j+1] = a[j];

   

    j--;

   

    }

   

    a[j+1] = temp;

   

    }

   

    }

   

    //选择排序

   

    public static void SelectSortint[] a

   

    {

   

    int i,j,min,temp;

   

    int n=a.length;

   

    fori=0;i<n;i++

   

    {

   

    min = a[i];

   

    forj=i+1;j<n;j++

   

    {

   

    ifa[j]<min

   

    {

   

    temp = min;

   

    min =a[j];

   

    a[j] = temp;

   

    }

   

    }

   

    a[i] =min ;

   

    }

   

    }

   

    public static void mainString[] args

   

    {

   

    int[] arr = {45,76,32,32,5,4,54,7,943,3};

   

    int n = arr.length;

    

    BubbleSortarr);

   

    forint i=0;i<n;i++

   

    System.out.printarr[i]+   ”);

   

    System.out.println();

   

    InsertSortarr);

   

    forint i=0;i<n;i++

   

    System.out.printarr[i]+   ”);

   

    System.out.println();

    

    SelectSortarr);

   

    forint i=0;i<n;i++

   

    System.out.printarr[i]+   ”);

   

    }

   

}

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990           星老师

posted @ 2012-09-09 11:23 疯狂软件 阅读(112) | 评论 (0)编辑 收藏

 

 PageBean.java

   

    package org.andy;public class PageBean {

   

    private Integer start;

   

    private Integer limit;

   

    public PageBean(){

   

    }

   

    public PageBeanInteger paramStart, Integer paramLimit {

   

    this.start = paramStart;

   

    this.limit = paramLimit;

   

    }

   

    public int getStart() {

   

    return this.start.intValue();

   

    }

   

    public int getLimit() {

   

    return this.limit.intValue();

   

    }}

   

    测试类:

   

    package org.andy;public class Test {

   

    public static void mainString[] args {

   

    PageBean pageBean=new PageBean();

   

    StringBuffer sb=new StringBuffer();

   

    sb.append(“start:”)。appendpageBean.getStart());

   

    sb.append(“/t”);

   

    sb.append(“limit:”)。appendpageBean.getLimit());

   

    System.out.printlnsb.toString());

   

    }}

   

    运行这段代码时,便会报异常,异常如下:

   

    Exception in thread “main” java.lang.NullPointerException

   

    at org.andy.PageBean.getStartPageBean.java:16

   

    at org.andy.Test.mainTest.java:7

   

    很显然是空指针异常,

   

    这是开发经常遇到的问题,

   

    Integer类型的变量没有赋值(默认null)的时候,对其执行intValue(),就会出现上面的错误,一个健壮的程序是不允许这种情况出现的,修改PageBean可以解决:

   

    package org.andy;public class PageBean {

   

    private Integer start;

   

    private Integer limit;

   

    public PageBean() {

   

    }

   

    public PageBeanInteger paramStart, Integer paramLimit {

   

    this.start = paramStart;

   

    this.limit = paramLimit;

   

    }

   

    public int getStart() {

   

    if start != null

   

    return this.start.intValue();

   

    return 0;

   

    }

   

    public int getLimit() {

   

    if limit != null

   

    return this.limit.intValue();

   

    return 0;

   

}}

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询“Q564205990           星老师

posted @ 2012-09-08 14:56 疯狂软件 阅读(148) | 评论 (0)编辑 收藏

 

 “这样下去没法玩了,我们的选择只有撤柜。” 95中午,杭州牛仔品牌Jasonwood电商总经理尉伟在电话里显得有些愤怒。

  同日,新浪微博认证为JASONWOOD电子商务运营负责人“louisa小曦”发微博称,决定退出京东商城POP平台,理由是93日京东举办“买3001000券”的活动,而1000的店铺券全部需要商家来出,JASONWOOD拒绝参加活动后,店铺被京东锁死。“你打价格战一分钱不出要我们埋单,请问刘总,这就是您所谓的豪气吗?”

  而尉伟告诉记者,“300200,500300,800500,这相当于我们的商品被京东强行打了三到四折”,而且事前没有任何征兆,所有在京东平台上销售的服装品牌的后台都被锁死,“我们是不参加都不行”。

  此外,94日,包括伊芙丽(eifini)、诺奇、AKSERIES等被强行拉上促销战车的服装品牌都曾一度在其网店主页上发布暂停发货或营业的紧急公告,并开始与京东商城平台营运方进行沟通,随后又先后撤掉公告。

  此外,为了抗议京东的这次活动,柒牌、杉杉、七匹狼、零号男均已将店铺产品下架,而卡帝乐鳄鱼与京东沟通后放弃参加此次活动,被京东冻结其后台编辑页面,无法进行相关操作,货款也被京东冻结。

  京东此次在秋装产品上的促销遭到如此多供应商的杯葛,背后的原因是什么?几乎就在同时,有消息称发改委价监局近期已经对电商“价格战”展开调查,初步调查认为,价格战过程中,有电商的促销宣传行为涉嫌虚构原价、欺诈消费者。

  撤柜反促销

  “京东的费用率已经最高”

  “我们这次活动都是与供应商进行了充分沟通后推出的,如果供应商不同意我们是不会强行让他们参与的,说到底我们与供应商的沟通一直是良性的。”面对供应商的抗议声音,京东商城高级副总裁吴声95日回应本报记者。

  然而对于吴声的说法,尉伟表示,“这完全是胡说,京东的确在我们供应商的QQ群中发布了一个活动方案的公告,但是当我们向他们提出不参加活动的意见时,我们的后台就已经被锁死了,说到底不参加是不可以的”。

  而一家供应商提供给本报记者的QQ聊天记录的截屏更是显示,当这家供应商提出将其从促销页面上删除的要求后,京东方面的人员的回复是:“不行,不参加这次活动今后别想参与任何活动。”

  而有的供应商则反映,在与京东沟通无果后,其所有的商品被京东方面强行修改为无货的状态,导致顾客无法下单。

  尉伟称,京东要求商家承担所有促销成本,“风险全部转嫁在我们身上”。据了解,今年京东6·18店庆促销活动之前说全是京东送券,后来变成双方各承担一半,但最后全部由商家承担了,而销售并不理想。

  “在京东我们的返点是9%,物流费是每单9.5元,这并不是最高的,但是其他平台基本不让我们承担促销费,京东则不然,这样算下来京东的费用率已经最高。”尉伟说。

  对于JASONWOOD这样中等规模的服装供应商来说,京东这样的做法让其压力很大,“louisa小曦”在微博上发出的一封名为“刘强东,我不玩了”的公开信中特别指出,“我们不是暴利企业,除了基础的京东年费、扣点外,我们总是为一些根本不为商家着想的活动来付出很多,但我们又得到了什么?”。

  上述公开信还提到,如果谁还可以扛下去,接下去要么卖次品,要么卖库存,或者跟上次一样再玩一次消费者。

  供应商的两难抉择

  “我们的账期已经在45天以上,现在有进一步延长的趋势”

  对于这次促销活动的起因,尉伟表示,“这是一个平台为了对抗另外一个平台仓促发起的促销活动,居然让商家来买单”。

  据悉,这次京东的秋装促销赠送的赠券是115-8日,其目的就是抢在天猫前启动双11促销。

  资金日趋紧张的京东商城不仅开始逐步让供应商来承担促销成本,对供应商的货款账期也一再延长,这也是引发供应商不满的主要原因。

  今年4月进入京东平台的JASONWOOD对此深有体会。尉伟告诉记者:“在我们进入开店前,京东给我们传递的信息是,他们是一个低费用的没有账期的欣欣向荣的全新的平台,但是从我们进入那天起我们的账期已经在45天以上,现在有进一步延长的趋势。”

  据悉,JASONWOOD在天猫、拍拍、京东、当当和1号店的平台上都有开店。但“去年1111日我们在天猫单天的销售额就达到570万,而我们在京东今年618促销的销售额只有11万元,在京东平台的大促的销售额还不如天猫一场中型促销销售额的1/5”。

  根据京东商城此前IPO的报告,其2011年平台收入大约为46亿元,而今年目的是达到百亿元以上,从目前来看这与天猫近千亿元的平台收入相差很大。更多供应商是将京东作为尝试性进入的平台来操作的,随时做好了退出的准备。

  “从进入京东那天开始我们就想撤柜,这不是现在才有的想法,今后消费者可以到我们在其他网购平台上的柜台去购买。”尉伟表示,“本来我们是希望有几个平台来分摊运营风险的,毕竟不能把所有鸡蛋都放在一个篮子里,但是京东这样的做法让我们无法继续维持,只有选择退出。”

  有电商行业人士表示,“京东2012年以来由于第四轮融资遇阻,其资金压力很大,刘强东对外说的87亿元现金其实很多都是应付账款,也就是账期结算中供应商的资金,而让供应商承担促销费用也是这个原因”。

  但很多厂商依然是捆绑参与了93日开始的这次促销,而大部分商家在与京东沟通无果后也还是恢复了促销,有不愿透露姓名的商家表示,“虽然京东平台目前销售规模不大,但是其增速更快,我们也不敢得罪这个平台,此外如果要退出,我们的货款损失和用户流失都很严重”。

上述电商行业人士指出,对于一些依靠网购平台成长的供应商来说,已经成为了电商平台之间竞争的牺牲品,但大部分厂商只能选择接受,也许他们开始后悔当初图便宜而选择的多平台进入的决策。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990           星老师

posted @ 2012-09-06 14:30 疯狂软件 阅读(146) | 评论 (0)编辑 收藏

 

 Oracle触发器中select into报错no_data_found异常处理

    红色部分为对查询不到数据异常的处理

    create or replace trigger TIG_MONITOR_ALarm

    after insert on t_monitor_real_minute

    for each row www.2cto.com

    declare

    -- 标准值

    standvalue number;

    --报警实况表id

    liveid number;

    begin

    --

    --触发器功能:监测实况数据表,对比监测数据是否超标,超标数据则记录入超标报警表中

    --

    standvalue:=-1;

    liveid:=-1;

    select nvlt.bzz,-1 into standvalue from t_monitor_factor t where t.jcdbm=:new.STATION_ID and t.jcxmbm=:new.INFECTANT_ID;

    --如果录入检测项目数据大于标准值,则入库报警信息表中

    if standvalue>-1 then

    if :new.M_VALUE>standvalue then

    --将数据录入报警历史数据中

    insert into t_alarm_historyid,jcdbm,jcxmbm,mvalue,mtime

    values www.2cto.com SEQ_ALarm_HISTORY.NEXTVAL,:new.STATION_ID,:new.INFECTANT_ID,:new.M_VALUE,:new.M_TIME);

    --异常判断,如果查询不到数据

    begin

    select r.id into liveid from t_alarm_real r where r.jcdbm=:new.STATION_ID and r.jcxmbm=:new.INFECTANT_ID;

    --查询不到数据

    EXCEPTION

    WHEN no_data_found THEN

    --不存在则录入新的报警实况

    insert into t_alarm_historyid,jcdbm,jcxmbm,mvalue,mtime

    valuesSEQ_ALarm_REAL.NEXTVAL,:new.STATION_ID,:new.INFECTANT_ID,:new.M_VALUE,:new.M_TIME);

    end;

    --报警实况中是否已存在该监测点的该因子报警信息

    if liveid>-1 then

    update t_alarm_real r1 set r1.mvalue=:new.M_VALUE,r1.mtime=:new.M_TIME,r1.status=0 where r1.id=liveid;

    else

    --不存在则录入新的报警实况

    insert into t_alarm_historyid,jcdbm,jcxmbm,mvalue,mtime

    values www.2cto.com SEQ_ALarm_REAL.NEXTVAL,:new.STATION_ID,:new.INFECTANT_ID,:new.M_VALUE,:new.M_TIME);

    end if;

    end if;

    end if;

    EXCEPTION

    WHEN no_data_found THEN

    null;

end TIG_MONITOR_ALarm;

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990             星老师

posted @ 2012-09-05 10:25 疯狂软件 阅读(198) | 评论 (0)编辑 收藏

Java根据图片url下载图片

 

java 天生在网络编程方面具有独特的优势,封装了许多网络的api.下面寥寥数句就实现了爬取网络图片的功能。

   

    String imageUrl

   

    URL url = new URLimageUrl);

   

    //打开网络输入流

   

    DataInputStream dis = new DataInputStreamurl.openStream());

   

    String newImageName=“C:/2.jpg”;

   

    //建立一个新的文件

   

    FileOutputStream fos = new FileOutputStreamnew FilenewImageName));

   

    byte[] buffer = new byte[1024];

   

    int length;

   

    //开始填充数据

   

    while length = dis.readbuffer))>0{

   

    fos.writebuffer,0,length);

   

    }

   

    dis.close();

   

fos.close();

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990          星老师

posted @ 2012-09-04 19:35 疯狂软件 阅读(372) | 评论 (0)编辑 收藏

hbase参数配置及优化

 

 

接触hbase已有半年的时间,查了很多资料,也参考了很多别人心得,也希望把自己的心得以及理解写出来,我把配置hbase必调的几个参数写一下,以及它们的意义。

zookeeper.session.timeout

这个参数的意义是regionserverzookeeper的会话过期时间,默认是3分钟,如果regionserver zookeeper.session.timeout这个配置的时间没有去连zookeeper的话,zookeeper会将该regionserverzookeeper摘除,不让该regionserver向提供服务,很多人都该值配置很大,原因是生产环境中regionserver的内存都配置很大,以扩大memstorecache的大小,提高性能,但是内存配置大了以后,regionserverjvm做一次内存大回收时,时间也会变长,很有可能这个时间超过zookeeper.session.timeout时间,导致regionserverjvm回收内存的时候,zookeeper误以为regionserver挂掉而将regionserver摘除。但我认为该值还是不要配的过大,首先地java已支持cms方式回收内存,每次内存回收的时间不是太长,并且生产环境中,我们也不允许过长时间的服务中断,配置大了,容易造成一个regionserver的服务真出现异常时,zookeeper不会切除该regionserver,使得很多请求失败。

hbase.regionserver.handler.count

regionserver的工作线程数量,默认是10,没有疑问,官方默认值太小,通常都调到100~200之间,提高regionserver性能。

hbase.regionserver.lease.period

regionserer租约时间,默认值是60s,也有点小,如果你的生产环境中,在执行一些任务时,如mapred时出现lease超时的报错,那这个时候就需要去调大这个值了。

hfile.block.cache.size

regionserver cache的大小,默认是0.2,是整个堆内存的多少比例作为regionservercache,调大该值会提升查询性能,当然也不能过大,如果你的hbase都大量的查询,写入不是很多的话,调到0.5也就够了,说到这个值,有一个地方需要说明一下,如果生产环境有mapred任务去scan hbase的时候,一些要在mapred scan类中加一个scan.setCacheBlocks(false),避免由于mapred使用regionservercache都被替换,造成hbase的查询性能明显下降。

hbase.hregion.memstore.flush.size

一个regionserver的单个region memstore的大小,默认是64M,在hbase结构中,一个regionserver管理多个region,一个region对应一个hlog和多个store,一个store对应多个storefile和一个memstore,这里的hbase.hregion.memstore.flush.size意思一个region下面的所有store里面的memstore的达到多少时,开始将这些memstore flushhdfs中去,配置这个值,需要参考一下,平均每个regionserver管理的region数量,如果每台regionsever管理的region不多的话,可以适当的调大该值,如512M时再flush

hbase.regionserver.global.memstore.upperLimit/hbase.regionserver.global.memstore.lowerLimit

配置一台regionserver所有memstore占整个堆的最大比例,默认是0.4/0.35,二个值的差异在于是做局部的flush,还是全部flush,如果你的regionserver日志中,频发出现因为超过hbase.regionserver.global.memstore.lowerLimit而做flush的信息,我觉得有必要调小hbase.hregion.memstore.flush.size,或者适当调大这二个值,当然hbase.regionserver.global.memstore.upperLimithfile.block.cache.size的和不能大于1,到0.8我觉得已经够大了。如果你的jvm内存回收是使用cms的话,有一个值CMSInitiatingOccupancyFraction(内存使用到时多少时,一始cms回收内存)的大小和觉得和这个有关系,略小于hbase.regionserver.global.memstore.upperLimithfile.block.cache.size的和是一个不错的选择。

hbase.hstore.compactionThreshold/hbase.hregion.majorcompaction

hbase.hstore.compactionThreshold执行compactionstore数量,默认值是3,如果需要提高查询性能,当然是storefile的数量越小,性能越好,但是执行compaction本身有性能资源的开消,如果regionserver频繁在compacion对性能影响也很大。hbase.hregion.majorcompaction表示majorcompaction的周期,默认是1天,majorcompaction与普通的compaction的区别是majorcompaction会清除过期的历史版本数据,同时合并storefile,而普通的compaction只做合并,通常都是majorcompaction,调为0,然后手工定期的去执行一下majorcompaction,适当调小点compacionThreshold

hbase.hregion.max.filesize

一个regionsever的最大值,默认是256M,如果数据量特别大的话,调大该值可以减少region的数量,调到2G我觉得都不为过。

hbase配置调优太多,jvmmslab内存管理以及hdfs append方式等等,需要太多的知识面,很多东西,我也在学习之中,先写这么多。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990            星老师

posted @ 2012-09-03 15:14 疯狂软件 阅读(2057) | 评论 (0)编辑 收藏

 

 

      认为编写一个类的列表,深受程序员。我应该说是最重要的?这里没有严格的规则的选择,事实上,也没有规则。类出现在顶部的心态,列举如下。欢迎您加入你自己的名单。本列表将取决于类型的项目上工作。这些类,我已经列出不需要任何介绍,他们是受欢迎的拉兹尼堪世界中。玩得开心。

 

1,java.lang.string

字符串类将是无可争议的冠军在任何一天的普及和不可以否认。这是最后一个类,用来创建操作不可变字符串字面值。

2java.lang.system

用法系统取决于类型的项目,你的工作。你可以不使用它在您的项目,但它仍然是一个受欢迎的爪哇班级。这是一个实用类,不能实例化。主要利用这一类获取标准输入,输出,环境变量。

3java.lang.exception

抛出是超类的所有错误和异常。所有异常情况,可以处理在例外。时是最流行的所有例外。例外的是在最高层次的所有例外。

4java.util.arraylist

一个实现数组数据结构。这个类实现了列表界面,是最受欢迎的成员或集合框架。之间的差异和向量数组列表是一个热门话题的初学者和常见问题的访谈。

5java.util.hashmap

实现了一个键值对数据结构。这个类实现了地图界面。类似vector -向量,我们有值与哈希表流行的比较。这恰好是一个受欢迎的集合类,作为一个容器的属性值和工程作为一个运输代理之间的多层次应用。

 

6java.lang.object

祖父所有类。每一类是一个类的对象。它将被用于经常在我们工作的一个平台框架。它包含的重要方法,等于,哈希,克隆,String,等。

7java.lang.thread

一个线程是一个单一的执行顺序,在多个线程可以共存,资源共享。我们可以扩展此线程类和创造我们自己的线程。使用运行也是另一种选择。这个类的使用取决于域的应用。这是完全没有必要建立一个通常的应用。

8java.lang.class

类是一个直接子类对象。有没有在这个类的构造函数对象加载Java虚拟机中的类加载器。我们中的大多数可能没有使用它直接但我认为其基本类。它是一类重要的做反射。

9java.util.date

这是用来工作日期。有时我们觉得这个类添加了更多实用的方法和我们最终创造那些。每一个企业应用程序的创建日期实用。介绍了1类和后来的巨大变化jdk1.1的自嘲一大堆的方法。

10java.util.iterator

这是一个接口。这是非常受欢迎,来作为替代枚举。这是一个使用简单方便实用,工作在同步迭代的。

您正在看的文章来自疯狂软件教育中心 www.fkjava.org

信息咨询:Q564205990           星老师

 

posted @ 2012-09-02 16:35 疯狂软件 阅读(149) | 评论 (0)编辑 收藏

怎样才能做个有灵性的技术人员

一个有灵性的技术员是项目中非常需要的,这里的灵性包含7个方面:全局观;细节的把握;认真负责的态度;合理的时间分配;沟通;学习能力;开放分享精神;

 

1.全局观

这个同一个技术员个人的修养、格局很有关系了,能够看到项目的远景,这个是一般技术员很难做到的,许多的技术员可能就是个代码工或者粉刷匠,对产品或者项目发展的意识看不到或者无法理解。尤其是刚刚从学校走出来的学生,很多的虽然有些技术基础(开发、设计),但大多还是不了解所从事的产品、项目甚至行业的发展情况,很多情况下就是听而从之,甚至有些技术员就草草了事。

 

全局观的培养需要从刚接触这个行业就开始培养,这个主要是一个技术人员看事情,想问题,出方法的能力,对整个行业的了解程度及对产品、项目的思考深度这就是一个技术员的全局观,统揽全局的技术员才不会轻易的迷失,并且更能够集中精力去对待。

 

2.对细节的把握

注重细节,这个我自己也和以前的技术员探讨过这个问题,一个产品完成总是那么毛毛糙糙,有的甚至无法使用,更让人痛心的就是只有一个版本,没有后续的跟进和更新建议说明。这个就要看一个技术人员对设计或者开发的态度,那些精益求精、把握住细节,多站在用户角度着想的技术产品才会深得人心。

 

对细节的把握,这个需要项目中每个成员都需要有这个共同的意识,除了项目经理要在整个项目过程中不断追求自身产品的精益求精之外,作为一个技术员也要能够站在很高的角度去对待这个问题,至少做的产品比用户想的更深一点,如果在技术实现在没有太大的问题,这些内容是必须意识到的,给出一个最优解决方案。

 

3.认真负责的态度

把产品当做自己的,把自己看成项目的一部分,我曾经看到过有技术员花费很长时间去完成一个产品,拿出手来让人脸红的场景,但自己的网站、自己开发的程序却非常精致、细心。这个很大一部分是态度问题,做公司项目的时候根本没有把心思用在上面,哪能够出来什么好产品。

 

这种负责的态度来源于自己同公司需要拥有一个共同的价值观,并且在之前需要有一个较为合理的安排,把每次开发、每次设计制作作为自己的一份经验积累,把这些中的点滴去记录下来,把自己去看成项目经理去思考,尽管你是小的员工,但你需要有一种领导者的意识,不要太去在乎功德利益,做好项目积累,付出总是会有很大的收获的,这个完全取决于你的个人心态了。

 

有许多技术员经常有这样一个念头“这东西开发出来反正也不算是我的,管他呢”,其实这个大错特错,有了这种心态后就会附带一个不负责任的态度,在整个项目过程中这个不负责任的技术员其实失去的是最多的,并且项目产品也没有做好,使得整个团队受害。这种责任取决于全局观,表现于细节和认真做事的态度。

 

4.合理的时间分配

总是有一种很多事情要做,但却无事可做的感觉,想想一桩桩事情就让人感到心烦意乱,但做起来却不知从何开始,尤其是项目开发,从策划、设计、前端开发、程序开发到测试运营等一个整体过程,如果项目参与人数比较少,会出现忙的一塌糊涂,最后自己糊涂。

 

这个就是技术员缺乏合理的时间管理,这个时间管理表现在1.项目开始对任务的充分分析及时间估计;2.项目进程对整体项目任务的时间把握,这2点缺少会直接导致以上情况的发生,所以在项目开始的时候技术员或者项目负责人需要有一个时间的预估,并且在开发设计过程中不断去对实现预定任务进行跟进,方能不乱。

 

5.沟通

其实这是一个技术员最重要的一点,一个项目如果涉及到2个或2个以上的人难免就需要沟通,如果技术员不能沟通我相信这个项目做到最后会成为一个哑巴项目,最后连责怪都不知道去责怪谁。

 

沟通并非说闲话说得来,聊聊生活、聊聊感情那些不是技术员的沟通,反而这里的沟通是指能够把气氛严肃起来,对整个项目中的问题能够及时的交流,这种沟通应该是一种探讨式的沟通,并且能够提出对问题看法的同时能够提出自己的解决方案,项目沟通中也需要技术员去了解大家的性格、态度,并且需要遵循一个“以用户为中心”的设计标准,这样的沟通才会有效。

 

6.学习能力

一个技术员如果没有学习能力,那基本上就让人很痛苦,尤其是做IT类的,学习是必不可少的事情,在技术日新月异的今天,开发制作技术也不断在更新,除了需要不断去关注的同时,还需要技术员去尝试理解、应用这些新的技术,这样这些技术才能够很好的融入到开发中来。这一点一些成熟的技术公司做的是非常好的,例如腾讯、阿里巴巴的技术团队,他们就经常研究一些新奇的东西分享出来,并且融入到他们自己的开发中。

 

学习能力其实我个人看来是一种模仿的能力,能够快速接受并且能够灵活运用其实这个就是一种学习的过程,这点腾讯做的是非常好的,他们的学习无处不在,这个也能看出中国人模仿学习的智慧了。

 

7.学会分享

我学会了一个东西这个就是我必杀技了,我不告诉你,我自己留着偷着乐,如果是以前那的确是这样了,并且中国人也喜欢有“独门绝技”,但在一个开放的时代,技术分享成为一种主流的趋势,一个技术员如果缺少分享那他永远可能会落在其他技术员后面,因为他只能“盗取”被人的技术。

 

有灵性的技术员其实是非常喜欢把自己琢磨的东西记录下来并且讲这些东西分享出去,当然途径很多,例如博客、相关行业的门户等,但这种积累和技术分享是一个走向成熟、具有灵性技术员的必经之路,懂得分享,一种开放式的胸怀能够让技术员成为大师级的人物,开源社区中很多英雄的出现也认证了这一点。

 

成为一个有灵性的技术员是很多想从事技术行业的人希望的,并且这个是我们不断追求的目标,不求各个都是大师级人物,中国只要多一些有灵性的程序员我们国家的计算机产业也不至于“比较落后”了,当然我也朝着这个方向去奋斗,很高兴能和朋友们分享这些,也很希望能和更多人学习和交流。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990           星老师

posted @ 2012-09-01 15:42 疯狂软件 阅读(137) | 评论 (0)编辑 收藏

 

 任何一款框架都应该有自己的菜单和权限管理策略,LML本来是没有的,后来借鉴了一下就有了。LML毫不保留的借鉴了公司正在使用的Castle.MonoRail框架的菜单和权限管理策略,以及权限审核策略,务求山寨的完美。由于本人能力有限,再者本人实际情况下并没有阅读过Castle.MonoRail的源码,所以粗糙之处敬请原谅,以后还定会加以改正和改进。

   

    菜单即链接,LML中每一个Action中的任何一个方法都可以成为一个菜单,实际情况下我们从没有把一个没有返回视图的方法作为一个菜单,但是它可能对应一个权限。

   

    权限并不是链接,但是访问链接,即使是通过菜单访问链接,都可能需要通过权限审核。链接和权限也有着莫大的关联。

   

    虽然我可能解释的很粗糙,但是大家肯定能理解一下这样的关系:

   

    1, 一个菜单就是有一个链接。

   

    2, 一个链接的访问可能需要通过权限的审核,即一个链接(可能是菜单)可以对应一个权限。

   

    还需要注意这样一点:

   

    3, LML中权限并不会单独存在,它依托于一个菜单而展现存在。原因是:在我们这样的模块开发中,基本上一个Action类就对应一个模块,一个模块其实相当于一个菜单,在这个Action类中出现的所有权限,都让它归属于这一个大菜单,便与收集和管理。LML的菜单权限策略借鉴Castle.MonoRail,理解起来有些问题,请原谅。

   

    使用LML的菜单和权限管理策略需要4步:

   

    1, 配置菜单和权限初始化Bean,代码如下:

   

    权限初始化Bean

   

    <bean id=“InitMenuPower”

   

    class=“LML.Core.System.InitMenuPower”><property name=“packages”

   

    value=“LML.Action.System,LML.Action.Article”/>

   

    </bean>

   

    初始化参数是需要初始化菜单和权限的包名,多个请使用英文逗号隔开。

   

    2, Action配置定义权限拦截器,代码如下:

   

    自定义权限拦截器

   

    <interceptors><interceptor name=“power” class=“LML.Core.System.PowerInterceptor”></interceptor>

   

    <interceptor-stack name=“baseStack”>

   

    <interceptor-ref name=“defaultStack”></interceptor-ref>

   

    <interceptor-ref name=“power”></interceptor-ref>

   

    </interceptor-stack>

   

    </interceptors>

   

    3, 为方法(链接)定义菜单和权限,LML中使用注解来定义,代码如下:

   

    使用注解定义菜单和权限

   

    @SysMenuMenuId = System, MenuName = “系统管理”, MenuPic = sys.png, MenuParent = “”, MenuLevel = 1, MenuSort = 1

   

    @SysPowerPowerId = SystemPower, PowerMenu = System, PowerName = “系统管理查看”)

   

    public void System()

   

    {

   

    }

   

    Sysmenu各个参数的意义分别为:菜单ID,菜单名称,菜单图片,上级菜单ID,菜单层级,菜单排序。

   

    Syspower各个参数的意义分别为:权限ID,所属菜单ID,权限名称。

   

    4, 初始化。

   

    初始化操作:收集系统中如第三步骤定义的菜单和权限,插入数据库永久保存。毫无疑问,数据库结构需要自行设计。

   

    以上四个步骤做完了,系统将能够自动化收集菜单和权限,并能够进行管理。

   

    下一集我们会说到初始化操作。

   

    经过以上简单介绍,想必大家都知道在LML如何简单的使用菜单和权限了,我觉得就算是让你自行设计开发一套类似的菜单和权限管理策略,也是小零食一袋了。我一直对LML的要求就是足够简单,对于菜单和权限也不例外。没有很复杂的概念,也没有很复杂的语法,通过以上步骤就可以就使一个业务系统纳入较为灵活的菜单和权限管理。

   

当然了,这并不是完美的,必定简单的策略做不了太复杂的事情。献丑了。

    您正在看的文章来自疯狂软件教育中心 www.fkjava.org

    信息咨询:Q564205990             星老师

 

posted @ 2012-08-31 14:46 疯狂软件 阅读(175) | 评论 (0)编辑 收藏

 

需要准备的安装包:

   

    1.      memcache包:memcached-1.4.0.tar.gz

   

    2.      php扩展包:memcache-2.2.5.tgz

   

    memcache安装到/usr/local/lib目录下面:

   

    [plain]

   

    #版本可能不同,选择自己相应的版本

   

    sudo tar zxvf memcached-1.4.0.tar.gz

   

    cd memcached-1.4.0

   

    sudo ./configure --prefix=/usr/local/web/lib/memcache --with-libevent

   

    sudo make

   

    sudo make install

   

    管理memcache:

   

    [plain]

   

    #启动memcache

   

    cd /usr/local/web/lib/memcache/bin/

   

    ./memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 128 -P /usr/local/web/lib/memcache/memcached.pid

   

    #查看memcache

   

    ps -ef | grep memcached

   

    #停止memcache进程

   

    sudo kill   21039

   

    扩展包安装

   

    [plain]

   

    #根据你自己php的安装目录

   

    sudo tar xzvf memcache-2.2.5.tgz

   

    cd memcache-2.2.5

   

    sudo /usr/local/web/php.5.3.3/bin/phpize

   

    sudo ./configure --enable-memcache --with-php-config=/usr/local/web/php.5.3.3/bin/php-config --with-zlib-dir

   

    sudo make

   

    sudo make install

   

    修改php.ini文件

   

    [plain]

   

    sudo vim /usr/local/web/php.5.3.3/lib/php.ini

   

    #加上:extension=memcache.so

   

sudo kill -USR2 `cat /usr/local/web/ php.5.3.3/var/run/php-fpm.pid` #重启

    您正在看的文章来自疯狂软件教育中心 www.fkjava.org

    信息咨询:Q564205990           星老师

posted @ 2012-08-28 14:13 疯狂软件 阅读(856) | 评论 (0)编辑 收藏

 

对于初学者来讲,在了解Oracle体系结构之前必须掌握以下两个基本的概念: 数据库和实例。

    一、数据库

    数据库(database)是一个数据集合。

    无论数据库是采用关系结构还是面向对象结构, oracle数据库都将

    其数据存放在数据文件中。 在其内部, 数据库结构数据对文件的逻辑

    映射, 使不同的数据分开存储, 这些逻辑划分称为表空间。

    表空间和文件介绍:

    1: 表空间

    表空间(tablespace)是数据库的逻辑划分, 每个数据库至少有一个表空间,叫做系统表空间(system 表空间)。 一个表空间只能属于一个数据库。

    每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件称为数据文件。

    表空间的特性:

    1)控制数据库数据磁盘分配

    2)限制用户在表空间中可以使用的磁盘空间大小

    3)表空间具有 online, offline, readonly, readwrite属性

    修改表空间的属性:

    SQL> alter tablespace 表空间名称 属性;

    查询表空间状态:

    SQL> select tablespace_name, status from dba_tablespaces;

    注意: system, undo, temp表空间不能设为offline属性。

    4)完成部分数据库的备份与恢复

    5)表空间通过数据文件来扩大, 表空间的大小等于构成该表空间的所以数据文件的大小只和。

    查询表空间与数据文件对应关系:

    SQL> select tablespace_name, bytes, file_name from dba_data_files;

    基于表空间的几个操作:

    1)查询用户缺省表空间:

    SQL> select username, default_tablespace from dba_users;

    2)查询表与存储该表的表空间:

    SQL> select table_name, tablespace_name from user_tables;

    3)修改用户缺省表空间:

    SQL> alter user username default tablespace tablespace_name;

    4)将数据从一个表空间移动到另一个表空间:

    SQL> alter table table_name move tablespace tablespace_name;

    2.数据文件

    每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件叫做数据文件(datafile),数据文件只能属于一个表空间。 数据文件创建后可以改变大小。 创建新的表空间需要创建新的数据文件。 数据文件一旦加入到表空间中, 就不能从表空间中移走, 也不能与其他表空间发生联系。

    数据库必须的三类文件是 data file, control file, redolog file. 其他文件 prameter file,password file, archived log files并不是数据库必须的, 他们只是辅助数据库的。

    查看数据库的物理文件组成:

    1)查看数据文件: SQL> select * from v$datafile;

    2)查看控制文件: SQL> select * from v$controlfile;

    3)查看日志文件: SQL> select * from v$logfile;

    二: 实例

    通俗的讲实例就是操作oracle数据库的一种手段。

    数据库实例也称作服务器, 是用来访问数据库文件集的存储结构及后台进程的集合。

    一个数据库可以被多个实例访问(称为真正的应用群集选项)。

    决定实例的大小及组成的各种参数或者存储在名称init.ora的初始化文件中, 或者隐藏

    在数据库内部的服务器参数文件中。 通过spfile引用该文件, spfile存储在spfile.ora文件中。

    实例启动时读取初始化文件, 数据库系统管理员可以修改该文件, 对初始化文件的修改只有在下次启动时才有效。

    Instance分为两部分:

    1: memory structure(内存结构)

    memory structure分为两部分:SGASystem Global Area)区是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

    包括:

    .share pool

    .datafase buffer cache

    .redo log buffer

    .other structures

    PGAProgram Global Area)区包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收。

    2: background process(后台进程)

    包括:

    .PMON 负责在一个Oracle 进程失败时清理资源

    .SMON 检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复

    .DBWR 负责将更改的数据从数据库缓冲区高速缓存写入数据文件

    .LGWR 将重做日志缓冲区中的更改写入在线重做日志文件

.CKPT 负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990              星老师

posted @ 2012-08-27 16:01 疯狂软件 阅读(95) | 评论 (0)编辑 收藏

 

对于初学者来讲,在了解Oracle体系结构之前必须掌握以下两个基本的概念: 数据库和实例。

    一、数据库

    数据库(database)是一个数据集合。

    无论数据库是采用关系结构还是面向对象结构, oracle数据库都将

    其数据存放在数据文件中。 在其内部, 数据库结构数据对文件的逻辑

    映射, 使不同的数据分开存储, 这些逻辑划分称为表空间。

    表空间和文件介绍:

    1: 表空间

    表空间(tablespace)是数据库的逻辑划分, 每个数据库至少有一个表空间,叫做系统表空间(system 表空间)。 一个表空间只能属于一个数据库。

    每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件称为数据文件。

    表空间的特性:

    1)控制数据库数据磁盘分配

    2)限制用户在表空间中可以使用的磁盘空间大小

    3)表空间具有 online, offline, readonly, readwrite属性

    修改表空间的属性:

    SQL> alter tablespace 表空间名称 属性;

    查询表空间状态:

    SQL> select tablespace_name, status from dba_tablespaces;

    注意: system, undo, temp表空间不能设为offline属性。

    4)完成部分数据库的备份与恢复

    5)表空间通过数据文件来扩大, 表空间的大小等于构成该表空间的所以数据文件的大小只和。

    查询表空间与数据文件对应关系:

    SQL> select tablespace_name, bytes, file_name from dba_data_files;

    基于表空间的几个操作:

    1)查询用户缺省表空间:

    SQL> select username, default_tablespace from dba_users;

    2)查询表与存储该表的表空间:

    SQL> select table_name, tablespace_name from user_tables;

    3)修改用户缺省表空间:

    SQL> alter user username default tablespace tablespace_name;

    4)将数据从一个表空间移动到另一个表空间:

    SQL> alter table table_name move tablespace tablespace_name;

    2.数据文件

    每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件叫做数据文件(datafile),数据文件只能属于一个表空间。 数据文件创建后可以改变大小。 创建新的表空间需要创建新的数据文件。 数据文件一旦加入到表空间中, 就不能从表空间中移走, 也不能与其他表空间发生联系。

    数据库必须的三类文件是 data file, control file, redolog file. 其他文件 prameter file,password file, archived log files并不是数据库必须的, 他们只是辅助数据库的。

    查看数据库的物理文件组成:

    1)查看数据文件: SQL> select * from v$datafile;

    2)查看控制文件: SQL> select * from v$controlfile;

    3)查看日志文件: SQL> select * from v$logfile;

    二: 实例

    通俗的讲实例就是操作oracle数据库的一种手段。

    数据库实例也称作服务器, 是用来访问数据库文件集的存储结构及后台进程的集合。

    一个数据库可以被多个实例访问(称为真正的应用群集选项)。

    决定实例的大小及组成的各种参数或者存储在名称init.ora的初始化文件中, 或者隐藏

    在数据库内部的服务器参数文件中。 通过spfile引用该文件, spfile存储在spfile.ora文件中。

    实例启动时读取初始化文件, 数据库系统管理员可以修改该文件, 对初始化文件的修改只有在下次启动时才有效。

    Instance分为两部分:

    1: memory structure(内存结构)

    memory structure分为两部分:SGASystem Global Area)区是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

    包括:

    .share pool

    .datafase buffer cache

    .redo log buffer

    .other structures

    PGAProgram Global Area)区包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收。

    2: background process(后台进程)

    包括:

    .PMON 负责在一个Oracle 进程失败时清理资源

    .SMON 检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复

    .DBWR 负责将更改的数据从数据库缓冲区高速缓存写入数据文件

    .LGWR 将重做日志缓冲区中的更改写入在线重做日志文件

.CKPT 负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990              星老师

posted @ 2012-08-27 16:01 疯狂软件 阅读(110) | 评论 (0)编辑 收藏

 

 jQuery是一款免费且开放源代码的JavaScript代码库,由John Resig创建。授权协议为GPLMIT许可证双协议。

   

    示例代码:$(“p.neat”)。addClass(“ohmy”)。show(“slow”);

   

    特点

   

    轻量级

   

    GZip压缩后传输的代码文件仅14KB,未经压缩传送的代码文件仅26KB. jQuery 1.26版时:

   

    档案

   

    档案行数

    

    档案Size

   

    备注

   

    jquery-1.2.6.pack.js

   

    11

   

    31KB

   

    使用 Notepad++ 4.92版开启时,易导致Notepad++程式当掉。

   

    jquery-1.2.6.min.js

   

    32

   

    55KB

   

    jquery-1.2.6.js

   

    3550

   

    98KB

   

    链式语法

   

    $(“p.surprise”)。addClass(“ohmy”)。show(“slow”);

   

    CSS 1-3 选择器

   

    支持CSS选择器选定DOM对象。

   

    跨浏览器

   

    支持Internet Explorer 6+Opera 9+Firefox 1.5+Safari 2+

   

    简单

   

    较其它JavaScript库更易于入门。

   

    子项目

   

    jQuery UI

   

    基于jQuery的用户界面库,包括菜单、工具条、拖放、缩放、对话框、表格排序等多个组件。

   

    jQuery FX

   

基于jQuery的网页特效库,包括元素渐进式显示、隐藏等功能。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990          星老师

posted @ 2012-08-25 17:46 疯狂软件 阅读(137) | 评论 (0)编辑 收藏

 

在使用java线程的时候,特别是初学者总会有几点很常见的误区,下面以以下代码为例:

   

    线程类:

   

    package threadtest1;

   

    public class ReturnThreadInfo extends Thread {

   

    private String str;

   

    public ReturnThreadInfo() {

   

    this.str = “Hello”;

   

    }

   

    public void run(){

   

    try{

   

    this.str = “Hello World!”;

   

    }catchException ex{

   

    }

   

    }

   

    /*返回线程信息:str变量的值*/

   

    public String getThreadInfo(){

   

    return this.str;

   

    }

   

    }

    

    主类:

   

    package threadtest1;

   

    public class Main extends Thread {

   

    public Main() {

   

    }

   

    public static void mainString[] args {

   

    ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo();

   

    returnThreadInfo.start();

   

    System.out.printlnreturnThreadInfo.getThreadInfo());

   

    }

   

    }

   

    大家可以看到这个程序主要功能是返回线程returnThreadInfo对象的变量str的值并输出,那么str的值到底是什么,一些人可能会认为是“Hello world!”或是null,其实如果大家运行下就会知道输出的str的值实际是“Hello.为什么呢?其实认为输出结果是“Hello world”或是null的人存在着两个比较常见的误区:

   

    1、误区一:认为returnThreadInfo对象中的run方法一定在主类的System.out.printlnreturnThreadInfo.getThreadInfo())之间运行。

   

    这是比较常见的一个误区,稍微了解一些java编译原理的人应该清楚,java源文件的代码编译是自上而下的,也就是处在同一文件上面的代码会在下面的代码之间被编译和运行。所以很多人认为returnThreadInfo.start()先被运行,returnThreadInfo线程被启动,然后run()方法被调用,str被赋值:“hello world!,然后线程结束并返回到主类,最后调用System.out.printlnreturnThreadInfo.getThreadInfo())将str的值输出就是“Hello world!.

   

    如果returnThreadInfo不是一个线程而是一个普通类的对象,那么输出的结果是“Hello world,但是正因为returnThreadInfo是一个线程,所以run方法并不一定在System.out.printlnreturnThreadInfo.getThreadInfo())之前运行。因为实际上主类Main在运行时也是一个线程,当调用returnThreadInfo.start()方法来启动returnThreadInfo线程后,此时系统中运行的实际上就是MainreturnThreadInfo两个线程,那么这两个线程就会竞争CPU,谁先抢到CPU的控制权,谁就会先运行(实际上线程谁能优先抢到CPU运行时间是靠优先级来决定的,优先级可以通过线程的setPriorityint newPriority)来设置,newPriority的取值是1-10,newPriority值越大,线程的优先级就越高,优先强占CPU的几率就越大。线程默认的优先级是5)。由于MainreturnThreadInfo的优先级都默认为5,所以它们争抢CPU的几率是相同的。又因为Main线程实际上是比returnThreadInfo线程先启动的,所以在这个程序中,MainSystem.out.printlnreturnThreadInfo.getThreadInfo())反而比returnThreadInforun方法更早运行,所以输出的str值还是初始的“Hello.

   

    2、误区二:认为线程运行完毕后,线程消亡的同时,线程对象也会一并被回收。

   

    下面对ReturnThreadInfo类的源代码进行修改,将ReturnThreadInfo线程的优先级设置为10:

   

    public ReturnThreadInfo() {

   

    this.str = “Hello”;

   

    this.setPriority10);

   

    }

   

    这样returnThreadInfo线程的run()方法就会在Main类的System.out.printlnreturnThreadInfo.getThreadInfo())语句之前被运行。因此有很多人会认为当returnThreadInfo线程的run()方法运行完毕并返回后,线程就会死亡,那么Main类的最后一句System.out.printlnreturnThreadInfo.getThreadInfo())就会出问题,等于调用了已经不存在的对象:returnThreadInfo.

   

实际上这存在着很大的一个误区,线程的死亡并不意味着线程对象的销毁和回收。线程的死亡指的是当线程的run方法结束后,该线程就无法被重用和启动,但它的对象还存在并且它的属性和方法还一样可以被使用,因此System.out.printlnreturnThreadInfo.getThreadInfo())输出的并不是NULL而是“Hello World!,只有当整个应用程序都结束后,returnT

 您正在看的文章来自疯狂软件教育中心 www.fkjava.org

 信息咨询:Q564205990          星老师

posted @ 2012-08-24 16:45 疯狂软件 阅读(146) | 评论 (0)编辑 收藏

 

 

Windows操作系统好几个版本中,都可以把系统日志另存为文本文件、CSV文件等等,以方便系统管理员查询。不过同XP操作系统版本不同,在Windows7 中其日志另存为多了一个格式,即Xml格式。如下图所示,在Windows7中除了有XP操作系统所具有的三种格式外,还多了一个XML文件格式。这个格式也真是很多系统管理员所期待的日志格式。因为采用这个日志格式,能够给我们日常管理带来很大的便利。

便利一:阅读与查询方便。

         Xml格式的文件与其它文件最大的不同,就是Xml文件是一种结构化的数据。通俗的来说,其在保存记录的时候,会采用一些特殊的格式化控制符符号,来保证存储的数据都符合结构化的需要。那么这结构化的数据,对于系统管理员有什么帮助呢?最直接的帮助,就是系统管理员可以将Xml文件的数据轻松的导入到数据库中,进行分析。系统管理员往往需要多几个月、甚至几年的日志信息进行分析,以找到提高操作系统性能与漏洞方面的信息。但是对于这些海量的数据,如果不借助于数据库等专业分析工具,很难得出一个合理的结论。为此系统管理员往往需要把这些日志记录导入到数据库系统中,然后进行纵向与横向的对比,最终得出一些可行的结论。

       而现在如果采用了Xml格式来保存日志信息的话,那么系统管理员就可以轻松的把这些日志信息导入到数据库中。在不需要任何调整的情况下,就可以把XML格式的文件直接导入到数据库系统中。由于XML文件可以直接通过浏览器等工具打开,而这个浏览器又往往是操作系统所必备的一个应用软件。所以其查看就会非常的方便。

便利二:兼容性比较高

       XML文件的另外一个优点,就是其兼容性比较高。现在主流的数据库软件,基本上都支持XML文件。也就是说,系统管理员不仅可以利用微软的SQL Server数据库软件,也可以利用Oracle等非微软的数据库软件,把日志信息导入进去,然后进行分析。通常情况下,大部分系统管理员不怎么喜欢使用SQL Server数据库,因为其相对来说复杂一点,而且安装起来也比较麻烦。再说,对日志记录进行统计分析,使用SQLServer这种大型的数据库系统也有一点大材小用。为此包括笔者在内的系统管理员更加喜欢使用MySQL等小型的数据库系统来进行分析。不仅仅因为其是免费的,主要是其小巧方便,而且也不会占用多大的硬盘空间。而现在Windows7操作系统中,推出了XML格式的文件来保存日志记录,那么我们系统管理员就更加有理由采用MySQL等小型数据库了。因为MySQLXML文件的支持是非常强大的。而且,数据库也可以把相关的统计结果保存为XML文件的格式。

 

       另外XML的兼容性还体现在不同操作系统平台上的兼容。像事件文件,这是微软操作系统提供的一种文件格式,在Linux等操作系统上无法打开。再如文本文件,虽然在Linux操作系统上可以打开。但是通常情况下会出现一个格式的混乱现象,影响系统管理员的正常阅读。除非系统管理员利用一些系统自带的工具进行转换。但是采用XML格式的文件就不会出现这种情况。XML文件看起来就好像是一个网页。其在Windows操作系统下打开是什么样子的,那么在Linux操作系统上打开也是这个样子。不仅格式不会乱掉,而且也不需要用到其它额外的辅助工具。所以说,这个不同操作系统平台上的兼容性,可以提高员工资料的共享。据笔者所知,不少的企业,可能客户端采用的是Windows系统,而在服务器端采用的是Linux等非微软的操作系统。现在这种趋势越来越明显。所以提高这个多操作系统的兼容性,也是非常必要的。即使把日志文件保存在Linux操作系统上的文件服务器中,也不用担心会有什么问题。

便利三:可以实现日志文件的统一管理

        在企业中,不仅操作系统会产生日志文件。其它应用系统也会产生相关的日志文件。如数据库系统、ERP系统、财务管理软件等等也会产生日志文件。当企业应用服务器比较多的时候,分散的管理日志文件不仅效率比较低,而且容易造成关键信息的疏漏。为此通过一个统一的日志服务器平台来管理各个系统与服务产生的日志文件,是一个比较好的解决方法。但是要实现这个目标的话,最大的障碍就是各个系统产生的日志文件格式不兼容。如果Oralce数据库系统、 Windows操作系统等等都以各自的格式来保存日志文件,那么就需要不同的工具来打开这些日志文件进行查询,这处理起来非常的不方便。而如果这些应用软件都支持XML格式的日志文件,那么就会非常的方便。

        自从微软Windows7操作系统推出了XML格式的日志文件,笔者现在正在做一个项目。就是把Windows7操作系统、Oracle数据库系统以及其它一些支持XML日志文件的应用服务的日志文件,实现同一个软件来管理。其实原理很简单,就是把这些系统产生的日志文件自动传送到一台日志服务器中,然后数据库会自动把这些日志文件导入到数据库服务器中。并利用数据库的触发器等等工具来进行一些分析、自动预警等等工作。这可以减少系统管理员不时的查看相关日志所耗用的时间,减轻系统管理员的工作量。

        所以微软推出了采用XML格式的日志文件,这让统一管理操作系统与其它非微软产品的日志文件有了实现的可能性。因为XML格式是一个结构化的数据文件,其支持的厂商有很多。不过XML格式的文件已经出来了好久了,应该在XP操作系统出来之前。为什么在XP操作系统上,没有实现这个技术,笔者对此比较迷惑。不过在Windows7中终于给大家盼来了,迟来总比没有好。

便利四:对于WEB的支持性比较好。

        有时候系统管理员往往一个人不能够完成相关日志记录的分析。而需要跟数据库管理员或者其他应用软件负责人一起完成相关的日志分析工作。这主要是系统管理人员分工的不断细化所造成。现在有不少的项目管理软件,都是基于WEB来实现的。如果把日志文件跟这些WEB项目管理软件结合起来的话,这对系统管理员的工作将会有很大的帮助。

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990            星老师

posted @ 2012-08-21 17:32 疯狂软件 阅读(115) | 评论 (0)编辑 收藏

 

今天在看用TdataSet生成的XML中第一行里有个standalone,不知道是什么意思,查了一下资料才知道它的作用,下面就把我了解的写下来。

    standalone 用来表示该文件是否呼叫其它外部的文件。若值是 yes 表示没有呼叫外部文件,若值是 no 则表示有呼叫外部文件。默认值是 yes”。

    这里所指的外部文件其实就是查检XML是不是有效的约束文件,或是DTD或是Schema,那这两者又有什么区别呢?

    尽管XML1.0提供了一种机制,即文档类型定义(DTD)来规范XML的格式规则。但是它天生存在一些缺点,比如,它采用了非XML的语法规则、不支持更多的数据类型、扩展性差等,为了克服这些缺点,XML Schema 出现了。W3C推荐在XML中使用XML Schema来代替DTD

    XML Schema(模式) DTD一样,也用于定义 XML 文档的约束。但它与DTD明显不同的是,XML Schema遵循XML语法规则,更好地支持数据类型以及命名空间。W3C称:XML Schema is an XML based alternative to DTD。模式在单独的文件中定义,通常扩展名为 .xsd。每个模式定义都有一个根元素 schema,该元素属于名称空间http://www.w3.org/2001/XMLSchemaschema 元素可以包含可选的属性。

    比如:

    <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema

    elementFormDefault="qualified" attributeFormDefault="unqualified">

    这表示模式中使用的元素来自http://www.w3.org/2001/XMLSchema名称空间。

    XML 文件使用 schema 名称空间中的 schemaLocation 属性链接到对应的模式。使用 schemaLocation 属性必须定义 schema 名称空间。所有这些定义都出现在 XML 文档的根元素中。

    语法如下:

    <root_element schema_namespace_definition schema_location_definition>

    下面是一个例子:

    <Books xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"

    xs:schemaLocation="http://www.example.com Books.xsd">

    先来看看一个XML文件示例(message.xml),分别用DTDXML Schema 描述这个文件,看看它们之间的区别:

    1、使用DTD

    <?xml version="1.0" standalone="yes"?>

    <!DOCTYPE message[

    <!ELEMENT message to,from,body>

    <!ELEMENT to      #PCDATA>

    <!ELEMENT from    #PCDATA>

    <!ELEMENT body    #PCDATA>

    ]>

    <message>

    <to>rose</to>

    <from>alex</from>

    <body>Hi,My Girl!</body>

   </message>

    2、使用XML Schema

    message.xml:

    <?xml version="1.0" standalone="no"? >

    <message xmlns=http://www.example.com

    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

    xsi:schemaLocation="http://www.example.com message.xsd">

    <to>Rose</to>

    <from>Alex</from>

    <body>Hi,My Girl!</body>

    </message>

    message.xsd:

    <?xml version="1.0"?>

    <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema

    targetNamespace=http://www.example.com

    xmlns="http://www.example.com" elementFormDefault="qualified">

    <xs:element name="message">

    <xs:complexType>

    <xs:sequence>

    <xs:element name="to" type="xs:string"/>

    <xs:element name="from" type="xs:string"/>

    <xs:element name="body" type="xs:string"/>

    </xs:sequence>

    </xs:complexType>

    </xs:element>

</xs:schema>

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990             星老师

posted @ 2012-08-19 17:27 疯狂软件 阅读(282) | 评论 (0)编辑 收藏

   tomcat服务器是一种Servlet/jsp容器,更实质性的说是Servlet容器,因为jsp最终还是被编译成servlet来执行的。而对于servlet来说,其最长见的用途是扩展java web服务器功能,为来自web客户的请求提供服务。它完全运行在java虚拟机上。由于它的运行在服务器端,因此他的运行不依赖于浏览器。

   

        tomcat作为servlet容器,负责处理客户请求,把请求传给servlet并把结果返回给客户。servlet容器与servlet之间的接口是由java servlet api定义的,在此api中定义了servlet的各种方法,这些方法在servlet生命周期的不容阶段被servlet容器调用,servlet api还定义了servlet容器传递给servlet的对象类,如请求对象ServletRequest和相应对象ServletResponse

   

       tomcat服务器是由一系列可配置的组件构成,其中核心组件是Catalina Servlet容器,它是所有其他tomcat组件的顶层容器。tomcat的组件可以在conf/server.xml文件当中进行配置,每个tomcat组件在server.xml文件中进行配置,每个tomcat组件在server.xml文件中对应一种配置元素。具体见下:

   

    < server>

   

    < service>

   

    < Connector>

   

    < /Connector>

   

    < Engine>

   

    < Host>

   

    < Context>< /Context>

   

    < /Host>

   

    < /Engine>

   

    < /service>

   

    < /server>

   

    1.顶层类元素:

   

    < Server>< Service>,他们位于整个配置文件的顶层

   

    < Server>元素代表整个Catalina Servlet容器,它是tomcat实例的顶层元素。< Server>元素当中可包含一个或多个< service>元素。

   

    < service>元素中包含一个< Engine>元素,以及一个或多个< Connector>元素,这些< Connector>元素共享同一个< Engine>元素

   

    2.连接器类元素:

   

    connector,它代表了介于客户与服务器之间的通信接口,负责将客户的请求发送给服务器,并将服务器的相应结果传递给客户。

   

    3.容器类元素

   

    < Engine>,< Host>< context

   

    其中< Engine>组件处理在同一个< service>中所有< Connector>元素接受到的客户请求

   

    < Host>组件为特定的虚拟机处理所有客户请求。每个< Host>元素定义了一个虚拟主机,它可以包含一个或多个web应用。

   

    < context>组件为特定的web应用处理所有客户请求。它是使用最频繁的元素。每个< Context>元素代表了运行在虚拟机上的单个web应用,一个< Host>元素中可以包含多个< context>元素

   

        说到< context>元素,java web应用的主要特征之一就是它与Context的关系,每个web应用有唯一的Context.java web应用运行时,Servlet容器为每个web应用创建唯一的ServletContext对象,它被整个web应用中所有的组件共享。

   

    如下代码:

   

    < Context path=“/reglog” docBase=“reglog” debug=“0”

   

    crosscontext=“true” reloadable=“true”>

   

    < /Context>

   

    你可以自己在server.xml当中定义一个context元素,设定你所存在项目的参数及属性。其中path指定访问web应用的url入口

   

    docBase指定web应用的文件路径,可以给定绝对路径,也可以给定向对于hostappBase属性的相对路径

   

    reloadable,如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classesWEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新,服务器会自动重新加载web应用。

   

    另外说一下tomcat的运行脚本

   

        如果仔细研究一下tomcat的启动和关闭脚本,会发现startup.batshutdown.bat都执行同一个目录下的catalina.bat脚本。其实质是这样的:执行startup.bat脚本,相当于执行了catalina start命令,执行shutdown.bat相当于执行了catalina stop命令。

   

    commonlib,serverlib,sharedlib这三个目录相信大家都见过吧,但具体是干什么用的呢?

   

    其中serverlib下的jar文件只能被tomcat服务器访问。

   

    sharedlib下的jar文件可以被所有的web应用访问,但不能被tomcat服务器访问。

   

    commonlib目录下的jar文件可以被tomcat服务器和所有的web应用访问

 

您正在看的文章来自疯狂软件教育中心 www.fkjava.org

信息咨询:Q564205990            星老师

posted @ 2012-08-18 14:51 疯狂软件 阅读(290) | 评论 (0)编辑 收藏

 

    从服务器端促进程序快速开发的Java Server Pages JSP)决定它成为一种广为流行的工具。虽然呆板的一面仍然存在,然而无论它包含多少缺点,JSP能够为Web程序设计者提供很多东西,尤其是与数据库的输入和输出操作与数据的处理。

   

    通过JSP来进行数据库访问不需要太多的引导。问题是如何使开发者能够接受Web程序的数据库访问比传统的本地OLAP系统的数据库访问更加具有吸引力,并且使他们认识到,整洁和简要的数据访问方法才是关键的。在这一点上,JSP可以很好地解决。

   

    你能够做哪些?

   

    如果你正在编写高数据量、数据密度大的Web程序时,你的数据库访问应该具备哪一方面的要求?如果你正在使用JSP,那么你必须处理大量的服务器端的数据。程序也许需要大量的数据,或者很多用户,或者这二者的结合。你所考虑的可能范围还会包括:性能的优化,可检测性,每一用户的多个查询的影响,查询的复杂性,以及当单一的会话处理大量数据时,高等级的类型转换。

   

    这其中包含大规模的处理。但是,JSP能够帮助你很好地处理,因为它能够与Java Database Connectivity API JDBC)很好的兼容。你可以将JDBC包含在JSP代码中,并且JDBC能够传递声明执行类似数据库的命令,只要你能够正确地使用JDBC驱动程序。

   

    开始

   

    这里是一个通常的、抽象的JSP程序执行的体系。首选的JSP设计模式为模型-视图-控制器(MVCModel-View-Controller),即传统三层体系的一种变异,以更好的适合于服务器程序。在JSPMVC设计模式中,Model指的是程序的逻辑与数据,View为查看,以及Controller为请求处理。

   

    当你设计一个JSP程序时,在客户端与服务器交互之间建立第一步骤的页面,这是最好的一个过程。例如,在一个典型程序中,在数据交换中的每一个特定步骤都会有页面:一个数据入口页面,一个验证请求页面,一个数据库响应页面,以及这些页面的子页面(一个更改记录的页面,一个删除记录的页面,等等)。

   

    你可以将JDBC嵌入到每一页面中,以完成被请求的数据库操作。然而,这一操作也会冒很大的风险,因为由于混合了JSPJDBC而混合了整个程序──JDBC是基于SQL.这也就是SQL被封装在JDBC,JDBC也被封装在JSP──这也足够让你晕头转向的。如果你选择这一方法,你将会获得你想要的功能,但一定要保证你的程序逻辑与数据库访问代码的关系非常清晰,这一点格外小心。

   

    嵌入式JDBC

   

    JDBC API不会直接地与数据库进行交流。其中的驱动程序完成的实际的连接,你可以在卖方的Web站点上下载这些驱动程序。除此之外,还有四种JDBC的驱动程序类型,如果你决定使用JDBC,你需要正确地选择最为适合你需要的那种类型。你将使用一个DriverManager类来处理基于驱动程序的连接。

   

    你可以使用一个名为getConnectionDriverManager方法来建立你的数据库连接。你还可以使用它的URL参数来识别数据库:

   

    public static Connection getConnectionjdbc:odbc:nameOfDatabase

   

    现在,告诉DriverManager有关驱动程序的信息(应该在你的classpath中):

   

    Class.forName(“sun.jdbc.odbc.nameOfJDBCDriver”);

   

    你已经将数据库连接到JSP程序,但你仍然不能够执行一个数据库命令。解决这一点,你可以在JSP代码中生成声明以建立数据库命令,如下所示:

   

    public Statement createStatementintresultSetType, intresultSetConcurrency

   

    其中的参数能够让你控制从数据库查询得到的结果。当使用第一个参数时,可以在程序中看到结果;当使用第二个参数时,你可以通过查询来更新数值(这是一个难以相信的功能,在以后的文章中值得进一步讨论)。

   

    A

   

    C#Listing">http://builder.com.com/5100-6387-5172666.html?tag=sC#Listing

   

    AListing A显示列举了下两种方法的复杂性。

   

    声明(Statement)就是SQL命令。PreparedStatement就是SQL的声明,你可以通过其中的参数来控制程序的过程。CallableStatement是用于访问SQL存储程序。你是否开始意识到,如果你没有看到这些说明,你是否觉得这些声明很复杂?请注意到,通过调用rollback方法,你可以撤除交易过程。

   

    如果你想完全使用这些数据库访问的方法,你唯一遗漏的还有:

   

    ResultSetexecuteQuerystring sqlQuery

   

    (你可以使用executeQuery来完成以上过程。你也可以使用一个executeUpdate来完成更新、插入和删除)。你以上的声明接口使你可以使用一些方法来执行SQL声明。ResultSet所做的就是访问从查询得到的数据,所以你可以在JSP程序中使用这些数据。

   

    通过将JSP程序分解成单一的、功能明显的页面,以及在任何给定页面中执行一个单一的数据库操作,可以很大程度地简化你的数据库操作,以及建立可以用于以后程序开发的页面,即使你将SQL嵌入到这些页面的JDBC中。

   

但是你还可以做更多的事情,以使得你的JSP数据库访问更加整洁和容易维护。在JSP代码中嵌入JDBC,以及通过发送SQL命令与数据库通讯,这些过程都很好。但是,它要求在不能增加代码复杂程度下,建立通过接口的SQL命令的程序。当你的SQL处理需要提高灵活性的时候,你可以进一步地分离你的数据库接口代码,以清洁你的JSP程序。

 

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990            星老师

posted @ 2012-08-17 13:13 疯狂软件 阅读(146) | 评论 (0)编辑 收藏

 

 1)继承第1种方式:对象冒充

2)继承第2种方式:

call方法call方法是Function对象中的方法,因此我们定义的每个函数都拥有该方法。可以通过函数名来调用call方法,call方法的第一个参数会被传递给函数中的this,从第二个参数开始,逐一赋值给函数中的参数。

 

3)继承第3种方式:

 apply方法apply方法与call方法的不同之处在于,apply方法第二个参数传递的是一个数组,而不像call方法那样以离散的形式传递参数。

4)继承第4种方式:

原型链方式该方式的缺点是不能够传递参数。初始化必须要等对象创建之后

5)继承第5种方式:混合方式(推荐)

 

您正在看的文章来自疯狂软件教育中心 www.fkjava.org

信息咨询:Q564205990          星老师

posted @ 2012-08-15 13:43 疯狂软件 阅读(145) | 评论 (0)编辑 收藏

 

 

 首次接触到WebService,要调用一个发送短信的WebService里方法sendMQ,不废话,自己留个备份,也给需要的朋友,代码如下:

   

    Service service = new Service();

   

    String url = “http://xxxxx.xx.xx/yy.asmx”;

   

    //在浏览器中打开url,可以找到SOAPAction: http://www.chinsoft.com.cn/SendMQString namespace = http://www.chinsoft.com.cn/;String actionUri = SendMQ;

   

    //Action路径String op = SendMQ;

   

    //要调用的方法名Call call = Call service.createCall();call.setTargetEndpointAddressnew java.net.URLurl));call.setUsername(“your username”);

   

    // 用户名(如果需要验证)call.setPassword(“your password”);

   

    // 密码call.setUseSOAPActiontrue);call.setSOAPActionURInamespace + actionUri);

   

    // action uricall.setOperationNamenew QNamenamespace, op));

   

    // 设置要调用哪个方法

   

    // 设置参数名称,具体参照从浏览器中看到的call.addParameternew QNameinstance.NAMESPACE, sender”),

   

    XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, phoneNumber”),

   

    XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, content”),

   

    XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, sendTime”),

   

    XMLType.XSD_STRING, ParameterMode.IN);call.setReturnTypeorg.apache.axis.encoding.XMLType.XSD_STRING);

   

    // 要返回的数据类型String sendTime = 2011-07-14 13:05:32;Object[] params = new Object[] {xxx, 13223333333, “测试短信”, sendTime };String result = String call.invokeparams);

   

    //方法执行后的返回值

   

    以上代码用到的包:apache axis

   

    import javax.xml.namespace.QName;

   

    import javax.xml.rpc.ParameterMode;

   

    import javax.xml.rpc.encoding.XMLType;

   

    import org.apache.axis.client.Call;

   

    import org.apache.axis.client.Service;

   

希望帮助需要的朋友。

 

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990         星老师

 

posted @ 2012-08-14 15:48 疯狂软件 阅读(530) | 评论 (0)编辑 收藏

 

在一个jsp文件中,有三处地方定义了字符集,哪位兄弟,请帮忙解答一下如下问题!先谢了!

 

第一个问题:这三处定义字符集的作用分别是什么?

第二个问题:这三处定义字符集的异同点是什么?

第三个问题:这三个定义字符集的地方?在jsp文件都是必须要的吗?]

 

<!-- 1 -->

<%@ page language="java" contentType="text/html;charset=UTF-8" errorPage="error.jsp" %>

<!-- 2 -->

<%@ page pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<!-- 3 -->

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>DispathTruck</title>

 

 

关于JSP页面中的pageEncodingcontentType两种属性的区别:

 

pageEncodingjsp文件本身的编码

 

contentTypecharset是指服务器发送给客户端时的内容编码

 

JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType

 

第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

 

第二阶段是由JAVACJAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8encodingjava源码。

 

JAVACUTF-8encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。

 

第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效

 

contentType的設定.

 

pageEncoding contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. pageEncoding不等于contentType, 更有利亚洲区的文字 CJKVJSP网页的开发和展示, (pageEncoding=GB2312 不等于 contentType=utf-8)

 

jsp文件不像.java.java在被编译器读入的时候默认采用的是操作系统所设定的locale所对应的编码,比如中国大陆就是GBK,台湾就是BIG5或者MS950。而一般我们不管是在记事本还是在ue中写代码,如果没有经过特别转码的话,写出来的都是本地编码格式的内容。所以编译器采用的方法刚好可以让虚拟机得到正确的资料。

 

但是jsp文件不是这样,它没有这个默认转码过程,但是指定了pageEncoding就可以实现正确转码了。

 

举个例子:

 

<%@ page contentType="text/html;charset=utf-8" %>

 

大都会打印出乱码,因为输入的“你好”是gbk的,但是服务器是否正确抓到“你好”不得而知。

 

但是如果更改为

 

<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>

 

这样就服务器一定会是正确抓到“你好”了'

您正在看的文章来自疯狂软件教育中心 www.fkjava.org

信息咨询:Q564205990           星老师

posted @ 2012-08-12 17:30 疯狂软件 阅读(707) | 评论 (0)编辑 收藏

 

 1.oracle冷备份脚本:

    -- script:coldbak.sql

    -- creater:yangkai

    -- date:9.8.2012

    -- desc:offline full backup database

    --connect database

    connect system/zhangle;

    --shutdown database

    shutdown immediate;

    --Copy Data file

    $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.DBF c: ebei;

    --Copy Control file

    $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.CTL c: ebei;

    --Copy Log file

    $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.LOG c: ebei;

    --startup database

    startup;

    2.sqlplus之后,start coldbak.sql即可。

    其中需要注意的是:

    !xcopy命令怎么用?加个“!”是不是指“!”符号后面的命令执行操作系统的命令。我一执行!xcopy命令splplus就报错说"sp2-0734未知命令开头“!xcopy c:--忽略剩于的行。"

    是因为:

    Windows下,不是!xcopy 而应该是 $xcopy,在SQL*Plus $表示执行操作系统命令。

    Linuxspl*plussvrmgrl下,是用!xcopy

    cms下是copy

    Linux下是cp

    host是通用的,如:

    SQL> host copy G:ORACLEPRODUCT10.2.0ORADATAYANGKAICONTROL02.CTL c: ebei;

    已复制 1 个文件。

SQL>'

 

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990           星老师

 

posted @ 2012-08-11 17:15 疯狂软件 阅读(660) | 评论 (0)编辑 收藏

多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程?当然,要了解到多进程,就要涉及到操作系统。不过大家也不要紧张,听我慢慢道来。这其中的环节其实并不复杂。

(1)单CPU下的多线程

在没有出现多核CPU之前,我们的计算资源是唯一的。那么如果系统中有多个任务要处理的话,那么就需要按照某种规则依次调度这些任务进行处理。什么规则呢?可以是一些简单的调度方法,比如说

1)按照优先级调度

2)按照FIFO调度

3)按照时间片调度等等

当然,除了CPU资源之外,系统中还有一些其他的资源需要共享,比如说内存、文件、端口、socket等。既然前面说到系统中的资源是有限的,那么获取这些资源的最小单元体是什么呢,其实就是进程。

(2)多核CPU下的多线程

没有出现多核之前,我们的CPU实际上是按照某种规则对线程依次进行调度的。在某一个特定的时刻,CPU执行的还是某一个特定的线程。然而,现在有了多核CPU,一切变得不一样了,因为在某一时刻很有可能确实是n个任务在n个核上运行。我们可以编写一个简单的open mp测试一下,如果还是一个核,运行的时间就应该是一样的。

(3)多线程编程

为什么要多线程编程呢?这其中的原因很多,我们可以举例解决

1)有的是为了提高运行的速度,比如多核cpu下的多线程

2)有的是为了提高资源的利用率,比如在网络环境下下载资源时,时延常常很高,我们可以通过不同的thread从不同的地方获取资源,这样可以提高效率

3)有的为了提供更好的服务,比如说是服务器

4)其他需要多线程编程的地方等等

转自:疯狂软件

posted @ 2012-05-12 16:44 疯狂软件 阅读(136) | 评论 (0)编辑 收藏

软件架构是在软件需求出来之后,软件构建开始之前的工作,架构师应该确定的事情有:

1、程序组织

架构应该定义程序中的主要构造块。根据程序规模不同,各个构造块可能是单个类,也可能是由多个类组成的系统。每个构造块实现一个高层功能。并且每个需求都至少有一个构造块覆盖它。

定义各个构造块之间的通信规则和依赖规则

2、主要的类

架构应该详细定义或写出所用的主要的类。并指出该类如何与其他类交互。

架构不需要对所有类进行说明,使用82法则:对构成系统80%功能的20%类进行说明

3、数据设计

架构应该说明清楚用到的数据表的设计,并且描述为何做出这样的选择

4、业务规则

对特定的业务规则(比如:客户信息的更新时间不能超过30秒)要有架构方面的描述(比如30秒内对客户端进行信息同步)

5、用户界面设计

架构应该有详细的用户界面,好的用户界面直接关系到功能的实现和软件的最终效果

6、资源管理

架构应该对稀缺资源有管理计划。比如数据库连接,线程,句柄等的使用。有可能需要设计一个“资源管理器”的模块

7、安全性

架构应该描述用户据输入数据,cookie,配置文件等的安全性说明

8性能

应该根据需求文档中对性能的描述来提供估计的性能数据,并且说明为什么架构师相信能达到性能目的。或者为什么有的性能指标无法达到

9、可伸缩性

架构应该说明系统如何应对以后用户数量,服务器数量,网络节点数量,数据库记录数,数据库记录长度,交易量等增长的需求。

10、互用性

如果系统与其他软件或硬件有共享资源,架构应该说明如何完成这项功能

11、国际化/本地化

系统式是否支持国际化,如何在与用户交互的模块中实现国际化

12、输入输出

架构应该详细定义读取策略

13、错误处理

有人估计程序中高达90%的代码是用来处理异常和错误的,意味只有10%的代码是用来处理常规情况的。

14、容错性

容错是增强系统可靠性的技术,如果出现了错误是转入“部分运转”还是“功能退化”?

15、架构的可行性

架构师应该论证自己这个系统设计的可行性

16过度工程

即健壮性。架构应该指出哪些类哪些模块需要进行过度工程(健壮性测试),哪些类或模块只需要做出最简单的工作性能

17、关于买还是造

一些软件,开源代码,处理程序,是使用现货采购还是自己定制开发

18、关于复用

如果使用业界已经存在的软件,开源代码等资源,应该说明清楚如何对这些东西进行加工。

19、变更策略

架构应该清楚描述处理变更的策略。架构应该列出已经考虑过的可能会有变更的需求或者可能增强的功能。并提供处理情况,比如使用版本号进行控制,或者将代码设计成可动态添加新数据

20、架构的总体质量

架构应该清楚描述其做的所有主要决策的动机明确指出有风险的地方

转自:疯狂软件

posted @ 2012-05-12 16:43 疯狂软件 阅读(272) | 评论 (0)编辑 收藏

偶然在网上看到了这个有趣的问题,有人问:既然普遍认为编程是比较难的工作,为什么业务分析人员和项目经理们会拿比程序员更多的薪水?虽然大多数的时候程序员都被发现是最晚离开公司的人,可那些家伙的工作却能拿更多的报酬,为什么会这样?

回答的人很多,但似乎只有一个是比较合情合理的,它是从经济学原理的角度分析的这个问题。

人们所能获得的报酬往往会低于老板们的“最高标准”,而高于人们自己的“最低要求”。在这个范围内,你的实际收入依赖于你相对于你的老板的讨价还价的能力。

假设你给公司提供的服务价值每天1000美元。如果你用枪指着他,他会给你这个价格,因为他别无选择。如果你别无选择,你只能接受每天100美元水平。这是你的浮动范围。

假设你是一个新手,没有背景关系,不出名,你的老板是谷歌。谷歌有很强的讨价资本,它可以等待,去雇用其他人,很多人都想为它工作。你的资本很少,你需要付房租,所以你只能接受每天100多美元,而不是1000美元。

假设你是地球上最后一个会COBOL语言的程序员,而你的老板的主机上正跑着COBOL程序。那么,你拥有很强的讨价还价的资本,你将能得到接近每天1000美元的报酬。

所以,要么是你的项目经理或业务分析员对公司更有价值,要么就是他们有更多的讨价还价的资本。我并不认为是前一种情况,也就是说,应该是后一种情况。善于人际交往的人很少。这种事情也不能外包——因为他们需要接触客户。他们的相对稀缺给了他们更多讨价的资本,所以他们有了更高的报酬。

这个巧妙的回答来自NRM,尽管跟其它的各种和政治相关的解答比起来有点乏味,但它确实反映了实际情况。就像他提到的,善于交际的人稀少,这种人在任何公司都能来到巨大的好处,尤其是在软件开发领域。

转自疯狂软

posted @ 2012-05-11 16:59 疯狂软件 阅读(135) | 评论 (0)编辑 收藏

每次去IT社区,都在吐槽:说技术人员是多么的苦逼;每次和一些搞技术的朋友聚会,聊的也是大家的生活是多么的苦逼;每次上网看微博,也是充斥着“技术人员苦逼论”

今天谈到这个话题,固然会有很多的不同的意见和想法,我这里这是就从我看到的一些现象和自己的一些思考说说技术人员到底为什么“苦逼”。

为什么苦逼?

原因一大堆,对于外部的因数,我们很难控制,例如中国的IT国情和对技术人员的观念。但是,在商业中有这样一句话可以借鉴一下:经济再萧条,也有人在赚钱;形式再好,也有很多人在亏本,很多的公司在倒闭。

很多的时候,我们倒苦水,但是心里要知道:是大的环境让我们苦逼,还是我们本身就得苦逼,换句话说,苦逼是我们自己应得的。这话很多人不爱听,但是很多时候确是事实。

这半年多以来,去了不少大大小小的公司,为他们的项目进行救火,解决他们现有的性能等问题。很多的项目在做的时候,很少考虑什么性能,安全等因素,都是上面的人在不断的催,下面的人在火急火燎的加班加点赶进度—今天完成了什么功能点,明天要完成什么功能点。于是很多的技术人员顾不上什么,一心思的把功能堆了起来。苦逼的第一个原因出来了。

终于,项目搞定了,上线跑了没有多久,问题就出来了:项目功能是齐全,但是就是无法使用,有的功能慢的像拖牛。于是,有人建议开始买好的设备,加大带宽,以为钱砸下去了,情况会好点。但是好景不长,甚至事与愿违。于是一堆人就开始焦虑,束手无策,技术人员又开始加班加点的解决明明知道自己无法解决的问题,于是苦逼的第二个原因出来了。

在无法搞定的情况下,技术人员开始郁闷了,接着疯狂的上网开始收集可能的偏方,然后一股脑的用在项目中,求神拜佛的希望偏方有效果,运气好,暂时搞定了,那就皆大欢喜,搞不定,把之前的步骤再次重复一次吧。基本可以用下面的一个幽默来总结这个过程

从接触到的一些技术朋友来看,有些朋友的技术能力不错,有的却让我想抽自己,没有听错,是抽我自己。抽我自己为什么要给他们讲这么多的东西,而这些东西他们又不懂,然后又非得把懂这些知识的铺垫知识给他们讲。例如,项目出现了内存泄露的问题,公司的技术人员问题我这么回事,于是我告诉他们是VAS的碎片,他们又问我们为什么VAS碎片了,于是我们给他们讲述,但是他们听不懂,于是让我们给他们讲解一些铺垫知识:Window内存机制,.NET内存机制等。本来以为大家都是同行,交流交流,没想到,使得我们自己陷入了苦逼

同时也深深的感受的一点:很多的技术朋友在走出了校门或者培训学校之后,技术能力就没有在进步了,一是处于打混的阶段,有的运气好,很多年之后,混到了不错的职位,但是很多的人却混的非常不幸,于是他们就成为“技术人员苦逼论”的忠实粉丝。其中有一点就是很多的朋友不喜欢自学,总是希望有人手把手的教。我们遇到的一个最搞人的情况就是,我们已经把功能全部调完了,代码完全实现了,服务器也是全部配置好了,就差调试了,很多的人依然不动。

也使得我想起另外一个情况:每次有很多的朋友都说要学习技术内幕,要学深一点,喊着叫着要看深一点的文章,但是写出来之后,没有几个人真正的看完,前几篇简单的介绍看的人很多,稍微深一点,就没有人看了。也有很多的朋友想到处找大牛拜师,都希望沾点牛气,成为牛中的一员。但是技术,能力,这个东西终究靠自己。用心与不用心,差别就是天壤之别。

我常常说这样的话:社会不是初中,高中,没有人会像老师那样手把手的教你,盯着你,一切靠自己。没有谁就非得要叫你,没有人欠你的,如果自己都不上进,想做阿斗,诸葛亮来了也没用办法。物竞天择,适者生存!

我非常敬佩那些出身不好但是一直坚持奋斗的人,也非常敬仰那么环境舒适还依然努力的人。你遇到过很多聪明人,你的大学同学,你的同事,你的朋友,有几个比你傻?很多年以后,你会看到成功的并不是最聪明的人。因为决定成功的更多是非智力因素:明确的目标,积极的心态,努力和坚持,承受挫折和压力的能力,成熟的接人待物等等。有一种人注定没戏:不努力和怨天尤人。看到这里,技术人员为什么苦逼,可能各人心中有了答案。

转自疯狂软

posted @ 2012-05-11 16:58 疯狂软件 阅读(163) | 评论 (0)编辑 收藏

Java运行环境交互

SunJava提供了丰富的基础类库,Java SE提供了三千多个基础类(包括第7章介绍的集合框架),通过这些基础类库可以提高开发效率,降低开发难度。对于合格的Java程序员而言,至少要熟悉Java SE70%以上的类(当然,笔者并不是让读者去背诵Java API文档),但在反复查阅API文档的过程中,大脑会自动记住大部分类的功能、方法,因此程序员一定要多练,多敲代码。

    Java提供了StringStringBufferStringBuilder来处理字符串,它们之间存在少许差别,本章会详细介绍它们之间的差别,以及如何选择合适的字符串类。Java还提供了DateCalendar来处理日期、时间,其中Date是一个已经过时的API,通常推荐使用Calendar来处理日期、时间。

    正则表达式是一个强大的文本处理工具,通过正则表达式可以对文本内容查找、替换、分割等操作。从JDK1.4以后,Java也增加了对正则表达式的支持,包括新增的PatternMatcher两个类,并改写了String类,让String类增加了正则表达式支持,增加了正则表达式功能后的String类更加强大。

    Java还提供了非常简单的国际化支持,Java使用Locale对象封装一个国家、语言环境,再使用ResourceBundle根据Locale加载语言资源包,当ResourceBundle加载了指定Locale对应的语言资源文件后,ResourceBundle对象就可调用getString方法来取出指定key所对应的消息字符串。

与用户互动

    如果一个程序总是按既定的流程运行,无须处理用户动作,这个程序总是比较简单的。实际上,绝大部分程序都需要处理用户动作,包括接受用户的键盘输入、鼠标动作等。因为现在还未涉及图形用户接口(GUI)编程,故本节主要介绍程序如何获得用户的键盘输入。

运行Java程序的参数

回忆Java程序的入口:main方法的方法签名:

//Java程序入口:main方法

public static void main(String[] args){….}

    现在可以详细讲解main方法为什么采用这个方法签名:

    1public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个main方法,所以使用public修饰符把这个方法暴露出来。

    2static修饰符:JVM调用这个主方法时,不可能先创建该主类的对象,然后通过对象来调用该主方法。JVM直接通过主类来调用主方法,因此使用static修饰该主方法。

    3void返回值:因为主方法被JVM调用,该方法的返回值将返回给 JVM,这没有任何意义,因此main方法没有返回值。

    上面方法中还包括一个字符串数组形参,根据前面介绍方法调用的规则:谁调用方法,谁负责为形参赋值。也就是说,main方法由JVM调用,即args形参应该由JVM负责赋值。但JVM怎么知道如何为args数组赋值呢?我们先看下面程序:

程序清单:codes/09/9- 1/TestArgs.java

public class TestArgs

{

public static void main(String[] args)

{

//输出args数组的长度

System.out.println(args.length);

//遍历args数组的每个元素

for(String arg:args)

{

System.out.pringln(arg);

}}}   

上面程序几乎是最简单的“HelloWorld”程序,只是这个程序增加了输出args数组的长度,遍历args数组元素的代码。使用java TestArgs命令运行上面程序,看到程序仅仅输出一个0,这表明args数组是一个长度为0的空数组—这是合理的:因为计算机是没有思考能力的,它只能忠实地执行用户交给它的任务,既然我们没有给args数组设定参数值,那么JVM就不知道args数组的元素,所以JVM以将args数组设置成一个长度为。的数组。

改为如下命令来运行上面程序:

java TestArgs Java Spring

看到如图9.1所示的运行结果:


9.1main方法的形参数组赋值

从图9.1中可以看出,如果运行Java程序时在类名后紧跟一个或多个字符串(多个字符串之间以空格隔开)JVM就会把这些字符串依次赋给args数组元素。运行Java程序时的参数与args数组之间的对应关系如图9.2所示:


9.2运行Java程序时参数和args数组的关系

如果某参数本身包含了空格,则应该将该参数用双引号(“)括起来,否则JVM会把这个空格当成参数分隔符,而不是当成参数本身。例如采用如下命令来运行上面程序:

 java TestArgs “Java Spring”

运行上面命令,看到args数组的长度是1,只有一个数组元素,其值是Java Spring

摘自《疯狂java讲义》

posted @ 2012-05-08 15:55 疯狂软件 阅读(235) | 评论 (0)编辑 收藏

 

EJB调用是耗时、费力的。怎么提高EJB的性能?我们为解决这一问题,开始边写边讨论。等到完成了,我才发现,我们所应用的技巧总结一下,竟有十条。把提高EJB性能的这些技巧总结一下,为以后的项目做参考。

1.用一个Session Bean封装多个Entity Bean,将原来的多个Entity BeanRemote调用和Local调用封装在一个Session Bean中。所以建立一个ServerFacade,它为多个对象提供统一获取EJB Home和获取对象的接口。ServerFacade为程序要用到的所有EJBhome handle提供缓存,提高访问JNDI Name的时间,达到提高访问效率的目的。以后查找JNDI Name的方法都应写在接口里,调用时直接从接口调用。

2.EJBRemote接口中使用粗粒度的方法,不推荐使用细粒度方法。

3.如果EJBRemote接口获取成功,应不再使用Remote接口,而是将Remote接口构造成一个一般的Java对象,通过调用一般的JAVA对象的方法来达到减少对网络的访问。

4.如果你部署EJB客户端和EJB在相同的JVM上,建设使用EJB2.0规范的Local接口代替Remote接口。

5."transient"关键字声明不必要的数据变量,替代以前的"public""private"等,避免不必要的数据变量占用网络资源。

6.ejb-jar.XML部署文件中,对Session Bean中非事务的方法,将trans-attribute属性赋为"NotSupported""Never"

7.设置事务的超时时间,在JBoss中,要修改${jboss.home}/server/${jboss.configuration}/conf/jboss-service.xml

8.当事务锁定数据库的行记录时,事务应跨越可能的最小的时间。

9.调整EJB 服务器的各种参数,如线程数、EJB池大小、连接池参数等。以在JBoss修改连接池参数为示例,进行说明。如果JBossMySQL相连,配置${jboss.home}/server/${jboss.configuration}/deploy/mysql-service.xml,来修改连接池参数,包括MinSizeMaxSizeBlockingTimeoutMillisIdleTimeoutMinutesCriteria等,各参数的含义如下所示:

1)MinSize :连接池保持的最小连接数。

2)MaxSize :连接池保持的最大连接数。

3)BlockingTimeoutMillis :抛出异常前最大的等待连接时间。

4)IdleTimeoutMinutes :关闭连接前连接空闲的最大时间。

5)Criteria :有ByContainerAndApplicationByContainerByApplicationByNothing等值。

10.对于数据库事务,应选择较低成本的事务等级,避免造成坏数据。递增成本的事务等级包括:

TRANSACTION_READ_UNCOMMITED,

TRANSACTION_READ_COMMITED,

TRANSACTION_REPEATABLE_READ,

TRANSACTION_SERIALIZABLE

转自疯狂软件

posted @ 2012-05-08 15:52 疯狂软件 阅读(118) | 评论 (0)编辑 收藏

Java内存管理的9个小技巧

以前很多人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测试报告来证明这一点。其实从理论上来讲Java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么多理由来证明它确实占内存呢?两个字,陋习。

1、别用new Boolean()。

在很多场景中Boolean类型是必须的,比如JDBCboolean类型的setget都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装boolean类型的,比如

ps.setBoolean(“isClosed”,new Booleantrue));

ps.setBoolean(“isClosed”,new BooleanisClosed));

ps.setBoolean(“isClosed”,new Booleani==3));

通常这些系统中构造的Boolean实例的个数是相当多的,所以系统中充满了大量Boolean实例小对象,这是相当消耗内存的。Boolean类实际上只要两个实例就够了,一个true的实例,一个false的实例。Boolean类提供两了个静态变量:

public static final Boolean TRUE = new Booleantrue;

public static final Boolean FALSE = new Booleanfalse;

因为valueOf的内部实现是:return b TRUE FALSE;所以可以节省大量内存。相信如果Java规范直接把Boolean的构造函数规定成private,就再也不会出现这种情况了。

2、别用new Integer

Boolean类似,java开发中使用Integer封装int的场合也非常 多,并且通常用int表示的数值通常都非常小。SUN SDK中对Integer的实例化进行了优化,Integer类缓存了-128127256个状态的Integer,如果使用 Integer.valueOfint i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用Integer.valueOf代替new Integer的话也将大大降低内存的占用。如果您的系统要在不同的SDK(比如IBM SDK)中使用的话,那么可以自己做了工具类封装一下,比如IntegerUtils.valueOf(),这样就可以在任何SDK中都可以使用这种特性。

3、用StringBuffer代替字符串相加。

这个我就不多讲了,因为已经被 人讲过N次了。我只想将一个不是笑话的笑话,我在看国内某“着名”java开发的WEB系统的源码中,竟然发现其中大量的使用字符串相加,一个拼装SQL 语句的方法中竟然最多构造了将近100string实例。无语中!

4、过滥使用哈希表

有一定开发经验的开发人员经常会使用hash表(hash 表在JDK中的一个实现就是HashMap)来缓存一些数据,从而提高系统的运行速度。比如使用HashMap缓存一些物料信息、人员信息等基础资料,这 在提高系统速度的同时也加大了系统的内存占用,特别是当缓存的资料比较多的时候。其实我们可以使用操作系统中的缓存的概念来解决这个问题,也就是给被缓存的分配一个一定大小的缓存容器,按照一定的算法淘汰不需要继续缓存的对象,这样一方面会因为进行了对象缓存而提高了系统的运行效率,同时由于缓存容器不是无限制扩大,从而也减少了系统的内存占用。现在有很多开源的缓存实现项目,比如ehcacheoscache等,这些项目都实现了FIFOMRU等常见的缓存算法。

5、避免过深的类层次结构和过深的方法调用。因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。

6、变量只有在用到它的时候才定义和实例化。

7、尽量避免使用static变量,类内私有常量可以用final来代替。

8、对频繁使用的对象采用对象池技术

9、保证每个IO操作,connection及时关闭
转自:疯狂软件

posted @ 2012-05-04 11:58 疯狂软件 阅读(117) | 评论 (0)编辑 收藏

从程序员到技术领导者

入行

你为什么要当程序员?每当我问起很多人入行的人,回答各不相同。

有很多人是因为喜欢。谁说过:热爱是最好的老师。当然,关键是热爱是否能支撑自己把爱好做成一份职业。但不论做多久,因为热爱或曾经热爱,这个理由就足够了。你不能希望撒一粒种子,都变成参天大树。所以,对进来和离开的人,我们都应该鼓励。

新入行的人,建议他们用1-2年来适应、评估程序员的生活状态。不论满怀希望还是充满失落,这些时间都不会浪费。在如今信息时代,曾经的经历,都会使有这方面经历的人拥有独特的眼光,很容易在其他领域内,引入新的思考。

进入软件行业,还是其他行业,其实,对一个新人来说,最重要的东西不是行业本身。而是,你自己得明白:你是什么样的人?你喜欢做什么?你希望做什么?你希望成为什么?你希望现在如何?你希望几年后又是怎么样?最关键的还有:你现在能做什么?

当然,你不可能凭空乱想,如果你自己都觉得目标遥远,那就仔细倾听内心的感受。你随时得问自己:我到底要什么?

有一定的方向感,就可以上路了,不必患得患失。

技能

作为立身之本,绝大多数的程序员首先关注的是编程知识、技能。他们大多容易忽视自己在从小到大的学习中,已经发展出来的能力:学习的能力、沟通的能力。这些能力虽然并不能马上换来高薪,但是,却对一个人后来的发展,有长远的影响。

程序员的工作,编码只是一个技能的部分,这种把知识转化为成果的技能非常重要。一个优秀的程序员所产生的绩效,是一般的程序员的几倍和几十倍。对一个软件公司而言,好的程序员仍然是公司的核心资产。

新入行的程序员都应该首先把精力都集中在技能的提高上。随着技能的提高,工作能力的增强,自信也会提高。

但是,不要光埋头干活,不抬头看路。如果你在一个不太正规的公司,你所做的东西和接触到东西,不太规范、有效的话,你可能在这个行业做了很多年,都算不上入行,就是说专业的起点太低。即使你有足够的时间学习,但是由于没有实践的平台,你要走的弯路就太多了。这样,你需要仔细的评估自己的选择了。

程序员普遍都有一种激情:希望自己做的产品,能为成千上万的用户使用。这种职业的自豪感,激励着每一个程序员的创造力和想象力。

即使程序员的工作能为你带来很好的收入,但你对自己所做的东西,毫无成就感,或者跟你的价值取向冲突的话,我想,你也应该考虑重新选择自己的职业生涯。

我认为,程序员的自律性都是比较高的。他们大多数人都热爱自己的工作,自己学习专业知识,努力提高工作技能。

除了对专业知识的把握以外,程序员还应该拓展自己的视野,程序员要学习关注自己的生存环境,随时审视未来的发展空间,选择自己的发展道路。仍然要问:我要什么?我要到哪里去?

总的说来,程序员生存的空间比较直接、单纯。程序员普遍不喜欢工作时受人打扰,这一切都在情理之中。

技术管理者

技术管理者和程序员,他们服务的对象和工作方式完全不同。

程序员是大我,主要是完成任务,所有的事情主要靠自己完成,目标就是完成技术思考和转化。

技术管理者是小我,服务的对象是团队,目标是组织和连接流程。用俗话说,就是要当“万金油”。

技术管理者,不论是项目经理,还是技术总监,首先要会选人和用人。要完成什么样的任务,选什么样的人,是领导的基本功。

技术管理者跟程序员最大的不同在于知道在有限资源的情况下,如何做出最合理的选择,不一定是最好的选择。领导者知道,用人用其长,而不会去苛求每个人都达到完美。

程序员可以谈论品味,像艺术家一样看待工作;而技术管理者谈论效果,是现实主义者。好的技术管理者,能在长期的理想和现实的结果中找到一个好的平衡。

技术管理者,关心的是外部目标、内部人员绩效和激励、质量控制、产品服务等一系列的活动,监督、评估并推进项目或产品的流程,直到产生一个可以交付的外部结果。

技术管理者的工作重心在人,在团队。他的绩效是通过组织和团队的绩效体现出来的。

从程序员到技术管理者

中国有句古话:劳心者治人,劳力者治于人。很多时候容易理解为:程序员劳力,技术管理者劳心。这种想法最容易造成程序员内心的不平衡。我想,现在的知识社会,大多既要劳心,又要劳力。只劳心,不劳力的人,有知识,没有执行和转换能力,这样的人,很难驾驭和管理真正的技术团队;只劳力,不劳心的人,不会提高自己的竞争力,自己也不会满意。

做程序员,还是技术管理者,这只是分工不同,并没有高低贵贱之分。可以看见,由于程序员和技术管理者定位和服务对象的不同,他们的知识结构的要求也有所不同。程序员看起来更技术化,便于评估,比较深入,技术管理者看起来更行政化,似乎表面,宽泛化,但都需要专业的素养和才干。

程序员也可以成为好的技术管理者,但需要积累和调整自己的知识结构和心态:要能勇敢地获取外部的力量。因为管理者的目标并不意味着他有多大的能力,而是他的团队有没有能力,有没有成效。那种认为管理者不劳而获的想法,是一种偏见。大家职责不同,责任不同。

一个优秀的技术人才,一定要选择一个优秀的团队。一个好的技术管理者,也要充分发挥技术人才的优势,这样,只有团队的力量,才可以把自己的才能成百上千地放大。

从外部来看待成长

从程序员到技术管理者,是一个众说纷纭的话题。但是,这不应该是一个非此即彼,孰优孰劣的问题。我更愿意看成是一个组织环境中,不同环节上不同的位置和选择,跟定位和特长有关。站在组织的观点来看,在一个团队的内部,是没有绩效可言的。只有团队,对外产生了价值,个人才有价值。

或许并不是所有的人都能接受这一点。

所以,当你问自己得到了什么的时候?你也应该问自己奉献了什么?什么是应该体现你的报酬?你的报酬是否体现了你的责任和承担的风险?

很多时候,不是你是否值多少钱的问题,而是在一个商业的环境中,没有贡献,就没有价值。

一个人要客观地看待自己,不论是程序员还是管理者,都不要不可一世或忘自菲薄。天生我才必有用。一个人的成长,应该从外部的趋势和影响,来学习、选择和发展。把更多时间和精力,放在建立自己的核心竞争力,找到自己事业的伙伴上。

请勇往直前,不要患得患失,不要怨天尤人,命运就掌握在自己的手中!

幸福和健康

没有任何正当的理由,让人用幸福和健康来交换所谓的前途。永远牢记:身体是革命的本钱。
转自疯狂软件

posted @ 2012-05-04 11:57 疯狂软件 阅读(138) | 评论 (0)编辑 收藏