meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中,meta
标签的用处很多。meta
的属性有两种:name和http-equiv。name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目
前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和
keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个:

  name 属性

  1、<meta name="Generator" content="">用以说明生成工具(如Microsoft FrontPage 4.0)等;

  2、<meta name="KEYWords" content="">向搜索引擎说明你的网页的关键词;

  3、<meta name="DEscription" content="">告诉搜索引擎你的站点的主要内容;

  4、<meta name="Author" content="你的姓名">告诉搜索引擎你的站点的制作的作者;

  5、<meta name="Robots" content="all|none|index|noindex|follow|nofollow">

  其中的属性说明如下:

  设定为all:文件将被检索,且页面上的链接可以被查询;

  设定为none:文件将不被检索,且页面上的链接不可以被查询;

  设定为index:文件将被检索;

  设定为follow:页面上的链接可以被查询;

  设定为noindex:文件将不被检索,但页面上的链接可以被查询;

  设定为nofollow:文件将不被检索,页面上的链接可以被查询。

  http-equiv属性

  1、<meta http-equiv="Content-Type" content="text/html";charset=gb_2312-80">

  和 <meta http-equiv="Content-Language" content="zh-CN">用以说明主页制作所使用的文字以及语言;

  又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;
  2、<meta http-equiv="Refresh"
content="n;url=http://yourlink">定时让网页在指定的时间n内,跳转到页面http;//yourlink;

  3、<meta http-equiv="Expires" content="Mon,12 May 2001
00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式;

  4、<meta http-equiv="Pragma" content="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;

  5、<meta http-equiv="set-cookie" content="Mon,12 May 2001
00:20:00 GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式;

  6、<meta http-equiv="Pics-label" content="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的;

  7、<meta http-equiv="windows-Target" content="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用;

  8、<meta http-equiv="Page-Enter"
content="revealTrans(duration=10,transtion=50)">和<meta
http-equiv="Page-Exit"
contect="revealTrans(duration=20,transtion=6)">设定进入和离开页面时的特殊效果,这个功能即
FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE abatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Abator for iBATIS Configuration 1.0//EN"
"http://ibatis.apache.org/dtd/abator-config_1_0.dtd"&gt;

<abatorConfiguration>
<abatorContext generatorSet="Java5"><!– TODO: Add Database Connection Information –>
<jdbcConnection driverClass="org.gjt.mm.mysql.Driver"
connectionURL="???"
userId="???" password="???">
<classPathEntry
location="???" />
</jdbcConnection>

<javaModelGenerator targetPackage="???"
targetProject="???" />
<sqlMapGenerator targetPackage="???"
targetProject="???" />
<daoGenerator type="IBATIS"
targetPackage="???"
targetProject="???" />

<table schema="???" tableName="???">
<generatedKey identity="true" column="???"
sqlStatement="???" />
<columnOverride column="???" javaType="java.sql.Date"
jdbcType="date" />
</table>

</abatorContext>
</abatorConfiguration>

所有的参数都是写在<abatorConfiguration>这个根节点中,下面可以用 <abatorContext>来生成个自的iBATIS配置文件、Java Bean和DAO
abatorContext的一个属性generatorSet有3个选项Legacy、Java2、Java5

Legacy:如果没有generatorSet属性的话,默认是Legacy。但并不推荐使用Legacy因为它在生成Example类(用于查询条件)的时候有很多限制,他将查询条件写在sqlMap配置文件中,将查询值写在Example中,这样就对修改产生一些困难。

Java2和Java5:他们只支持iBATIS 2.20以上的版本。在以这个模式成生的Example文件中包含了查询条件和查询值。这样修改就方便多了,对于用join的select时的查询就更方便了,自己可以定义查询条件,自由度高了很多(对于join的and查询可能还得自己修改一下Example代码)。对于or和and的应用Legacy的限制就比较大了。

<jdbcConnection>描述了JDBC的属性和其jar包的位置.

<javaModelGenerator>、 <sqlMapGenerator>、 <daoGenerator>描述了个自生成的位置。<daoGenerator>中type属性则用来告诉abator生成的DAO是用于iBATIS还是SPRING等容器。

