宸 的个人资料Yurina Space照片日志列表 工具 帮助

日志


1月26日

解决家中电脑问题

今天解决家中电脑的一个小问题,任务栏托盘的图标总是莫名奇妙的丢失,找网上的资料:
(转)
可能和SSDP DISCOVERY SERVICE服务有关,关闭这个可以把消失的图标找回来。
我突然想到自己为了BT下载是开启了UPNP和SSDP这2个网络服务,应该就是这里的问题了。
可是网上说的解决办法是禁用SSDP这个服务. 这样固然可以解决问题,但始终觉得会影响到BT下载的速度。
我研究了一下,原来真的问题不是这2个服务上面,而是"添加删除程序"里面"添加删除WINDOWS程序"--"网络服务"里面有作更改的关系。
因为开启UPNP需要在里面钩选"UPNP用户界面".  你一旦在这里作了改变就会导致某些任务栏图标消失。

解决办法: 1. 将这个"UPNP用户界面"钩取消.  
                  2. 到XP防火墙设置里面将"UPNP"框架"例外
                  3. 服务里面SSDP和UPNP都可以照常开启

这样就即保留了UPNP和SSDP这2个网络服不影响BT下载,也不会造成任务栏图标消失。
 
而我自己在做的时候发现按照上面的方法要插入xp安装盘,我家的找不到了。。。狠心一下,把服务关了,现在貌似还行。

1月10日

Htm和Html文件图标丢失

不知道安装了什么软件,htm和html文件图标丢失了,看得极度不爽,不过还是让我找到了解决方法,网上有人写的,我佩服作者。
以下就是转自作者的:
病因:装了某个改变Htm/Html文件设置的程序
处理:修改注册表,将Htm/Html文件默认的图标关联改回默认。
具体操作:主要在注册表里确认两处默认值。一处是HKEY_CLASSES_ROOT\htmlfile\ShellEx\IconHandler,确认其右侧默认值为{42042206-2D85-11D3-8CFF-005004838597}(XP下面为此值,不保证其他系统下相同),如果不是请改回此值(包括花括号);另一处是HKEY_CLASSES_ROOT\CLSID\{42042206-2D85-11D3-8CFF-005004838597}\Old Icon\htmlfile\DefaultIcon,确认其右侧默认值是C:\Program Files\internet explorer\IEXPLORE.EXE,1(我的系统就是这个地方不对),否则请改回此值。保存,刷新,这个时候应该就OK了。

补充:做完上述几步,如果只有Html图标恢复正常,而Htm图标还是没改回来,请确认HKEY_CLASSES_ROOT\.htm右侧默认值是htmlfile,否则请改回,再保存、刷新,一切就OK了。
 
PS:我自己补充一句,这两种文件改起来很麻烦,其他文件的图标丢失因为不修改注册表,不会太麻烦,只要在“文件夹选项”里的“文件类型”选项卡里改改就行了。

教授的言论

美国纽约大学的两位计算机科学系退休教授发表一篇公开文章,标题是“计算机科学教育:明日的软件工程师在何处?”。

  在文中,他们强烈的批评了纽约大学和其他大学,没有向学生传授纯粹的语言如C、C++、Lisp和ADA。 “学生从当前教育实践课程中获取的技能不足以应付今日软件行业的发展(尤其是安全和安全目的方面)。更不幸的是,与外部行业需要过于匹配了,我们训练了许多容易被取代的软件工程师....由于web应用程序的流行,java成为入门课程中使用最普遍的语言。但是存在的缺陷使java语言课程不是作为学生的第一课准备的,更不用提其它的更高级的语言。学生发现很难在一个没有图像界面的语言上编写程序,不清楚源程序和硬件如何执行之间的关系,更具有危险性的是一点也不了解指示器的语义,这使得使用C语言编程也成为挑战。”

  教授们认为真正的程序员能够使用任何语言(C,java,Lisp,Ada)。

     个人认为,计算机学科的学生应该对于计算机基础有一个深刻的理解,以我的经验,掌握一些内部机制的知识可以帮助我们在日常工作中快速理解和运用技能(当然,不需要非常深入,有一个提纲挈领的理解就可以了,在遇到问题时能稍微知其所以然就可以了)。对于教授们说的程序员能够使用任何语言,我认为这在于一个学习能力的问题,我们培养的不是某一方面特别突出的所谓精英,而是能够快速掌握新知识和新技术,能够及时融入他人的思维方式中的工程师。这也是我们在本科和研究生必须学会的能力。

12月3日

正是我想要的

看了一遍《Javascript高级程序设计》,正准备开始Javascript的正式学习,正好发现了这个,非常好。微笑
 
  1. MochiKit
  2. Dojo
  3. YUI (Yahoo User Interface)
  4. scriptaculous
  5. jQuery

