java技术

智慧是第一生产力
 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(8)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • flex学习(2) (rss)
  • hibernate学习 (rss)
  • ibatis学习 (rss)
  • java 基础(14) (rss)
  • java水晶报表(1) (rss)
  • java设计模式 (rss)
  • Maven (rss)
  • Seam (rss)
  • spring学习 (rss)
  • struts2学习 (rss)
  • workflow工作流 (rss)
  • 客户端技术 (rss)
  • 工具使用(1) (rss)
  • 开发工具(6) (rss)
  • 数据库(2) (rss)
  • 生活片段(6) (rss)
  • 软件工程(1) (rss)

随笔档案

  • 2010年1月 (1)
  • 2009年12月 (2)
  • 2009年10月 (1)
  • 2009年9月 (6)
  • 2009年8月 (1)
  • 2009年6月 (3)
  • 2009年5月 (1)
  • 2009年2月 (1)
  • 2008年10月 (1)
  • 2008年1月 (2)
  • 2007年9月 (2)
  • 2007年7月 (2)
  • 2006年11月 (1)
  • 2006年10月 (3)
  • 2006年9月 (13)

相册

  • she

搜索

  •  

最新评论

  • 1. re: java 实现ftp上传下载(转)
  • 好 支持文件夹好
  • --ayns
  • 2. re: java 实现ftp上传下载(转)
  • 很好很强大!
  • --ayu.j
  • 3. re: java 实现ftp上传下载(转)
  • 不错 解决了所有的问题,支持多种格式的文件,还支持文件夹上传,借用了,谢谢!
  • --yjq
  • 4. re: ftp实现上传下载,解决了编码问题。
  • 请问,LZ用的什么FTP 服务器?
  • --kdmhh
  • 5. re: java 实现ftp上传下载(转)
  • 很好
  • --taojun

阅读排行榜

  • 1. java 实现ftp上传下载(转)(12072)
  • 2. ftp实现上传下载,解决了编码问题。(11959)
  • 3. Eclipse中配置tomcat(7481)
  • 4. javax.naming.NameNotFoundException: Name jdbc is not bound in this Context(7212)
  • 5. swing调用水晶报表(5372)

评论排行榜

  • 1. Ajax使用POST提交中文乱码问题(转)(10)
  • 2. 手机开通GPRS(7)
  • 3. java 实现ftp上传下载(转)(5)
  • 4. swing调用水晶报表(4)
  • 5. java中的io系统总结.(3)

Powered by: 博客园
模板提供:沪江博客
BlogJava | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

Eclipse中不能按application执行java类的问题

在eclipse中,新建了一个带main函数的class文件,结果不能按java application执行,
提示错误 :editor does not contain a main type 。
网上也没找到原因,又重新新建了几个class也不行,
后来我重新建了个项目,
然后在新建class就可以。。
我仔细看了下,
在出问题的项目中建立class时,上面有提示不是java project,奇怪,我建立项目的时候是java project的,
可能就是这个原因,
希望出这个问题的朋友能在这里搜索到。。

posted @ 2007-09-30 13:10 空空 阅读(835) | 评论 (0) | 编辑 收藏
 
Oracle中的数据锁定机制全面解析
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。

  为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。

  数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做。

  先从悲观锁开始说。在SqlServer等其余很多数据库中,数据的锁定通常采用页级锁的方式,也就是说对一张表内的数据是一种串行化的更新插入机制,在任何时间同一张表只会插1条数据,别的想插入的数据要等到这一条数据插完以后才能依次插入。带来的后果就是性能的降低,在多用户并发访问的时候,当对一张表进行频繁操作时,会发现响应效率很低,数据库经常处于一种假死状态。而Oracle用的是行级锁,只是对想锁定的数据才进行锁定,其余的数据不相干,所以在对Oracle表中并发插数据的时候,基本上不会有任何影响。

  Oracle的悲观锁需要利用一条现有的连接,分成两种方式,从SQL语句的区别来看,就是一种是for update,一种是for update nowait的形式。比如我们看一个例子。首先建立测试用的数据库表。

CREATE TABLE TEST
(ID,
NAME,
LOCATION,
VALUE,
CONSTRAINT test_pk PRIMARY KEY(ID))
AS SELECT deptno, dname, loc, 1 FROM scott.dept

  这里我们利用了Oracle的Sample的scott用户的表,把数据copy到我们的test表中。首先我们看一下for update锁定方式。首先我们执行如下的select for update语句。