<table>告诉abator生成那个table的sqlMap。

<generatedKey>来告诉abator那些列需要自动返回值(当插入的时候可以返回插入记录的主键,这对有外键的数据库极其有用)identity默认为false,则在sqlMap配置文件中<selectKey>的位置在sql命令前面,所以identity应该改为true。sqlStatement属性则填入各类数据库的返回值函数:

CloudscapeThis will translate to VALUES IDENTITY_VAL_LOCAL()
DB2This will translate to VALUES IDENTITY_VAL_LOCAL()
DerbyThis will translate to VALUES IDENTITY_VAL_LOCAL()
HSQLDBThis will translate to CALL IDENTITY()
MySqlThis will translate to SELECT LAST_INSERT_ID()
SqlServerThis will translate to SELECT SCOPE_IDENTITY()

<columnOverride>告诉abator那些列是需要特殊处理的,对于date这种比较复杂的类型,可以用它来指定映射(用jdbctype和javatype属性来指定)。

还有一些不大用的到的属性这里就不介绍了。

一、创建启动/停止脚本文件

通过一下脚本,可以使Tomcat以Service方式运行。


#!/bin/bash

# chkconfig: 2345 10 90

# description: Starts and Stops the Tomcat daemon.

TOMCAT_HOME=/usr/local/apache-tomcat-5.5.12
TOMCAT_START=$TOMCAT_HOME/bin/startup.sh
TOMCAT_STOP=$TOMCAT_HOME/bin/shutdown.sh

# necessary environment variables

export
CATALINA_HOME=$TOMCAT_HOME

export JAVA_HOME=/usr/java/jdk1.5.0_05

# source function library.

. /etc/rc.d/init.d/functions

# source networking configuration.

. /etc/sysconfig/network

# check that networking is up.

[ "${NETWORKING}" = "no" ] && exit 0

# check for tomcat script

if [ ! -f $TOMCAT_HOME/bin/catalina.sh ]

then
echo "Tomcat not valilable…"

exit

fi

start(){
echo -n "Starting Tomcat: "

daemon $TOMCAT_START

echo

touch /var/lock/subsys/tomcat

}

stop(){

echo -n $"Shutting down Tomcat: "

daemon $TOMCAT_STOP

rm -f /var/lock/subsys/tomcat.pid
echo

}

restart(){
stop

start

}

status(){

ps ax –width=1000 | grep
"[o]rg.apache.catalina.startup.Bootstrap start" | awk ‘{printf $1 " "}’
| wc | awk ‘{print $2}’ > /tmp/tomcat_process_count.txt

read line < /tmp/tomcat_process_count.txt

if [ $line -gt 0 ]; then

echo -n "tomcat ( pid "

ps ax –width=1000 | grep "org.apache.catalina.startup.Bootstrap start" | awk ‘{printf $1 " "}’

echo -n ") is running…"

echo

else

echo "Tomcat is stopped"

fi

}

case "$1" in

start)

start
;;

stop)

stop
;;

restart)

stop

sleep 3

start
;;

status)

status
;;

*)

echo "Usage: tomcatd {start|stop|restart|status}"

exit 1

esac

exit 0
<span style="font-weight: bold">

二、保存并设置脚本文件

将以上的脚本文件保存在/etc/init.d中,命名为tomcat;
设置tomcat的文件属性

#chmod a+x tomcat


三、设置服务运行级别
最后用chkconfig设置服务运行

#chkconfig --add tomcat
注意:
在tomcat文件的头两行的注释语句中,需要包含chkconfig和description两部分内容(确认不要拼写错误,),否则在执行“chkconfig –add tomcat”时,会出现“tomcat服务不支持chkconfig”的错误提示。

chkconfig这行表示缺省启动的运行级别以及启动和停止的优先级,如该服务缺省不再任何运行级启动,则以 - 代替运行级别。在tomcat中表示脚本在运行级2、3、4、5启动,启动优先权为10,停止优先权为90。

description行对服务进行描述,可以用 “\” 跨行注释。


参考:

[1] RE: Starting Tomcat on Linux as a Service??
[2] Starting Tomcat as a Service on Linux

函数:原型

