Skip navigation.

Xruben's Blog

my space , 记录我的世界

Posts tagged with "java"

总结

, ,

前段时间忙这敢着做东西,还碰上了自己以前很多没碰上的事情,所以干脆在这做个记录。

1. 乱码的问题:
以前以为写了一个filter就没有问题了,但事实上问题还很多。以前一直不知道为什么在Ajax中用GET方法发送的数据会有乱码的问题。就算是用了encodeURI进行编码,问题还是依旧。很多时候都尽量避免使用中文,又或者是使用字符串重建的方法来实现消除乱码问题。但一直都觉得这样的方法实在是不“协调”了,总觉得这是很别扭的事情。

几个这次又遇上必须要能下载中文文件名的的文件,以前的方法都是直接使用英文,但链接文字用中文,但是这样用户不干了。觉得写下载类,又加上要使用数据库进行管理,比较麻烦,不过写下载类,能更细粒度地控制整个下载。

IE有个总以UTF-8对链接进行编码,这也就是说,链接都是以UTF-8格式传上去的。但就是这样,服务器端依旧没有办法正常识别汉字,因为Tomcat总是以ISO-8859-1(java.net.URLDecoder.decode(url, "ISO-8859-1"))对URL进行解码,所以根本得不到正确的文件地址。解决方法很简单,那就是在配置文件中(访问端口的配置中)加入URIEncoding="UTF-8"这个设置,那么问题就解决了。但是这个问题解决了,老问题又来了,以前字符串重建获得参数值的方法又是乱码了。原来IE的UTF-8进行编码,并不包括对GET形式提交参数进行编码。也就是“?”后面的中文并没有进行编码。

用Opera的时候,就会发现,很多时候URL中的中文字符就被进行了编码。IE就不会帮你完成这项任务,所以你只有自己动手,使用encodeURI进行编码,或者在显示前,用Struts标签中的Link之类的便签编码后输出。当然自己用URLEncoder.encode(url, "UTF-8") 方法也行。

由于POST没有这样的问题,所以最好都是使用POST方法提交,有链接的地方,那还是先编码再输出,或者还是用脚本控制。还有就是字符串重建是非常非常愚蠢的方法,还是别用的好。

以前不知道JSP页面里的pageEncoding是干什么用的,现在知道了,是标识JSP源码是用的什么编码格式,这个属性可以令源码同页面字符的输出不是同一种格式。不过这样的做比较愚蠢。

2.线程安全
在使用ThreadLocal类的时候一定要注意,每次使用完毕了ThreadLocal中的数据后,一定记得要清理掉,或者每个请求前覆盖掉。在Tomcat中,每次请求后,此线程并没有消亡,只是假如不够用会启用新的,旧的会一直保留着,这点和连接池一样!只是连接池程序会帮我们清理。以前我一直以为每个请求后,都会启用新的线程,但事实上是每个请求都是独立的线程,但不一定是新的。结果上次写程序还犯了错误!!

3.数据库
一直没在数据库上遇到乱码问题,也许是因为用的Oracle,人家这方面已经做得很好了。不过上传发现,大数据类型,如BLOB这样的字段类型,对储存空间非常敏感,因为要是没有相同名称的空间,那根本就导不进去,哎!!!以前一直用Oracle提供的操作界面在操作,结果自己都不知道如何用SQL进行创建,结果使用简化版本的时候,我根本没办法创建空间!

关于MS

, , , ...

微软已经发布了.net下的Ruby,这个和JRuby的高调不同,在外界并不十分清楚的情况下(虽然有的已经猜到MS要有这样一个动作)。微软一直都很懂得如何吸引开发者到自己的平台下,当然这次也不会放过Ruby这个大蛋糕。