select * from test where id = 10 for update

  通过这条检索语句锁定以后,再开另外一个sql*plus窗口进行操作,再把上面这条sql语句执行一便,你会发现sqlplus好像死在那里了,好像检索不到数据的样子,但是也不返回任何结果,就属于卡在那里的感觉。这个时候是什么原因呢,就是一开始的第一个Session中的select for update语句把数据锁定住了。由于这里锁定的机制是wait的状态(只要不表示nowait那就是wait),所以第二个Session(也就是卡住的那个sql*plus)中当前这个检索就处于等待状态。当第一个session最后commit或者rollback之后,第二个session中的检索结果就是自动跳出来,并且也把数据锁定住。不过如果你第二个session中你的检索语句如下所示。

select * from test where id = 10

  也就是没有for update这种锁定数据的语句的话,就不会造成阻塞了。另外一种情况,就是当数据库数据被锁定的时候,也就是执行刚才for update那条sql以后,我们在另外一个session中执行for update nowait后又是什么样呢。比如如下的sql语句。 由于这条语句中是制定采用nowait方式来进行检索,所以当发现数据被别的session锁定中的时候,就会迅速返回ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源。所以在程序中我们可以采用nowait方式迅速判断当前数据是否被锁定中,如果锁定中的话,就要采取相应的业务措施进行处理。

select * from test where id = 10 for update nowait

  那这里另外一个问题,就是当我们锁定住数据的时候,我们对数据进行更新和删除的话会是什么样呢。比如同样,我们让第一个Session锁定住id=10的那条数据,我们在第二个session中执行如下语句

update test set value=2 where id = 10

  这个时候我们发现update语句就好像select for update语句一样也停住卡在这里,当你第一个session放开锁定以后update才能正常运行。当你update运行后,数据又被你update语句锁定住了,这个时候只要你update后还没有commit,别的session照样不能对数据进行锁定更新等等。

posted @ 2007-07-10 11:12 空空 阅读(547) | 评论 (0) | 编辑 收藏
 
Servlet版本的HelloWorld(附环境配置)

原文地址:http://www.yesky.com/SoftChannel/72342371945283584/20031203/1750000_1.shtml

  下面我们讨论Servlet的运行环境:

  要运行Servlet,则需要JSP/Servlet container,我建议初学者用Tomcat。

Tomcat(最新版本5.0):http://cvs.apache.org/builds/jakarta-tomcat-5/nightly/jakarta-tomcat-5-bin-20030725.zip

  然后把这个压缩包解压到:

  C:\Tomcat

  然后再配置环境变量;添加三个系统变量:

JAVA_HOME: C:\JDK
TOMCAT_HOME: C:\Tomcat
CLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\lib

  Tomcat的环境变量就配置完毕了,下面检验Tomcat是否能够运行:

  在控制台中转到C:\Tomcat\bin这个目录,运行startup,然后回出现一个窗口,连跳一大串东西,最后表示Server已经运行。

  在浏览器中输入http://localhost:8080,出现欢迎界面,则表示Tomcat没问题了。然后和上面一样,写入你的第一个Servlet。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{

response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println("This is my first Servlet");
out.println("</title></head><body>");
out.println("<h1>Hello,World!</h1>");
out.println("</body></html>");

}
}

  然后照样用javac HelloWorld.java来编译这个文件,如果出现无法import javax.servlet.*

  那么就是应该把C:\Tomcat\common\lib里面的servlet.jar文件拷贝到C:\JDK\jre\lib\ext中,再次编译,就没有问题了!

  然后在Tomcat目录里面的C:\Tomcat\webapps\ROOT里面按如下的文件结构:

ROOT\index.html
ROOT\welcom.jsp
ROOT\WEB-INF\lib\MyServlet.jar(如果你的servlet的.class打成了.jar文件,则放在lib下面)
ROOT\WEB-INF\classes\HelloWorld.class(把上面生成的HelloWorld.class文件放在这个里面)

  然后在浏览器中输入http://localhost:8080/servlet/HelloWorld,于是Server众望所归的报错了:Error 404--Not Found

  怎么回事呢?

  Servlet必须使用C:\Tomcat\webapps\ROOT\WEB-INF这个目录下面的web.xml文件进行注册,用EP打开这个web.xml文件,在里面加入:

<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/servlet/helloworld</url-pattern>
</servlet-mapping>

  这样的结构

<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>

  表示指定包含的servlet类。而以下的结构:

<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/servlet/HelloWorld</url-pattern>
</servlet-mapping>

   表示指定HelloServlet应当映射到哪一种URL模式。

  在修改web.xml完毕过后,重新启动Server,然后再输入http://localhost:8080/servlet/HelloWorld,那么偌大一个Hello,World!等着你呢。
 

posted @ 2007-07-10 10:44 空空 阅读(741) | 评论 (0) | 编辑 收藏
 
控制texterea长度,并显示剩余字数;附:Javascript中的trim和replace函数

控制texterea长度,并显示剩余字数,只能在IE上运行