每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文)。这个属性非常有用:为一个特定类声明通用的变量或者函数。

prototype的定义

你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它的存在。你可以看看下面的例子:

Example PT1

Language:javascript, parsed in: 0.003 seconds, using GeSHi 1.0.7.12
  1. function Test()
  2. {
  3. }
  4. alert(Test.prototype); // 输出 "Object"

运行示例;)

给prototype添加属性

就如你在上面所看到的,prototype是一个对象,因此,你能够给它添加属性。你添加给prototype的属性将会成为使用这个构造函数创建的对象的通用属性。

例如,我下面有一个数据类型Fish,我想让所有的鱼都有这些属性:<span title="代码"><font>livesIn=&quot;water&quot;</font></span><span title="代码"><font>price=20</font></span>;为了实现这个,我可以给构造函数Fishprototype添加那些属性。

Example PT2

Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
  1. function Fish(name, color)
  2. {
  3. this.name=name;
  4. this.color=color;
  5. }
  6. Fish.prototype.livesIn="water";
  7. Fish.prototype.price=20;

接下来让我们作几条鱼:

Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
  1. var fish1=new Fish("mackarel", "gray");
  2. var fish2=new Fish("goldfish", "orange");
  3. var fish3=new Fish("salmon", "white");

再来看看鱼都有哪些属性:

Language:javascript, parsed in: 0.008 seconds, using GeSHi 1.0.7.12
  1. for (var i=1; i<=3; i++)
  2. {
  3. var fish=eval("fish"+i); // 我只是取得指向这条鱼的指针
  4. alert(fish.name+","+fish.color+","+fish.livesIn+","+fish.price);
  5. }

运行示例;)

输出应该是:

Language:text, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
  1. "mackarel, gray, water, 20"
  2. "goldfish, orange, water, 20"
  3. "salmon, white water, 20"

<

p>你看到所有的鱼都有属性livesInprice,我们甚至都没有为每一条不同的鱼特别声明这些属性。这时因为当一个对象被创建时,这个构造函数

djConfig是dojo内置的一个全局设置对象,其作用是可以通过其控制dojo的行为


首先我们需要在引用dojo.js前声明djConfig对象,以便在加载dojo.js的时候才
能够取得所设置的值,虽然在0.3版本以后dojo支持在加载后设置,但是强烈建议你
把声明djConfig的代码作为第一段script


一个完整的djConfig对象定义如下(值均为dojo的默认值)

<script type="text/javascript">
var djConfig = {
isDebug:
false
,
debugContainerId:
""
,
allowQueryConfig:
false
,
baseScriptUri:
""
,
parseWidgets:
true

searchIds: [],
baseRelativePath:
"",
libraryScriptUri:
""
,
iePreventClobber:
false
,
ieClobberMinimal:
true
,
preventBackButtonFix:
true
,
}
;
</script>

isDebug是一个很有用的属性,顾名思义,如果设置为真,则所有dojo.Debug的输出有效,开发时应该设置为true,发布时应该设置为false

debugContainerId同样也是与调试有关的,如果不指定的话,调试信息将会直接利用 document.write输出,这样可能会破坏页面的整体布局,所以你可以指定任何一个可以作为容器的html元素的id作为调试信息输出容器

allowQueryConfig,这个属性指明 dojo是否允许从页面url的参数中读取djConfig中的相关属性,当值为true时,dojo会优先从url参数中读取djConfig的其他属性,比如: http://server/dojoDemo.htm?djConfig.debugContainerId=divDebug

baseScriptUri,一般不需要设置,dojo会自动根据你引用dojo.js的路径设置这个值,比如,,自动获取的值便是 ../dojo/
ps: 如果你有多个工程需要同时引用dojo.js的话,建议也把dojo当作一个独立的工程,引用的时候采用绝对路径就可以了

parseWidgets,这个是可以控制dojo是否自动解析具有dojoType的html元素为对应的widget,如果你没有使用任何Widget,建议设置为false以加快dojo的加载速度

searchIds,这是一个字符串数组,定义了所有需要解析为widget的html元素的ID,如果ID不在其中的html元素是不会被解析的,当数组为空数组时,则所有具有dojoType的元素都会被解析

