宸's profileYurina SpacePhotosBlogLists Tools Help

Blog


    September 25

    实习啊

    要去上海实习了,新的生活不知道如何面对,真的只能走一步是一步了,不过我有信心能够做好,这也是我步入社会的开始。。。
    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()相比,字符串越长,则后者更快,大家可以试试。

    太阳

     今天qq到太阳了,确实有点晚,不知为什么,总是不记得登qq,即使记起来了也不想登。是不是有点自闭啊
    September 14

    无题

     一直都没用过NetBeans,是不是要试着用一下。。。
    September 12

    Guice

    今天知道了Google的Guice框架,好像和Spring相似。。。 

    关于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;

    }

    September 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;
           }
       }
    }
    September 08

    兴趣

    现在有点喜欢用Java做Web开发 

    如何让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();
                         }

                   }

              }

    }
     
    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}