2009年3月19日星期四

Java中UUID的使用

UUID又称为通用唯一标识符(Universally Unique Identifier),是一个128位长的数字,一般用16进制表示,算法的核心思想是结合机器的网卡、当前时间和一个随机数来生成 UUID。UUID的应用非常广泛,比如Hibernate中ID Generator中的一种实现就是UUID。在系统中需要用到随机数的地方都可以考虑采用UUID算法。

在Java1.5中,已经包含了一个UUID的实现java.util.UUID。要随机生成一个UUID,代码为:String uuid = UUID.randomUUID().toString();

如果系统中采用了Hibernate框架,也可以用Hibernate的UUIDHexGenerator。代码为:
String uuid = (String)new UUIDHexGenerator().generate(null, null);

JDBC

一. 使用JDBC的五个步骤
1.注册driver
(1). Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection(url,"kettas","19851127");
(2). Driver driver=new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(driver);
(3). java -Djdbc.drivers=xxxxxxxxxx
2.连接db
String url=” oracle:jdbc:thin:@127.0.0.1:1525:XE”;
Connection conn=DriverManager.getConnection(url,"kettas","19851127");

3.执行sql语句
Statement stm=conn.createStatement();
stm.execute(“sql”);
4.返回结果集
ResultSet rs=stm.executeQuery("select id,sid,name from students");
while(rs.next()) {
System.out.print(rs.getInt(1)+"\t");
System.out.print(rs.getInt(2)+"\t");
System.out.println(rs.getString(3));
System.out.println("--------------------");
}
5.释放资源
xxx.close();

二.Statement对象的三个execute方法
1. execute() 返回boolean,是否有结果集
stm. getResultSet()
2. executeQuery() 返回ResultSet
3.executeUpdate() 返回 int,影响的行数

三. PreparedStatement
同构的sql语句使用,有预编译
有变量的sql语句中简化书写
sql语句在oracle的执行过程
1.语法检查 2. 权限检查 3.转化sql语句为内部指令 ----编译
4.执行
PreparedStatement pstm = conn.preparedStatement(“insert into students values(1,?,?)”);
pstm.setString(1,变量 )
pstm.setString(2, 变量)
pstm.executeUpdate();

四. Connection工厂
package com.kettas.raiha;

import java.util.*;
import java.io.*;
import java.sql.*;

public class JDBCUtil {
private static Properties env=new Properties();
static {
InputStream is=JDBCUtil.class.getResourceAsStream("connection.properties");
try {
env.load(is);
} catch (IOException e) {
System.out.println("ERROR! Can't find file : connection.properties.");
throw new ExceptionInInitializerError(e);
} finally {
if(is!=null)try { is.close();} catch (IOException e) {e.printStackTrace();}
}
}

public static Connection getConnection() throws ClassNotFoundException, SQLException{
Connection conn=null;
try{
Class.forName( env.getProperty("driver") );
} catch (ClassNotFoundException e) {
System.out.println("Mabey connection.properties file error");
throw e;
}
conn=DriverManager.getConnection(env.getProperty("url"),env.getProperty("username"), env.getProperty("password"));
return conn;
}
/*
public static void main(String[] args) {
try {
JDBCUtil.getConnection();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
*/
}

ThreadLocal
保证线程中的对象唯一的方法;
每个线程中包含一个Map,以ThreadLoacal为key,用set()存值;
get()方法获得本线程中Map的值
t1 = new ThreadLocal();
t1.set( i ) ;
t1.get();

事物
conn.setAutoCommint(false);
conn.commint();
conn,rollback();

Log4j

代码中:
1.得到Logger对象
Logger logger=Logger.getRootLogger();
Logger logger=Logger.getLogger(test.class);
2.读取配置
(1)使用默认配置:
BasicConfigurator.configure();
(2)读取配置文件
PropertyConfigurator.configure("mylog4j.properties");
3.插入记录信息
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;

配置文件参考:
rootLogger
#其中level就是设置需要输出信息的级别,后面是appender的输出的目的
#log4j.rootLogger=[level],appenderName, ...,
log4j.rootLogger=debug, stdout, R

LEVEL
level是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。
Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG

appender

#配置日志信息输出目的地Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#配置日志信息的格式(布局)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
#配置另一个Appender:R
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize= 100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n


Log4j提供的appender
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

Log4j提供的layout
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

log4j的PatternLayout参数含义
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:
%d{yyy MMM dd HH:mm:ss,SSS},输出类似: 2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

