posts - 9, comments - 1, trackbacks - 0, articles - 0

2009年12月5日

character set,character encoding和xml encoding declaration

hanlray@gmail.com

Revision: 0.9 Date: 2005/08/28


1. character set和character encoding

一 直以为character set和character encoding是一回事,最近才发现它们差不多是两个概念。从字面意思上看,一个character set就是一些字符的集合,比如26个英文字母,全体汉字,或者两者的组合,然而计算机是只能处理数字的,一个字符必须被表示成一个数字才可能被计算机处 理,因此一个character set还必须定义字符到数字的映射关系,比如字符A映射到数字64,字符Z映射到数字90,这些数字叫做code points;character encoding则用来定义这些code points如何用字节表示出来,比如code point 90可以被编码为一个单字节,一个little-endian的unsigned short,一个big-endian的integer,或者更复杂的形式。换句话说,一个character set仅仅是一张字符和数字的映射表,它并不规定这些数字如何用字节表示出来,这种表示的事情由character encoding来定义。因此,一个character encoding是针对一个character set的,而一个character set可以有多个character encoding,比如UTF-8,UTF-16都是Unicode Character Set的encoding。

2. xml encoding declaration

对 一段编码后的文本,要想正确地处理它,必须要事先知道其采用的编码方式,因此这种编码信息一般是存在于该文本之外的,比如某些编辑器会在文件开始放几个不 可见的字节来指示其正文的编码方式,这些字节叫做BOM(Byte Order Mark);某些网络协议会有一些字段来指示其所携带文本的编码方式。这种方式很直观,很多系统/技术采用这种方式,大多数有关xml的应用也会优先使用 这种外部的编码信息,但是当没有这种外部的编码信息可用的时候呢?一个xml document可以用一个xml declaration来声明其采用的编码,形如<?xml version="1.0" encoding="UTF-8"?>,这种方式看起来不大可能工作,因为这个声明本身就是文本的,并且该声明是xml document的一部分,不可能规定其采用的编码方式。如何能在不知道xml document编码的情况下理解其xml declaration中声明的编码呢?对xml编码声明的位置及内容的限制使自动检测成为可能:编码声明必须出现在文档开头,只允许ASCII字符并且 其头几个字符必须是<?xml,这样,一个xml processor就可以先读出文档的前几个字节,推断其采用的编码的特征,根据该特征能理解xml declaration,读出encoding属性值,从而知道该文档的编码。比如,如果前4个字节的内容为3C 3F 78 6D,则可以确定该文档采用的是一种兼容ASCII的编码,这样xml processor就可以用任一种兼容ASCII的编码(如UTF-8)来理解编码后xml声明,因为其只包含ASCII字符,任何兼容ASCII的编码 对其编码的结果都是相同的。当得到xml declaration中声明的编码时,xml processor再转换到该编码对该xml进行处理。下表来自XML W3C Recommendation,列出了自动检测编码的方式:

00 00 00 3C
3C 00 00 00
00 00 3C 00
00 3C 00 00
UCS-4 or other encoding with a 32-bit code unit and ASCII characters encoded as ASCII values, in respectively big-endian (1234), little-endian (4321) and two unusual byte orders (2143 and 3412). The encoding declaration must be read to determine which of UCS-4 or other supported 32-bit encodings applies.
00 3C 00 3F UTF-16BE or big-endian ISO-10646-UCS-2 or other encoding with a 16-bit code unit in big-endian order and ASCII characters encoded as ASCII values (the encoding declaration must be read to determine which)
3C 00 3F 00 UTF-16LE or little-endian ISO-10646-UCS-2 or other encoding with a 16-bit code unit in little-endian order and ASCII characters encoded as ASCII values (the encoding declaration must be read to determine which)
3C 3F 78 6D UTF-8, ISO 646, ASCII, some part of ISO 8859, Shift-JIS, EUC, or any other 7-bit, 8-bit, or mixed-width encoding which ensures that the characters of ASCII have their normal positions, width, and values; the actual encoding declaration must be read to detect which of these applies, but since all of these encodings use the same bit patterns for the relevant ASCII characters, the encoding declaration itself may be read reliably
4C 6F A7 94 EBCDIC (in some flavor; the full encoding declaration must be read to tell which code page is in use)
Other UTF-8 without an encoding declaration, or else the data stream is mislabeled (lacking a required encoding declaration), corrupt, fragmentary, or enclosed in a wrapper of some kind

