| 宸's profileYurina SpacePhotosBlogLists | Help |
|
December 03 正是我想要的看了一遍《Javascript高级程序设计》,正准备开始Javascript的正式学习,正好发现了这个,非常好。
还有一个Ext框架的,貌似很值得一学的样子。。。 November 17 实习中哎。。。。开始实习了,这两个月来回的跑,突然发现自己对于整个世界来说是多么的渺小。 大家都忙着自己的事,考研、找工作、实习,当然,学校不会因为我的离开而会发生什么改变。我只期待我离开的几个月不要发生什么让我错过的大事。 好多人都受到公司的offer了,大部分人都蛮不错的,看来我也要努力了啊,准备行动! September 21 关于Java类加载记得在刚学JAVA的时候,类的加载机制和初始化顺序经常被弄的糊里糊涂,其实当我们不太了解某些事情的时候,不防去做一做实验,让代码的运行结果
说话,这或许能帮助我们更好地了解一些事情.今天我们就用一些代码来看一下类是如何被加载的,并且当有继承关系的时候,类的加载顺序又是怎么样的. /*
* Test4.java * * Created on 2007-9-21, 9:33:31 * * To change this template, choose Tools | Templates * and open the template in the editor. */ package test1; /** * * @author hadeslee */ public class Test4 { private void testClassForName(String name) throws ClassNotFoundException{ Class c=Class.forName(name); } private void testNewInstance(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ Class c=Class.forName(name); Object obj=c.newInstance(); System.out.println(obj); } public static void main(String[] args)throws Exception { Test4 t=new Test4(); t.testClassForName("test1.B"); new B(); new B(); } } class A{ private int aj; { aj=20; System.out.println("A成员初始化块"); } private static int ai; static { ai=10; System.out.println("A静态初始化块"); } public A(){ System.out.println("A构造函数"); } } class B extends A{ private static int bi; static { bi=30; System.out.println("B静态初始化块"); } private int bj; { bj=40; System.out.println("B成员初始化块"); } public B(){ System.out.println("B构造函数"); } } 在代码里面我们总共有三个类,一个是做测试用的Test4,一个是A,一个是A的子类B,我们在A和B类里面都有很多输出,一个是静态初始化的输出,一个是成员初始化的输出,一个是在构造函数里面的输出,从这些输出我们可以知道代码的执行顺序,以上代码运行输出如下: A静态初始化块 B静态初始化块 A成员初始化块 A构造函数 B成员初始化块 B构造函数 A成员初始化块 A构造函数 B成员初始化块 B构造函数 从上面我们可以看出,A和B的静态初始化块只被执行了一次,也就是类的对象将要被生成的时候,它会执行,并且执行的顺序如下:父类的静态成员,子类的静态成员,父类的成员变量和构造方法,子类的成员变量和构造方法.当再用这个类生成对象的时候,静态的部份就不再被调用了.因为静态是类的所有实例所共享的,所以它在整个虚拟机的生命周期内只执行一次. 如果我们加上一个t.testClassForName("test1.B");放在main函数的最后面,我们会发现输出还是和刚刚一样,没有任何改 变,这个时候,我们知道,当我们调用Class.forName(name);的时候,类是不会自动初始化的,它默认只是把这个类的字节码读入内存,但是 并没有初始化这个类.只有我们调用了newInstance()的时候,它才会被初始化.在这里我们再这样试一下:把A和B生成的class文件去掉,然 后再分别调用Class.forName和new B(),看看会怎么样,我们会发现当我们调用Class.forName的时候,当我们要for的Name找不到的时候,只会抛出ClassNotFoundException,注意,它只是一个异常而已,而当我们new B()的时候,B的class文件却被我们删掉了,那就事大了,那就将抛出NoClassDefFoundError, 呵呵,它就是一个Error了,这点区别我们可要注意啦,当我们在做这些事情的时候,一个只要捕获异常就可以了,一个却需要捕获一个Error,一般来 说,Error级别的错误是不希望程序员去捕获的.了解了类的基本加载顺序以及加载机制后,对我们了解JAVA是有一定的帮助的.好了,先讲这些吧,有关 类的加载机制以后再继续分享:) September 19 重设数组大小private static Object resizeArray (Object oldArray, int newSize) {
int oldSize = java.lang.reflect.Array.getLength(oldArray); Class elementType = oldArray.getClass().getComponentType(); Object newArray = java.lang.reflect.Array.newInstance(elementType,newSize); int preserveLength = Math.min(oldSize,newSize); if (preserveLength > 0) System.arraycopy (oldArray,0,newArray,0,preserveLength); return newArray; } 顺便提一下,Java中数组的单纯赋值比System.arraycopy()相比,字符串越长,则后者更快,大家可以试试。 September 15 随便列的太阳 今天qq到太阳了,确实有点晚,不知为什么,总是不记得登qq,即使记起来了也不想登。是不是有点自闭啊 关于Spring开发的链接其中有一个地方比较重要:
log4j配置
首先,在 web.xml 文件中加入如下配置:
log4j.properties 文件放在 /WEB-INF/ 目录下, 文件内容如下例,其中根日志级别为 warn ,而在包 cn.idtag 中的类的日志级别为 info 。
转:Hibernate包作用总结Hibernate一共包括了23个jar包,令人眼花缭乱。本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进行取舍。 下载Hibernate,例如2.0.3稳定版本,解压缩,可以看到一个hibernate2.jar和lib目录下有22个jar包: hibernate2.jar: Hibernate的库,没有什么可说的,必须使用的jar包 cglib-asm.jar: CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包 dom4j.jar: dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。 odmg.jar: ODMG是一个ORM的规范,Hibernate实现了ODMG规范,这是一个核心的库,必须使用的jar包。 commons-collections.jar: Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。 commons-beanutils.jar: Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。 commons-lang.jar: Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 commons-logging.jar: Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本身包含了一个Simple Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的 java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。 后来Apache就开发出来了commons-logging.jar用来兼容两个 logger。因此用commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j, java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。 使用Hibernate必须的jar包就是以上的这几个,剩下的都是可选的。 ant.jar: Ant编译工具的jar包,用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码,那么就没有什么用,可选的jar包 optional.jar: Ant的一个辅助包。 c3p0.jar: C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池,就需要这个jar包。 proxool.jar: 也是一个连接池,同上。 commons-pool.jar, commons-dbcp.jar: DBCP数据库连接池,Apache的Jakarta组织开发的,Tomcat4的连接池也是DBCP。 实际上Hibernate自己也实现了一个非常非常简单的数据库连接池,加上上面3个,你实际上可以在Hibernate上选择4种不同的数据库连接池,选择哪一个看个人的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中使用Hibernate,一定要用App Server的连接池,不要用以上4种连接池,否则容器管理事务不起作用。 connector.jar: JCA 规范,如果你在App Server上把Hibernate配置为Connector的话,就需要这个jar。不过实际上一般App Server肯定会带上这个包,所以实际上是多余的包。 jaas.jar: JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以实际上是多余的包。 jcs.jar: 如果你准备在Hibernate中使用JCS的话,那么必须包括它,否则就不用。 jdbc2_0-stdext.jar: JDBC2.0的扩展包,一般来说数据库连接池会用上它。不过App Server都会带上,所以也是多余的。 jta.jar: JTA规范,当Hibernate使用JTA的时候需要,不过App Server都会带上,所以也是多余的。 junit.jar: Junit包,当你运行Hibernate自带的测试代码的时候需要,否则就不用。 xalan.jar, xerces.jar, xml-apis.jar: Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上,JDK1.4也包含了解析器,不过不是Xerces,是Crimson,效率比较差,不过Hibernate用XML只不过是读取配置文件,性能没什么紧要的,所以也是多余的。 给出Java类的完整路径public class JWhich {
/**
* Prints the absolute pathname of the class file * containing the specified class name, as prescribed * by the current classpath. * * @param className Name of the class. */ public static void which(String className) { if (!className.startsWith("/")) {
className = "/" + className; } className = className.replace('.', '/'); className = className + ".class"; java.net.URL classUrl =
new JWhich().getClass().getResource(className); if (classUrl != null) {
System.out.println("\nClass '" + className + "' found in \n'" + classUrl.getFile() + "'"); } else { System.out.println("\nClass '" + className + "' not found in \n'" + System.getProperty("java.class.path") + "'"); } } public static void main(String args[]) { if (args.length > 0) { JWhich.which(args[0]); } else { System.err.println("Usage: java JWhich <classname>"); } } } 转:JSP乱码解决思路总结对于Java由于默认的编码方式是 UNICODE,所以用中文也易出问题,常见的解决是 September 10 带提示的JTextFieldimport java.awt.BorderLayout;
import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Font; import java.awt.Point; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.Icon;
import javax.swing.ImageIcon; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import net.java.balloontip.BalloonBorder; /** * Custom JTextField. * * @version 0.1.1, 2007-9-9 * @author ruislan <a href="mailto:z17520@126.com"/> */ public class MyJTextField extends JTextField { private static final Color TIP_COLOR = new Color(255, 255, 225); private int limit = Integer.MAX_VALUE; private boolean numberOnly; private CoolToolTip numberTip; private CoolToolTip limitTip; private ImageIcon tipIcon; public MyJTextField() { initComponents(); initEventListeners(); } private void initComponents() {
tipIcon = new ImageIcon(MyJTextField.class.getResource("tip.gif")); numberTip = new CoolToolTip(this, TIP_COLOR, getColumns(), 10); numberTip.setText("只能输入数字!"); numberTip.setIcon(tipIcon); numberTip.setIconTextGap(10); limitTip = new CoolToolTip(this, TIP_COLOR, getColumns(), 10); limitTip.setIcon(tipIcon); limitTip.setIconTextGap(10); } private void initEventListeners() { addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { if (getText().length() + 1 > limit) { deleteInputChar(e); limitTip.setVisible(true); return; } else { limitTip.setVisible(false); } if (numberOnly) { char input = e.getKeyChar(); if (!Character.isDigit(input)) { numberTip.setVisible(true); deleteInputChar(e); } else { numberTip.setVisible(false); } } } private void deleteInputChar(KeyEvent source) { source.setKeyChar((char) KeyEvent.VK_CLEAR); } }); } public void setMaxTextLength(int limit) { if (limit < 0) { return; } this.limit = limit; limitTip.setText(String.format("超过最大长度 \"%d\"", limit)); } public int getMaxTextLength() { return limit; } public void setNumberOnly(boolean numberOnly) {
this.numberOnly = numberOnly; } public boolean isNumberOnly() {
return this.numberOnly; } private class CoolToolTip extends JPanel {
private JLabel label = new JLabel(); private boolean haveShowPlace; private Component attachedComponent;
public CoolToolTip(Component attachedComponent, Color fillColor,
int borderWidth, int offset) { this.attachedComponent = attachedComponent; label.setBorder(new EmptyBorder(borderWidth, borderWidth,
borderWidth, borderWidth)); label.setBackground(fillColor); label.setOpaque(true); label.setFont(new Font("system", 0, 12)); setOpaque(false);
this.setBorder(new BalloonBorder(fillColor, offset)); this.setLayout(new BorderLayout()); add(label); setVisible(false);
// if the attached component is moved while the balloon tip is
// visible, we need to move as well attachedComponent.addComponentListener(new ComponentAdapter() { public void componentMoved(ComponentEvent e) { if (isShowing()) { determineAndSetLocation(); } } }); }
private void determineAndSetLocation() {
Point location = attachedComponent.getLocation(); setBounds(location.x, location.y - getPreferredSize().height, getPreferredSize().width, getPreferredSize().height); } public void setText(String text) {
label.setText(text); } public void setIcon(Icon icon) {
label.setIcon(icon); } public void setIconTextGap(int iconTextGap) {
label.setIconTextGap(iconTextGap); } public void setVisible(boolean show) {
if (show) { determineAndSetLocation(); findShowPlace(); } super.setVisible(show); } private void findShowPlace() { if (haveShowPlace) { return; } // we use the popup layer of the top level container (frame or // dialog) to show the balloon tip // first we need to determine the top level container Container parent = attachedComponent.getParent(); JLayeredPane layeredPane; while (true) { if (parent instanceof JFrame) { layeredPane = ((JFrame) parent).getLayeredPane(); break; } else if (parent instanceof JDialog) { layeredPane = ((JDialog) parent).getLayeredPane(); break; } parent = parent.getParent(); } layeredPane.add(this, JLayeredPane.POPUP_LAYER); haveShowPlace = true; } } } 如何让Swing控件如JLabel,JButton等显示动态Gif图片public class DynGifLabel extends JLabel implements Runnable {
private static final long serialVersionUID = 45345345355L; // 用以存储Gif动态图片 public Image image; // 用以刷新paint函数 Thread refreshThread; /** * * @param image: * Sample:new ImageIcon(DynGifLabel.class * .getResource("/picture.gif")).getImage() */ public DynGifLabel(Image image) { this.image = image; refreshThread = new Thread(this); refreshThread.start(); } /**
* 重载paint函数
*/ public void paint(Graphics g) { super.paint(g); Graphics2D graph = (Graphics2D) g; if (image != null) { // 全屏描绘图片 graph.drawImage(image, 0, 0, getWidth(), getHeight(), 0, 0, image .getWidth(null), image.getHeight(null), null); } } /** * 隔100毫秒刷新一次 */ public void run() { while (true) { this.repaint();// 这里调用了Paint try { Thread.sleep(100);// 休眠100毫秒 } catch (Exception e) { e.printStackTrace(); } } } } September 06 Java冒泡排序算法 public static void sort(int[] values){ int temp; for(int i=0 ; i < values.length ; ++i){ for(int j=0; j <values.length - i - 1; ++j){ if(values[j] > values[j + 1]){ temp = values[j]; values[j] = values[j + 1]; values[j + 1] = temp; } } } Java单链表逆序算法 1 package ch01; 2 3 public class Node 4{ 5 6 int data; 7 8 Node next = null; 9 10 11 12 public Node(int data){ 13 this.data = data; 14 } 15 16 17 public static Node reverse(Node head){ 18 19 Node p = null; 20 Node q = head; 21 22 23 while(head.next != null){ 24 25 p = head.next; 26 head.next = p.next; 27 p.next = q; 28 q = p; 29 30 31 } 32 33 return q; 34 } 35 36 37 public static void main(String[] args){ 38 Node head = new Node(0); 39 Node tail = head; 40 41 42 for(int i = 1 ; i < 10; ++i){ 43 Node p = new Node(i); 44 tail.next = p; 45 tail = p; 46 47 } 48 49 head = reverse(head); 50 while(head.next != null){ 51 52 System.out.println(head.data); 53 head = head.next; 54 55 56 } 57 } 58 59 60} March 14 从硬盘安装系统1.Windows98(或Me)启动盘一张。内含
smartdrv.exe
(磁盘高速缓存)
format.com (硬盘分区格式化命令)。 2.准备好Windows XP Professional 简体中文免激活版安装文件。推荐将安装文件复制到硬盘如 F:\XPVLSP1 (这时XPVLSP1文件夹里应包含如下∶DOCS、DOTNETFX、I386、SUPPORT、VALUEADD五个子文件夹和十个文件,存放安装文件的文件夹的名称不能是中文,要用英文或数字,并且长度最好不超过8个英文字母或数字) ,安装文件复制到硬盘,安装速度会快一点,同时避免在安装过程中有提示xxx文件不能复制的问题,亦使到以后运行Windows XP Professional过程(或安装驱动程序)如有系统文件丢失时,系统能自动从该文件夹提取文件修复系统。推荐将 smartdrv.exe
和format.com
复制到F盘根目录F:\ 这样便于操作。 3.可能的情况下,在运行安装程序前用磁盘扫描程序扫描所有硬盘检查硬盘错误并进行修复,否则安装程序运行时如检查到有硬盘错误即会很麻烦。 以上所提到的文件均有超链接,点击文件时均可下载。 5.可能的情况下,用驱动程序备份工具(如:
驱动精灵 2004 V1.9 Beta.exe
)将原Windows XP下的所有驱动程序备份到硬盘上(如∶F:\Drive)。最好能记下主板、网卡、显卡等主要硬件的型号及生产厂家,预先下载驱动程序备用。
6.如果你想在安装过程中格式化C盘或D盘(建议安装过程中格式化C盘),请备份C盘或D盘有用的数据。 7. 系统要求-----微处理器(CPU)在233 兆赫 (MHz) Pentium 或更高的(或与之相当的处理器),内存建议使用大于 128 MB(RAM 最小为 64 MB;最大为 4 GB),大于1.5 GB 的可用硬盘空间。 二、启动DOS系统:
(如果你已经知道方法请转到下一步) 如果你不知道请参考--> 如何进入纯DOS系统。
三、加载磁盘缓存,格式化C盘 。(如果你已经知道方法请转到下一步) 进入dos。
输入“F:”按“Enter”键回车。这时转到了F盘,屏幕显示F:\>_ 输入“smartdrv”按“Enter”键回车。 再输入“smartdrv 200000”按“Enter”键回车。这样就给DOS加载了磁盘高速缓存。如果在DOS下安装Windows 2000或Windows xp不加载磁盘高速缓存,你的安装时间将延长好几倍。加载了磁盘高速缓存后如下图2所示。如果没有看到图2所示的画面表明加载磁盘高速缓存失败。(注∶如果想查看当前路径下的文件夹和文件,可输入“DIR”后回车,想返回根目录可输入“CD\”后回车。) 四、格式化C盘
加载磁盘缓存后,接着输入“FORMAT C:”后按“Enter”键回车,准备格式化C盘。格式化C盘将删除C盘的所有数据。出现如图3的画面。(注∶在xp系统中制作为MS-DOS启动盘不支持FORMAT.EXE命令,会提示FORMAT不是有效的DOS命令)
这里是问你是否要执行格式化命令?如果确定要格式化C盘,请输入“Y”后按“Enter”键回车。否则输入“N”后按“Enter”键回车退出格式代C盘。 输入“Y”后按“Enter”键回车将格式化C盘。 这里等待你为刚格式化的C盘起名,一般不用起名,直接按回车即可。
五、安装Windows XP Professional
如果你的安装文件放在F盘的XPVLKSP1目录下,格式化C盘后在屏幕出现提示“F:\>_”时输入“CD XPVLKSP1\I386”即转到安装目录下的i386文件夹。 出现“F:\XPVLKSP1\I386>_”后,输入“WINNT”后回车,将准备开始安装Windows xp。
确认是否从这里复制文件,直接按“Enter”回车,开始复制文件,复制文件期间约停顿几分钟,再开始第二次复制文件(如果你没有运行smartdrv加载磁盘缓存,第一次复制文件后会停顿4-5个小时后再开始第二次复制文件,切记!切记!)
这里提示你取出启动软盘,取出启动软盘后按“Enter”键回车将会重新启动进行下一步安装。重新启动。
在这里我们按“Enter”键回车。 |
|
|