至于其它的属性,不是用处不大,就是不知道有什么作用

在实际开发中,可以把djConfig的定义放在一个js文件里,并将其作为第一个引用的js文件,这样应该是最方便的。

OVA<鸦-KARAS->片尾曲
-月光石-

摇拽的灯火 瓦砾的街道
透明旋律载满心愿回荡着
燃烧殆尽的天空缓缓沉入水底
银色月光布满大地
m( )m
你的身影溶入青色夜空 恍如梦幻
拼命抱紧你瘦削的双肩
依然害怕你会转瞬消失
m( )m
无数的星晨 宇宙的尽头
初次的相遇甚至令我目眩
笼罩在天空洒下的绚烂光芒中
我们去神圣之河
m( )m
幸福的感觉如潮水袭来 不禁颤抖
希望就这样永远抱紧你
不愿让你消失在我眼前
m( )m
笼罩在天空洒下的绚烂光芒中
我们去向神圣之河
m( )m
你的身影溶入青色夜空 恍如梦幻
拼命抱紧你瘦削的双肩
依然害怕你会转瞬消失

幸福的感觉如潮水袭来 不禁颤抖
希望就这样永远抱紧你
不愿让你消失在我眼前

都说本命年是不祥之年,我本不迷信,不相信这种东西。不过本命年真的很晦气啊。唉!

数数今年遇到的晦气事:

1.房子住了半年,突然房东说要装修。硬把我赶出来,差点无家可归。可怜!

2.从不丢三落四的我居然把手机给丢了,损失了一大把数据,还得花大把Money去买个新的,可怜!

3.现在住的房子电路老化,得换电线,在没钱的时候又得花大钱,穷的可怜!

4.在单位累死累活,头头就是不给我谈合同加工资,温饱就快成问题。大大的可怜!

发发牢骚心情好一点,不知道什么时候能走运,什么时候心情能好点,什么时候能大把大把地数钱!hoho

还是去灵隐烧烧香吧!

微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel。时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发。然而在要求更高的服务器领域,微软本身的产品移植性不好,性能不佳。

在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开。

或者是:我们已经习惯用Excel打印。这样子如果用.net开发是没有问题的,但是有J2EE这个比.net更有前途的开放式的开发环境,难道我为了解决打印的要求去另写客户端的控件?或者在服务器端使用本地代码?第一种方案的问题是关键数据的处理有时候不能在客户端做,第2种方案的问题是牺牲了代码的可移植性和稳定性。如果让客户端只负责处理生成好的报表,那将是一种诱人的选择。

Apache的Jakata项目的POI子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由 Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

这是一个年轻的项目,所以象HDF这样直接支持Word对象的好东西仍然在设计中。其它支持word格式的纯Java方案还有itext,不过也是仍在奋斗中。但是HSSF已经成熟到能够和足够我们使用了。

其实,从开发历史的角度讲,在80年代中期starOffice的原作者在德国成立了StarOffice suite公司,然后到1999年夏天 starOffice被sun收购,再到2000年6月starOffice5.2的发布;并且从starOffice6.0开始,starOffice 建立在OpenOffice的api的基础上,这个公开代码的office项目已经进行了很长的时间。虽然那是由C++写的,但是POI的代码部分也是由 openOffice改过来的。所以,应该对POI充满足够的信心。国内已经有部分公司在他们的办公自动化等Web项目中使用poi了,如日恒的 ioffice,海泰的HTOffice等。

Java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境。然而由于老外的英语只有26个字母,有些情况下,一些程序员用8位的byte处理,一不小心就去掉了CJK的高位。或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多Java应用在CJK的处理上很烦恼。还好在POI HSSF中考虑到这个问题,可以设置encoding为双字节。

POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。

如果用Jakarta ant编译和运行,下载apache Jakarta POI的release中的src包,它里面已经为你生成好了build文件了。只要运行ant就可以了(ant 的安装和使用在此不说了)。如果是用Jbuilder 运行,请在新建的项目中加入poi包。