posted @ 2009-12-09 20:27 TonyZhangtl 阅读(289) | 评论 (0)编辑 收藏

虽然将jxl.jar包添加到工程里了, 但是仍让有java.lang.ClassNotFoundException: jxl.write.WritableCell错误。
需要把jar包放在web-inf/lib目录下再加载才可以解决这个问题。
package tony.servlet.example;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class Hello extends HttpServlet {
    protected void service(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // ServletOutputStream out = response.getOutputStream();
        // PrintWriter out = response.getWriter();
        // out.println("Hello world!");
        // System.out.println("TEST");
        // request.getRequestDispatcher("/WEB-INF/jspfooder/test1.html").forward(request,
        // response);
        // request.getRequestDispatcher("test.jsp").forward(request, response);
        // request.getRequestDispatcher("/WEB-INF/test.jsp").forward(request,
        // response);
        /*
         * response.setContentType("application/vnd.ms-excel");
         * response.setHeader("Content-disposition","filename="+ "Example.xls"
         * ); HSSFWorkbook demoWorkBook = new HSSFWorkbook(); HSSFSheet sheet =
         * demoWorkBook.createSheet("账号详单"); HSSFRow row = sheet.createRow(0);
         * HSSFCell cell = row.createCell(0); cell.setCellValue(11);
         * ServletOutputStream out = response.getOutputStream();
         * demoWorkBook.write(out); out.flush(); out.close();
         */
        OutputStream out = response.getOutputStream();
        try {

            response.setContentType("application/vnd.ms-excel");

            response.setHeader("Content-Disposition",
                    "attachment; filename=example.xls");

            WritableWorkbook w = Workbook.createWorkbook(out);
            WritableSheet s = w.createSheet("sheet1", 0);

            s.addCell(new Label(0, 0,
                    "this is my first servlet & sheet example."));
            w.write();
            w.close();

        } catch (Exception e) {
            throw new ServletException("Exception in Excel Sample Servlet", e);
        } finally {
            if (out != null)
                out.close();
        }
    }
}


posted @ 2009-12-06 17:42 TonyZhangtl 阅读(881) | 评论 (1)编辑 收藏

EJB与JavaBean之区别
[日期]: 2006-08-17  [来源]:   [作者]:
EJB 不是一般的JavaBean,EJB是企业级JavaBean,EJB一共分为3种,实体Bean,消息Bean,会话Bean,书写EJB是需要遵循一 定的规范的,具体规范你可以参考相关的资料.另外,要运行EJB,你需要相应的EJB容器,比如Weblogic,Jboss等,而JavaBean不需 要,只需要安装Tomcat就可以了
.EJB用于服务端应用开发, 而JavaBeans用于客户端应用开发
也可以使用JavaBeans进行服务端应用开发,但JavaBeans模型没有提供服务框架,当应用需要使用系统级服务(如事务管理,安全性,生命周期管理等)时,不适合。

2.EJB构件是可部署的,EJB构件可以作为独立的单元被部署到EJB应用服务器上,是应用构件(application components),而JavaBeans构件是不可部署的, JavaBeans构件是开发构件,不能被部署为独立的单元。

3.EJB构件是部署可定制的,使用部署描述符可以在部署EJB时对其运行时配置进行定制,而JavaBeans构件在部署时不能进行定制,JavaBeans构件的定制仅发生在开发阶段,只能利用开发工具创建并组装JavaBeans构件,部署时不能定制

4.EJB构件是分布式对象,可以被客户应用或者其它EJB构件进行远程访问,而JavaBeans构件不是分布式对象,JavaBeans构件只能在其构成的应用中使用,不能提供远程访问能力