<script>
function checklen(obj){
  var lenE = obj.value.length;
  var lenC = 0;
  var CJK = obj.value.match(/[u4E00-u9FA5uF900-uFA2D]/g);
  if (CJK != null) lenC += CJK.length;
    tno.innerText = obj.maxlength - lenC - lenE ;
    if (tno.innerText < 0) {
      var tmp = 0
      var cut = obj.value.substring(0, obj.maxlength);
      for (var i=0; i<cut.length; i++){
      tmp += /[u4E00-u9FA5uF900-uFA2D]/.test(cut.charAt(i)) ? 2 : 1;
      if (tmp > obj.maxlength) break;
    }
    obj.value = cut.substring(0, i);
  }
}
</script>
<body onload="tno.innerText = s1.maxlength;">
<textarea name="s1" rows="5" cols="50" maxlength="100" onpropertychange="checklen(this)"></textarea>
剩余<span id="tno"></span>个字符

附:Javascript中的trim和replace函数===============
//triml();
triml = function () {
  for (var i = 0; i < this.length; i++) {
    if (this.charcodeat (i) > 32) {
      return this.substr (i, this.length);
    }
  }
  return this;
}
 
//trimr();
trimr = function () {
  for (var i = this.length; i > 0; i--) {
    if (this.charcodeat (i) > 32) {
    return this.substring (0, i + 1);
    }
  }
  return this;
}
 
//trimwhite();
trimwhite = function() {
  this = this.triml ();
  return this.trimr ();
}
 
//replace();
function replace():string {
  var str:string = string(arguments[0]);
  var re_str:string = string(arguments[1]);
  var new_str:string = string(arguments[2]);
  if (arguments.length<3||re_str=="") {
    return str;
  }
  while (str.indexof(re_str) != -1 && str != "") {
    str_b = str.indexof(re_str);
    str_e = str_b+re_str.length-1;
    if (str_b != 0 && str_e != str.length-1) {
      str = str.substr(0, str_b)+new_str+str.substr(str_e+1, str.length-1);
    } else if (str_b == 0) {
      str = new_str+str.substr(str_e+1, str.length-1);
    } else {
      str = str.substr(0, str_b)+new_str;
    }
  }
  return str;
}
posted @ 2006-11-22 13:54 空空 阅读(1269) | 评论 (0) | 编辑 收藏
 
Tomcat简介
系统结构

一、Tomcat背景
  自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。
Tomcat是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品,同时它又是sun公司官方推荐的servlet和jsp容器,因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。其次,Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载。Tomcat与Apache的组合相当完美。

二、Tomcat目录

tomcat
|---bin Tomcat:
存放启动和关闭tomcat脚本;

|---conf Tomcat:存放不同的配置文件(server.xml和web.xml);
|---doc:存放Tomcat文档;
|---lib
/japser/common:存放Tomcat运行需要的库文件(JARS);
|---logs:存放Tomcat执行时的LOG文件;
|---src:存放Tomcat的源代码;
|---webapps:Tomcat的主要Web发布目录(包括
应用程序示例);
|---work:
存放jsp编译后产生的class文件;

三、Tomcat类加载