.net一开始就被设计成为一个与语言无关的平台(虽然大家都认为C#是这平台首选语言),在现在提倡领域语言的时代,这样的平台优势会越来越突出。虽然JAVA努力向着这个方向发展,但是先天的不足,还是让其有很多障碍。当然,如果可以,我相信很多语言还是很愿意让自己的语言在JVM上运行。JAVA一直一来在企业级应用上的优势,大家都是还是想借用的。

虽然现在的微软已经没有了从前的那种创造性,但是他的优势,是不可否认的。借助这样的优势,推广新的,巩固已有的优势,还是很有作用的!

这次从成都回来,在火车上碰到两个人,是大学生(说到这里,也想起自己大一大二的时候了)。说Vista是最好的操作系统,说真的,我很无语。除了那漂亮的外表,Vista真正的进步真的很少,假如以前的Longhorn那么多特性没被砍掉的话,相信真的会很优秀。

一个好的OS,要有好的人机交互哲学在里面。我们受MS影响太久了,所以要是偶然过度到别的系统,会觉得很不适应,甚至就认为别的系统不好。就拿右上角的小叉来说。在MS下,你点了它,就是直接退出系统。然而在Apple里就不是,这样一个操作仅仅是将图形界面关闭了。也许有人会说,点一下就关闭,不是很方便的吗?不过不知道有没有人想过,为什么另外相邻的两按钮却仅仅是对图形界面产生影响呢?一个是最小化到托盘,一个是最大化占满整个界面。最大化,最小化都有了,是不是该有一个消耗图形界面,让程序后台运行的选项呢?

程序应该让用户显示退出,这样防止用户因为错误关闭了程序,导致数据丢失。现在的系统都是多任务的,应该有后台运行的选项。不知道大家有没有注意到,MSN的小叉,就是让程序后台运行,而退出是要显示执行的。自己在用Swing编写程序的时候也注意到,自己可以设置窗口关闭按钮的行为到底是不是退出程序,或者仅仅是把图形界面隐藏或销毁。程序,不仅仅只是界面的。

Opera有一个锁定选项卡的功能,我很喜欢用,这样就不容易因为错点,而导致页面错误关闭了(不过由于不再使用双击关闭,其实误操作已经很了)。什么时候Windows能支持锁定窗口呢?

JDK 6.0 API 中文版发布

, ,

如题:很高兴发现这个新闻!
废话少说:在线参考ZIP打包的HTML版本CHM版本

java进制互转

,

关于java进制之间的互转,其实这用得也很少,不过还是记录下来好了!

//十进制转成十六进制:
Integer.toHexString(int i)
//十进制转成八进制
Integer.toOctalString(int i)
//十进制转成二进制
Integer.toBinaryString(int i) 

//十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
//八进制转成十进制
Integer.valueOf("876",8).toString()
//二进制转十进制
Integer.valueOf("0101",2).toString()

密码加密

, , ,

今天突然想知道JAVA里,怎么实现密码加密。搜寻了一下,开始搜索到天极网上的一篇文章,不过对于自己可用性好像不是很高的样子:Java加密和数字签名编程快速入门

后来又在http://www.cjsdn.net/上搜到了一篇满意的!不过可惜的是,标准库里只有返回byte[],在实际项目中,不好存储到数据库中,只有使用sun.misc.BASE64Encoder这个类生成String 不过由于是使用了非标准库中的类,移植性就成了个问题。

以下是代码:
/**
  * This is the one-way hash using SHA1. See javadoc on the class to get
  * more methods.
  * This also uses two internal classes from SUN for base 64 encoding. There is
  * another lib from HP too, but they are not officially in java lib and may not
  * be compatible in the future, use in your own risk.
  */
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

public class MessageDigestTesting
{
  /**
    * This method uses SHA1 to hash the input string and then output the base
    * 64 encoded string of the hashed string.
    * @param dataToHash the string to be hashed
    * @return the base 64 hashed string or null if SHA1 is not available.
    */
  public static String hashSHA1String(String dataToHash)
  {
    String tmp = null;
    /*
    * While this hashing prevents an attacker from reading the passwords in
    * clear text, the hashed passwords are still open to a so called dictionary
    * attack. The attacker compiles a database of common passwords and their
    * hash value and looks up the hash values. If he finds a match he knows
    * the corresponding password.
    * Even the designers of UNIX noticed this and added a field called "salt"
    * to the passwd file. The salt is a number that is prepended to the
    * password before the hash function is called.
    * */
    String salt = "abcedefghijklmnopqrstuvwxyz";

    try
    {
      //One-way hash
      MessageDigest md = MessageDigest.getInstance("SHA1");
      md.update(salt.getBytes());
      byte[] byteTmpe = md.digest(dataToHash.getBytes());

      //base 64 encoding, using sun's internal lib
        BASE64Encoder b64encoder = new BASE64Encoder();
        tmp = b64encoder.encode(byteTmpe);
    }
    catch (NoSuchAlgorithmException e)
    {
      //silence and return null
        }

    return tmp;
    }

  /**
   * User cases:
   * 1. In addition to salt, you should use iterations of the hash to protect
   *    against brute force attacks on a single password.
     * 2. Unless you know this, ignore for now.
   *    This one is safe:
   *        com.sun.crypto.provider.PBEWithMD5AndTripleDESCipher
   *    This one is not safe:
   *        PBEWithMD5AndDES
   * @param args
   */
  public static void main(String[] args)
  {
    String a = "abcdefg";
    String b = "abcdefghijk";
    String c = "abcdefg";
    String aa = hashSHA1String(a);
    String bb = hashSHA1String(b);
    String cc = hashSHA1String(c);
    String aaa = hashSHA1String(aa); //hash a twice
    System.out.println("aa==" + aa);
    System.out.println("bb==" + bb);
    System.out.println("cc==" + cc);
    System.out.println("aaa==" + aaa);
    System.out.println("check a==c: " + aa.equals(cc));
    }
}

狭隘的开源 -- 读“国外开源ERP现状”

, , ,

前几天看了袁萌的专栏,袁萌是个开源的倡导者,不读完他的“国外开源ERP现状”,觉得他也只不过是一个狭隘的开源者!在那鼓吹LAMP(Linux+Apache+MySQL+PHP)是多么多么的强,说什么J2EE构架不行,太复杂什么的。但是我很好奇,像PHP这样的语言,系统构架能够比J2EE强悍?假如因为一个软件设计得垃圾,就说J2EE不行,那LAMP我想也不少!我并没有贬低LAMP的意思,但是袁萌倡导的开源ERP太狭隘了!首先他硬性认为ERP应该只在B/S形式下,可事实上个人认为如果企业选择java/.net作为整个企业的技术方向,那部署C/S系统也并非不可以。当然,当ERP延伸的时候B/S有着很大的优势。java已经开源了,即使在部署EJB时也有JBoss这样的开源软件。如果好好的发挥J2EE,那它所释放的力量绝对是巨大的,开发出优秀的开源ERP更是轻而易举的事情。即使在LAMP中的P,也有Python,Perl,Rub这些语言作替代。其中的L也是同样可以替代的,比如BSD系统,又或者是已经开源的Solaris,中国在强调开源的时候,总是只说说什么Linux,PHP。说实在的,有时候我们这些所谓的专家真是在误导群众,上次在一个群里聊的时候,有个人说:Linux我倒是听过,可FreeBSD是什么?其实自已也一直很奇怪,BSD许可下有那么多优秀的软件,可是却没有得到大众的认可。不过我很赞同袁萌老师说的,开源应该从教育开始。如果连学校都不相信开源,又何以让我们广大的学生相信,开源软件是值得信赖的呢?学校应该是先锋,也应该是开源的先锋。无论出于什么目的,都应该把国家的开源事业引入我们的教育中!我们的教育,为MS培养太多的windows程序员了,也该为自己的开源事业出力了!

LGRM程序总结

, , , ...

  LGRM -- Lao Geng Records Manager

  为同学开发的这个软件,也是自己第一个桌面程序,还是用JAVA写的。所用的数据库是陌生的(db4o),JFC(swing)以前也没用过,也是第一次用NetBeans来设计界面。整个过程下来,还是学到不少东西。

  以前没做过桌面程序,对开发模式,模块分化等等都好的设计。做了下来,个人觉得应该分为四个部分 GUI,Action,Model,DAO。

  GUI部分主要是界面布局,提供功能入口和数据呈现。应该尽量将拆分为独立的各个部分,最好是Panel,并添加到组件面板中。使用JDialog还是JFrame,那要按需求而定。这次我就改过,从JDialog到JFrame,因为JDialog不能全屏放大。只要将界面组件拆分好,再加上NetBeans的强大能力,是可以做出漂亮的界面,并且对界面的修改也容易。要是分离得好,那基本上对功能代码没有影响!

  Action部分,基本都继承Thread,也就是要有多线程运行能力,保证程序反应灵敏,特别是在访问数据库的的时候。这部分也是主要的逻辑部分,处理用户的操作、获取数据、验证数据完整性、提示用户、更新数据。有时候会觉得这部分太零散了,类过多。

  Model部分,基本是数据承载类,也是因为swing的原因,像JTable这样的数据组件都有个Model,提前封装好就可以直接使用。封装一般由Action完成,可以适应一个数据,多个Model。不过如果数据显示单一的话,也可以直接由DAO完成,这样还要个好处就是数据装填对应性好。

  DAO部分,负责和数据库交互,返回数据格式最好是和数据以方便装填。这部分多数以存储对象的为基础构造。

  实际中,组件间的相互访问,Action和组件访问都是比较多的,要想访问,就得有引用。要不所有组件放到一个Class中,要不保证本组件有要访问组件的引用。与其这样还不如搞个组件池,把几个主要的组件放个引用到池中,需要时就去拿。

  在Web程序中,表单验证是经常提到的事情,比较客户端和服务器端交互的主要手段就是表单。在桌面程序由于没这个故有的form,所以自由度很大,不过最优的解决方案还是验证的直接绑定。原则是,只写一次!

  在桌面程序,最复杂的地方应该算是事件的触发了。包括同一事件的不同触发方式,以及多事件的相关触发,以及同一事件不同情况的触发的不同结果。还要一个方面就是数据的完整性。保证数据的完整性是个很重要的方面,应该在Action和DAO两个部分都保证。主要在Action来完成,这样也可以向用户提示足够细致的信息,DAO主要是起到一个校验的作用。

  提供一个默认设置,从数据存放到功能方式。尽可能向用户提供更多的选择!尽量不要让提示、标识文字出现在程序中,将他资源化,保留一个默认资源。这样最大的好处就是可以国际化!如果有可能给用户提供一个BUG或意见的提交方式!

  建模的重要性。建模可以提前帮助你更清晰的看清每个部分,提前想好每个部分的关联。“过于敏捷”也不是什么好事!提早进入细节的实现,容易导致对全局的或略,使软件走偏。也容易犯考虑不周的问题。敏捷最主要还是要满足用户需求,可以让GUI部分走得块些,利用强大的界面设计器,和用户一起模拟使用环境。用户是“愚蠢的”,很多时候用户并不知道自己真正的需求,如果你想到了某需求可能需要,那请在进度保证的情况下加上去。如果是功能实现的不同见解,那就和用户沟通,如果自己坚持那就干脆提供两总方式!满足自己也满足用户!

  今天就写这些了!

JTable的排序

, , , ...

swing中JTable并没有实现排序功能,不过在实际应用中,这个却是非常常用的功能,不过sun公司有一个实现,通用的,也挺好用的。在别人的BLOG上找到的,现在放到BLOG上。记得上次找到一个可以关闭标签的JTabbedPane实现,不过在Windows外观下,按钮失效。如以后真的要用,还是只有用NetBeans的那个实现(和JBuilder可不一样)。不过要能掌握NetBeans Platform那应该更好!

/** 使用方法 */
TableSorter sorter = new TableSorter(new MyTableModel()); //ADDED THIS
//JTable table = new JTable(new MyTableModel()); //OLD
JTable table = new JTable(sorter); //NEW
sorter.setTableHeader(table.getTableHeader()); //ADDED THIS

Read more...

感受

, , , ...

按常理来说,大考完了以后,肯定会比较放松,有更多的空余时间。可是现在的我却不是,考试还没有全结束,我就马上又开始给同学写软件了!从现在到毕业前的事情都拍满了,一点空余的时间都没有!

今天在用Swing做界面,不过我是用的NetBeans做的设计,排版的时候确实是容易很多。不过代码安排,组件拆分,触发事件……都没有轻松的。软件看似很容易,可是当问题越分析约深入的时候,就觉得没有那么轻松了。swing虽然说其自身设计非常不错,但是想用好它,特别是把自己的软件也设计得和swing一样“美”,那就非常困难了,何况我对swing不熟悉。

最近可能也不很有空写BLOG,不过还是希望什么时候能写些随笔,或者开始写小说也不错,呵呵!

JDK各版的发布时间表

, ,

JDK 1.1.4
Sparkler
宝石
1997-09-12

JDK 1.1.5
Pumpkin
南瓜
1997-12-13

JDK 1.1.6
Abigail
阿比盖尔--女子名
1998-04-24

JDK 1.1.7
Brutus
布鲁图--古罗马政治家和将军
1998-09-28

JDK 1.1.8
Chelsea
切尔西--城市名
1999-04-08

J2SE 1.2
Playground
运动场
1998-12-04

J2SE 1.2.1
none

1999-03-30

J2SE 1.2.2
Cricket
蟋蟀
1999-07-08

J2SE 1.3
Kestrel
美洲红隼
2000-05-08

J2SE 1.3.1
Ladybird
瓢虫
2001-05-17

J2SE 1.4.0
Merlin
灰背隼
2002-02-13

J2SE 1.4.1
grasshopper
蚱蜢
2002-09-16

J2SE 1.4.2
Mantis
螳螂
2003-06-26

J2SE 5.0 (1.5.0)
Tiger
老虎
2004-10

J2SE 6.0 (Beta)
Mustang
野马
2006-04
December 2009
S M T W T F S
November 2009January 2010
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31