还有一个Ext框架的,貌似很值得一学的样子。。。

9月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是有一定的帮助的.好了,先讲这些吧,有关 类的加载机制以后再继续分享:)
9月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()相比,字符串越长,则后者更快,大家可以试试。
9月12日

关于Spring开发的链接

 
其中有一个地方比较重要:
log4j配置
首先,在 web.xml 文件中加入如下配置:

<!-- 设置环境变量指定 log4j 的配置文件 -->

<context-param>

    <param-name>log4jConfigLocation</param-name>

    <param-value>/WEB-INF/log4j.properties</param-value>

</context-param>

 

<!-- 设置 log4j 的监听,使日志组件能够使用,调用 log4jConfigLocation 中设置的环境变量 -->

<listener>

    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>

</listener>

 log4j.properties 文件放在 /WEB-INF/ 目录下, 文件内容如下例,其中根日志级别为 warn ,而在包 cn.idtag 中的类的日志级别为 info

# 定义根日志的级别和输出路径 fatal, error, warn, info, debug

log4j.rootCategory=warn, stdout, logfile

 

# 在包 cn.idtag 中的类的日志级别

log4j.logger.cn.idtag=info

 

# 日志输出参数

#%c: 日志信息所在类名

#%d: 日志信息产生时间

#%p: 日志信息级别

#%m: 产生的日志具体信息

#%n: 输出日志信息换行

log4j.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c%n%m%n%n

 

# 控制台输出

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=${log4j.ConversionPattern}

 

# 日志文件输出

log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/log.txt

log4j.appender.logfile.Append = true

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=${log4j.ConversionPattern}

转: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,所以用中文也易出问题,常见的解决是
String s2 = new String(s1.getBytes("ISO-8859-1"),"GBK");
前三种方法是我比较常用的方法,别人的经验告诉我:通常get方法通过改server.xml解决,
post方法通过过滤器或者设置字符集解决,呵呵,不知道是否可行!

1、utf8解决JSP中文乱码问题

一般说来在每个页面的开始处,加入:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<%
request.setCharacterEncoding("UTF-8");
%>

charset=UTF-8 的作用是指定JSP向客户端输出的编码方式为"UTF-8"

pageEncoding="UTF-8" 为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效

request.setCharacterEncoding("UTF-8"); 是对请求进行了中文编码

有时,这样仍不能解决问题,还需要这样处理一下:

String msg = request.getParameter("message");
String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");
out.println(st);

2、Tomcat 5.5 中文乱码(利用tomcat已经写好的字符集过滤器)

1)只要把%TOMCAT安装目录%/ webapps\servlets-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.class 文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个。

2)在你的web.xml里加入如下几行:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


3、 get方式的解决办法(修改tomcat server.xml,但是不建议使用的说)

1) 打开tomcat的server.xml文件,找到区块,加入如下一行:
URIEncoding="GBK"
完整的应如下:

<Connector
port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true"
URIEncoding="GBK"
/>

4、xmlHttpRequest中文问题

页面jsp用的GBK编码

<%@ page contentType="text/html; charset=GBK"%>

javascript部分
function addFracasReport() {
var url="controler?actionId=0_06_03_01&actionFlag=0010";
var urlmsg="&reportId="+fracasReport1.textReportId.value; //故障报告表编号
var xmlHttp=Common.createXMLHttpRequest();
xmlHttp.onreadystatechange = Common.getReadyStateHandler(xmlHttp, eval("turnAnalyPage"));
xmlHttp.open("POST",url,true);
xmlHttp.setRequestHeader( " Content-Type " , " application/x-www-form-urlencoded);
xmlHttp.send(urlmsg);
}

后台java中获得的reportId是乱码,不知道该怎么转,主要是不知道xmlHttp.send(urlmsg); 以后是什么编码?在后面用java来转,试了几种,都没有成功,其中有:

public static String UTF_8ToGBK(String str) {
try {
return new String(str.getBytes("UTF-8"), "GBK");
} catch (Exception ex) {
return null;
}
}

public static String UTF8ToGBK(String str) {
try {
return new String(str.getBytes("UTF-16BE"), "GBK");
} catch (Exception ex) {
return null;
}
}

public static String GBK(String str) {
try {
return new String(str.getBytes("GBK"),"GBK");
} catch (Exception ex) {
return null;
}
}
public static String getStr(String str) {
try {
String temp_p = str;
String temp = new String(temp_p.getBytes("ISO8859_1"), "GBK");
temp = sqlStrchop(temp);
return temp;
} catch (Exception e) {
return null;
}
}



5、Solaris下Servlet编程的中文问题及解决办法

在使用Java开发Internet上的一个应用系统时,发现在Windows下调试完全正常的Servlet,上传到Solaris 服务器上,运行却出现故障--返回的网页不能显示中文,应为中文的信息全为乱码;用中文信息做关键字,不能正确检索数据库。后来采用加入检查代码等方法探知故障原因如下:

显示乱码主要是因为通过类 HttpServletResponse提供的方法setContentType 无法改变返回给客户的数据的编码方式,正确的编码方式应为GB2312或者GBK,而事实上为缺省的ISO8859-1。无法检索中文信息则是因为,客户提交的中文信息经浏览器编码到达服务器后,Servlet无法将其正确解码。

举例说明显示乱码解决方法

Servlet 一般通常做法如下:

public class ZldTestServlet extends HttpServlet {

public void doGet (HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{

//在使用 Writer向浏览器返回数据前,设置 content-type header ,在这里设置相应的字符集gb2312

response.setContentType("text/html; charset=gb2312");

PrintWriter out = response.getWriter(); //*

// 正式返回数据

out.println("〈html〉〈head〉〈title〉Servlet test〈/title〉〈/head〉" );

out.println("这是一个测试页!");

out.println("〈/body〉〈/html〉");

out.close();

}

...

}

解决页面显示乱码问题,需将*处代码换成如下内容:

PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(),"gb2312"));