以Jbuilder6 为例,选择Tools菜单项的config libraries…选项,新建一个lib。在弹出的菜单中选择poi包,如这个jakarta-poi -1.5.1-final-20020820.jar,把poi添加到jbuilder中。然后,右键点击你的项目,在project的 properties菜单中path的required Libraries中,点add,添加刚才加入到jbuilder中的poi到你现在的项目中。

如果你仅仅是为了熟悉POI hssf的使用,可以直接看POI的samples包中的源代码,并且运行它。hssf的各种对象都有例程的介绍。hssf提供的例程在org.apache.poi.hssf.usermodel.examples包中,共有14个,生成的目标xls都是 workbook.xls。如果你想看更多的例程,可以参考hssf的Junit test cases,在poi的包的源代码中有。hssf都有测试代码。
这里只对部分例程的实现做介绍。

HSSF提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell对象,样式和格式,还有辅助操作。有以下几种对象:

HSSFWorkbook excell的文档对象

HSSFSheet excell的表单

HSSFRow excell的行

HSSFCell excell的格子单元

HSSFFont excell字体

HSSFName 名称

HSSFDataFormat 日期格式

在poi1.7中才有以下2项:

HSSFHeader sheet头

HSSFFooter sheet尾

和这个样式

HSSFCellStyle cell样式

辅助操作包括

HSSFDateUtil 日期

HSSFPrintSetup 打印

HSSFErrorConstants 错误信息表

仔细看org.apache.poi.hssf包的结构,不难发现HSSF的内部实现遵循的是MVC模型。

这里我用Rose把org.apache.poi.hssf.usermodel包中的对象反向导入并根据相互关系作了整理,详见下面两图:



图1 基本对象


从中不难可以发现每一个基本对象都关联了一个Record对象。Record对象是一个参考Office格式的相关记录。



图2 HSSFWorkbook


HSSFWorkbook即是一个Excell对象。这幅类图体现的是HSSFWorkbook和基本对象的相互关系。可见,许多对象中也建立了Workbook的引用。还需要注意的是在HSSFWorkbook和HSSFSheet中建立了log机制 POILogger,而且POILogger也是使用apache Log4J实现的。

先看poi的examples包中提供的最简单的例子,建立一个空xls文件。

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.FileOutputStream;

import java.io.IOException;

public class NewWorkbook

{

public static void main(String[] args)

throws IOException

{

HSSFWorkbook wb = new HSSFWorkbook();
//建立新HSSFWorkbook对象

FileOutputStream fileOut =
new FileOutputStream("workbook.xls");

wb.write(fileOut);
//把Workbook对象输出到文件workbook.xls中

fileOut.close();

}

}

通过这个例子,我们建立的是一个空白的xls文件(不是空文件)。在此基础上,我们可以进一步看其它的例子。

import org.apache.poi.hssf.usermodel.*;

import java.io.FileOutputStream;

import java.io.IOException;

public class CreateCells

{

public static void main(String[] args)

throws IOException

{

HSSFWorkbook wb = new HSSFWorkbook();
//建立新HSSFWorkbook对象

HSSFSheet sheet = wb.createSheet("new sheet");
//建立新的sheet对象

// Create a row and put some cells in it.
Rows are 0 based.

HSSFRow row = sheet.createRow((short)0);
//建立新行

// Create a cell and put a value in it.

HSSFCell cell = row.createCell((short)0);
//建立新cell

cell.setCellvalue(1);//设置cell的整数类型的值

// Or do it on one line.

row.createCell((short)1).setCellvalue(1.2);
//设置cell浮点类型的值

row.createCell((short)2).setCellvalue("test");
//设置cell字符类型的值

row.createCell((short)3).setCellvalue(true)
;
//设置cell布尔类型的值

HSSFCellStyle cellStyle = wb.createCellStyle();
//建立新的cell样式

cellStyle.setDataFormat
(HSSFDataFormat.getFormat("m/d/yy h:mm"));
//设置cell样式为定制的日期格式

HSSFCell dCell =row.createCell((short)4);

dCell.setCellvalue(new Date());
//设置cell为日期类型的值

dCell.setCellStyle(cellStyle);
//设置该cell日期的显示格式

HSSFCell csCell =row.createCell((short)5);

csCell.setEncoding(HSSFCell.ENCODING_UTF_16);
//设置cell编码解决中文高位字节截断

csCell.setCellvalue("中文测试_Chinese Words Test");
//设置中西文结合字符串

row.createCell((short)6).setCellType
(HSSFCell.CELL_TYPE_ERROR);
//建立错误cell

// Write the output to a file

FileOutputStream fileOut =
new FileOutputStream("workbook.xls");

wb.write(fileOut);

fileOut.close();

}

}