5.EJB构件对终端用户不可见,运行在服务端,没有人机交互界面,而部分JavaBeans构件对终端用户可见,如GUI应用中使用的按钮构件.

Java bean is just a set of conventions. EJB is a standard for J2EE business components.

Specifically a Java bean:

  • has a public default constructor;
  • readable propertiy methods prepended with "get";
  • writable propertty methods prepended with "set"; and
  • is Serializable.

For example, a Java bean with a property of "margin" would minimally look like this:

public class MyBean implements Serializable {
 
private int margin;

 
public MyBean() { }
 
public int getMargin() { return margin; }
 
public void setMargin(int margin) { this.margin = margin; }
}

EJB, despite the name, is almost completely unrelated.


JavaBeans:-
---------
Basically used to CUSTOMIZE EXISTING OBJECTS. i.e. You can
create USER OBJECTS, which are based on existing objects.
For Example: A default button operates as a Single-State Switch. i.e. when you press a button on a web page, it doesn't remain pressed. Infact, it immediately bounces back to its OFF state like a Door-Bell.

Now, let's say, you need a button, which should have 2 stable states, like the typical Electrical Light Switch. So, in this case, what you can do is, take an existing button (having 1 stable state) and CUSTOMIZE it so that it has 2 stable states.
This is possible using JavaBeans.

Enterprise Java Beans (EJB):-
---------------------------
EJB is a completely different concept than the one mentioned
above. It is NOT used to customize existing objects. Instead
they are basically used to STANDARDIZE the way, in which
business logic is written.
For Example: We can write our business logic as well as the GUI logic, inside Servlets/Applets/StandAlone applications itself. But this way,there will be no clear distinction between the Code that is responsible for the GUI and the actual Business logic code, because everything is written inside the same class file.

So, to COMPONENTIZE we write business logic in seperate class files than the GUI logic, thereby making a clear distinction between the reponsibilities


有一些基本相同之处。它们都是用一组特性创建,以执行其特定任务的对象或组件。它们还有从当前所驻留服务器上的容器获得其它特性的能力。这使得   bean   的行为根据特定任务和所在环境的不同而有所不同。  
        不同的是:  
        EJB   是设计成运行在服务器上,并由客户机调用的非可视远程对象。可通过多个非可视   JavaBean   构建   EJB。它们有一个部署描述符,其目的与   JavaBean   属性相同:它是以后可由工具读取的   bean   的描述。EJB   还独立于平台,一旦编写好,还可以在任何支持   Java   的平台(包括客户机和服务器)上使用。  
        EJB是一种非可视化的构件,完全位于服务器端,规范说明详细说明了EJB容器需要满足的需求以及如何和EJB构件相互协作。EJB可以和远程的客户端程 序通讯,并提供一定的功能,根据规范说明,EJB是client/Server系统的一部分,如果不和客户端程序交互,EJB一般不执行具体的功 能,EJB和JavaBean的一个重要区别是EJB必须在网络计算环境下使用才有意义。  
  EJB的重点是给出服务框架模型,以保证Java构件可以进行可移植性的部署,因此,在EJB规格说明中,并没有提到事件,因为典型的EJB构件不发 送和接收事件,EJB规范说明中也没有提到属性。和一般的JavaBean一样,EJB是高度可定制的,对EJB进行定制不需要存取源代码,但对EJB可 以进行定制不是在开发阶段,而是在部署阶段用部署描述符进行定制。  
  需要说明的是,JavaBean不仅可用于客户端应用程序的开发,也可以用于服务器端应用程序的开发,但和EJB的区别是,如果用JavaBean创 建服务器端应用程序,还必须同时实现服务框架,在多层结构分布式应用系统中,服务框架的实现是非常繁琐的,对于EJB来说,服务框架已经提供,因此大大简 化了系统的开发过程。