Solaris中文信息检索问题的解决
浏览器利用表单向服务器提交信息时,一般采用x-www-form-urlencoded 的MIME格式对数据进行编码。如果使用get方法,参数名称和参数值经编码后附加在URL后,在Java中称作查询串(query string)。

在Servlet程序中,如果采用ServletRequest的方法getParameter取得参数值,在Solaris环境下,对汉字却不能正确解码。因而无法正确检索数据库。

在Java 1.2的包--java.net中提供了URLEncode和URLDecode类。类URLEncode提供了按x-www-form-urlencoded格式对给定串进行转换的方法。类URLEncode则提供了逆方法。

6、Common Mail乱码问题

common mail是一个小而方便的mail包,他实现了对Java Mail的封装,使用起来十分的方便,但是我在使用他的时候发现,使用纯文本的内容发送,结果是乱码,代码如下:

public class TestCommonMail {
public static void main(String[] args) throws EmailException, MessagingException {
SimpleEmail email = new SimpleEmail();
email.setCharset("GB2312");
email.setHostName("smtp.163.com");
email.setSubject("test");
email.addTo("test@163.com");
email.setFrom("test@163.com");
email.setMsg("我的测试");
email.setAuthentication("test", "test");
email.send();
}
}

分析了一下commons mail的源码找到了原因。源码如下:

public class SimpleEmail extends Email
{
public Email setMsg(String msg) throws EmailException, MessagingException
{
if (EmailUtils.isEmpty(msg))
{
throw new EmailException("Invalid message supplied");
}

setContent(msg, TEXT_PLAIN);
return this;
}
}

Email代码片段

public void setContent(Object aObject, String aContentType)
{
this.content = aObject;
if (EmailUtils.isEmpty(aContentType))
{
this.contentType = null;
}
else
{
// set the content type
this.contentType = aContentType;

// set the charset if the input was properly formed
String strMarker = "; charset=";
int charsetPos = aContentType.toLowerCase().indexOf(strMarker);
if (charsetPos != -1)
{
// find the next space (after the marker)
charsetPos += strMarker.length();
int intCharsetEnd =
aContentType.toLowerCase().indexOf(" ", charsetPos);

if (intCharsetEnd != -1)
{
this.charset =
aContentType.substring(charsetPos, intCharsetEnd);
}
else
{
this.charset = aContentType.substring(charsetPos);
}
}
}
}

email.send(); 的send方法将调用
public void buildMimeMessage() throws EmailException
{
try
{
this.getMailSession();
this.message = new MimeMessage(this.session);

if (EmailUtils.isNotEmpty(this.subject))
{
if (EmailUtils.isNotEmpty(this.charset))
{
this.message.setSubject(this.subject, this.charset);
}
else
{
this.message.setSubject(this.subject);
}
}

// ========================================================
// Start of replacement code
if (this.content != null)
{
this.message.setContent(this.content, this.contentType);
}
// end of replacement code
// ========================================================
else if (this.emailBody != null)
{
this.message.setContent(this.emailBody);
}
else
{
this.message.setContent("", Email.TEXT_PLAIN);
}

if (this.fromAddress != null)
{
this.message.setFrom(this.fromAddress);
}
else
{
throw new EmailException("Sender address required");
}

if (this.toList.size() + this.ccList.size() + this.bccList.size() == 0)
{
throw new EmailException(
"At least one receiver address required");
}

if (this.toList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.TO,
this.toInternetAddressArray(this.toList));
}

if (this.ccList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.CC,
this.toInternetAddressArray(this.ccList));
}

if (this.bccList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.BCC,
this.toInternetAddressArray(this.bccList));
}