Bootstrap($JAVA_HOME/jre/lib/ext/*.jar)
System($CLASSPATH/*.class
和指定的
jar)
Common($CATALINA_HOME/common
下的classes,lib,endores三个子目录
)
Catalina ($CATALINA_HOME/server/
下的classes和lib目录仅对Tomcat可见
)
&Shared($CATALINA_HOME/shared/
下的classes和lib目录以及$CATALINA_HOME/lib目录)仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见
classes/*.class lib/*.jar)

加载类和资源的顺序为:
1
、/Web-INF/classes

2、/Web-INF/lib/*.jar

3、Bootstrap

4、System

5、$CATALINA_HOME/common/classes
6
、$CATALINA_HOME/common/endores/*.jar

7、$CATALINA_HOME/common/lib/*.jar

8、$CATALINA_HOME/shared/classes
9
、$CATALINA_HOME/shared/lib/*.jar

四、server.xml配置简介:

下面讲述这个文件中的基本配置信息,更具体的配置信息请参考tomcat的文档:
server:
1
、port 指定一个端口,这个端口负责监听关闭tomcat的请求
2
、shutdown 指定向端口发送的命令字符串
service:
1
、name 指定service的名字

Connector (
表示客户端和service之间的连接):

1
、port 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求
2
、minProcessors 服务器启动时创建的处理请求的线程数

3
、maxProcessors 最大可以创建的处理请求的线程数

4
、enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查

询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip

地址
5
、redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的

端口号
6
、acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理

队列中的请求数,超过这个数的请求将不予处理
7
、connectionTimeout 指定超时的时间数(以毫秒为单位
)
Engine (
表示指定service中的请求处理机,接收和处理来自Connector的请求):

1
、defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name

属性值是一样的
Context (
表示一个web应用程序):

1
、docBase 应用程序的路径或者是WAR文件存放的路径
2
、path 表示此web应用程序的url的前缀,这样请求的url为

http://localhost:8080/path/****
3
、reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的

/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可

以在不重起tomcat的情况下改变应用程序
host (
表示一个虚拟主机):

1
、name 指定主机名
2
、appBase 应用程序基本目录,即存放应用程序的目录

3
、unpackWARs 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接

从WAR文件中运行应用程序
Logger (
表示日志,调试和错误信息):

1
、className 指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
2
、prefix 指定log文件的前缀

3
、suffix 指定log文件的后缀

4
、timestamp 如果为true,则log文件名中要加入时间,如下

例:localhost_log.2001-10-04.txt
Realm (
表示存放用户名,密码及role的数据库):

1
、className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口
Valve (
功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样):

1
、className 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve

类可以记录应用程序的访问信息
directory
(指定log文件存放的位置):

1
、pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行

请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记

录的值更多

五、web.xml配置简介:

1、默认(欢迎)文件的设置

在tomcat4confweb.xml中,<welcome-file-list>与IIS中的默认文件意思相同。

<welcome-file-list>

 <welcome-file>index.html</welcome-file>

 <welcome-file>index.htm</welcome-file>

 <welcome-file>index.jsp</welcome-file>

 </welcome-file-list>

2、报错文件的设置

<error-page>

<error-code>404</error-code>

<location>/notFileFound.jsp</location>

</error-page>

<error-page>

<exception-type>java.lang.NullPointerException</exception-type>

<location>/null.jsp</location>

</error-page>

如果某文件资源没有找到,服务器要报404错误,按上述配置则会调用webappsROOTnotFileFound.jsp。

如果执行的某个JSP文件产生NullPointException ,则会调用webappsROOTnull.jsp

3、会话超时的设置

设置session 的过期时间,单位是分钟;

<session-config>

<session-timeout>30</session-timeout>

</session-config>

4、过滤器的设置

<filter>

<filter-name>FilterSource</filter-name>

<filter-class>project4. FilterSource </filter-class>

</filter>

<filter-mapping>

<filter-name>FilterSource</filter-name>

<url-pattern>/WwwServlet</url-pattern>

(<url-pattern>/haha/*</url-pattern>)

</filter-mapping>

过滤:

1) 身份验证的过滤Authentication Filters

2) 日志和审核的过滤Logging and Auditing Filters

3) 图片转化的过滤Image conversion Filters

4) 数据压缩的过滤Data compression Filters

5) 加密过滤Encryption Filters

6) Tokenizing Filters

7) 资源访问事件触发的过滤Filters that trigger resource access events XSL/T 过滤XSL/T filters

9) 内容类型的过滤Mime-type chain Filter 注意监听器的顺序,如:先安全过滤,然后资源,

然后内容类型等,这个顺序可以自己定。

六、管理
1
、用户配置
在进行具体Tomcat管理之前,先给tomcat添加一个用户,使这个用户有权限来进行管理。
打开conf目录下的tomcat-users.xml文件,在相应的位置添加下面一行:

<user name="user" password="user" roles="standard,manager"/>
然后重起tomcat,在浏览器中输入http://localhost:8080/manager/,会弹出对话框,输入上面的用户

名和密码即可。

2
、应用程序列表
在浏览器中输入http://localhost:8080/manager/list,浏览器将会显示如下的信息:
OK - Listed applications for virtual host localhost
/ex:running:1
/examples:running:1
/webdav:running:0
/tomcat-docs:running:0
/manager:running:0
/:running:0
上面显示的信息分别为:应用程序的路径、当前状态、连接这个程序的session数


3
、重新装载应用程序
在浏览器中输入 http://localhost:8080/manager/reload?path=/examples,浏览器显示如下:
OK - Reloaded application at context path /examples

这表示example应用程序装载成功,如果我们将server.xml的Context元素的reloadable属性设为true,则没必要利用这种方式重新装载应用程序,因为tomcat会自动装载。

4、显示session信息
在浏览器中输入http://localhost:8080/manager/sessions?path=/examples,浏览器显示如下:
OK - Session information for application at context path /examples Default maximum session inactive

interval 30 minutes

5
、启动和关闭应用程序
在浏览器中输入http://localhost:8080/manager/start?path=/examples和

http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。

posted @ 2006-10-17 11:55 空空 阅读(555) | 评论 (0) | 编辑 收藏
 
Java 关于中文乱码问题的解决方案与经验
Java 关于中文乱码问题的解决方案与经验

一、字节和unicode

Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的。因此Java要对这些字节流经行转化。char是unicode的,而byte是字节。Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,可以用来告诉你,你用的convertor。其中两个很常用的静态函数是:

public static ByteToCharConverter getDefault();
public static ByteToCharConverter getConverter(String encoding);

如果你不指定converter,则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用8859_1。

byte ??〉char:
"你"的gb码是:0xc4e3 ,unicode是0x4f60
String encoding = "gb2312";
byte b[] = {(byte)´\u00c4´,(byte)´\u00e3´};
ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding);
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}
结果是什么?0x4f60
如果encoding ="8859_1",结果又是什么?0x00c4,0x00e3

如果代码改为:

byte b[] = {(byte)´\u00c4´,(byte)´\u00e3´};
ByteToCharConverter converter = ByteToCharConverter. getDefault();
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}

结果将又是什么?

这就要根据平台的编码而定。

char ??〉byte:
String encoding = "gb2312";
char c[] = {´\u4f60´};
CharToByteConverter converter = CharToByteConverter.getConverter(encoding);
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}
结果是什么?0x00c4,0x00e3
如果encoding ="8859_1",结果又是什么?0x3f
如果代码改为
String encoding = "gb2312";
char c[] = {´\u4f60´};
CharToByteConverter converter = CharToByteConverter.getDefault();
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}

结果将又是什么?还是根据平台的编码而定。

很多中文问题就是从这两个最简单的类派生出来的。而却有很多类不直接支持把encoding输入,这给我们带来诸多不便。很多程序难得用encoding了,直接用default的encoding,这就给我们移植带来了很多困难。

二、utf-8

utf-8是和unicode一一对应的,其实现很简单:

7位的unicode: 0 _ _ _ _ _ _ _
11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _

大多数情况是只使用到16位以下的unicode:

"你"的gb码是:0xc4e3 ,unicode是0x4f60
0xc4e3的二进制:
1100 ,0100 ,1110 ,0011

由于只有两位我们按照两位的编码来排,但是我们发现这行不通,因为第7位不是0因此,返回"?"

0x4f60的二进制:
0100 ,1111 ,0110 ,0000
我们用utf-8补齐,变成:
1110 ,0100 ,1011 ,1101 ,1010 ,0000
e4--bd-- a0
于是返回:0xe4,0xbd,0xa0。

三、string和byte[]

string其实核心是char[],然而要把byte转化成string,必须经过编码。string.length()其实就是char数组的长度,如果使用不同的编码,很可能会错分,造成散字和乱码。例如:


String encoding = “”;
byte [] b={(byte)´\u00c4´,(byte)´\u00e3´};
String str=new String(b,encoding);

如果encoding=8859_1,会有两个字,但是encoding=gb2312只有一个字这个问题在处理分页是经常发生。

四、Reader,Writer / InputStream,OutputStream

Reader和Writer核心是char,InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char读/写InputStream/OutputStream。例如:


文件test.txt只有一个"你"字,0xc4,0xe3
String encoding = "gb2312";
InputStreamReader reader = new InputStreamReader(new FileInputStream(
"text.txt"), encoding);
char c[] = new char[10];
int length = reader.read(c);
for (int i = 0; i < length; i++) {
System.out.println(c[i]);
}

结果是什么?是"你"。如果encoding ="8859_1",结果是什么?"??"两个字符,表示不认识。反过来的例子自己做。

五、我们要对Java的编译器有所了解:

Javac ?encoding

我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。如果没有指定encoding,则按照系统的默认encoding,gb平台上是gb2312,英文平台上是iso8859_1。Java的编译器实际上是调用sun.tools.Javac.main的类,对文件进行编译,这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取Java文件的,然后把用utf-8形式编译成class文件。例子代码:


String str = "你";
FileWriter writer = new FileWriter("text.txt");
write.write(str);
writer.close();

如果用gb2312编译,你会找到e4 bd a0的字段 ;
如果用8859_1编译, 00c4 00e3的二进制:
0000,0000 ,1100,0100 ,0000,0000 ,1110,0011
因为每个字符都大于7位,因此用11位编码:
1100,0001,1000,0100,1100,0011,1010,0011
c1-- 84-- c3--  a3
你会找到c1 84 c3 a3

但是我们往往忽略掉这个参数,因此这样往往会有跨平台的问题:

样例代码在中文平台上编译,生成zhclass

样例代码在英文平台上编译,输出enclass

(1) zhclass在中文平台上执行ok,但是在英文平台上不行

(2) enclass在英文平台上执行ok,但是在中文平台上不行

原因是:

(1) 在中文平台上编译后,其实str在运行态的char[]是0x4f60, 在中文平台上运行,filewriter的缺省编码是gb2312,因此chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中,于是0xc4,0xe3放进了文件。但是如果是在英文平台下,chartobyteconverter的缺省值是8859_1, filewriter会自动调用8859_1去转化str,但是他无法解释,因此他会输出"?"

(2) 在英文平台上编译后,其实str在运行态的char[]是0x00c4 0x00e3, 在中文平台上运行,中文无法识别,因此会出现??;在英文平台上,0x00c4-->0xc4,0x00e3->0xe3,因此0xc4,0xe3被放进了文件。

六、其它原因:


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

设置浏览器的显示编码,如果response的数据是utf8编码,显示将是乱码,但是乱码和上述原因还不一样。

七、发生编码的地方:

1. 从数据库到Java程序 byte??〉char

2. 从Java程序到数据库 char??〉byte

3. 从文件到Java程序 byte??〉char

4. 从Java程序到文件 char??〉byte

5. 从Java程序到页面显示 char??〉byte

6. 从页面form提交数据到Java程序byte??〉char

7. 从流到Java程序byte??〉char

8. 从Java程序到流char??〉byte

可以使用配置过滤器的方法解决中文乱码的:


<web-app>
<filter>
<filter-name>RequestFilter</filter-name>
<filter-class>net.golden.uirs.util.RequestFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RequestFilter</filter-name>
<url-pattern>*.Jsp</url-pattern>
</filter-mapping>
</web-app>


public void doFilter(ServletRequest req, ServletResponse res,
FilterChain fChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
String userId = (String) session.getAttribute("userid");
req.setCharacterEncoding(this.filterConfig.getInitParameter("charset"));
// 设置字符集?
实际上是设置了byte ??〉char的encoding
try {
if (userId == null || userId.equals("")) {
if (!request.getRequestURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\\x2EJsp$")) {
session.invalidate();
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logon.Jsp");
}
}
else {
// 看看是否具有信息上报系统的权限
if (!net.golden.uirs.util.UirsChecker.check(userId, "信息上报系统",
net.golden.uirs.util.UirsChecker.ACTION_DO)) {
if (!request.getRequestURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\\x2EJsp$")) {
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logonController.Jsp");
}
}
}
}
catch (Exception ex) {
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logon.Jsp");
}
fChain.doFilter(req, res);
}
posted @ 2006-10-12 13:53 空空 阅读(590) | 评论 (1) | 编辑 收藏
 
Eclipse中配置tomcat

1>JDK

版本: j2sdk1.4.2

配置属性,打开我的电脑 , 属性,高级,环境变量:

1> 在系统变量中的 path 下加: ;C:\jdk\bin   ( C:\jdk 为 jdk 安装目录)

2> 在用户变量里新建:

(1) 变量名: JAVA_HOME 变量值: C:\jdk

(2) 变量名: CLASSPATH

变量值:

 .;C:\jdk\lib\dt.jar;C:\jdk\lib\tools.jar;C:\jdk\jre\lib\rt.jar

到命令行(运行- cmd )输入 javac 命令查看是否配置正确。

2>Tomcat

版本: jakarta-tomcat-5.0.28

2> 在用户变量里修改 CLASSPATH :

增加 ;D:\tomcat\common\lib\servlet-api.jar

(D:\tomcat为tomcat的安装目录)

注:启动 tomcat 的方法:

Windows: 在 D:\Tomcat\bin 下双击 startup.bat 关闭则为 D:\Tomcat\bin 下 shutdown.bat

启动 tomcat 后到 ie 输入 http://localhost:8080 检查配置是否正确。

3> Eclipse:
1.JPG

2.JPG

posted @ 2006-10-08 10:09 空空 阅读(7481) | 评论 (0) | 编辑 收藏
 
六十六条经典禅语,你必须控制现在

六十六条经典禅语,你必须控制现在

1人之所以痛苦,在于追求错误的东西。

2如果你不给自己烦恼,别人也永远不可能给你烦恼。因为你自己的内心,你放不下。


3你永远要感谢给你逆境的众生。

4你永远要宽恕众生,不论他有多坏,甚至他伤害过你,你一定要放下,才能得到真正的快乐。

5当你快乐时,你要想,这快乐不是永恒的。当你痛苦时你要想这痛苦也不是永恒的。

6今日的执著,会造成明日的后悔。

7你可以拥有爱,但不要执著,因为分离是必然的。

8不要浪费你的生命在你一定会后悔的地方上。

9你什么时候放下,什么时候就没有烦恼。

10每一种创伤,都是一种成熟。

11狂妄的人有救,自卑的人没有救,认识自己,降伏自己,改变自己,才能改变别人。

12你不要一直不满人家,你应该一直检讨自己才对。不满人家,是苦了你自己。

13一个人如果不能从内心去原谅别人,那他就永远不会心安理得。

14心中装满着自己的看法与想法的人,永远听不见别人的心声。

15毁灭人只要一句话,培植一个人却要千句话,请你多口下留情。

16根本不必回头去看咒骂你的人是谁?如果有一条疯狗咬你一口,难道你也要趴下去反咬他一口吗?

17永远不要浪费你的一分一秒,去想任何你不喜欢的人。

18请你用慈悲心和温和的态度,把你的不满与委屈说出来,别人就容易接受。

19同样的瓶子,你为什么要装毒药呢?同样的心里,你为什么要充满着烦恼呢?

20得不到的东西,我们会一直以为他是美好的,那是因为你对他了解太少,没有时间与他相处在一起。当有一天,你深入了解后,你会发现原不是你想像中的那么美好。


21活着一天,就是有福气,就该珍惜。当我哭泣我没有鞋子穿的时候,我发现有人却没有脚。

22多一分心力去注意别人,就少一分心力反省自己,你懂吗?

23憎恨别人对自己是一种很大的损失。

24每一个人都拥有生命,但并非每个人都懂得生命,乃至于珍惜生命。不了解生命的人,生命对他来说,是一种惩罚。

25情执是苦恼的原因,放下情执,你才能得到自在

26不要太肯定自己的看法,这样子比较少后悔。

27当你对自己诚实的时候,世界上没有人能够欺骗得了你。

28用伤害别人的手段来掩饰自己缺点的人,是可耻的。

29默默的关怀与祝福别人,那是一种无形的布施。

30不要刻意去猜测他人的想法,如果你没有智慧与经验的正确判断,通常都会有错误的。

31要了解一个人,只需要看他的出发点与目的地是否相同,就可以知道他是否真心的。

32人生的真理,只是藏在平淡无味之中。

33不洗澡的人,硬擦香水是不会香的。名声与尊贵,是来自于真才实学的。有德自然香。 原谅别人,就是给自己心中留下空间,以便回旋。

 34时间总会过去的,让时间流走你的烦恼吧!

35你硬要把单纯的事情看得很严重,那样子你会很痛苦。

36永远扭曲别人善意的人,无药可救。

37说一句谎话,要编造十句谎话来弥补,何苦呢?

38白白的过一天,无所事事,就像犯了窃盗罪一样

39广结众缘,就是不要去伤害任何一个人。

40沈默是毁谤最好的答覆。

41对人恭敬,就是在庄严你自己。

42拥有一颗无私的爱心,便拥有了一切。

43来是偶然的,走是必然的。所以你必须,随缘不变,不变随缘。

44慈悲是你最好的武器。

45只要面对现实,你才能超越现实。

46良心是每一个人最公正的审判官,你骗得了别人,却永远骗不了你自己的良心。

47不懂得自爱的人,是没有能力去爱别人的。

48有时候我们要冷静问问自已,我们在追求什么?我们活着为了什么?

49不要因为小小的争执,远离了你至亲的好友,也不要因为小小的怨恨,忘记了别人的大恩。

50感谢上苍我所拥有的,感谢上苍我所没有的。

51凡是能站在别人的角度为他人着想,这个就是慈悲。

52说话不要有攻击性,不要有杀伤力,不夸已能,不扬人恶,自然能化敌为友。

53诚实的面对你内心的矛盾和污点,不要欺骗你自己。

54因果不曾亏欠过我们什么,所以请不要抱怨。

55大多数的人一辈子只做了三件事;自欺、欺人、被人欺。

56心是最大的骗子,别人能骗你一时,而它却会骗你一辈子

57只要自觉心安,东西南北都好。如有一人未度,切莫自己逃了。

58当你手中抓住一件东西不放时,你只能拥有这件东西,如果你肯放手,你就有机会选择别的。人的心若死执自己的观念,不肯放下,那么他的智慧也只能达到某种程度而已

59如果你能够平平安安的渡过一天,那就是一种福气了。多少人在今天已经见不到明天的太阳,多少人在今天已经成了残废,多少人在今天已经失去了自由,多少人在今天已经家破人亡。


60你有你的生命观,我有我的生命观,我不干涉你。只要我能,我就感化你。如果不能,那我就认命。

61你希望掌握永恒,那你必须控制现在。

62恶口永远不要出自于我们的口中,不管他有多坏,有多恶。你愈骂他,你的心就被污染了,你要想,他就是你的善知识。

63别人可以违背因果,别人可以害我们,打我们,毁谤我们。可是我们不能因此而憎恨别人,为什么?我们一定要保有一颗完整的本性和一颗清净的心。

64如果一个人没有苦难的感受,就不容易对他人给予同情。你要学救苦救难的精神,就得先受苦受难。

65世界原本就不是属于你,因此你用不着抛弃,要抛弃的是一切的执著。万物皆为我所用,但非我所属。

66虽然我们不能改变周遭的世界,我们就只好改变自己,用慈悲心和智慧心来面对这一切。

posted @ 2006-09-29 15:10 空空 阅读(502) | 评论 (1) | 编辑 收藏
 
中文字符集与字符编码的基础知识

字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB 18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编码,是中文信息交流的技术基础。本文将按照字符集的时间顺序讨论几种典型的字符集,选取几种代表性的中文字符集,研究历史由来、特点、技术特征。

ASCII 字符集

1.名称的由来

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于罗马字母表的一套电脑编码系统。

2.特点

它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO 646。

3.包含内容

控制字符:回车键、退格、换行键等。

可显示字符:英文大小写字符、阿拉伯数字和西文符号

4.技术特征

7位(bits)表示一个字符,共128字符

5.ASCII扩展字符集

7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。

ASCII扩展字符集比ASCII字符集扩充出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。

GB2312 字符集

1.名称的由来

GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。

2.特点

GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。

3.包含内容

GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。其中包括6763个汉字,其中一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

4.技术特征

(1)分区表示:

GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。

各区包含的字符如下:01-09区为特殊符号;16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序;10-15区及88-94区则未有编码。

(2)双字节表示

两个字节中前面的字节为第一字节,后面的字节为第二字节。习惯上称第一字节为“高字节” ,而称第二字节为“低字节”。

“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。

5.编码举例

以GB2312字符集的第一个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在大多数计算机程序中,高字节和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。

BIG5 字符集

1.名称的由来

又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大众 (FIC)创立,故称大五码。

Big5码的产生,是因为当时台湾不同厂商各自推出不同的编码,如倚天码、IBM PS55、王安码等,彼此不能兼容;另一方面,台湾政府当时尚未推出官方的汉字编码,而中国大陆的GB2312编码亦未有收录繁体中文字。

2.特点

Big5字符集共收录13,053个中文字,该字符集在中国台湾使用。耐人寻味的是该字符集重复地收录了两个相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。

3.字符编码方法

Big5码使用了双字节储存方法,以两个字节来编码一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。

各编码范围对应的字符类型如下:0xA140-0xA3BF为标点符号、希腊字母及特殊符号,另外于0xA259-0xA261,存放了双音节度量衡单位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E为常用汉字,先按笔划再按部首排序;0xC940-0xF9D5为次常用汉字,亦是先按笔划再按部首排序。

4.Big5 的局限性

尽管Big5码内包含一万多个字符,但是没有考虑社会上流通的人名、地名用字、方言用字、化学及生物科等用字,没有包含日文平假名及片假名字母。

例如台湾视“着”为“著”的异体字,故没有收录“着”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常见的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也没有收录到Big5之中。

GB18030 字符集

1.名称的由来

GB 18030的全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准

2.特点

GB 18030字符集标准的出台经过广泛参与和论证,来自国内外知名信息技术行业的公司,信息产业部和原国家质量技术监督局联合实施。

GB 18030字符集标准解决汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统一汉字扩展A”的内容。并且与以前的国家字符编码标准(GB2312,GB13000.1)兼容。

3.编码方法

GB 18030标准采用单字节、双字节和四字节三种方式对字符编码。单字节部分使用0×00至0×7F码(对应于ASCII码的相应码)。双字节部分,首字节码从0×81至0×FE,尾字节码位分别是0×40至0×7E和0×80至0×FE。四字节部分采用GB/T 11383未采用的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。

4.包含的内容

双字节部分收录内容主要包括GB13000.1全部CJK汉字20902个、有关标点符号、表意文字描述符13个、增补的汉字和部首/构件80个、双字节编码的欧元符号等。  四字节部分收录了上述双字节字符之外的,包括CJK统一汉字扩充A在内的GB 13000.1中的全部字符。

Unicode字符集

1.名称的由来

Unicode字符集编码是Universal Multiple-Octet Coded Character Set 通用多八位编码字符集的简称,是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0。

2.特征

Unicode是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

3.编码方法

Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,例如字母“A”的编码为 004116 和字符“€”的编码为 20AC16。所以“A”的编码书写为“U+0041”。

4.UTF-8 编码
UTF-8是Unicode的其中一个使用方式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。

UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。

UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

5.UTF-16 和 UTF-32 编码
UTF-32、UTF-16 和 UTF-8 是 Unicode 标准的编码字符集的字符编码方案,UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码;UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数。

posted @ 2006-09-29 11:10 空空 阅读(1107) | 评论 (0) | 编辑 收藏
 
tomcat中的java_home问题

在用 tomcat 做服务器调试 jsp 的时候。总是报这个错误:

Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK

上网找了下才知道是要把 jdk\lib\tools.jar 文件拷贝到 tomcat\common\lib 下才行。

posted @ 2006-09-29 10:40 空空 阅读(834) | 评论 (1) | 编辑 收藏
 
仅列出标题
共4页: 上一页 1 2 3 4 下一页