我了省时间,我给你一份文档吧!是专门介绍二者区别的。  
   
  java   bean   与   ejb的区别  
   
  您现在可能已在使用   JavaBean,但还不了解它。如果有支持   Java   的浏览器,那么,在桌面上使用   JavaBean   就没有限制。使用的   Web   页面可以将   bean   作为小应用程序的一部分。您很快就会和作为浏览器可视部分的   JavaBean   交互,然后,那些   JavaBean   将与服务器上的   EJB   接口。这种能力也可以扩展到因特网和内部网。  
   
  JavaBean   和   Server   Bean(通常称为   Enterprise   JavaBean   (EJB))有一些基本相同之处。它们都是用一组特性创建,以执行其特定任务的对象或组件。它们还有从当前所驻留服务器上的容器获得其它特性的能力。这使 得   bean   的行为根据特定任务和所在环境的不同而有所不同。  
   
  这开辟了巨大商机。因为   JavaBean   是与平台无关的,所以对于将来的解决方案,供应商可以轻易向不同用户推出其客户机方的   JavaBean,而不必创建或维护不同的版本。这些   JavaBean   可以与执行商业功能(例如订购、信用卡处理、电子汇款、存货分配、运输等)的   EJB   配合使用。这里有巨大潜力,而这正是组件代理(WebSphere   Application   Server   企业版)设计提供的那种潜力。  
   
  JavaBean   是一种组件,它在内部有接口或有与其相关的属性,以便不同人在不同时间开发的   bean   可以询问和集成。可以构建一个   bean,而在以后构造时将其与其它   bean   绑定。这种过程提供了先构建,然后重复使用的方法,这就是组件的概念。可以将这种单一应用程序部署成独立程序、ActiveX   组件或在浏览器中。  
   
  JavaBean   因其外部接口(即属性接口)而与纯对象不同。这种接口允许工具读取组件要执行的功能,将其与其它   bean   挂钩,以及将其插入其它环境。JavaBean   设计成对单一进程而言是本地的,它们在运行时通常可视。这种可视组件可能是按钮、列表框、图形或图表   -   但这不是必需的。  
   
  可执行组件    
  Server   Bean   或   EJB   是部署在服务器上的可执行组件或商业对象。有一个协议允许对其进行远程访问或在特定服务器上安装或部署它们。有一系列机制允许它们将服务安全性、事务行 为、并发性(由多个客户机同时访问的能力)和持久性(其状态可以保存多久)的主要方面授权给   EJB   服务器上其所在的容器。当安装在容器中时,它们获得各自的行为,该行为提供不同质量的服务,因此,选择正确的   EJB   服务器至关重要。这正是   IBM   WebSphere   企业版的优势所在。  
   
  EJB   是设计成运行在服务器上,并由客户机调用的非可视远程对象。可通过多个非可视   JavaBean   构建   EJB。它们有一个部署描述符,其目的与   JavaBean   属性相同:它是以后可由工具读取的   bean   的描述。EJB   还独立于平台,一旦编写好,还可以在任何支持   Java   的平台(包括客户机和服务器)上使用。  
   
  因为   EJB   由诸如   IBM   VisualAge   for   Java   这样的工具集生成,所以,它是基于服务器的对象,并用于远程调用。它们安装在   EJB   服务器上,并象调用其它   CORBA   远程对象那样获得进行调用的远程接口。  
   
  ActiveX   对象    
  可以将   JavaBean   部署成   ActiveX   对象,虽然   EJB   的代理也可以这样做,但是,因为   ActiveX   运行在桌面上,所以,EJB   本身不能成为   ActiveX   对象。要在与平台相关的、仅   Windows   平台上做到这一点,开发人员可以将   JavaBean   变换成   ActiveX   组件。  
   
  好处    
  EJB   的主要好处在于:构建   bean   时,bean   开发人员可以规定需要什么类型的行为,而不必规定如何去做。开发分为两部分:程序员开发   bean,然后验证:它可与构建工具一起工作,并包括标识所需服务质量行为种类的部署描述符。下一步,另一个程序员可以采用这个   bean,并使用读取   EJB   部署描述符的部署工具,然后将该   bean   安装到   Enterprise   Java   Server   上的容器中。在第二步中,部署工具采取一些操作   -   这可能意味着生成如状态保存代码,放入事务挂钩,或执行安全性检查这样的代码。所有这些操作由部署工具生成,bean   开发人员和部署人员可以是不同的人。  
   
  可以通过使用部署工具,将任何独立于平台的   JavaBean   改写成具有可靠服务质量、特定于平台的   EJB,以满足现有商业系统和应用程序的特定需求。这就是   EJB   服务器对集成系统、网络和体系结构如此重要的原因所在。  
   
  EJB   与   IBM   WebSphere   企业版    
  在   IBM   WebSphere   企业版中使用时,可以将   EJB   配置成被管理的商业对象。接受它们授权服务的容器是其安装到的容器。将   EJB   的持久性部分映射在数据或状态对象中。EJB   服务器为   EJB   提供不同的服务质量,选择正确的   EJB   服务器可能对满足完整的商业需求至关重要。“组件代理”功能极其健壮,该功能提供如负载均衡和支持服务器组中多台机器的高级功能。它还有大大超出   Enterprise   Java   Server   (EJS)   规范所倡导的系统管理功能。因此,按照基本标准编写的   JavaBean   或   EJB   可以运行在使用“组件代理”功能的   WebSphere   企业版上,并获得那些所有的附加功能。  
   
  EJB   服务器还提供独特的特性和服务质量,而且不完全相同。IBM“组件代理”有一些强大特性   -   例如,可伸缩性,它允许开发人员将   EJB   部署到从小型系统到大型网络的不同类型服务器。开发人员可以从小处入手,例如,在一个部门中,首先在   LAN   的   Java   服务器上部署,一旦准备好,就知道可以将在那里创建的   JavaBean   和   EJB   部署到全球网络。然后,开发人员可以测试并熟悉这些   bean,试运行,制作样本等等。满意之后,开发人员可以通过将其移至高性能服务器,来大幅度扩大其规模。JavaBean   和   EJB   不受任何计算机体系结构边界的限制。它们用   Java   编写,可以运行在任何具有   Java   虚拟机的系统上,并可以使用任何   Enterprise   Java   Server   (EJS)   来部署对象。因此,开发人员现在可以在方便的系统上构建,以后在方便的系统上部署,而不必是同一台或同样类型的机器。  
   
  IBM   WebSphere   企业版支持将商业对象部署到多台服务器。EJB   作为商业对象集成到“组件代理”功能,并作为任何其它商业对象处理。因此,EJB   可以连接到所选的后端系统,并执行任何所需操作,以满足其商业需求。这就成为“组件代理”为   EJB   提供的基础设施。通过将“组件代理”用作   EJB   服务器,开发人员将能够继续使用当前旧有系统,并将其与电子商务接口一起提供。  
   
  为使   EJB   能在   WebSphere“组件代理”环境中工作,可以使用“组件代理”部署工具将其安装在一台或多台服务器上,然后将其添加到命名服务器,以便可以全局查找到 它。任何可以访问公共命名服务器的人都可以找到它,找到其宿主,并可以在宿主上执行方法,同时创建   EJB。这就是“代理组件”要做的事。  
   
  示例    
  让我们举一个在   Web   购物站点上可以看到的电子购物车的例子。用户的购物车是一个   JavaBean。用户将货架上的商品放入购物车,这些商品本身是   JavaBean。它们全部可视,并且面向用户。结帐时,将用户购物车中的商品发送到服务器上的   EJB,该   EJB   执行一些必要的操作,如检查信用卡授权和可用额度,生成封条,或生成给发货部门的有关提什么货和发货地点的特殊指示   -   这就是商业程序已在进行的活动。  
   
  结束语    
  Bean   的全部意义不只是其现有能力,更在于其可以为商业提供的有竞争力的潜在能力。IT   设计师和应用开发人员现在可以将精力完全集中在商业逻辑,而将如事务、持久性和安全性的底层工作留给服务器。WebSphere   的“组件代理”功能将提供所有这些(还有后端访问)和对象事务管理器。





posted @ 2009-12-05 13:05 TonyZhangtl 阅读(213) | 评论 (0)编辑 收藏