if (this.replyList.size() > 0)
{
this.message.setReplyTo(
this.toInternetAddressArray(this.replyList));
}

if (this.headers.size() > 0)
{
Iterator iterHeaderKeys = this.headers.keySet().iterator();
while (iterHeaderKeys.hasNext())
{
String name = (String) iterHeaderKeys.next();
String value = (String) headers.get(name);
this.message.addHeader(name, value);
}
}

if (this.message.getSentDate() == null)
{
this.message.setSentDate(getSentDate());
}

if (this.popBeforeSmtp)
{
Store store = session.getStore("pop3");
store.connect(this.popHost, this.popUsername, this.popPassword);
}
}
catch (MessagingException me)
{
throw new EmailException(me);
}
}
由代码可以知道纯文本方式最终调用了Java Mail的
message.setContent(this.content, this.contentType);
content是内容
contentType是类型,如text/plain,
(我们可以试试直接用Java mail发邮件,设置文本内容不使用setText方法,也使用setContent("测试", "text/plain")方式,你可以看到内容也是乱码)

关键就在于text/plain,我们改成text/plain; charset=gb2312,ok乱码解决了。在commons mail我们看SimpleEmail 类中setMsg方法调用的就是 setContent(msg, TEXT_PLAIN); 我们只需要将Email类中的常量TEXT_PLAIN修改一下加入 charset=你的字符集 ,重新打包jar,这样就可以了

7、toad的字符集的设置与oracle的安装

oracle数据库服务器的安装一般是中文字符集,有时安装在不同的平台下,设置为ISO编码,toad是oracle开发的最好工具,不是我说的,可是中文环境下安装的toad,打开英文字符的oracle时,中文全是乱码。必须进行设置

环境变量---〉系统变量

NLS_lANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

NLS_lANG=AMERICAN_AMERICA.WE8ISO8859P1

AMERICAN_AMERICA.WE8MSWIN1252

或者

打开注册表,点击HKEY_LOCAL_MATHINE
再点击Software,再点击ORACLE
在点击HOME(ORACLE所在目录)
在注册表的右半面有NLS_LANG,
双击它,将你想要的覆盖掉原来的就可以了
最好记下旧的,以便可以改回来。

connect sys/chang_on_install
update props$
set value$='ZHS16CGB231280'
where name='NLS_CHARACTERSET';
commit;
这样就OK了

8、如何解決GWT(google web toolkit)中文的問題

GWT 中文乱码解决方法

1.把你要显示的中文"测试字符串"输入到一个文件,如:1.txt
2.进入命令行,进入1.txt所在的目录,敲入以下命令:native2ascii.exe 1.txt 2.txt 回车。这样就生成了另外一个文件2.txt。
3.2.txt的内容如下:\u6d4b\u8bd5\u5b57\u7b26\u4e32
4.然后用上面的编码,在gwt中使用,就可以了.

9、xmlHttp得到的网页怎么是乱码?

(1)在服务器端使用WebRequest而不是xmlHttp
(2) 将

StreamReader sr = new StreamReader(stream);

对于简体中文改成:

StreamReader sr = new StreamReader(stream , Encoding.Default );

对于utf-8改成:

StreamReader sr = new StreamReader(stream , Encoding.UTF8 );

当然,Encoding枚举还有很多其他的成员,对于不同的编码content-type可以有选择的应用

(3)后来我发现无论是content-type是gb2312还是utf-8,用

StreamReader sr = new StreamReader(stream , Encoding.Default );

都可以返回正常的汉字,所以统一的改成Encoding.Default




--------------------------------------------------------------------------------

最后,在服务器端从一个url获得网页的源代码的代码如下:



/// <summary>
/// post一个指定的url,获得网页的源代码(用WebRequest实现)
/// </summary>
/// <param name="url"></param>
/// <returns>
/// 如果请求失败,返回null
/// 如果请求成功,返回网页的源代码
/// </returns>
public static string GetContentFromUrl2( string url )
{
//变量定义
string respstr;

WebRequest myWebRequest=WebRequest.Create(url);
// myWebRequest.PreAuthenticate=true;
// NetworkCredential networkCredential=new NetworkCredential( username , password , domain );
// myWebRequest.Credentials=networkCredential;

// Assign the response object of 'WebRequest' to a 'WebResponse' variable.
WebResponse myWebResponse=myWebRequest.GetResponse();
System.IO.Stream stream = myWebResponse.GetResponseStream();
StreamReader sr = new StreamReader(stream , Encoding.Default );
//以字符串形式读取数据流
respstr = sr.ReadToEnd();
sr.Close();

return respstr;

}

9月10日

带提示的JTextField

import 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;
       }
   }
}
9月8日

如何让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, 00, getWidth(), getHeight(), 00, 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();
                     }

               }

          }

}
 
9月6日

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}

 
3月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”键回车。