一个比较全的配置文件例子
log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE
log4j.addivity.org.apache=true

# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=GBK
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# 用于数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:oracle:thin:@192.168.0.103:1521:ORCL
log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user=Nation
log4j.appender.DATABASE.password=1
log4j.appender.CONSOLE.Threshold=WARN
log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread, infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')
# INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
# 写入数据库中的表LOG4J的Message字段中,内容%d(日期)%c: 日志信息所在地(类名)%p: 日志信息级别%m: 产生的日志具体信息 %n: 输出日志信息换行
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# 每天新建日志
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=C:/log4j/log
log4j.appender.A1.Encoding=GBK
log4j.appender.A1.Threshold=DEBUG
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n

#应用于文件
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=C:/log4j/file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.Encoding=GBK
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# 应用于文件回滚
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.CONSOLE_FILE.Encoding=GBK
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = yyflyons@163.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

# 发送日志给邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=yyflyons@163.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=yyflyons@126.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

Tomcat配置三点

1. 如何加大tomcat连接数

在tomcat配置文件server.xml中的<Connector ... />配置中,和连接数相关的参数有:
minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。

web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。Unix中如何设置这些参数,请参阅Unix常用监控和管理命令

tomcat4中的配置示例:
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080" minProcessors="10" maxProcessors="1024"
enableLookups="false" redirectPort="8443"
acceptCount="1024" debug="0" connectionTimeout="30000" />

对于其他端口的侦听配置,以此类推。

2. tomcat中如何禁止列目录下的文件
在{tomcat_home}/conf/web.xml中,把listings参数设置成false即可,如下:
<servlet>
...
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
...
</servlet>

3. 如何加大tomcat可以使用的内存

tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。

Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
需要把这个两个参数值调大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为256MB,可以使用的最大内存为512MB

大家都知道,JAVA程序启动时都会JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。
所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明,一般的JAVA程序在运行都可以通过中-Xms -Xmx来调整应用程序的初始内存和最大内存:
如:java -Xms64m -Xmx128m a.jar.
tomcat的启动程序是包装过的,不能直接使用java -X..... tomcat.*来改变内存的设置。在Tomcat在改变这个设置
有两种方法:
1. 就需要在环境变量中加上TOMCAT_OPTS, CATALINA_OPTS两个属性,
如 SET CATALINA_OPTS= -Xms64m -Xmx512m;
ms是最小的,mx是最大,64m, 512m分别是指内存的容量.

2. 修改Catalina.bat文件
在166行“rem Execute Java with the applicable properties ”以下每行%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home=" CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 中的%CATALINA_OPTS% 替换成-Xms64m -Xmx512m

2009年3月18日星期三

中文乱码问题

JSP设置
<%@ page language="java" contentType="text/html; charset=GB2312" pageEncoding="GB2312"%>
“contentType”中的”charset=GB2312”说明http头信息指定编码为gb2312,这样浏览器就会自动选择相应的编码; pageEncoding指的是jsp文件的编码,通常不涉及乱码问题

URLEncode
在url提交中文参数的时候,会进行urlencode,例如:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<form action="login.jsp">
姓名:<input type="text" name="username"/>
密码:<input type="text" name="password"/>
<input type="submit"></form>
<!--此jsp页面指定浏览器使用utf-8编码,我们输入”张三”,提交,浏览器的url为-->
<!-- http://xxxx/xxxx/login.action?username=%E5%BC%A0%E4%B8%89 -->
下面我们看看使用gb2312编码的情况:
<%@ page language="java" contentType="text/html;
charset=gb2312"pageEncoding="utf-8"%>
<!-- 只改变charset的属性,jsp文件编码依然使用utf-8 --!>
<!-- url:http://xxxx/xxxx/login.action?username=%D5%C5%C8%FD -->
URL的encode与当前浏览器的编码选择有关,因此需要指定web服务器的URIEncoding,与浏览器编码匹配

设置Tomcat的URIEncoding
<Connector connectionTimeout="20000" port="8081"
protocol="HTTP/1.1" redirectPort="8443" URIEncoding="GB2312"/>


Action里从Request得到参数
if( name!=null ){
name = new String( name.getBytes("ISO-8859-1"),"gbk");
}

等有空学学jQuery

jQuery中文入门指南:
http://www.k99k.com/jQuery_getting_started.html

官网:http://jquery.com

参考:http://api.jquery.com/
http://visualjquery.com/

另:web前端的潮流:
http://www.smashingmagazine.com/