Archive for the ‘Java’ Category

Java Thread.interrupt

Java Thread.interrupt 害人! 中断JAVA线程(zz)

关于Java thread的Interrupt, isInterrupt, interrupted

package security;

在QMaster分类里记录的相关源码是个人认为写得比较好、比较有用(可复用程度比较高)的一部分,并非QMaster的全部源码。欢迎评论。

MD5.java

/**
 * 功能:MD5加密
 */
package security;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;

public class MD5 {
    public static String md5Encoder(String pwd) throws NoSuchAlgorithmException {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        BASE64Encoder base64en = new BASE64Encoder();
        return base64en.encode(md5.digest(pwd.getBytes()));
    }
}

package db;

在QMaster分类里记录的相关源码是个人认为写得比较好、比较有用(可复用程度比较高)的一部分,并非QMaster的全部源码。欢迎评论。

dbconfig.xml

<?xml version="1.0" encoding="GB2312"?>
<!--数据库配置文件-->
<dbconfig>
    <jdbcdriver>com.mysql.jdbc.Driver</jdbcdriver><!--JDBC Driver-->
    <jdbcurl>jdbc:mysql://localhost:3306/questionnaire</jdbcurl><!--JDBC URL-->
    <dbuser>root</dbuser><!--数据库用户名-->
    <dbpwd>yarpee19890607</dbpwd><!--数据库密码-->
</dbconfig>

DBConfig.java

/**
 * 功能:解析dbconfig.xml文件,提供数据库配置。
 */
package db;

import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

Read more

浅谈字符集

强烈推荐一篇文章:理解字符编码

在写程序的过程中,字符集的问题遇到过N多。查查改改,解决问题,一直没有总结。这段时间做J2EE的项目,遇到了更多的字符集问题,在解决的过程中收获不少。写篇文章浅谈下字符集问题。

个人将字符集粗分为两大类:ASCII和UNICODE。简单介绍下它们:

众所周知,计算机是美国人发明的。因此,为了方便使用计算机,那么计算机起码要能表达他们(美国人)的语言。这也就是ASCII(美国信息交换标准代码)的由来了。计算机的最小信息单位是位(bit),但更常用的基本信息单位是字节(Byte),它们之间的转换是1Byte = 8bits(为什么是8而不是2、4、16等,我就不得而知了)。ASCII又分基础的(7位,最高位用作奇偶校验)和扩展的(8位),最多能表示256个字符。这对于表示全世界的语言字符是不可能的,因此有了UNICODE。

UNICODE简单的来说就是,用两个字节(16位)来表示一个字符。但是基于不同的考虑(如存储空间)又有UTF-8、UTF-16、UTF-32等不同的格式,这里就不详细介绍了。

正是ASCII和UNICODE给我们带来了字符集问题。一个比较好的程序,应该要能支持UNICODE。对于我们(中国人),更是如此,因为我们使用的是汉字而不是英文。接下来,我要以一个不完全的Java Web Server例子来说说个人的理解。

OS(Windows、Unix、Linux等)、Java、MySQL在全世界流行,因此很容易预见到它们都是支持ASCII和UNICODE的。先说说OS,个人用的是Windows XP(中文版)(Windows对于本地化的支持有个“代码页”的概念,在此不详细介绍),很容易知道OS的字符集是UNICODE的GBK。对于运行在该OS上的Java平台,也是如此。而MySQL对字符集的支持主要表现在它的存储。

在例子中,MySQL采用latin1(称之为ASCII或者ISO-8859-1都行),而JSP采用GB2312。

问题一:JSP page指令中的pageEncoding属性指定的字符集是指该JSP页面被打开时,OS用哪种字符集格式读取。这就相当于你在记事本里写篇文字(即有英文又有中文),保存的格式。如果为ASCII,则中文会丢失原有的信息,为UNICODE则能正常显示。因此,其实只要你在该JSP里面的注释仅有英文,是可以设置该属性为ISO-8859-1的。

问题二:JSP page指令中的contentType="text/html;charset=gb2312"和HTML中的<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />意思一样,都是指该页面由浏览器解析时采用的字符集。

问题三:Java中所有字符都是两个字节,无论是ASCII还是UNICODE,但是建议你不要简单地认为它就是UNICODE。而网络上传输的字符是ISO-8859-1(1Byte)的(因为网络传输是基于字节流的)。所以前一个JSP页面的中文参数采用POST方法传到后一个页面接收后,它是乱码。详细:一个汉字两个字节都有数据**(GB2312),网络传输成* *(ISO-8859-1),后一个页面接收后成#* #*(GB2312)两个汉字四个字节。(*表示数据,#表示未知,空格表示字符间隔)当然乱码了。重新组合下new String(data.getBytes("ISO-8859-1"))就好了(默认采用页面charset编码组合即GB2312)。采用GET方法则要在前一个页面先将中文编码后再在URL中传递参数:String msg = java.net.URLEncoder.encode("中文", "UTF-8");在后一个页面取得msg后,对应的使用new String(msg.getBytes("ISO-8859-1"), "UTF-8")或者java.net.UREDecoder.decode(msg, "UTF-8");。

Read more

JavaMail

J2EE项目里有用到JavaMail,研究了下。下面是参考资料和我的JavaMail:

JavaMail

J2EE JavaMail

如何使用JSP发送邮件

java利用JavaMail实现邮件功能

package mail;

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Mail {
     private Properties props;//系统属性,可以get和put属性名值对。
     private Session session;//根据系统属性设置会话
     private Message msg;//MimeMessage为其子类
     //管理员SMTP服务器信息
     private String host;
     private String username;
     private String password;
     private String from;

     public Mail(String host, String username, String password, String from) {
        props = System.getProperties();
        //props.put("mail.smtp.host", "smtp.jspinsider.com");
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        session = Session.getDefaultInstance(props);
        msg = new MimeMessage(session);
        this.host = host;
        this.username = username;
        this.password = password;
        this.from = from;
     }

     public void send(String to) throws MessagingException {
        msg.setFrom(new InternetAddress(from));
        msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
        msg.setSubject("测试");
        msg.setText("测试");
        Transport transport = session.getTransport("smtp");
        transport.connect((String)props.get("mail.smtp.host"), username, password);
        transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
        transport.close();
        //Transport.send(msg);
     }
}

无觅相关文章插件,快速提升流量