|
2007年11月28日
这道菜也是师从我婆婆
不得不说,婆婆真的是一个美食家,好吃,好看,随便几个蔬菜到她那里都会被演绎的很美味。
呵呵。。。。
现在就来介绍这道菜的步骤:
1.准备材料
原茄子一个
青豆若干
葱白少许
醋
胡椒
盐
酱油
2.制作过程
将茄子去皮,切成薄片,然后在切成细丝
给切好丝的茄子上散少许盐,腌制15分钟,让其出水
青豆用水煮熟,如果你买的是生的
(我在超市买的大包装的,不知道是不是熟的,反正我没提前煮过)
炒锅中倒少许油,爆香葱花
加入茄子丝儿,翻炒几下,放少许酱油,少许醋
(喜欢稍微酸一点的可以多加一点点醋哦)
将火调小一些,加一点水,翻炒几下,盖上锅盖,闷少许时间
当茄子快全部软了的时候,加入刚才煮好的青豆
翻炒几下,然后去调一些 稀薄的 水淀粉
回来,加入些鸡精,胡椒粉,翻炒几下
加入水淀粉,大火收一下,出锅
下次我在做的时候,拍张照片附上
用fileupload组件上传文件出现乱码解决方法|http://www.aspsky.net
减小字体
增大字体
作者:佚名 来源:不详 发布时间:2007-12-31 19:58:00
快速查找内容
我们用apache的fileupload组件上传文件,
如果不做任何出理,通常会出现文件名乱码或普通text文本框值的乱码,那么,我们该如何处理呢?
其实,fileupload组件提供了一个设置编码的接口,在没有指定编码时使用系统缺省的encoding,如果需要使用gbk,可以使用该接口进行设置,如:
//FileUploadBase fb = new FileUpload(new DefaultFileItemFactory());
//fb.setHeaderEncoding("GBK");
DiskFileUpload fu = new DiskFileUpload();
fu.setHeaderEncoding("GBK");
这
样,获取的文件名就不会乱码了,但普通文本框的值却还是乱码,我们还要对文本值进行处理,中文的text字段可以通过
title = new String((fileItem.getString("iso8859-1")).getBytes("iso8859-1"),"GBK"); 来
获取
UTF-8的也是同理,祝在家好运.
在网上找过很多例子,但都有很多问题。
希望得到大家的帮助。
谢谢
在网上找过很多例子,但都有很多问题。
希望得到大家的帮助。
谢谢
下面的方法也是我在google上搜到的,因为尝试了其中一个方法,成功了,
所以在这里记录下,备用。
比如以下两个jsp页面之间的传递:
a.jsp页面内容:
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<form action="b.jsp">
name:<input type=text name=name>
<input type=submit>
</form>
b.jsp页面内容:
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%
String name=request.getParameter("name");
%>
<body>
<%=name%>
</body>
现象:中文乱码,比如“??????”
解决方法如下:
方法一:-----------尝试过,有效但确实不可取
1. 在b.jsp中把pageEncoding="GB2312"改为pageEncoding="ISO8859-1"
虽然这样b.jsp页面显示的内容还是乱码,但是不是那种“??????”的乱码,
而是一些特殊字符
2. 然后在浏览器中查看菜单中修改成GB2312的编码,这时乱码就显示中文了。
3. 但是这种方法是不可行的。
方法二:---------- 尝试过,有效。我的部分页面就是用该方法
1. 在b.jsp中把String name=request.getParameter("name");修改为
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312");
2. 这时再在页面上显示,则就是中文了。
3. 但是我个人不喜欢这种方法,因为编写起来代码非常繁琐
方法三:
1. 有人说修改get/post的传值方式,但是这是有前提的,
如果只是把get方式修改成post方式,页面结果还是乱码!
2. 前提你必须配置了过滤器,若果你只是配置了过滤器,
则传值方式必须是:post方式才不是乱码,如果是get方式照样是乱码!
3. 过滤器的配置,我想大家都能有,我就不说了
方法四:
1. 有人说配置tomcat的配置文件server.xml里这句:
<Connector URIEncoding="GB2312"
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
加上这句:URIEncoding="GB2312"
2. 虽然可以但是有前提的,若果你过滤器没有配置,
则只是配置了server.xml文件,这样只有在表单是get传值时候才可以!
当是post方式时,照样是乱码!
*这时我们就可以看出在tomcat5中的post与get传值方式是不一样的*
*有人要问有没有一种方法让传值使用get方式或post方式都好用呢,
下面就是我推荐的方法五*
方法五:
1. 其实很简单,就是同时实现方法三又实现方法四!
2. 就是先配置过滤器,又配置server.xml文件,都设置成GB2312的编码
3. 这样无论是post还是get方式的表单传值,中文都不会是乱码!
今天闲逛CSDN ,看到了这样一个有趣的标题,赶紧进去瞧了瞧。
别人我不知道,因为我是转行业到java编程的。现在正在做web开发的工作,
所以对这篇文章的内容深有同感,尤其是我转载过来,注以红色字的部分。
希望跟我一样境况的人看到这则新闻,也能加强一下对其他语言的学习。
【CSDN 1月9日消息】 国际消息 美国纽约大学的两位计算机科学系退休教授发表一篇公开文章,标题是“计算机科学教育:明日的软件工程师在何处?”。在文中,他们强烈地批评了纽约大学和其他大学,没有向学生传授纯粹的语言如C、C++、Lisp和ADA。
“学生从当前教育实践课程中获取的技能不足以应付今日软件行业的发展(尤其是安全和安全目的方面)。更不幸的是,与外部行业需要过于匹配了,我们训练了许多容易被取代的软件工程师。”
尤为注意的是,文中以“Java作为第一编程语言的诸多缺陷”为小标题对Java进行了批判:
由于Java在Web应用领域的流行,以及初学者容易生成图形化编程,Java成为入门课程中使用最普遍的语言。从此后学生发现很难在一个没有图像界面的语言上编写程序,不清楚源程序和硬件如何执行之间的关系,更具有危险性的是他们一点也不了解指示器的语义,这使得使用C语言编程也成为挑战。”
编程的真正的美妙之处在于,将复杂的过程缩减成非常小的一个简单操作。Java并没有体现这种美妙,它鼓励采用“问题解决(problem-solving)”的方式,使程序员就像五金店的水管工人:到处翻腾抽屉、阁子最后找出需要的零件。最终的结果使得学生知道如何将一些简单的程序组到一起,而对编程却一无所知。而且过早地使用Java库和框架有一个更大的缺陷:它使得学生很难对编写的东西形成运行时间成本(run-time cost)的概念,因为他们很难知道究竟哪种方法的调用是有效的。我们为此亦找到了一些证据。Bjarne Stroustrup(被誉为C++之父)在德州农工大学(Texas A&M University )的报告中,指出了工业对于这种方式越来越多的不满,而且Bjarne这样说,“从工业那里我看到了许多许多对此(Java作为第一编程语言来使用)的抱怨,尤其是AT&T, IBM, Intel, Bloomberg, NI, Microsoft, Lockheed-Martin等等。”
另外在文中,这两位教授们认为真正的程序员能够使用任何语言(C,Java,Lisp,Ada)。【呐不喊】
在网上找到了的解决办法
解决方法一:
1.运行对话框中输入mmc
------打开控制台,将cmd改写成mmc
------在弹出来的对话框里,点击文件
------添加/删除管理单元
------添加--找到"Microsoft SQL 企业管理器"
--添加,确定
然后回到控制台
------点击控制台的另存为,
------将它存储为: c:\program File\microsoft SQL Srver\80\Tools\BINN\SQL Server Enterprise Manager.MSC
即可
关掉控制台的时候,不保存控制台的目录结构
解决方法二:
删掉C:\Documents and Settings\YourUserName\Application Data\Microsoft\MMC\SQL Server Enterprise Manager
上面的两个方法我只尝试了方法一,成功了哦
Hex (hexadecimal) ---- 十六进制,注意,十六进制代码都是以#开头的
Binary ---- 二进制的( octal 八进制的,decimal 十进制的,hexadecimal 十六进制的,)
Binary distribution ---二进制版本(很多地方都会发现这个词,比如你去tomcat官网下载tomcat,下载mysql,大概其的意思就是告诉你这是一个二进制版本的)
Bit ------ (二进制的)位
beta ----- 因为字母的 B ,常常用来表示 真正发布前的测试阶段
有alfa(alpha)字幕A,表示发布前第一阶段的测试,开发者自己测试
而beta 就是 发布前的第二阶段测试 常常是开放给 部分用户的测试
这两个测试阶段都过去后,就可以released 发布 了
Octal --------- <计算机>八进制的
八的,第八的
Axis --------- n.轴,中轴,中枢,中心线
the Axis 指二战时德意日组成的轴心国
<计算机> axis 是指一种 数据库
debugger --------- 计算机指 调试器
我目前知道的有application debugger 和 application debugger 这两个名词,其他的还待补充
Decimal ----- <计算机>十进制的
十的,第十的
URL---- 统一资源定位符,在URL里必须包含“http://”
Terry Lee - 2008年不再用腾讯QQ says:
这个也行:http://java-source.net/open-source/bloggers
Terry Lee - 2008年不再用腾讯QQ says:
是专门web用的
mimi says:
好的。我都看看。呵呵。。
mimi says:
谢谢了
mimi says:
我今天才知道还有专门的调试器程序
Terry Lee - 2008年不再用腾讯QQ says:
恩,好多呢
mimi says:
我傻死了
Terry Lee - 2008年不再用腾讯QQ says:
我原来跟你说过,java最大的好处是有各种开源工具
Terry Lee - 2008年不再用腾讯QQ says:
各个行业,各种应用的几乎都有
mimi says:
没明白
Terry Lee - 2008年不再用腾讯QQ says:
你得多上网看一些技术文章
mimi says:
恩。
Terry Lee - 2008年不再用腾讯QQ says:
比如连接池,log,内容管理,CRM,报表,进程管理,缓存管理等等好多方面java都有开源的框架和工具
Terry Lee - 2008年不再用腾讯QQ says:
不用自己来开发,直接使用就行
Terry Lee - 2008年不再用腾讯QQ says:
比如hibernate和struts
Terry Lee - 2008年不再用腾讯QQ says:
这个网站有个简单的总结:http://java-source.net/
mimi says:
那些开源的框架都是人们免费写的
mimi says:
为什么就给java写啊
Terry Lee - 2008年不再用腾讯QQ says:
有时间建议你去一些java技术网站看看最新的技术和应用: www.theserverside.com, www.onjava.com 等等
Terry Lee - 2008年不再用腾讯QQ says:
因为java开源
Terry Lee - 2008年不再用腾讯QQ says:
php也有,但是没有java的多
mimi says:
哦。
Terry Lee - 2008年不再用腾讯QQ says:
java的开源是所有语言中最多的了
Terry Lee - 2008年不再用腾讯QQ says:
因为java语言本身就是开源的,其他语言都不是
mimi says:
我问一个,你不要生气啊。
Terry Lee - 2008年不再用腾讯QQ says:
你用的eclipse也是java的开源工具
mimi says:
你说java语言本身就是开源的。。就是指免费的。还是也指其他的
mimi says:
那这么说,myeclipse就不是开源的
Terry Lee - 2008年不再用腾讯QQ says:
java本身是开放源代码的,开源指的是源代码,不是免费不免费
Terry Lee - 2008年不再用腾讯QQ says:
和linux一样,可以去官方网站下载源代码
mimi says:
哦。
Terry Lee - 2008年不再用腾讯QQ says:
其他语言都是编译好免费使用,但不一定是开源的
Terry Lee - 2008年不再用腾讯QQ says:
java的这个特点被众多网友应用在java开发的产品上,好多免费的东西都是开源的
mimi says:
哦
Terry Lee - 2008年不再用腾讯QQ says:
其他的语言,比如asp,php开发的东西也可以叫开源,但是和java比还不一样
Terry Lee - 2008年不再用腾讯QQ says:
java不是脚本语言,php本身就是脚本语言,不想开放代码都不行
mimi says:
哦,因为java可以随便看源代码,所以大家可以根据java的源代码再开发一些基于java语言的 软件,框架什么的
mimi says:
有这个意思吧
Terry Lee - 2008年不再用腾讯QQ says:
不是随便看源代码才有这些框架
mimi says:
脚本语言为什么不想开放都不行
Terry Lee - 2008年不再用腾讯QQ says:
是因为java开源,很多技术专家都可以跟sun公司提出自己的改进意见,使得java更好,和linux一样
Terry Lee - 2008年不再用腾讯QQ says:
你用过asp或者php吗
mimi says:
基本没用过,但是看过一些,php是脚本语言,就是那些 用var声明,function什么的。
Terry Lee - 2008年不再用腾讯QQ says:
我给你个.asp文件,你用记事本就能打开看到代码,我把java编译成.class或者用工具做成.exe给你用,你能直接看到源代码吗
mimi says:
你刚才说脚本语言不想开源度不行是什么意思啊
mimi says:
哦。
mimi says:
asp也可以用记事本看啊
mimi says:
这样的。
Terry Lee - 2008年不再用腾讯QQ says:
那你说说怎么不让我看到asp代码
mimi says:
呵呵。。
mimi says:
恩呢
Terry Lee - 2008年不再用腾讯QQ says:
这好像没啥难理解的吧
mimi says:
恩。
mimi says:
是的。
Terry Lee - 2008年不再用腾讯QQ says:
做软件行业应该对这些东西都有个了解,这个就像生活的基本尝试一样
mimi says:
主要是没想到 能用 记事本打开那些 php或asp文件
mimi says:
恩。
mimi says:
你说的对
mimi says:
谢谢
Terry Lee - 2008年不再用腾讯QQ says:
这个我想不明白了
Terry Lee - 2008年不再用腾讯QQ says:
用记事本打开什么文件,怎么会想到或者想不到呢
Terry Lee - 2008年不再用腾讯QQ says:
就算是二进制文件都可以用记事本打开,只不过打开后看不懂是些什么东西
mimi says:
恩。
Terry Lee - 2008年不再用腾讯QQ says:
jsp,asp,php,js等等这些脚本语言因为它们自身的特性想不开源都不行
mimi says:
我还是不太习惯用这样的思维考虑,我总是想,打开一种类型的文件,肯定要用相关的软件,以前都是作为普通的使用者。比如打开数码照片就用acd什么的。
Terry Lee - 2008年不再用腾讯QQ says:
c/c++/java/delphi/basic等等这些语言可以选择是否开源
mimi says:
恩。。。你说的对。
Terry Lee - 2008年不再用腾讯QQ says:
php确实还没有什么官方的编辑工具,那些IDE环境都是第三方开发的
Terry Lee - 2008年不再用腾讯QQ says:
所以不要有这种概念,一个文件类型不一定要用某种特定工具打开
mimi says:
嗯
Terry Lee - 2008年不再用腾讯QQ says:
你用java读取flv本身就是“打开”的概念
mimi says:
嗯
Terry Lee - 2008年不再用腾讯QQ says:
java有个开源框架专门处理office文档的,是apache项目下的poi项目
Terry Lee - 2008年不再用腾讯QQ says:
可以直接读取excel,word等文档
mimi says:
哦。
Terry Lee - 2008年不再用腾讯QQ says:
不借助其他什么ODBC,是直接二进制读取分析的
mimi says:
哦。
mimi says:
开源还真是好处多多啊
Terry Lee - 2008年不再用腾讯QQ says:
java的freeChat报表框架可以生成各种报表图,扇形、圆饼、柱状、曲线等等,不用自己调用绘图类进行绘图,直接调用这个框架,输入一些数据参数就行
mimi says:
哦
Terry Lee - 2008年不再用腾讯QQ says:
tomcat本身也是一种开源servlet容器,你做web程序不用自己写服务器,直接用免费开源的就行
Terry Lee - 2008年不再用腾讯QQ says:
很多大公司使用自己的web服务器,就是拿tomcat或者apache的源代码然后做修改,改成适合自己公司使用的服务器
mimi says:
难道其他的语言还要自己写服务器
mimi says:
哦。
Terry Lee - 2008年不再用腾讯QQ says:
其他很多都不用,但要么不是免费,要么是别人给你服务器,你没法看到服务器内部工作原理,无法自己修改
mimi says:
哦。
Terry Lee - 2008年不再用腾讯QQ says:
比如tomcat你发现几个功能有缺陷,不太适合自己公司,可以拿来源代码自己修改,发现多余的功能可以自己删除,windows下的IIS就不同了,你没法自己修改,只能把意见提到微软,看看它们什么反应
Terry Lee - 2008年不再用腾讯QQ says:
linux系统也是,现在有N多版本,就是因为开源的缘故,谁都可以根据核心代码生产自己的linux产品
mimi says:
哦。
mimi says:
这样的
mimi says:
嗯
Terry Lee - 2008年不再用腾讯QQ says:
所以java才会发展起来,要不大家都还在用vc或者.net
mimi says:
嗯。
Terry Lee - 2008年不再用腾讯QQ says:
java光靠跨平台是没有太多优势的,开源框架才是它的生命力
mimi says:
嗯。
mimi says:
是啊。。会更方便
mimi says:
谢谢你说的这么多
mimi says:
刚看了你给我的那两个技术网站,都是e文的呢。呵呵。。
mimi says:
我csdn才刚刚能看懂一些
Terry Lee - 2008年不再用腾讯QQ says:
是,我经常去看
mimi says:
主要是知道的太少
mimi says:
看不明白
Terry Lee - 2008年不再用腾讯QQ says:
特别是 http://www.theserverside.com/ 经常介绍一些新框架和新技术
Terry Lee - 2008年不再用腾讯QQ says:
能学到不少东西
mimi says:
我都收藏起来
mimi says:
恩。。你简直太厉害了
Terry Lee - 2008年不再用腾讯QQ says:
很多东西我不是天生就知道的,比如log4j那些东西,都是看到一些有影响力的大网站介绍我才知道的
Terry Lee - 2008年不再用腾讯QQ says:
这就像天天看报纸新闻才能知道天下发生了什么事情一样
mimi says:
嗯。明白你的意思。我会多看的。
Terry Lee - 2008年不再用腾讯QQ says:
恩,英文的东西多训练一下自己,毕竟前沿的文章有人翻译后就变成过时的东西了
mimi says:
恩。
mimi says:
现在看这些e文的,习惯多了。
mimi says:
很多主要都是 中文都不知道说个什么,e文就更不明白了
mimi says:
不过多看确实很好。谢谢你啊
Terry Lee - 2008年不再用腾讯QQ says:
恩,说明你知识面还是不够宽,接触的东西太少
mimi says:
可不是嘛,
mimi says:
这个是积累的
Terry Lee - 2008年不再用腾讯QQ says:
可以先去jakarta.apache.org看看apache项目下面的子项目都是干嘛的
mimi says:
哦
mimi says:
那你每天都几点睡觉啊
Terry Lee - 2008年不再用腾讯QQ says:
不一定,最近几天睡得比较晚
mimi says:
你现在回到家了吧
Terry Lee - 2008年不再用腾讯QQ says:
恩
mimi says:
Ex-Jakarta 这个是什么意思啊,扩展的
mimi says:
ant 也是jakarta下的
Terry Lee - 2008年不再用腾讯QQ says:
恩
mimi says:
算什么呢
Terry Lee - 2008年不再用腾讯QQ says:
jakarta是apache下面的子项目,主要是一些java的项目
Terry Lee - 2008年不再用腾讯QQ says:
apache不光包括java项目,还有c++的
Terry Lee - 2008年不再用腾讯QQ says:
axis就是分c++和java两个版本
Terry Lee - 2008年不再用腾讯QQ says:
今后可能会有.net版本的
mimi says:
哦。
Terry Lee - 2008年不再用腾讯QQ says:
以前我们公司经常用axis
mimi says:
谢谢你啊。
Terry Lee - 2008年不再用腾讯QQ says:
客气
mimi says:
那我先不打扰了。你忙吧。估计今天还要晚睡。注意身体哦。
Terry Lee - 2008年不再用腾讯QQ says:
恩
最近,有两位Google Maps API的初学者向我请教他们按照最简单例子写的程序为什么不能正常的运行。
其中一位用GTalk跟我交流,我仔细了看了他的代码,没看出问题,把代码保存在本地,打开Firefox的错误控制台,用Firefox打开他的页面。出错的那一行被清晰的显示出来,我再仔细端详那句话,原来有两个应该是英文逗号的地方,写上了中文逗号。
另一位,在我的论坛跟我交流他的Google Maps API中遇到的问题,我看他代码的时候也没有马上发现问题。然而,同样在用Firefox打开后,问题很明显的找到了,原来是一个方法openInfoWindow被他写成OpenInfoWindow了。
在我帮助别人解决的程序调试问题中,这是非常常见的。人人都可能打出中文逗号,人人都可能把大小写写错。但是在我帮助他们解决问题以后,他们总是感慨的说,谢谢我解决了这个问题,这个问题困扰了他们几个小时,甚至是几天。
这其实并不是只有初学者才会遇到的问题,我还帮助过些有非常丰富经验的工程师解决问题,有时候问题仅仅出自某个参数没有传递进来,或者是拼接字符串的时候少些了一个冒号,或者是拼接地址的时候漏掉了http:。我甚至帮助一些人调试一些我根本不懂的语言的程序,因为多半出现的问题,都和语言特性无关,不是程序员写错了字符,就是写错了逻辑,或者是错误理解了一个函数。
出问题是正常的,写程序是一个复杂的边思考边打字的过程,笔误和一时糊涂都是难以避免的。程序员一般把这种问题叫做低级问题,因为这类问题跟你的智商完全无关,任何人都可能犯。
但是,问题在于,有时候即使是很优秀的程序员,也会被一个低级错误困扰,可能会几天都解决不了。所以,关键在于,如何找到问题。
遇到问题的时候:
1,不要怨天怨地。出了问题,当然有可能是系统的bug,API的问题,但是那些几率往往比你犯低级错误的几率要低多了,先从自己身上找原因,是不是自己写错了。
2,要掌握工具。最低限度你要会写Log,最好是Log和调试器结合。好 的工具可以大大的提高效率。以前有人跟我说,Dll不能调试,我发现可以;有人说多线程不能调试,我发现可以;有人说COM不能调试,我发现可以;有人说 IE插件不能调试,我发现可以;有人说OE插件不能调试,我发现也可以。当然,你确实会遇到不能调试的时候,当年我们做东芝芯片的嵌入程序,一个组都没有 一个仿真器和调试器,但是至少可以用Log嘛,无非是麻烦点。
3,分析问题要有逻辑。遇到问题可以先把所有的可能性都列出来,然后一个一个分析,肯定能找到原因的。
4,要学会隔离问题。问题涉及到的代码越多,越难以理解,问题越难以解决。遇到这样的情况,可以利用Log或者调试器,一行代码一行代码的给它们洗清嫌疑,这样很快你就可以找到出问题的地方。如果代码特别长,程序特别复杂,可以用二分法来做,效率很高。
5,千万不要懒惰,不要事事求别人。一次复杂的调试过程就像一部侦探剧,如果你有非常好的逻辑性,那这部剧的主角就是福尔摩斯,剧情一定非常精彩。我说这个是有巨大风险的,说真的我帮人调东西挺上瘾的,很有意思。但是我还是要告诉大家,一次高难度的调试之后,你的满足感绝对不亚于写了一个伟大的程序。
要想不遇到问题,写代码的时候:
1,要对写出来的代码负责。我很佩服那些写代码写100行都不执行一次的 高手,如果他们最后不被低级错误困扰的话我就更加的佩服了。我写程序几乎是写一行两行就要执行一次,每句话我都要确保执行效果跟我的预期一致。没错这样写的时候 可能慢一些,但是调试的时候很轻松,我可以很简单的确定哪些代码绝对没有问题。所以我写代码整体速度比一般人高。很多人学习新东西的时候喜欢把例子抄一遍,运行一下,改改,再运行。我喜欢一句一句的抄例子,抄一句两句执行一次,这样可以把例子透彻的理解,而且很难会遇到出现了问题找不到原因的时候。
2,函数体功能块不要过长。我认为我的智商并不高,我很难接受一个程序的一个函数体或者一个功能块超越3屏(当然逻辑真的有那么复杂除外,你会发现越是简单的逻辑越是容易被人写的冗长)。很多人对面向对象耳熟能详,对封装继承看起来驾轻就熟。但是动不动就写出来个函数体超长的程序。这就像写本书从头到尾不点句号一样,会累死读者的。自己看的时候,估计也会被累的喘不过来气。这是我对基础教育的微词所在,他们连教会学生写函数都没教会,虽然表面上他们连面向对象这么高深的东西都教。
3,缩进要对。这点很重要,虽然大部分语言不是像Python那样用缩进来决定逻辑块的位置,但是人看到缩进的时候,总是会以为这些缩进位置跟逻辑相关。尤其是在有大量的ifelse或者for循环等等的嵌套逻辑的时候,如果缩进错了,可能会直接让人把程序的逻辑读错。所以我拿到别人的代码,第一件事情就是整理缩进。我见过一些比较优秀的页面工程师,他们会在div结束的位置用注释写上这个div的id,这样层级关系就一目了然了。
4,不断重构。随着程序的不断修改,有些部分会不断的增长,原来看着清晰的架构可能因为问题的复杂而慢慢模糊,也可能被修正bug的权宜之计弄的面目全非。不信你找一个经过多次修改的程序看看,是不是满目疮痍,是不是都很难认出是你自己的作品了。这在多人参与的项目中更加严重,每个人有不同的代码风格,经过多次杂交后,你肯定认不出你的代码是骡子是马,还是四不像了。随着程序的慢慢成长,原来有些函数体会慢慢膨胀,需要拆分;有些原来简单的功能块四处都需要,应该被提炼成函数或者方法,等等。现在不重构,未来等到代码复杂到无法控制的时候,重构的工作就会变得更加困难。我见过最强的案例是,一个几千行的电子辞典配套联机软件,经过无数次的改版,变成了一个几乎无法维护的主窗体的cpp有1万8千行的怪物。最后经过复杂的重构,才变成一个出新版本只需要新增一个驱动程序的可以维护的几千行的程序。
郝培强:银杏技术咨询创始合伙人,网名Tinyfool,技术方向是全文检索,搜索引擎优化,网站架构设计等。 银杏技术咨询的主要业务是帮助客户的网站改进技术,提高网站性能和反应速度,解决门槛性技术问题,从而提高用户满意度。
关于郝培强:www.yinxingtech.com/team.htm
关于银杏技术咨询:www.yinxingtech.com/
我就是初学者,我觉得讲的很是有道理,转到这里,大家共同看看。
也为要做页面验证,需要用到js,发现了一个问题。
在js里,有indexOf 这样的方法,却没有像java一样的startsWith 或者 endsWith 这样的方法。
研究了半天,在js里,通通可以用 indexOf()!=-1 来代替。要记得,这个indexOf()!=-1 和 indexOf()>0 得到的结果是不同的。
比如下面的例子:(功能:希望输入的值不包含空格)
function checkSize(str){
if(str.indexOf(' ')!=-1){
alert("不能含有空格");
}
这个方法可以检查到 str 的开头,中间,结尾是不是空格
可是如果选择了 下面这个方法,却只能检测到 str 中间 和 结尾的空格,检测不到str开头的空格。
function checkSize(str){
if(str.indexOf(' ')>0){
alert("不能含有空格");
}
很奇怪的。呵呵。。。。
还不是很了解js,以后还会更新
呵呵,看到这个标题,我自己都在笑,写了3个月的代码了,连这个问题还搞不清呢
没有计算机基础的人就是这样子的。
我没有时间从头学起,只能现学现用,现用现学了
今天在工作的时候,将 my eclipse 项目下的一个 jsp 移动了位置(从WebRoot 下,移入到 WebRoot 下的一个package 下面),竟发生了找不到 servlet的情况。呵呵...
想着就是路径问题,在jsp页面 表单里的 action 属性了,加了 ../ ,ok了呢。
所以就趁这次的机会,补充一下路径的知识。
*****************************************************************************
相对路径:相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。
使用相对路径可以为我们带来非常多的便利。
index.htm要想链接到01.htm这个文件,正确的链接应该是:<a href=web/article/01.htm>链接文字</a>,
这是标准的相对路径。
反过来,01.htm要想链接到index.htm这个文件,在01.htm文件里面应该写上这句:
<a href=../../index.htm>返回首页</a>。这里的../表示向上一级。
至此,你已经了解相对路径的概念了,就是这样简单明了。如果你还是没有看明白,
以前学过DOS吗?它的“CD 文件夹名”和“CD..”命令用过吗?这是同理的。
注意:相对路的文件夹符号是斜杠:/
<a href=/web/article/01.htm>链接文字</a>这样的链接,在href后面的第一个斜杠表示根目录,
通常我们要特别慎用这种方式
所以我刚才错的地方是,把jsp 从webroot 移动到其下的一个package里后,
没有改变这个jsp里form的action的属性。
所以当要发生action时,只会在当前目录下找 addUserinfo 这个servelt,
而当我改变了这个jsp form里的 action 属性,
从 action="addUserinfo" ---更改为----> action="../addUserinfo"
加上了../ ,就表示,会先找到了这个jsp页面所在的上级目录,然后再去找 web.xml 配置的 addUserinfo
“../”代表当前位置(即该链接所在文件所处的文件夹)的上一级文件夹。
*****************************************************************************
二、绝对路径:
在www中(广域网),以http开头的链接都是绝对路径。
*****************************************************************************
三、物理路径
物理路径指的是某一台计算机本地的路径,以盘符开头,例如C:\ 、D:\temp等等。
ASP的数据库连接中,只能连接物理路径,而不能连接相对路径,
所以需要用server.mappath对象把相对路径转化成物理路径。
<html></html> 创建一个HTML文档
<head></head> 设置文档标题和其它在网页中不显示的信息
<title></title> 设置文档的标题
<h1></h1> 最大的标题
<pre></pre> 预先格式化文本
<u></u> 下划线
<b></b> 黑体字
<i></i> 斜体字
<tt></tt> 打字机风格的字体
<cite></cite> 引用,通常是斜体
<em></em> 强调文本(通常是斜体加黑体)
<strong></strong> 加重文本(通常是斜体加黑体)
<font size="" color=""></font> 设置字体大小从1到7,颜色使用名字或RGB的十六进制值
<BASEFONT></BASEFONT> 基准字体标记
<big></big> 字体加大
<SMALL></SMALL> 字体缩小
<STRIKE></STRIKE> 加删除线
<CODE></CODE> 程式码
<KBD></KBD> 键盘字
<SAMP></SAMP> 范例
<VAR></VAR> 变量
<BLOCKQUOTE></BLOCKQUOTE> 向右缩排
<DFN></DFN> 述语定义
<ADDRESS></ADDRESS> 地址标记
<sup></SUP> 上标字
<SUB></SUB> 下标字
<xmp>...</xmp>固定寬度字体(在文件中空白、換行、定位功能有效)
<plaintext>...</plaintext>固定寬度字體(不執行標記符號)
<listing>...</listing> 固定寬度小字體
<font color=00ff00>...</font>字體顏色
<font size=1>...</font>最小字體
<font style ="font-size:100 px">...</font>無限增大
◆◆◆◆◆◆◆◆◆◆◆◆◆◆《〈格式标志〉》◆◆◆◆◆◆◆◆◆◆◆◆
<p></p> 创建一个段落
<p align=""> 将段落按左、中、右对齐
<br>换行 插入一个回车换行符
<blockquote></blockquote> 从两边缩进文本
<dl></dl> 定义列表
<dt> 放在每个定义术语词前
<dd> 放在每个定义之前
<ol></ol> 创建一个标有数字的列表
<ul></ul> 创建一个标有圆点的列表
<li> 放在每个列表项之前,若在<ol></ol>之间则每个列表项加上一个数字,
若在<ul></ul>之间则每个列表项加上一个圆点
<div align=""></div> 用来排版大块HTML段落,也用于格式化表
<MENU> 选项清单
<DIR> 目录清单
<nobr></nobr> 强行不换行
<hr size="9" width="80%" color="ff0000">水平線(設定寬度)
<center></center> 水平居中
◆◆◆◆◆◆◆◆◆《〈链接标志表格标志〉》◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<a href="URL"></a> 创建超文本链接
<a href="mailtEMAIL">
</a> 创建自动发送电子邮件的链接
<a name="name"></a> 创建位于文档内部的书签
<a href="#name"></a> 创建指向位于文档内部书签的链接
<BASE> 文档中不能被该站点辨识的其它所有链接源的URL
<LINK> 定义一个链接和源之间的相互关系
◆◆◆◆◆◆◆◆链接标记注解:◆◆◆◆◆◆◆◆◆◆◆◆
◆target="..."决定链接源在什么地方显示(用户自定义的名字,_blank,_parent,_self,_top
◆rel="..."发送链接的类型
◆rev="..."保存链接的类型
◆accesskey="..."指定该元素的热键
◆shape="..."允许我们使用已定义的形状定义客户端的图形镜像(default,rect,circle,poly
◆coord="..."使用像素或者长度百分比来定义形状的尺寸
◆tabindex="..."使用定义过的tabindex元素设置在各个元素之间的焦点获取顺序(使用tab键使元素获得焦点)
◆◆◆◆◆◆◆◆表格标记注解:◆◆◆◆◆◆◆◆◆◆◆◆
<table></table> 创建一个表格
<tr></tr> 表格中的每一行
<td></td> 表格中一行中的每一个格子
<th></th> 设置表格头:通常是黑体居中文字
<table cellspacing=""> 设置表格格子之间空间的大小
<table border=""> 设置边框的宽度
<table cellpadding=""> 设置表格格子边框与其内部内容之间空间的大小
<table width=""> 设置表格的宽度。用绝对像素值或总宽度的百分比
<table align=""> 设置表格格子的水平对齐方式(left,center,right,justify)
<tr align=""> 设置表格格子的水平对齐方式(left,center,right,justify)
<tr valign=""> 设置表格格子的垂直对齐方式(baseline,bottom,middle,top)
<td colspan=""> 设置一个表格格子跨占的列数(缺省值为1)
<td rowspan=""> 设置一个表格格子跨占的行数(缺省值为1)
<td nowrap> 禁止表格格子内的内容自动断行
<CAPTION></CAPTION> 表格的标题
<COLGROUP></COLGROUP> 定义多个列为一组列
<TABLE></TABLE> 创建一个表格
<THEAD></THEAD> 定义表格的页眉
<COL> 定义一个列组中的列,以便对它们能够同时设置有关属性
<TBODY></TBODY> 定义一个表格的实体
<TFOOT></TFOOT> 定义一个表格的页脚
◆◆◆◆◆◆◆◆◆◆◆◆《表单标志》◆◆◆◆◆◆◆◆◆◆◆
<form></form> 创建表单
action="..."接收数据的服务器的URL
method="..."HTTP的方法(get, post)。其中get是被反对使用的
enctype="..."指定MIME(Internet媒体类型)
onsubmit="..."当提交表单时发生的内部事件
noreset="..."在重新设置表单时发生的内部事件
target="..."决定把内容显示在什么地方(_blank, _parent, _self, _top
<select multiple name="name" size=""></select> 创建滚动菜单,size设置在需要滚动前可以看到的表单项数目 <option> 设置每个表单项的内容
<select name="name"></select> 创建下拉菜单
<textarea name="name" cols=40 rows=8></textarea> 创建一个文本框区域,列的数目设置宽度,行的数目设置高度
<input type="checkbox" name="name"> 创建一个复选框,文字在标签后面
<input type="radio" name="name" value=""> 创建一个单选框,文字在标志后面
<input type=text name="foo" size=20> 创建一个单行文本输入区域,size设置以字符串的宽度
<input type="submit" value="name"> 创建提交(submit)按钮
<input type="image" border=0 name="name" src="name.gif"> 创建一个使用图象的提交(submit)按钮 <input type="reset"> 创建重置(reset)按钮
<BUTTON></BUTTON> 创建一个按钮
disabled="..."把按钮的状态设置为不能
name="..."按钮的控制名 value="..."按钮的值
type="..."按钮的类型(button, submit, reset)
<FIELDSET></FIELDSET> 把相互关联的控件组合成一组
<ISINDEX> 提示用户输入
<LABEL></LABEL> 为一个控件提供标签
<LEGEND></LEGEND> 为FIELDSET元素指定一标题
<SELECT></SELECT> 为用户做选择创建各个选项
<TEXTAREA></TEXTAREA> 创建一个允许用户多行输入的区域
◆◆◆◆◆◆◆◆◆◆◆◆◆◆表单注解:◆◆◆◆◆◆◆◆◆◆◆◆◆◆
type="..."用于输入控件的类型(text,password,checkbox,radio,submit,reset,file,hidden,image,button)
name="..."控件的控制名(要求是除了submit和reset之外的任何名字)
value="..."控件的初始值
checked="..."把一个单选钮设置为选中的状态
disabled="..."把控件的状态设置为不能使用
readonly="..."只对输入密码的文本框使用
size="..."表示以像素为单位的除了文本框和密码框控件之外的其它控件的宽度,它是用来指定字符的数目 src="..."一个图像控件的URL
maxlength="..."指定可以输入的最多的字符数目
alt="..."另外一种文本描述
usemap="..."到客户端图形镜像的URL
align="..."被反对。控制对齐方式(left, center, right, justify)
tabindex="..."通过定义的tabindex值确定在不同元素之间获得焦点的顺序
onfocus="..."当元素获得焦点时发生的事件
onblur="..."当元素失去焦点时发生的事件
onselect="..."当元素被选中时发生的事件
onchang="..."当元素状态被改变时发生的事件
accept="..."允许上载的文件类型
◆◆◆◆◆◆◆◆◆◆◆◆◆◆《帧标志》◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<frameset></frameset> 放在一个帧文档的<body>标签之前,也可以嵌在其他帧文档中
<frameset rows="value,value"> 定义一个帧内的行数,可以使用绝对像素值或高度的百分比
<frameset cols="value,value"> 定义一个帧内的列数,可以使用绝对像素值或宽度的百分比
<frame> 定义一个帧内的单一窗或窗区域
<noframes></noframes> 定义在不支持帧的浏览器中显示什么提示
<frame src="URL"> 规定帧内显示的HTML文档
<frame name="name"> 命名帧或区域以便别的帧可以指向它
<frame marginwidth=""> 定义帧左右边缘的空白大小,必须大于等于1
<frame marginheight=""> 定义帧上下边缘的空白大小,必须大于等于1
<frame scrolling=""> 设置帧是否有滚动栏,其值可以是"yes","no" 或"auto"
<frame noresize> 禁止用户调整一个帧的大小
<IFRAME></IFRAME> 创建一个内联的帧
scr="..."定义在帧中显示的内容的来源
frameborder="..."定义帧之间的边界(0或1)
align="..."被反对。控制对齐方式(left, center, right, justify)
height="..."帧的高度 width="..."帧的宽度
marquee>...</marquee>普通捲動
<marquee behavior=slide>...</marquee>滑動
<marquee behavior=scroll>...</marquee>預設捲動
<marquee behavior=alternate>...</marquee>來回捲動
<marquee direction=down>...</marquee>向下捲動
<marquee direction=up>...</marquee>向上捲動
<marquee direction=right></marquee>向右捲動
<marquee direction="left"></marquee>向左捲動
<marquee loop=2>...</marquee>捲動次數
<marquee width=180>...</marquee>設定寬度
<marquee height=30>...</marquee>設定高度
<marquee bgcolor=FF0000>...</marquee>設定背景顏色
<marquee scrollamount=30>...</marquee>設定捲動距離
<marquee scrolldelay=300>...</marquee>設定捲動時間
<img src=""> 插入图片,参数有:width="宽",alt="说明文字",height="高",boder="边框"
◆◆◆◆◆◆◆◆◆◆◆◆◆◆《 文档整体属性标志》◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<body bgcolor=""> 设置背景颜色。使用名字或RGB的十六进制值
<body background=""> 设置背景图片
<body bgsound=""> 设置背景音乐
<body bgproperties="fixed">
固定背景图片(IE适用)
<body text=""> 设置文本颜色。使用名字或RGB的十六进制值
<body link=""> 设置链接颜色。使用名 字或RGB的十六进制值
<body vlink=""> 设置已使用的链接的颜色。使用名字或RGB的十六进制值
<body alink=""> 设置正在被击中的链接的颜色。使用名字或RGB的十六进制值
<body topmargin=""> 设置页面的上边距 <body leftmargin=""> 设置页面的左边距
换段: <p>
换行 : <br>
链接文字: <a href="链接地址">在此输入文字</a>
链接发邮件: <a href=" mailto:webmaster@fm365bbs.com">在此输入文字</a>
文字居中: <center>在此输入文字</center>
文字加粗体效果: <b>在此输入文字</b>
文字加倾斜效果: <i>在此输入文字</i>
文字加下划线效果: <u>在此输入文字</u>
改变文字大小: <font size=4>在此输入文字</font>
改变字体: <font face=宋体>在此输入文字</font>
改变文字颜色: <font color=red>在此输入文字</font>
文字上標: <sup>在此输入文字</sup>
文字下標: <sub>在此输入文字</sub>
文字闪烁效果: <blink>在此输入文字</blink>
列表方式: <ul>开始列表
<li>列表项目</li>
</ul>
贴图片: <img src="链接地址">
滚动文字特效: <marquee>在此输入文字</marquee>
插入一个背景声音文件: <img ="链接地址">
插入音乐或视屏播放: <embed name=player1 src="链接地址" type=audio/x-pn-realaudio-plugin width="填数字" height="添数字" border="添数字" autostart="true"></embed>
按钮效果: <input type=button value="按钮上的字" onclick=alert("按后框里的字")></span>
贴flash文件: <embed src=链接地址 width="填数字" height="填数字">
摘要: 因为我连html都没学过,只是平时见到的时候,记得些许,知道大概的格式。
这里有一个内容比较多的html页面,作为记录,用的时候参考参考。
<html>
<head>
<title>
&nb... 阅读全文
如果你常常用 Eclipse 或者 MyEclipse ,那你就会跟我一样,会在保存页面的时候经常遇到这样的提示
some character can not mapped using "iso-8859-1" character encoding ......
以前上学的时候,老师讲过类似的解决办法,就是
1.右键选种 该项目,或该文件
2.点击 properties ,看到左边 第一个 选项 info 了吧。
左边就是该选项的详细信息
3.更改里面的 Text File Encoding
选择 other 里面的 utf-8 (推荐喽)
然后ok了。
以前总是编译一些java源文件或者 jsp 文件。好像这个问题也都能解决
但是,今天用 MyEclipse 编写了一个后缀名为 .js 的文件,又碰到了这个问题,就发现这个方法不再管用了
上网google了下,,(可真是要感激google啊)发现了其他的解决之道,尝试后,OK了,记录到这里,跟大家共勉。
方法一: 使用eclipse的jinto插件编辑,会自动调用java的native2ascii把文件转码。
方法二: 1. Eclipse-->Preferences..(MyEclipse --> Window -->Preferences:)
2. 在“type filter text“的框框里输入”Content Types
3. 输入完后,Eclipse 会自动进行查找,然后会在右边显示出 Content Types 的属性
4. 点击右边的Text,选择 Java Properties File,看一下 下面的两个选项
<1>:File associatios: ----- 看看里面有没有 你需要的文件类型,
默认的是*.porperties(locked)
我需要的*.js ,所以这时点击 Add 按钮,自己添写file type,
我写的是 *.js 哦,点击ok
<2>:Default encoding: ----- 这里默认的值不是utf-8,
也是需要自己更改,删除掉原来的,写上
你需要的,然后点击Update ,就好了。
这里我只尝试 方法二,所以也写得比较详细(呵呵,应该说改的比较详细,因为是改别的前辈的)。
有朋友一定喜欢方法一的,可以自己尝试下。
很多时候,程序都不是像前两篇写的那么简单,<如何用My Eclipse 发布 带mianfes.mf 的 jar 文件(一) >
<如何用My Eclipse 发布 带mianfes.mf 的 jar 文件(二) >
很多时候,程序都要用到第三方jar文件,比如最常用的,跟MS-SQLSERVER 交互的就需要用到msbase.jar,mssqlserver.jar,msutil.jar这三个驱动。
在eclipse中,我们都是依靠 右键单击项目,在 Java bulid path 中添加 来完成。
明明在eclipse中 测试成功的项目,发布成jar包后就是没法用。 这里的原因就是这些第三方jar文件没加载进来。如果你在dos控制台下运行你的jar包,也会看到这样的提示。
可是,到底这些第三方jar文件要配置到哪里呢??这个问题也是困惑了我很久的。
在网路上看到,很多人说,在 环境变量 里的 classpath 里进行配置,配置的时候要写绝对路径哦,要加上第三方jar文件的文件名哦。我试了,依然都找不到呢
还有人说,在dos 下运行的时候 记得要 手动指定,比如: -classpath 或 -cp ,我也试了,还是不行的。
后来找到一篇很好的文章,解决了我的困惑。<这篇文章我也有转载到这里,名字是:jar参数运行应用时classpath的设置方法 >
当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报ClassNotFound错误。
实际上这是由于当使用-jar参数运行的时候,java VM会屏蔽所有的外部classpath,而只以本身(yourJarExe.jar)的内部class作为类的寻找范围。
原来如此呢
解决的办法可以参看那篇文章,仔细看哦,我看了好几遍的...(呵呵...没办法啊,我很笨的呢)
另外,还有一个办法就是网路上经常说的,做个exe文件吧。虽然执行的时候,依然需要 jre的 环境,但至少有一个好处就是,它可以很方便的将 第三方jar文件捆绑进去...
关于这个exe文件的制作,不瞒大家说,我又是一通有研究,唉.....有时候,我真的很郁闷,为什么别人一看就懂的问题,我却要花几倍的时间,我确实是不上道啊...........
下面我就来说说我自己的亲身体会吧。
我选择的 exe 封装 工具是 JSmooth ,这个东东虽然好用,可是有两个地方还是很让人恼火的。
一个就是,最好把你要生成exe的可执行jar文件,和你用到的第三方jar文件,还有图片(用来设置exe需要的),这几样通通放到一个目录下。
在一个就是,下面选择mianfest.mf文件时,必须先选择 地下的 embedded jar,这个选好了,在mianfest.mf的浏览里你才能看到 要选的 main 主文件
下面看我自己的实践体验:
1,首先你得去下在一个 JSmooth,很多很多的。(放心吧,我都能下载的到,你一定也可以)
安装后,在文件夹下,双击这个文件 jsmoothgen.exe,看到以下的界面 (我的是 jsmooth-0.9.9-7哦)
这是个欢迎界面了。
2.点击右边的 Skeleton 如图:
Skeleton Selection 我选择的是 Windowed Wrapper
Skeleton Properties 选择 Launch java app in the exe process
选择好了后,接着点击右边的 Executable
3. Executable 界面:
在下面的界面中,Executable Settings 里 有三个选项(鼠标滑动到小问号上,就会有说明德)
<1>. Executable Binary: 写一下你希望生成的 exe文件名,记得要带着扩展名的。这里只写名字即可,不用管路径。
<2>. Executable Icon: 选择一副图片 作为 即将生成的exe文件的 图标,图片尺寸好像有规定,不过我自己试了大的图片,除了有些变形外,还是可以用的。
<3>. Current directory: 这个选项我没选过,默认空就好了。
4.点击Application,看到下面的界面:
这里要强调一点就是:不能先去选择Main class,你点击最右边的Browser,会发现无法选择的。
需要先选择下面的 Embedded jar,---- Browser,--- 选中后,在反过来选择 Main class
这两个选择好了后,在最下面有一个 Classpath 选项,请把你用到的第三方jar文件添加至此处。
然后基本就可以了
5.其实下面还有一个 JVM Selection ,和 JVM Config,这两个,如果你是在自己的机器上使用,这两个基本默认就好,如果你运行 这个exe 的环境和你的机器上的jre版本不同,那就要在设置了,我也正在看这里,因为我今题那就遇到了此问题。会在补充的。
6.前面设置都ok了,就可以选择菜单栏里的project 下的 compile,这时候,会跳出一个对话话,问你要保存exe文件要保存到哪里,你选择一下,其他的不用动。
这里保存的其实是两个文件,一个是 exe 文件,一个是 相对应的 同名的xml 文件,在那个xml文件里 有这个exe的信息。
去你生成exe的路径下检查一下吧,应该是可以用的了。
上面那篇文章 《如何用My Eclipse 发布 带mianfes.mf 的 jar 文件(一)》
讲了用My Eclipse 发布jar文件的步骤,这里可以在做一个,这个程序不依赖 dos 的控制台,所以发布好的jar文件是可以双击直接运行的哦。
比如程序:
import javax.swing.JOptionPane;
public class Output {
/**
* @param args
*/
public static void main(String[] args) {
JOptionPane.showMessageDialog(null,"aaaaaa");
}
}
按照前一篇的方法 将 其发布成 jar 文件,然后双击该文件,就能够直接运行,运行效果如图:
如果你已经可以 发布这样的jar包了,那么下面就可以 看下我的 第三篇 ,带第三方jar文件(比如常用的sqlserver的驱动jar:mssqlserver.jar...)的项目,这样的项目 打成jar包后,如何运行。
关于这个jar文件,我可是费了很多的时间,力气,和脑细胞,虽然只是这么一个小小的问题,可的确不是让人很省心的事情。
网络上虽然有不少这样的文章,但当一个新手看的时候,还是会发现 很多情况说的不够明确,测试也不会成功,这里就先将一个简单的程序打成jar文件,下面提到的方法都是我亲自实践过的。
可以看到我的这篇文章的title并没有起成“如何用My Eclipse 发布 能够双击运行的 jar 文件”,而是写成了带 mianfest..mf 的jar文件。
这是因为 有的jar文件 虽然是包含了 mianfest.mf 的,但是,你双击它却依旧看不到 程序的 运行结果。
因为这个程序的运行结果需要 依靠 dos窗口。
比如这样一段程序:-------该程序在项目test下,test下只有这一个类文件
public class Output {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("aaaaaaaa");
}
}
让我们来试试:
1.右键选中你的项目,选择 export,选择JAR file
2.选择Next ,然后选择你要打包的项目,画上小对号就好。然后在底下 JAR file 那里选择你要 存储 jar文件的路径,另外就是自己给你的jar文件起个名字,这里我就存在了D盘下,名字就叫test.jar
3.然后接着点击 Next,会出现下面的界面,这里默认设置就好,这两个小对号是说带着编译提示的错误和警告export。目前我这里每次都是默认的设置
4.接着点击Next,这里就要注意选择 Mianfiest.mf 文件了,点击下面 Main class 右边的Browser ,会跳出一个窗口,让你选择 你的main类(主程序,就是java文件里有main方法的那个类),我这里的是Output,选中Output,然后点击小窗口上的OK
5.选择完毕后,应该就是这个样子的:
6. 点击 Finish ,结束了哦。
用My Eclipse 发布jar文件的步骤 到这里就结束了呢。
*********************************************************************************
然后就可以在D盘下找到 test.jar 这个文件
可是你双击运行它,并没有得到什么反应,因为该程序的运行结果是依靠 控制台的。所以你 从运行--cmd--进入dos下。
然后到test.jar的目录下,(这里是d盘下),运行 java -jar test.jar ,就能够看到程序运行的结果了。
1. byte[] b 转换String str
str = new String(b, "gb2312"); 第二个参数是byte[]的编码格式
2. String str 转换 byte[] b
b=str.getBytes( );
我存档的一篇java资料,里面对 -jar 情况下的classpath 有了比较详细的阐述。
当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报ClassNotFound错误。实际上这是由于当使用-jar参数运行的时候,java VM会屏蔽所有的外部classpath,而只以本身yourJarExe.jar的内部class作为类的寻找范围。
**解决方案**
一 BootStrap class扩展方案
Java 命令行提供了如何扩展bootStrap 级别class的简单方法.
-Xbootclasspath: 完全取代基本核心的Java class 搜索路径.
不常用,否则要重新写所有Java 核心class
-Xbootclasspath/a: 后缀在核心class搜索路径后面.常用!!
-Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用,避免
引起不必要的冲突.
语法如下:
(分隔符与classpath参数类似,unix使用:号,windows使用;号,这里以unix为例)
java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar
二 extend class 扩展方案
Java exten class 存放在{Java_home}\jre\lib\ext目录下.当调用Java时,对扩展class路径的搜索是自动的.总会搜索的.这样,解决的方案就很简单了,将所有要使用的第三方的jar包都复制到ext 目录下.
三 User class扩展方案
当使用-jar执行可执行Jar包时,JVM将Jar包所在目录设置为codebase目录,所有的class搜索都在这个目录下开始.所以如果使用了其他第三方的jar包,一个比较可以接受的可配置方案,就是利用jar包的Manifest扩展机制.
步骤如下:
1.将需要的第三方的jar包,复制在同可执行jar所在的目录或某个子目录下. 比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包复制到/usrhome目录下或/usrhome/lib 等类似的子目录下.
2.修改Manifest 文件
在Manifest.mf文件里加入如下行
Class-Path:classes12.jar lib/thirdlib.jar
Class-Path 是可执行jar包运行依赖的关键词.详细内容可以参考 http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html 。要注意的是 Class-Path 只是作为你本地机器的CLASSPATH环境变量的一个缩写,也就是说用这个前缀表示在你的jar包执行机器上所有的CLASSPATH目录下寻找相应的第三方类/类库。你并不能通过 Class-Path 来加载位于你本身的jar包里面(或者网络上)的jar文件。因为从理论上来讲,你的jar发布包不应该再去包含其他的第三方类库(而应该通过使用说明来提醒用户去获取相应的支持类库)。如果由于特殊需要必须把其他的第三方类库(jar, zip, class等)直接打包在你自己的jar包里面一起发布,你就必须通过实现自定义的ClassLoader来按照自己的意图加载这些第三方类库。
以上三种方法推荐第一种,扩展性好,操作起来也最方便.
另外编写自己的ClassLoader,来动态载入class,是更加复杂和高级技术.限于篇幅,不赘述.有兴趣了解可以去google一下custom classloader,或者参考我的另一篇日志:让classpath参数走开。
Java的安全机制随不同的JDK版本有不同的变化,会影响很多核心CLASS,比如Thread,所以很多大型商业软件,要求JDK的版本很严格.部分原因也在此.这也要求在发布自己编写的应用时候,不管大小,都要说明开发和测试的JDK版本.
本文所述方法测试基于j2sdk 1.4.2_04-b05
----------------------------------------------------------------------------------------------
附:背景知识
自JDK 1.2以后,JVM采用了委托(delegate)模式来载入class.采用这种设计的原因可以参考http://java.sun.com/docs/books/tutorial/ext/basics/load.html
归纳来讲:是基于JVM sandbox(沙盒)安装模型上提供应用层的可定制的安全机制.
Java虚拟机(JVM)寻找Class的顺序
1. Bootstrap classes
属于Java 平台核心的class,比如java.lang.String等.及rt.jar等重要的核心级别的class.这是由JVM Bootstrap class loader来载入的.一般是放置在{java_home}\jre\lib目录下
2. Extension classes
基于Java扩展机制,用来扩展Java核心功能模块.比如Java串口通讯模块comm.jar.一般放置在{Java_home}\jre\lib\ext目录下
3. User classes
开发人员或其他第三方开发的Java程序包.通过命令行的-classpath或-cp,或者通过设置CLASSPATH环境变量来引用.JVM通过放置在{java_home}\lib\tools.jar来寻找和调用用户级的class.常用的javac也是通过调用tools.jar来寻找用户指定的路径来编译Java源程序.这样就引出了User class路径搜索的顺序或优先级别的问题.
3.1 缺省值:调用Java或javawa的当前路径(.),是开发的class所存在的当前目录
3.2 CLASSPATH环境变量设置的路径.如果设置了CLASSPATH,则CLASSPATH的值会覆盖缺省值
3.3 执行Java的命令行-classpath或-cp的值,如果制定了这两个命令行参数之一,它的值会覆盖环境变量CLASSPATH的值
3.4 -jar 选项:如果通过java -jar 来运行一个可执行的jar包,这当前jar包会覆盖上面所有的值.换句话说,-jar 后面所跟的jar包的优先级别最高,如果指定了-jar选项,所有环境变量和命令行制定的搜索路径都将被忽略.JVM APPClassloader将只会以jar包为搜索范围.
有关可执行jar有许多相关的安全方面的描述,可以参考http://java.sun.com/docs/books/tutorial/jar/ 来全面了解.
这也是为什么应用程序打包成可执行的jar包后,不管你怎么设置classpath都不能引用到第三方jar包的东西了
关于 什么是 jar文件可以参看以下链接:
http://www-128.ibm.com/developerworks/cn/java/j-jar/index.html
|