2006-09-27

json是什么样的

var MyJson=
{
  name:"myjson",
  description:"it is my json",
  display:function(arg){
    alert(arg);
  }
};

MyJson.display("json很简单");
link


powered by performancing firefox

2006-09-26

判断myfunc是否存在

判断myfunc是否存在

function myfunc(){
alert("helloworld");
}

try{
if(myfunc)myfunc();
}catch(e)
{alert("exception");}

2006-09-20

问题


  • 两个完全相同的类,JVM会如何加载呢?

    同时加,还是随机性的选择一个,抑或根据版本号选择版本较高的?

  • 如果两个类只是版本不同,JVM又会如何加载呢?

    在tomcat启动的时候,如果你的webapp里有较低版本的servlet-api.jar,会自动报告说版本过低然后不再加载它.但是,这可能只是jar....

getResourceAsStream

getClassLoader().getResourceAsStream && .getResourceAsStream()


package jay.home.test.comm;

import static org.junit.Assert.*;

import java.io.InputStream;
import jay.home.test.dbunit.DBUnitUsage;
import org.junit.Test;

/**
* @author Jay
* @since 2006-9-20 下午12:02:15
*/
public class GetResourceAsStream
{
@Test
public void getResourceByClass()throws Exception
{
// 如果不是在同一目录下,不可访问到
InputStream stream2 = DBUnitUsage.class.getResourceAsStream("resource.file");
assertNull(stream2);
// 可以访问,需要加全限定名
InputStream stream3 = DBUnitUsage.class.getResourceAsStream("/jay/home/test/comm/resource.file");
assertNotNull(stream3);
// 可以访问,如果在同一个目录下就可以直接访问
InputStream stream4 = GetResourceAsStream.class.getResourceAsStream("resource.file");
assertNotNull(stream4);
}

@Test
public void getResourceByClassLoader() throws Exception
{
ClassLoader loader = GetResourceAsStream.class.getClassLoader();

InputStream stream1 = loader.getResourceAsStream("resource.file");
assertNull(stream1);
// 可以访问,加包名
InputStream stream2 = loader.getResourceAsStream("jay/home/test/comm/resource.file");
assertNotNull(stream2);
// 不可以访问,不需要最前的/
InputStream stream3 = loader.getResourceAsStream("/jay/home/test/comm/resource.file");
assertNull(stream3);
}
}

2006-09-19

运行applet

以前一直以为网页内的applet需要用sun的activex才能运行,今天试了一手,原来这样也可以的:

d:/>appletviewer http://www.meterware.com/evdemo/index.html

看来,虽然麻烦,以后在重装系统的时候真的不需要重装JDK了

2006-09-18

Registry vs. Repository

A registry is a list of items with pointers for where to find the items, like the index on a database table or the card catalog for a library. A repository stores the actual items, like a database table itself or a library's shelves of books. If you lose a registry, the items still exist; you just may need to reindex them. If you lose a repository, the items are gone.

2006-09-05

布局

GEF的布局全仰仗org.eclipse.draw2d下的布局类,gef有种挺迷惑人的LayoutEditPolicy,其实它跟布局没关联,是用来产生command的:
public Command getCommand();
像什么getCreateCommand()、getDeleteCommand()等都是由它统一送出去的。
如果硬要说有什么关系的话,那么就是command所接收的context是LayoutEditPolicy从Layout等地方获取的。Layout准确得应该叫做是LayoutManager,有个核心方法大概表达的这个意思:
public void layout(IFigure parent)
{
List children = parent.getChildren();
for(IFigure item: children)item.setBounds(/**new Rectangle(...)*/);
}
它会管理其属下的Figure,当放一个元素到Figure pane的时候会自动调用pane的layout方法来重新布局。

static变量生存期

formEditor有一个奇怪的现象:
第一次打开它运行正常,比如创建新element等操作皆可。但是你把这个editor关闭然后再打开就会出问题,图形化的操作再不会产生反应了,model的数据也不再有变化。后来才发现,原来是在段代码出错:
private static IDOMDocument document = DocumentTransferer.getDocument();
把static去掉就OK了,其实就是一static变量生存期的问题。

java.util.Timer vs javax.swing.Timer

javax.swing.Timer.start()这个方法跟Thread.start()的方法含义是不一样的。前者的作用是把这个timer放到一个TimerQueue里去。这个TimerQueue是一个独立的进程,可以循环执行它所管辖的timer的post方法,post的意思就是这个timer到期了,可以通知以使事件发生。所以,如果想让你注册进来的actionlistener执行的话需要的不是timer.start(), 而是timer.post(),但是你不会有这个执行权利,因为它的访问权限是package。
你可能想了,那我能不能新建立一个thread来执行TimerQueue呢?也不可以。同样受访问权限限制。所以,惟一可能的办法就是把它放到swing的运行环境中,让swing来维护这个TimerQueue:
//javax.swing.Timer
public class SwingTimer extends JFrame
{
private ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("^^^^^^^^^^^");
}
};

public SwingTimer(){
super();
new Timer(1000, listener).start();
}

public static void main(String[] args){
//怪事,如果不设visible或设为false就不会循环执行,闷!
new SwingTimer().setVisible(true);
}
}

或者,你找的是这个东西:
//java.util.Timer
public static void main(String[] args)
{
TimerTask task = new TimerTask(){
public void run(){
System.out.println("^^^^^^^^^^");
}
};
Timer timer = new Timer();
//0millisecond后开始执行,每1000milliseconds执行一次
timer.schedule(task, 0, 1000);
}

2006-09-02

正则表达式的应用

最近有点喜欢帮人了:)

问题:
有一个文本文件如下

A,1
A,2
A,3
B,4
B,5
C,6
C,7
C,8

每行有两个元素,以逗号分隔,例如(A和1),文件的行数未知第一个元素都是连续相同的(如AAABBCCC),没有混乱现象(如AABABCCC)逐行读这个文件需要要把第一个元素相同的第二元素抽出来,放在一个新new出来的ArrayList里面例如读前面三行,第一个元素都是A,那么就new一个ArrayList,把第二元素1,2,3放进去然后接着读,第一个元素变成B了,这个时候需要重新new一个新的ArrayList,把第二元素4,5放进去再读,第一个元素变成C,再new一个新的ArrayList,把第二元素6,7,8放进去
请教算法,谢谢了!

解决

//这个字符串代表你的文件内容
String input = "A,1\nA,2\nA,3\nB,1\nB,2\nB,3\nB,4";
public void testCSDN()
{
Pattern pattern = Pattern.compile("[\n]+");
String[] results = pattern.split(input);
Map target = new HashMap();
//这里设置一个开始字符,也可以修改成察看文件获取
String current = "A";
ArrayList currentList = new ArrayList();
for(String item : results)
{
String[] currentLine = Pattern.compile("[,| ]+").split(item);
if(!current.equals(currentLine[0]))
{
target.put(current, currentList);
current = currentLine[0];
currentList = new ArrayList();
}
currentList.add(currentLine[1]);
}
target.put(current, currentList);
System.out.println(target);
}