我稍微修改了原来的examples包中的CreateCells类写了上面的功能测试类。通过这个例子,我们可以清楚的看到xls文件从大到小包括了 HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。

尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。

其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。

如HSSFSheet 的getFooter() getHeader()和setFooter(HSSFFooter hsf) setHeader (HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就没有。运行测试熟悉代码或者使用它做项目时请注意POI的版本。

另外需要注意的是HSSF也有它的对xls基于事件的解析。可以参考例程中的EventExample.java。它通过实现HSSFListener完成从普通流认知Xls中包含的内容,在apache Cocoon中的 org.apache.cocoon.serialization.HSSFSerializer中用到了这个解析。因为Cocoon2是基于事件的,所以POI为了提供快速的解析也提供了相应的事件。当然我们自己也可以实现这个事件接口。

因为POI还不是一个足够成熟的项目,所以有必要做进一步的开发和测试。但是它已经为我们用纯Java操作ole2对象提供了可能,而且克服了ole对象调用的缺陷,提供了服务器端的Excel解决方案。
在Java中读写Excel文件
Jakarta的POI项目提供了一组操纵Windows文档的Java API,如下几个类提供了操作Excel文件的方便的途径: HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell,分别代表了Excel电子表格中的Book、Sheet、行和单元格。
你可以在下面地址下载到最新的POI工具包:
http://jakarta.apache.org/poi/index.html
下面的代码创建一个Excel文件test.xls,并在第一行的第一格中写入一条消息:



1. import org.apache.poi.hssf.usermodel.;2. import java.io.FileOutputStream;3.
  • _// code run against the jakarta-poi-1.5.0-FINAL-20020506.jar._4. public class PoiTest {5.
  • static public void main(String[] args) throws Exception {6. FileOutputStream fos = new FileOutputStream("d:\test.xls");7. HSSFWorkbook wb = new HSSFWorkbook();8. HSSFSheet s = wb.createSheet();9. wb.setSheetName(0, "first sheet");10. HSSFRow row = s.createRow(0);11. HSSFCell cell = row.createCell(0);12. cell.setCellValue("Hello! This message is generated from POI.");13. wb.write(fos);14. fos.close();15. }16.
  • }

  • 读取Excel文件时,首先生存一个POIFSFileSystem对象,由POIFSFileSystem对象构造一个HSSFWorkbook,该HSSFWorkbook对象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串:


    1. POIFSFileSystem fs = null;2. HSSFWorkbook wb = null;3.
  • try {4. fs = new POIFSFileSystem(new FileInputStream("d:\test.xls"));5. wb = new HSSFWorkbook(fs);6. } catch (IOException e) {7. e.printStackTrace();8. }9. HSSFSheet sheet = wb.getSheetAt(0); ////获取第一张Sheet表10. HSSFRow row = sheet.getRow(0); // 第1行11. HSSFCell cell = row.getCell((short) 0); // 第1列的单元格12. *String msg = cell.getStringCellValue();
  • 1. 下载WebSphere Application Server安装包。然后解压到任意目录下(建议/usr/local下)。

    2. 开始安装WebSphere Application Server。需要在图形界面下完成安装(如果出现乱码,可参考linux下java中文字体问题这篇文章)。在/WASinstall/WAS目录下键入./install开始安装。

    3. 安装过程中一路的选择NEXT,途中可选择安装目录,若选择自定义安装的话,还需配置默认概要表的第一服务器各个端口。然后finish完成安装。

    4. 安装完成后,会自动弹出PCT的概要表生成向导,可用来生成新的概要表。也可以运行bin/ProfileCreator目录下的pctLinux.bin程序启动概要表生成向导.(需要在图形界面下)

    5. http://host:9906/ibm/consolez中进入控制台进行配置(默认)