??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲精品福利在线无卡一 ,亚洲免费在线视频,久久亚洲国产精品成人AV秋霞http://m.tkk7.com/dudubird/category/15776.htmlzh-cnWed, 28 Feb 2007 03:35:39 GMTWed, 28 Feb 2007 03:35:39 GMT60JCS(Java Caching System)介以及相x?cjsdn)http://m.tkk7.com/dudubird/articles/72770.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Fri, 29 Sep 2006 04:13:00 GMThttp://m.tkk7.com/dudubird/articles/72770.htmlhttp://m.tkk7.com/dudubird/comments/72770.htmlhttp://m.tkk7.com/dudubird/articles/72770.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/72770.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/72770.html

JCS(Java Caching System)介以及相x?cjsdn)

概述
JCS是Jakarta的项目Turbine的子目。它是一个复合式的缓冲工兗可以将对象~冲到内存、硬盘。具有缓冲对象时间过期设定。还可以通过JCS构徏h~冲的分布式构架Q以实现高性能的应用?br />对于一些需要频J访问而每讉K一ơ都非常消耗资源的对象Q可以时存攑֜~冲ZQ这样可以提高服务的性能。而JCS正是一个很好的~冲工具。缓冲工具对于读操作q远多于写操作的应用性能提高非常显著?br />JCS的详l说明在 http://jakarta.apache.org/turbine/jcs/

JCS的特?br />JCS除了单的对象缓冲在内存中以外,q具有几个特性,以适应企业U缓冲系l的需要。这些特性包括时间过期、烦引式盘~冲、ƈ行式的分布缓冲等?br />内存~冲
JCS现在支持两种内存~冲法LRU和MRU。通常都是使用LRU法?br />org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
使用内存~冲区需要定义缓冲区大小Q当过~冲区限制时Q会缓冲内Ҏ弃掉。如果有配硬盘缓Ԍ则将挤出来的~冲内容写入盘~冲区?/p>

旉q期
JCS对于~冲的对象,可以讑֮~冲q期旉Q一个对象在~冲Z停留的时间超q这个时_׃被认为是“不新鲜”而被攑ּ?/p>

索引式硬盘缓?br />一斚wQؓ了避免缓冲区q大Q撑爆虚拟机的内存,另一斚w又希望能够缓冲更多的对象QJCS可以超出缓冲区大小的对象缓存到盘上。配|上也比较方便,只需要指定缓冲时文件的存放目录位置。硬盘缓冲将~冲对象的内容写到文件上Q但是将讉K索引保存在内存中Q因此也能够辑ֈ可能高的访问效率?/p>

q行式的分布~冲(Lateral)
通常Q将对象~冲在内存中Q一斚w提高了应用的性能Q而另一斚w却得应用不可以分布式发布。因为假设一个应用配|在两台服务器上q行q行Q而两台服务器单独~冲Q则很容易导致两个缓冲区内容出现版本上的不一致而出错。一个机器上修改了数据,q个动作会媄响到本地内存~冲区和数据库服务器Q但是却不会通知到另一台服务器Q导致另一C~冲的数据实际上已经无效了?br />q行式的分布~冲是解决q个问题。可以通过配置Q将几台服务器配成一个缓冲组Q组内每台服务器上有数据更新Q会横向更新的内容通过TCP/IP协议传输到其他服务器的缓冲层Q这样就可以保证不会出现上述情况。这个的~点是如果组内的q行的服务器数量增大后,l内的数据传输量会q速上升。这U方案适合q行服务器的数量比较的情况?/p>

Client/Server式的~冲(Remote)
客户/服务端式的缓冲集。这U方式支持一个主服务器和最高达?56个客L。客L的缓冲层会尝试连接主服务器,如果q接成功Q就会在L务器上注册。每个客L有数据更斎ͼ׃通知C服务器,L务器会将更新通知到除消息来源的客L以外的所有的客户端?br />每个客户端可以配|超q一个服务器Q第一个服务器是主服务器,如果与第一个服务器q接p|Q客L会尝试与备用的服务器q接Q如果连接成功,׃通过备用服务器与其他客户端对话,同时会定期l尝试与L务器取得q接。如果备用服务器也连接失败,׃按照配置序试与下一个备用服务器q接?br />q种方式下,更新通知是一U轻量的,一个机器上的数据更斎ͼ不会把整个数据传输出去,而只是通知一个IDQ当q程的其他机器收到更新通知后,׃把对应ID的缓冲对象从本地的内存缓冲区中移除,以保证不会在~冲区内出现错误数据?br />q种构造需要分别配|客L和服务器Q配|比较麻烦?br />

配置Ҏ
JCS的好处之一Q就是应用在开发的时候,可以不用L思底层的~冲配置构架。同一个应用,只需要修攚w|,可以改变缓冲构Ӟ不需要修改应用的源代码。配|方法也比较单,是修改配置文gcache.ccf。这个文件放|在WEB-INF/classes目录下。配|格式类似log4j的配|文件格式。下面介l一下用各U缓冲结构的配置Ҏ?/p>

内存~冲
#WEB-INF/classes/cache.ccf(以下内容不要换行)
jcs.default=
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
上面配置了默认缓冲属性。一个应用中Q由于对象类型的不同Q可能会使用多个~冲区,每个~冲区都会有一个名字,如果在配|文件中没有指明特定的缓冲区的属性,所有的~冲区都会根据默认属性来构徏。上面的内容Q指明缓冲区的大ؓ存放1000个对象,内存~冲器用LRUMemoryCache对象。可选的q有MRUMemoryCacheQ应该可以自定义新的内存~冲区?000个缓冲对象这个容量,是指每个~冲区都~冲1000个,而不是指所有缓冲区d量。以上配|,可以让应用q行h?/p>

旉q期
如果需要引入时间过期机Ӟ则需要加?br />jcs.default.cacheattributes.cacheattributes.UseMemoryShrinker=true
jcs.default.cacheattributes.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.default.cacheattributes.cacheattributes.ShrinkerIntervalSeconds=60
q里指明对象过3600U则q期Q每?0U检查一ơ?/p>


索引式硬盘缓?br />索引式硬盘缓冲是辅助~冲的一U,使用旉要做以下事情
#定义一个硬盘缓冲区产生?Factory)Q取名ؓDC
jcs.auxiliary.DC=org.apache.stratum.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DC.attributes=org.apache.stratum.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=g:/dev/jakarta-turbine-stratum/raf
#q里其实是指明了缓冲文件存攑ֈ那里厅R?br />然后Q做以下修改
jcs.default=DC
q样Q所有未特别指定属性的~冲区都会自׃用一个硬盘缓冲区Q缓冲文件会以缓冲区的名字来命名。存攑֜指定的目录下?/p>


横向式的q行~冲
q行式的配置如下
jcs.auxiliary.LTCP=org.apache.jcs.auxiliary.lateral.LateralCacheFactory
jcs.auxiliary.LTCP.attributes=org.apache.jcs.auxiliary.lateral.LateralCacheAttributes
jcs.auxiliary.LTCP.attributes.TransmissionTypeName=TCP
jcs.auxiliary.LTCP.attributes.TcpServers=192.168.10.129:1121,192.168.10.222:1121
jcs.auxiliary.LTCP.attributes.TcpListenerPort=1121
jcs.auxiliary.LTCP.attributes.PutOnlyMode=false
q里的配|是?1,129,221三台机器上实现ƈ行缓冲的?br />大家都在1121端口上监听,同时与另外两台机器连接。如果连接失败,׃{待一个时间后再连接一ơ,直到q接成功为止。三台机器中L一台的~冲区发生更斎ͼ比如put和remove动作Q就会把更新传递给另外两台?/p>


单独指明某个~冲区的属?br />如果Q针Ҏ个缓冲区Q比如叫做TestCache1Q需要单独配|属性,可以如下配置?br />jcs.region.testCache1=DC,LTCP
jcs.region.testCache1.cacheattributes=org.apache.stratum.jcs.engine.CompositeCacheAttributes
jcs.region.testCache1.cacheattributes.MaxObjects=1000
jcs.region.testCache1.cacheattributes.MemoryCacheName=org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.testCache1.cacheattributes.UseMemoryShrinker=true
jcs.region.testCache1.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.region.testCache1.cacheattributes.ShrinkerIntervalSeconds=60

system.GroupIdCache
q个概念我也不是很清楚。不qJCS文档中指出配|以下内容会比较好?br />jcs.system.groupIdCache=DC
jcs.system.groupIdCache.cacheattributes=org.apache.stratum.jcs.engine.CompositeCacheAttributes
jcs.system.groupIdCache.cacheattributes.MaxObjects=10000

jcs.system.groupIdCache.cacheattributes.MemoryCacheName=org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
q可能是JCS自己的组理体系上的~冲区?/p>


Client/Server式的~冲(Remote)
q种构架需要单独配|客L和服务端Q如果要研究Q可以查?http://jakarta.apache.org/turbine/jcs/RemoteAuxCache.html



]]>
几个著名java开源缓存系l的介绍http://m.tkk7.com/dudubird/articles/72769.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Fri, 29 Sep 2006 04:12:00 GMThttp://m.tkk7.com/dudubird/articles/72769.htmlhttp://m.tkk7.com/dudubird/comments/72769.htmlhttp://m.tkk7.com/dudubird/articles/72769.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/72769.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/72769.html

几个著名java开源缓存系l的介绍

作者:不详  来源Q?60doc   http://www.csai.cn 2005q?9?8?/p>

  OSCache
  OSCache是个一个广泛采用的高性能的J2EE~存框架QOSCache能用于Q何Java应用E序的普通的~存解决Ҏ?
  OSCache有以下特点:
  ~存M对象Q你可以不受限制的缓存部分jsp面或HTTPhQQ何java对象都可以缓存?
  拥有全面的API--OSCache APIl你全面的程序来控制所有的OSCacheҎ?
  怹~存--~存能随意的写入盘Q因此允许昂늚创徏Qexpensive-to-createQ数据来保持~存Q甚臌让应用重启?
  支持集群--集群~存数据能被单个的进行参数配|,不需要修改代码?
~存记录的过?-你可以有最大限度的控制~存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时Q?
  官方|站 http://www.opensymphony.com/oscache/

  Java Caching System
  JSC(Java Caching System)是一个用分布式的~存pȝQ是Z服务器的java应用E序。它是通过提供理各种动态缓存数据来加速动态web应用?
  JCS和其他缓存系l一P也是一个用于高速读取,低速写入的应用E序?
  动态内容和报表pȝ能够获得更好的性能?
  如果一个网站,有重复的|站l构Q用间歇性更新方式的数据库(而不是连l不断的更新数据库)Q被重复搜烦出相同结果的Q就能够通过执行~存方式改进其性能和׾~性?
  官方|站 http://jakarta.apache.org/turbine/jcs/

  EHCache
  EHCache 是一个纯java的在q程中的~存Q它h以下Ҏ:快速,单,为Hibernate2.1充当可插入的~存Q最的依赖性,全面的文档和试?

  官方|站 http://ehcache.sourceforge.net/

  JCache
  JCache是个开源程序,正在努力成ؓJSR-107开源规范,JSR-107规范已经很多q没改变了。这个版本仍然是构徏在最初的功能定义上?
  官方|站 http://jcache.sourceforge.net/

  ShiftOne
  ShiftOne Java Object Cache是一个执行一pd严格的对象缓存策略的Java libQ就像一个轻量的配|缓存工作状态的框架?
  官方|站 http://jocache.sourceforge.net/

  SwarmCache
  SwarmCache是一个简单且有效的分布式~存Q它使用IP multicast与同一个局域网的其他主行通讯Q是特别为集和数据驱动web应用E序而设计的。SwarmCache能够让典型的L作大大超q写操作的这cd用提供更好的性能支持?
  SwarmCache使用JavaGroups来管理从属关pd分布式缓存的通讯?
  官方|站 http://swarmcache.sourceforge.net

  TreeCache / JBossCache
  JBossCache是一个复制的事务处理~存Q它允许你缓存企业应用数据来更好的改善性能。缓存数据被自动复制Q让你轻松进行JBoss服务器之间的集群工作。JBossCache能够通过JBoss应用服务或其他J2EE容器来运行一个MBean服务Q当Ӟ它也能独立运行?
  JBossCache包括两个模块QTreeCache和TreeCacheAOP?
  TreeCache --是一个树形结构复制的事务处理~存?
  TreeCacheAOP --是一个“面向对象”缓存,它用AOP来动态管理POJO(Plain Old Java Objects)
  注:AOP是OOP的gl,是Aspect Oriented Programming的羃写,意思是面向斚w~程?
  官方|站 http://www.jboss.org/products/jbosscache

  WhirlyCache
  Whirlycache是一个快速的、可配置的、存在于内存中的对象的缓存。它能够通过~存对象来加快网站或应用E序的速度Q否则就必须通过查询数据库或其他代h较高的处理程序来建立?
官方|站 https://whirlycache.dev.java.net/



]]>
如何用java操作excelQ二Q(转)http://m.tkk7.com/dudubird/articles/72762.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Fri, 29 Sep 2006 03:44:00 GMThttp://m.tkk7.com/dudubird/articles/72762.htmlhttp://m.tkk7.com/dudubird/comments/72762.htmlhttp://m.tkk7.com/dudubird/articles/72762.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/72762.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/72762.html

以下是同事写的一个jxl的工L

package test.jxl.util;

import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import jxl.Workbook;
import jxl.write.Blank;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class ConvinWriter {

/**
* 写入一?br />* @param sheet
* @param array
* @param row
* @return the number of cols written
*/
public static int writeRow(WritableSheet sheet, Object[] array, int row) {
int colsWritten = 0;
int col = 0;
for (Object value : array) {
colsWritten += writeObject(sheet, value, col ++, row) ? 1 : 0;
}
return colsWritten;
}

/**
* 写入一?br />* @param sheet
* @param array
* @param beginCol
* @param endCol
* @param row
* @return the number of cols written
*/
public static int writeRow(WritableSheet sheet, Object[] array, int beginCol, int endCol, int row) {
int colsWritten = 0;
int col = beginCol;
for (Object value : array) {
if (col == endCol) {
break;
}
colsWritten += writeObject(sheet, value, col ++, row) ? 1 : 0;
}
return colsWritten;
}

/**
* 写入一?br />* @param sheet 表单
* @param list 数据
* @param row 所在行
* @return the number of cols written
*/
public static int writeRow(WritableSheet sheet, Collection<Object> list, int row) {
int colsWritten = 0;
int col = 0;
for (Object value : list) {
colsWritten += writeObject(sheet, value, col ++, row) ? 1 : 0;
}
return colsWritten;
}

/**
* 写入一?br />* @param sheet
* @param list
* @param beginCol >=0, inclusive
* @param endCol >0, exclusive
* @param row
* @return the number of cols written
*/
public static int writeRow(WritableSheet sheet, Collection<Object> list, int beginCol, int endCol, int row) {
int colsWritten = 0;
int col = beginCol;
for (Object value : list) {
if (col == endCol) {
break;
}
colsWritten += writeObject(sheet, value, col ++, row) ? 1 : 0;
}
return colsWritten;
}

/**
* 向Sheet写入List的数?br />* @param sheet
* @param keyArray
* @param list
* @param beginRow
* @return the number of rows written
*/
public static int writeMapListOfStringKey(WritableSheet sheet, String[] keyArray, Collection<Map<String, Object>> list, int beginRow){
int count = 0;
int rowCount = beginRow;
for (Map<String, Object> element : list) {
boolean bl = writeStringKeyMap(sheet, keyArray, element, rowCount++);
if(bl)count++;
}
return count;
}

/**
* 写入一个Map的数据到一?br />* @param sheet
* @param keyArray
* @param map
* @param row
* @return
*/
public static boolean writeStringKeyMap(WritableSheet sheet, String[] keyArray, Map<String,Object> map, int row){
int col = 0;
for (String key : keyArray) {
key = key.trim();
Object value = map.get(key);
writeObject(sheet, value, col ++, row);
}
return false;
}

/**
* 写入一个对?br />* @param sheet
* @param value
* @param col
* @param row
*/
public static boolean writeObject(WritableSheet sheet, Object value, int col, int row) {
if (value == null) {
return addCell(sheet, new Blank(col, row));
} else if (value instanceof Number) {
Number new_name = (Number) value;
return addCell(sheet, new jxl.write.Number(col, row, new_name.doubleValue()));
} else if (value instanceof Boolean) {
Boolean bool = (Boolean) value;
return addCell(sheet, new jxl.write.Boolean(col, row, bool.booleanValue()));
} else if (value instanceof java.util.Date) {
java.util.Date new_name = (java.util.Date) value;
return addCell(sheet, new DateTime(col, row, new_name));
} else {
return addCell(sheet, new Label(col, row, value.toString()));
}
}

private static boolean addCell(WritableSheet sheet, WritableCell cell) {
try {
sheet.addCell(cell);
} catch (RowsExceededException e) {
e.printStackTrace();
return false;
} catch (WriteException e) {
e.printStackTrace();
return false;
}
return true;
}

/**
* 一个List的内容写C个新的Sheet
* @param path 文g路径
* @param titleArray 行题?br />* @param keyArray 行题?Key
* @param content
* @param sheetName
* @return boolean
*/
public static boolean writeInNewSheet (String path, String[] titleArray, String[] keyArray, Collection<Map<String, Object>> content, String sheetName) {
java.io.File file = new java.io.File(path);
return writeInNewSheet (file, titleArray, keyArray, content, sheetName);
}

/**
* create file
* @param file
* @return
*/
private static boolean createFile(java.io.File file) {
if (!file.exists()) {
try {
if (file.getParentFile().mkdirs()) {
if (file.createNewFile()) {
// do nothing
} else {
return false;
}
} else {
return false;
}
} catch (java.io.IOException e) {
e.printStackTrace();
return false;
}
}
return true;
}

/**
* get the workbook
* @param file
* @return
*/
public static Workbook getWorkBook(java.io.File file) {
jxl.Workbook exists = null;
if (createFile(file)) {
try {
exists = jxl.Workbook.getWorkbook(file);
} catch (jxl.read.biff.BiffException e) {
e.printStackTrace();
return null;
} catch (java.io.IOException e) {
e.printStackTrace();
return null;
}
} else {
return null;
}
return exists;
}

/**
* 创徏workbook
* @param file
* @return writableworkbook, or null when failed
*/
public static WritableWorkbook createWorkbook (java.io.File file) {
jxl.Workbook exists = getWorkBook(file);
jxl.write.WritableWorkbook workbook = null;
try {
if (exists != null) {
workbook = jxl.Workbook.createWorkbook(file, exists);
} else {
workbook = jxl.Workbook.createWorkbook(file);
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
return workbook;
}

/**
* 一个List的内容写C个新的Sheet
* @param file 文g
* @param titleArray 行题?br />* @param keyArray 行题?Key
* @param content
* @param sheetName
*/
public static boolean writeInNewSheet (java.io.File file, String[] titleArray, String[] keyArray, Collection<Map<String, Object>> content, String sheetName) {
jxl.write.WritableWorkbook wookbook = createWorkbook(file);
int sheetNum = wookbook.getNumberOfSheets();
try {
WritableSheet sheet = wookbook.createSheet(sheetName, sheetNum);
ConvinWriter.writeRow(sheet, titleArray, 0);
ConvinWriter.writeMapListOfStringKey(sheet, keyArray, content, 1);
wookbook.write();
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
wookbook.close();
} catch (WriteException e) {
e.printStackTrace();
return false;
} catch (java.io.IOException e) {
e.printStackTrace();
return false;
}
}
return true;
}

/**
* @param args
*/
public static void main(String[] args) {

List<Object> list = new java.util.ArrayList<Object>();
list.add(null);
list.add("String");
list.add(new java.util.Date());
list.add(12345);
list.add(false);
list.add(new ConvinWriter());

List <Map<String, Object>> mapList = new java.util.ArrayList<Map<String, Object>>();
String[] keyArray = new String [] {
"Blank", "String", "DateTime", "Number", "Boolean", "Object"
};

for (int i = 0; i < 3; i ++) {
Map<String, Object> map = new java.util.HashMap<String, Object>(keyArray.length);
if (i == 0)map.put("Blank", null);
map.put("String", "String " + i);
map.put("DateTime", new java.util.Date());
map.put("Number", i);
map.put("Boolean", i % 2 == 0);
map.put("Object", map);
mapList.add(map);
}
// FIXME
java.io.File file = new java.io.File("E:/tempJxlFile.xls");
jxl.Workbook exists = null;
if (file.exists()) {
try {
exists = jxl.Workbook.getWorkbook(file);
} catch (jxl.read.biff.BiffException e) {
e.printStackTrace();
} catch (java.io.IOException e) {
e.printStackTrace();
}
} else {
try {
file.createNewFile();
} catch (java.io.IOException e) {
e.printStackTrace();
}
}

jxl.write.WritableWorkbook wookbook = null;
try {
if (exists != null) {
wookbook = jxl.Workbook.createWorkbook(file, exists);
} else {
wookbook = jxl.Workbook.createWorkbook(file);
}
int sheetNum = wookbook.getNumberOfSheets();
WritableSheet sheet = wookbook.createSheet("testSheet" + (sheetNum + 1), sheetNum);
ConvinWriter.writeRow(sheet, keyArray, 0);
ConvinWriter.writeRow(sheet, list, 1);
ConvinWriter.writeMapListOfStringKey(sheet, keyArray, mapList, 2);
} catch (java.io.IOException e) {
e.printStackTrace();
} finally {
try {
wookbook.write();
wookbook.close();
} catch (WriteException e) {
e.printStackTrace();
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
}
}



]]>
如何用java操作excelQ一Q(转)http://m.tkk7.com/dudubird/articles/72759.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Fri, 29 Sep 2006 03:42:00 GMThttp://m.tkk7.com/dudubird/articles/72759.htmlhttp://m.tkk7.com/dudubird/comments/72759.htmlhttp://m.tkk7.com/dudubird/articles/72759.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/72759.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/72759.html

使用Windows操作pȝ的朋友对ExcelQ电子表|一定不会陌生,但是要用Java语言来操UExcel文gq不是一件容易的事。在
Web应用日益盛行的今天,通过Web来操作Excel文g的需求越来越强烈Q目前较为流行的操作是在JSP或Servlet 中创Z个CSV
Qcomma separated valuesQ文Ӟq将q个文g以MIMEQtext/csvcdq回l浏览器Q接着览器调用Excelq且昄CSV文g。这?br />只是说可以访问到Excel文gQ但是还不能真正的操UExcel文gQ本文将l大家一个惊喜,向大家介l一个开放源码项目,Java
Excel APIQ用它大家可以方便地操纵Excel文g了?br />

JAVA EXCEL API?/font>

Java Excel是一开放源码项目,通过它Java开发h员可以读取Excel文g的内宏V创建新的Excel文g、更新已l存在的Excel文g。用该API?br />Windows操作pȝ也可以通过UJava应用来处理Excel数据表。因为是使用Java~写的,所以我们在Web应用中可以通过JSP、Servlet来调用API?br />现对Excel数据表的讉K?/p>

现在发布的稳定版本是V2.0Q提供以下功能:

  • 从Excel 95?7?000{格式的文g中读取数据;
  • dExcel公式Q可以读取Excel 97以后的公式)Q?
  • 生成Excel数据表(格式为Excel 97Q;
  • 支持字体、数字、日期的格式化;
  • 支持单元格的阴媄操作Q以及颜色操作;
  • 修改已经存在的数据表Q?

现在q不支持以下功能Q但不久׃提供了:

  1. 不能够读取图表信息;
  2. 可以读,但是不能生成公式QQ何类型公式最后的计算值都可以dQ?



 


应用CZ

1 从Excel文gd数据?/font>

Java Excel API既可以从本地文gpȝ的一个文?.xls)Q也可以从输入流中读取Excel数据表。读取Excel数据表的W一步是创徏Workbook(术语Q?br />工作?Q下面的代码片段举例说明了应该如何操作:(完整代码见ExcelReading.java)

												
														import java.io.*;
import jxl.*;
????
try
{
//构徏Workbook对象, 只读Workbook对象
	//直接从本地文件创建Workbook
//从输入流创徏Workbook
    InputStream is = new FileInputStream(sourcefile);
    jxl.Workbook rwb = Workbook.getWorkbook(is);
}
catch (Exception e)
{
	e.printStackTrace();
}

												
										

一旦创ZWorkbookQ我们就可以通过它来讉KExcel Sheet(术语Q工作表)。参考下面的代码片段Q?/p>
												
														//获取W一张Sheet?
Sheet rs = rwb.getSheet(0);

												
										

我们既可能通过Sheet的名U来讉K它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的一Ҏ下标?开始,像数组一栗?br />

一旦得CSheetQ我们就可以通过它来讉KExcel Cell(术语Q单元格)。参考下面的代码片段Q?/p>
												
														//获取W一行,W一列的?
Cell c00 = rs.getCell(0, 0);
String strc00 = c00.getContents();

//获取W一行,W二列的?
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();

//获取W二行,W二列的?
Cell c11 = rs.getCell(1, 1);
String strc11 = c11.getContents();

System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());

												
										

如果仅仅是取得Cell的|我们可以方便地通过getContents()ҎQ它可以Q何类型的Cell值都作ؓ一个字W串q回。示例代码中Cell(0, 0)是文
本型QCell(1, 0)是数字型QCell(1,1)是日期型Q通过getContents()Q三U类型的q回值都是字W型?/p>

如果有需要知道Cell内容的确切类型,API也提供了一pd的方法。参考下面的代码片段Q?/p>
												
														String strc00 = null;
double strc10 = 0.00;
Date strc11 = null;

Cell c00 = rs.getCell(0, 0);
Cell c10 = rs.getCell(1, 0);
Cell c11 = rs.getCell(1, 1);

if(c00.getType() == CellType.LABEL)
{
LabelCell labelc00 = (LabelCell)c00;
strc00 = labelc00.getString();
}
if(c10.getType() == CellType.NUMBER)
{
	NmberCell numc10 = (NumberCell)c10;
strc10 = numc10.getValue();
}
if(c11.getType() == CellType.DATE)
{
DateCell datec11 = (DateCell)c11;
strc11 = datec11.getDate();
}

System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());

												
										

在得到Cell对象后,通过getType()Ҏ可以获得该单元格的类型,然后与API提供的基本类型相匚wQ强制{换成相应的类型,最后调用相应的
取值方法getXXX()Q就可以得到定cd的倹{API提供了以下基本类型,与Excel的数据格式相对应Q如下图所C:



每种cd的具体意义,请参见Java Excel API Document?/p>

当你完成对Excel电子表格数据的处理后Q一定要使用close()Ҏ来关闭先前创建的对象Q以释放d数据表的q程中所占用的内存空_在读
取大量数据时昑־ؓ重要。参考如下代码片D:

												
														//操作完成Ӟ关闭对象Q释攑֍用的内存I间
rwb.close();

												
										

Java Excel API提供了许多访问Excel数据表的ҎQ在q里我只要地介绍几个常用的方法,其它的方法请参考附录中的Java Excel
APIdocument?/p>

WorkbookcL供的Ҏ

1. int getNumberOfSheets()
获得工作薄(WorkbookQ中工作表(SheetQ的个数Q示例:

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
int sheets = rwb.getNumberOfSheets();

												
										

2. Sheet[] getSheets()
q回工作薄(WorkbookQ中工作表(SheetQ对象数l,CZQ?

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
Sheet[] sheets = rwb.getSheets();

												
										

3. String getVersion()
q回正在使用的API的版本号Q好像是没什么太大的作用?

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
String apiVersion = rwb.getVersion();

												
										

Sheet接口提供的方?/b>

1) String getName()
获取Sheet的名UͼCZQ?

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
String sheetName = rs.getName();

												
										

2) int getColumns()
获取Sheet表中所包含的d敎ͼCZQ?

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
int rsColumns = rs.getColumns();

												
										

3) Cell[] getColumn(int column)
获取某一列的所有单元格Q返回的是单元格对象数组Q示例:

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell[] cell = rs.getColumn(0);

												
										

4) int getRows()
获取Sheet表中所包含的总行敎ͼCZQ?

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
int rsRows = rs.getRows();

												
										

5) Cell[] getRow(int row)
获取某一行的所有单元格Q返回的是单元格对象数组Q示例子Q?

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell[] cell = rs.getRow(0);

												
										

6) Cell getCell(int column, int row)
获取指定单元格的对象引用Q需要注意的是它的两个参敎ͼW一个是列数Q第二个是行敎ͼq与通常的行、列l合有些不同?

												
														jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell cell = rs.getCell(0, 0);

												
										

2 生成新的Excel工作?/font>

下面的代码主要是向大家介l如何生成简单的Excel工作表,在这里单元格的内Ҏ不带M修饰?如:字体Q颜色等{?Q所有的内容都作?br />字符串写入?完整代码见ExcelWriting.java)

与读取Excel工作表相|首先要用Workbookcȝ工厂Ҏ创徏一个可写入的工作薄(Workbook)对象Q这里要注意的是Q只能通过API提供?br />工厂Ҏ来创建WorkbookQ而不能用WritableWorkbook的构造函敎ͼ因ؓcWritableWorkbook的构造函Cؓprotectedcd。示例代码片D如
下:

												
														import java.io.*;
import jxl.*;
import jxl.write.*;
????
try
{
//构徏Workbook对象, 只读Workbook对象
//Method 1Q创建可写入的Excel工作?
    jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));

//Method 2Q将WritableWorkbook直接写入到输出流
/*
    OutputStream os = new FileOutputStream(targetfile);
    jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
*/
}
catch (Exception e)
{
	e.printStackTrace();
}

												
										

API提供了两U方式来处理可写入的输出,一U是直接生成本地文gQ如果文件名不带全\径的话,~省的文件会定位在当前目录,如果?br />件名带有全\径的话,则生成的Excel文g则会定位在相应的目录Q另外一U是Excel对象直接写入到输出流Q例如:用户通过览器来讉K
Web服务器,如果HTTP头设|正的话,览器自动调用客L的Excel应用E序Q来昄动态生成的Excel电子表格?br />

接下来就是要创徏工作表,创徏工作表的Ҏ与创建工作薄的方法几乎一P同样是通过工厂模式Ҏ获得相应的对象,该方法需要两个参
敎ͼ一个是工作表的名称Q另一个是工作表在工作薄中的位|,参考下面的代码片段Q?/p>
												
														//创徏Excel工作?
jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);

												
										

"q锅也支好了Q材料也准备齐全了,可以开始下锅了Q?Q现在要做的只是实例化API所提供的Excel基本数据cdQƈ它们添加到工作表中可以了Q参考下面的代码片段Q?/p>
												
														//1.dLabel对象
jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
ws.addCell(labelC);

//d带有字型Formatting的对?
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
ws.addCell(labelCF);

//d带有字体颜色Formatting的对?
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCF);

//2.dNumber对象
jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
ws.addCell(labelN);

//d带有formatting的Number对象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);

//3.dBoolean对象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);

//4.dDateTime对象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);

//d带有formatting的DateFormat对象
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);

												
										

q里有两点大家要引v大家的注意。第一点,在构造单元格Ӟ单元格在工作表中的位|就已经定了。一旦创建后Q单元格的位|是不能
够变更的Q尽单元格的内Ҏ可以改变的。第二点Q单元格的定位是按照下面q样的规?column, row)Q而且下标都是?开始,例如QA1
被存储在(0, 0)QB1被存储在(1, 0)?/p>

最后,不要忘记关闭打开的Excel工作薄对象,以释攑֍用的内存Q参见下面的代码片段Q?/p>
												
														//写入Exel工作?
wwb.write();

//关闭Excel工作薄对?
wwb.close();

												
										

q可能与dExcel文g的操作有少不同Q在关闭Excel对象之前Q你必须要先调用write()ҎQ因为先前的操作都是存储在缓存中的,所以要
通过该方法将操作的内容保存在文g中。如果你先关闭了Excel对象Q那么只能得C张空的工作薄了?/p>

3 拯、更新Excel工作?/font>

接下来简要介l一下如何更C个已l存在的工作薄,主要是下面二步操作,W一步是构造只ȝExcel工作薄,W二步是利用已经创徏?br />Excel工作薄创建新的可写入的Excel工作薄,参考下面的代码片段Q?完整代码见ExcelModifying.java)

												
														//创徏只读的Excel工作薄的对象
jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));

//创徏可写入的Excel工作薄对?
jxl.write.WritableWorkbook  wwb = Workbook.createWorkbook(new File(targetfile), rw);
            
//dW一张工作表
jxl.write.WritableSheet ws = wwb.getSheet(0);

//获得W一个单元格对象
jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
            
//判断单元格的cd, 做出相应的{?
if(wc.getType() == CellType.LABEL)
{
Label l = (Label)wc;
    l.setString("The value has been modified.");
}

//写入Excel对象
wwb.write();

//关闭可写入的Excel对象
wwb.close();

//关闭只读的Excel对象
rw.close();

												
										

之所以用这U方式构建Excel对象Q完全是因ؓ效率的原因,因ؓ上面的示例才是API的主要应用。ؓ了提高性能Q在d工作表时Q与数据
相关的一些输Z息,所有的格式信息Q如Q字体、颜色等{,是不被处理的Q因为我们的目的是获得行数据的|既没有了修饎ͼ也不
会对行数据的g生什么媄响。唯一的不利之处就是,在内存中会同时保存两个同L工作表,q样当工作表体积比较大时Q会占用相当?br />的内存,但现在好像内存的大小q不是什么关键因素了?br />

一旦获得了可写入的工作表对象,我们可以对单元格对象进行更新的操作了,在这里我们不必调用API提供的add()ҎQ因为单元格已经?br />
工作表当中,所以我们只需要调用相应的setXXX()ҎQ就可以完成更新的操作了?/p>

单元格原有的格式化修饰是不能去掉的Q我们还是可以将新的单元g饰加上去Q以使单元格的内容以不同的Ş式表现?/p>

新生成的工作表对象是可写入的Q我们除了更新原有的单元格外Q还可以d新的单元格到工作表中Q这与示?的操作是完全一L?/p>

最后,不要忘记调用write()ҎQ将更新的内容写入到文g中,然后关闭工作薄对象,q里有两个工作薄对象要关闭,一个是只读的,另外一
个是可写入的?/p>
 

 
 


本文只是对Java Excel API中常用的Ҏ作了介绍Q要x详尽C解APIQ请大家参考API文档Q或源代码。Java Excel API是一个开放源码项目,请大家关注它的最新进展,有兴的朋友也可以申请加入这个项目,或者是提出宝贵的意见?/p>

]]>
几种所见所得的在线~辑器(转)http://m.tkk7.com/dudubird/articles/72756.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Fri, 29 Sep 2006 03:31:00 GMThttp://m.tkk7.com/dudubird/articles/72756.htmlhttp://m.tkk7.com/dudubird/comments/72756.htmlhttp://m.tkk7.com/dudubird/articles/72756.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/72756.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/72756.html1.FCKeditor ~辑?br />
FCKeditor is compatible with most internet browsers which include: IE 5.5+ (Windows), Firefox 1.0+, Mozilla 1.3+ and Netscape 7+.
最新版?FCKeditor 2.0
语言环境:多国语言
Ҏ功?所见所?支持q_众多,支持XHTML 1.0,文本格式讄,常见的编?复制,_脓,撤销,文g上传{功?br />授权方式:Open Source & Free
官方地址:http://www.fckeditor.net/
下蝲地址:http://www.fckeditor.net/ download/default.html
演示:http://www.fckeditor.net/ demo/default.html
节:FCKeditor?.0版比1.6版有了许多的改进。首先是FCKeditor的文件结构更加清晎ͼ可以更方便地其部v在自qpȝ中。另?.0版开始支持了Firefox览?br />

2.WebEditor

WebEditorpd文档控gQ采用了ESS专业电子{֐和电子盖章的技术,除l支持手写签名,电子印章Q痕q保留外Q?br />该版本采用了我们强大的B/S通讯技术,能够自由的将服务器数据库

最新版?WebEditor[V4.3.0.0 OCX版]
语言环境:体中?br />技术特?br />采用IE5.0以上版本内置的传输协议,通讯性能E_Q高效?br />采用标准HTTP通讯端口80Q用方便,无需特别配置、安全性好、更无需特别讄防火墙?br />采用插g技术,可以完全融入IE览器中Q方便系l维护、方便用h作?br />采用自定义协议包q行数据的组装和分析Q系l开放性好Q便于二ơ开发?br />采用了Comlg和JavaBeanlg技术,很好的实C跨^台系l,便于开发?br />官方地址:http://www.dragongod.com/
演示:http://www.dragongod.com/ WebEditor/Demo.asp
下蝲:http://www.dragongod.com/ download/index.asp#item1
节:q个~辑器很h中国特色?但必L持安装WebEditor插gQ才能正常运行对于很多用h?,q个是无法接收的?br />

3.InnovaStudio WYSIWYG Editor在线~辑?br />
WYSIWYG 英文QWhat You See Is What You Get(所见所?
一Ƒ֟于web的WYSIWYGQ所见即所得)的HTML~辑器,支持ASP, PHP, ASP.NET
最新版?InnovaStudio WYSIWYG Editor version 2.9
功能Ҏ?快速加?融合所有的HTML标签,全屏~辑模式,所见所得预?拼写?
Ҏ的嵌入式WEB~辑.
官方:http://www.innovastudio.com/
演示:http://www.innovastudio.com/ editor_tutorial.asp
下蝲:官方好像都是收费?,自己ȝ上搜索找?好像有h已经做过?.0的汉化版

节:采用DHTML, JavaScript 构g的WYSIWYG也有很多不之处Q由于代码放在远E服务器Q一些控件事先没有下载到客户端,使得一些操作速度变慢Q那些加入了ActiveX 控g的更慢,另外它无法在|页里直接调用CSSQ所以在操作框里的界面效果和寸和实际上的界面有差距。有很多WYSIWYG对各U浏览器q不兼容Q而且有的也要在IE的高版本下才能正常运?此段老鬼的blog)?br />

4.eWebEditor在线~辑?br />
eWebEditor是基于网늚、所见即所得的在线HTML~辑器。她能够在网上实现许多桌面~辑软g
Q如QWordQ所h的强大可视编辑功能;Ҏ一个真正的l色软gQ不需要在计算Z安装
M的客L软gQ她的易用得WEB开发h员只要一行代码即可完成调用?br />最新版?Version 3.6 (ASP版、PHP版、JSP版、ASP.NET?
官方:http://www.ewebsoft.com/
演示:http://ewebeditor.webasp.net/demo.asp
下蝲:http://ewebeditor.webasp.net/download.asp
功能Ҏ?
U静态:大大提高了效率,最佳的融入您的产品Q?br />多样式支持:您只需要在您的整个|站中用一个eWebEditorQ?br />自动提交Q无需在提交按钮中加入脚本q行处理Q?br />自动获取q程文gQ把别h服务器上的图片等文g自动传到自己的服务器Q?br />相对或绝对\径:完全摆脱了站Ҏpȝ或目录迁U而带来的路径问题Q?br />囑Ş热点链接Q始创能够在U编辑实现图形的热点链接功能Q?br />多种~辑模式QHTML代码模式、可视设计模式、纯文本模式、预览模式;
大小自适应Q可以按你调用的宽度和高度自适应~辑器的大小Q?br />内附文g上传功能Q自带有从客L直接上传到服务器端的功能Q?br />完善的接口:您可以通过接口实时控制或者获取编辑器的内Ҏ者状态;

节:除了他是国的外Q比较符合国人的习惯Q另外也可能是众多编辑器Q唯一q带后台理模式Q可以直接在后台理~辑模式Q另外接口定刉常容易,具体的自己可以去官方下蝲回来看看?br />

5.htmlarea

htmlarea.com is a directory of browser based wysiwyg editor components for use
in CMS (content management software) and other web software.
htmlArea是一N怼U的所见即所得编辑器,被用在CMSpȝ或其他的WEBpȝ?.
语言环境:多国语言?br />版本:version 3.0
官方:http://www.htmlarea.com/
演示:没找?
下蝲:官方没找C载地址Qsiyizhu找了?.0的版?http://www.92key.com/mp3/chinahtml@_HTMLArea3.rar
节:q个~辑器调用也非常方便Q已l广泛用在各UCMS和blogpȝ里,记得bo-blog、phpArticle里整合了q个~辑器?br />

6.XStandard XHTML (Strict or 1.1)

WYSIWYG Editor 也是所见所?比v前几个,它已l完全支持XHTML 1.1的严格验证,q个非常厉害 @@
版本:XStandard Version 1.6.2
官方:http://xstandard.com/
下蝲:http://xstandard.com/ download.asp
演示:



节:q个~辑器,也很在国内的CMSQblog上见到有Z用,当然一个原因就是它是一个共享Y件。XStandard Lite是免费的QXStandard Pro?0天的试用期,而且hq不Ԍ179?br />

7.Cross-Browser Rich Text Editor

The cross-browser rich-text editor (RTE) is based on the designMode() functionality introduced in Internet Explorer 5, and implemented in Mozilla 1.3+ using the Mozilla Rich Text Editing API. The cross-browser rich-text editor now includes table support (as of 2/10/2005) as well as an option to generate xhtml-compliant code
官方:http://www.kevinroth.com
演示:http://www.kevinroth.com /rte/demo.htm
下蝲:http://www.kevinroth.com /rte/demo.htm


]]>
如何l图片加水印Q{载)http://m.tkk7.com/dudubird/articles/72749.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Fri, 29 Sep 2006 03:14:00 GMThttp://m.tkk7.com/dudubird/articles/72749.htmlhttp://m.tkk7.com/dudubird/comments/72749.htmlhttp://m.tkk7.com/dudubird/articles/72749.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/72749.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/72749.html我是l合在jspsmart.upload下用的Q这个是imgbean的代?br />package com.dcampus;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.awt.image.*;
import org.w3c.dom.*;
import com.sun.image.codec.jpeg.*;
import javax.imageio.*;

public class ImgBean_i{
public void ImgBean_i(){

}

public void ImgYin(String Imagename_biao,String ImgName){
try{
File _file = new File(ImgName);
Image src = ImageIO.read(_file);
int wideth=src.getWidth(null);
int height=src.getHeight(null);
BufferedImage image=new BufferedImage(wideth,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.createGraphics();
g.drawImage(src,0,0,wideth,height,null);

//水印文g
File _filebiao = new File(Imagename_biao);
Image src_biao = ImageIO.read(_filebiao);
int wideth_biao=src_biao.getWidth(null);
int height_biao=src_biao.getHeight(null);
g.drawImage(src_biao,wideth-110,height-110,wideth_biao,height_biao,null);
//水印文g在原囄文g的位|,原图片文件的右下角ؓwideth-0,height-0
 g.dispose();
FileOutputStream out=new FileOutputStream(ImgName);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
catch(Exception e){
System.out.println(e);
}
}
}
以下是修改过的smartupload代码
<%@ page language="java" import="com.jspsmart.upload.*" import="java.util.*,java.text.*"%>
<%@ page contentType="text/html;charset=GBK" %>

<jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload"/>

<HTML><META http-equiv=Content-Type content="text/html; charset=gb2312">
<LINK href="images/css.css" rel=stylesheet>
<BODY BGCOLOR="white" leftmargin="0" topmargin="0">
<%
 
 int count=0;      
 String path=request.getRealPath("");
 mySmartUpload.initialize(pageContext);

 mySmartUpload.upload();

 connectToDatabase();
 for (int i=0;i<mySmartUpload.getFiles().getCount();i++){

  com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);

  if (!myFile.isMissing()) {
   int Size=myFile.getSize() ;
   String FileName=myFile.getFileName();
   String FileExt=myFile.getFileExt();
   String uploadtime=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( java.util.Calendar.getInstance().getTime() );
   if(Size>=1000000) {
    out.println("文g过1000KQ?); //限制大小
   }else{
    if((FileExt.equals("jpg")) || (FileExt.equals("JPG")) || (FileExt.equals("gif")) || (FileExt.equals("GIF"))) {
     java.util.Date date = new java.util.Date();
     SimpleDateFormat formatter1 = new SimpleDateFormat("yyyyMMddHHmmss");
                String name1=FileName.substring(0,FileName.indexOf("."));
                String name2=FileName.substring(FileName.indexOf("."),FileName.length());
                String newname=name1+formatter1.format(date)+name2;
     //session.putValue("path1",newname);
     myFile.saveAs("/photo/upfile/" + newname);
     if(Integer.parseInt(sy)==1) {
      com.pic.ImgBean_i bbb= new com.pic.ImgBean_i();
      bbb.ImgYin(path+"/photo/images/shuiyin.gif",path+"/photo/upfile/" + newname);//q里是水印文件的来源地址Q可修改成取得下拉菜单值的形式Q这样就可以实现打文字水印或者图片水C
     }
     stmt.executeUpdate("insert into img_photo (name,http,userid,classid,title,content,imgsize,format,num,primflag,posttime) values ()");
     out.println(("<br><br><center>囄上传成功Q?lt;br>").toString());
    }else{
     out.println("文g格式不对Q?);
    }
   }
   count ++;
  }
   else
  {
   out.println("未找C传文Ӟ\n");
  }
 }
 disConnectToDatabase();
%>
</BODY>
</HTML>



]]>
使用Java Servlet动态生成图片(转)http://m.tkk7.com/dudubird/articles/72618.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Thu, 28 Sep 2006 08:39:00 GMThttp://m.tkk7.com/dudubird/articles/72618.htmlhttp://m.tkk7.com/dudubird/comments/72618.htmlhttp://m.tkk7.com/dudubird/articles/72618.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/72618.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/72618.html
  本质上,览器向服务器请求静态图片如jpegӞ服务器返回的仍然是标准的http响应Q只不过http头的contentType不是text/htmlQ而是image/jpeg而已Q因此,我们在Servlet中只要设|好contentTypeQ然后发送图像的数据,览器就能正解析ƈ昄出图片?br />
  在Java中,java.awt和java.awt.image包提供了基本的绘制图像的能力Q我们可以在内存中绘制好需要的囑ŞQ然后编码成jpeg或其他图像格式,最后发送相应给览器即可。下面是使用Servlet动态创建图像的详细步骤Q?br />
  1Q创建BufferedImage对象Q该对象存在内存中,负责保存l制的图像;

  2Q创建Graphics2D对象Q该对象负责l制所需的图像;

  3Q当l制完成后,调用com.sun.image.codec.jpeg包的JPEG~码器对其编码;

  4Q最后将~码后的数据输出至HttpResponse卛_?br />
  注意com.sun.image.codec.jpeg包位于JDK目录的rt.jar包中Q它不是公开的APIQ需要将rt.jar复制到web应用E序的WEB-INF/lib下?br />
  我们先创Z个最单的ServletQ?br />
public class CreateImageServlet extends HttpServlet {
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
  response.setContentType("image/jpeg");
 }
}

  我们首先讄了response的contentType为image/jpegQ这h览器可以正识别?br />
  然后Q创Z个大ؓ100x100的BufferedImage对象Q准备绘图:
int width = 100;
int height = 100;
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

  接着QBufferedImage对象中获取Graphics2D对象q绘图:


Graphics2D g = bi.createGraphics(); // 创徏Graphics2D对象
// 填充背景为白Ԍ
g.setBackground(Color.BLUE);
g.clearRect(0, 0, width, height);
// 讄前景Ԍ
g.setColor(Color.RED);
// 开始绘图:
g.drawLine(0, 0, 99, 99); // l制一条直U?br />// l图完成Q释放资源:
g.dispose();
bi.flush();

  然后Q对BufferedImageq行JPEG~码Q?


JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1.0f, false);
encoder.setJPEGEncodeParam(param);
try {
 encoder.encode(bi);
}
catch(IOException ioe) {
 ioe.printStackTrace();
}

  ~码后的JPEG囑փ直接输出Cout对象中,我们只要传入response. getOutputStream()可以直接输出到HttpResponse中?br />
  下面是完整的代码Q?

package com.crackj2ee.web.util;

import java.io.*;
import java.awt.*;
import java.awt.image.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.sun.image.codec.jpeg.*;

/**
* @author Liao Xue Feng
*/
public class CreateImageServlet extends HttpServlet {

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
  response.setContentType("image/jpeg");
  createImage(response.getOutputStream());
 }

 private void createImage(OutputStream out) {
  int width = 100;
  int height = 100;
  BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  Graphics2D g = bi.createGraphics();
  // set background:
  g.setBackground(Color.BLUE);
  g.clearRect(0, 0, width, height);
  // set fore color:
  g.setColor(Color.RED);
  // start draw:
  g.drawLine(0, 0, 99, 199);
  // end draw:
  g.dispose();
  bi.flush();
  // encode:
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
  JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
  param.setQuality(1.0f, false);
  encoder.setJPEGEncodeParam(param);
  try {
   encoder.encode(bi);
  }
  catch(IOException ioe) {
   ioe.printStackTrace();
  }
 }
}

  最后将q个Servlet~译Q注册到web.xml中,映射路径?CreateImageQ写一个简单的index.html试Q?br />


QhtmlQ<headQ</headQ?br />QbodyQ?br />Qimg src="CreateImage"Q?br />Q?bodyQ</htmlQ?/td>

  如能正确昄Q大功告成!


]]>
内存泄漏解决之道http://m.tkk7.com/dudubird/articles/62934.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Fri, 11 Aug 2006 03:10:00 GMThttp://m.tkk7.com/dudubird/articles/62934.htmlhttp://m.tkk7.com/dudubird/comments/62934.htmlhttp://m.tkk7.com/dudubird/articles/62934.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/62934.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/62934.html

摘要

  虽然Java虚拟?JVM)及其垃圾攉?garbage collectorQGC)负责理大多数的内存dQJava软gE序中还是有可能出现内存泄漏。实际上Q这在大型项目中是一个常见的问题。避免内存泄漏的W一步是要弄清楚它是如何发生的。本文介l了~写Java代码的一些常见的内存泄漏陷阱Q以及编写不泄漏代码的一些最佛_c一旦发生了内存泄漏Q要指出造成泄漏的代码是非常困难的。因此本文还介绍了一U新工具Q用来诊断泄漏ƈ指出Ҏ原因。该工具的开销非常,因此可以使用它来L处于生中的pȝ的内存泄漏?/p>

垃圾攉器的作用

  虽然垃圾攉器处理了大多数内存管理问题,从而ɾ~程人员的生zd得更L了,但是~程人员q是可能犯错而导致出现内存问题。简单地_GC循环地跟t所有来自“根”对象(堆栈对象、静态对象、JNI句柄指向的对象,诸如此类Q的引用Qƈ所有它所能到辄对象标记为活动的。程序只可以操纵q些对象Q其他的对象都被删除了。因为GC使程序不可能到达已被删除的对象,q么做就是安全的?/p>

  虽然内存理可以说是自动化的Q但是这q不能ɾ~程人员免受思考内存管理问题之苦。例如,分配Q以及释放)内存M有开销Q虽然这U开销对编Eh员来说是不可见的。创Z太多对象的程序将会比完成同样的功能而创建的对象却比较少的程序更慢一些(在其他条件相同的情况下)?/p>

  而且Q与本文更ؓ密切相关的是Q如果忘记“释䏀先前分配的内存Q就可能造成内存泄漏。如果程序保留对永远不再使用的对象的引用Q这些对象将会占用ƈ耗尽内存Q这是因动化的垃圾收集器无法证明q些对象不再用。正如我们先前所说的Q如果存在一个对对象的引用,对象p定义为活动的Q因此不能删除。ؓ了确保能回收对象占用的内存,~程人员必须保该对象不能到达。这通常是通过对象字D设|ؓnull或者从集合(collection)中移除对象而完成的。但是,注意Q当局部变量不再用时Q没有必要将其显式地讄为null。对q些变量的引用将随着Ҏ的退自动清除?/p>

  概括地说Q这是内存托管语言中的内存泄漏产生的主要原因:保留下来却永q不再用的对象引用?/p>

典型泄漏

  既然我们知道了在Java中确实有可能发生内存泄漏Q就让我们来看一些典型的内存泄漏及其原因?/p>

全局集合

  在大的应用程序中有某U全局的数据储存库是很常见的,例如一个JNDI树或一个会话表。在q些情况下,必须注意理储存库的大小。必L某种机制从储存库中移除不再需要的数据?/p>

  q可能有多种ҎQ但是最常见的一U是周期性运行的某种清除d。该d验证储存库中的数据QƈU除M不再需要的数据?/p>

  另一U管理储存库的方法是使用反向链接(referrer)计数。然后集合负责统计集合中每个入口的反向链接的数目。这要求反向链接告诉集合何时会退出入口。当反向链接数目为零Ӟ该元素就可以从集合中U除了?/p>

~存

  ~存是一U数据结构,用于快速查扑ַl执行的操作的结果。因此,如果一个操作执行v来很慢,对于常用的输入数据,可以将操作的结果缓存,q在下次调用该操作时使用~存的数据?/p>

  ~存通常都是以动态方式实现的Q其中新的结果是在执行时d到缓存中的。典型的法是:

  • 查结果是否在~存中,如果在,p回结果?
  • 如果l果不在~存中,p行计?
  • 计出来的l果d到缓存中Q以便以后对该操作的调用可以使用?

  该算法的问题Q或者说是潜在的内存泄漏Q出在最后一步。如果调用该操作时有相当多的不同输入Q就有相当多的l果存储在缓存中。很明显q不是正的Ҏ?/p>

  Z预防q种h潜在破坏性的设计Q程序必ȝ保对于缓存所使用的内存容量有一个上限。因此,更好的算法是Q?/p>

  • 查结果是否在~存中,如果在,p回结果?
  • 如果l果不在~存中,p行计?
  • 如果~存所占的I间q大Q就U除~存最久的l果?
  • 计出来的l果d到缓存中Q以便以后对该操作的调用可以使用?

  通过始终U除~存最久的l果Q我们实际上q行了这L假设Q在来Q比L存最久的数据Q最q输入的数据更有可能用到。这通常是一个不错的假设?/p>

  新算法将保~存的容量处于预定义的内存范围之内。确切的范围可能很难计算Q因为缓存中的对象在不断变化Q而且它们的引用包|万象。ؓ~存讄正确的大是一w常复杂的dQ需要将所使用的内存容量与索数据的速度加以q?/p>

  解决q个问题的另一U方法是使用java.lang.ref.SoftReferencec跟t缓存中的对象。这U方法保证这些引用能够被U除Q如果虚拟机的内存用而需要更多堆的话?/p>

ClassLoader

  Java ClassLoaderl构的用ؓ内存泄漏提供了许多可乘之机。正是该l构本n的复杂性ClassLoader在内存泄漏方面存在如此多的问题。ClassLoader的特别之处在于它不仅涉及“常规”的对象引用Q还涉及元对象引用,比如Q字Dc方法和cR这意味着只要有对字段、方法、类或ClassLoader的对象的引用QClassLoader׃ȝ在JVM中。因为ClassLoader本n可以兌许多cd光态字D,所以就有许多内存被泄漏了?/p>

定泄漏的位|?/strong>

  通常发生内存泄漏的第一个迹象是Q在应用E序中出COutOfMemoryError。这通常发生在您最不愿意它发生的生产环境中Q此时几乎不能进行调试。有可能是因为测试环境运行应用程序的方式与生产系l不完全相同Q因而导致泄漏只出现在生产中。在q种情况下,需要用一些开销较低的工h监控和查扑ֆ存泄漏。还需要能够无需重启pȝ或修改代码就可以这些工兯接到正在q行的系l上。可能最重要的是Q当q行分析Ӟ需要能够断开工具而保持系l不受干扰?/p>

  虽然OutOfMemoryError通常都是内存泄漏的信P但是也有可能应用E序实正在使用q么多的内存Q对于后者,或者必d加JVM可用的堆的数量,或者对应用E序q行某种更改Q它用较的内存。但是,在许多情况下QOutOfMemoryError都是内存泄漏的信受一U查明方法是不间断地监控GC的活动,定内存使用量是否随着旉增加。如果确实如此,可能发生了内存泄漏?/p>

详细输出

  有许多监控垃圾收集器zd的方法。而其中用最q泛的可能是使用-Xverbose:gc选项启动JVMQƈ观察输出?/p>[memory ] 10.109-10.235: GC 65536K->16788K (65536K), 126.000 ms

 头后面的|本例中是16788KQ是垃圾攉所使用的堆的容量?/p>

控制?/strong>

  查看q箋不断的GC的详l统计信息的输出是非常乏味的。幸好有q方面的工具。JRockit Management Console可以昄堆用量的图C。借助于该图,可以很容易地看出堆用量是否随时间增加?/p>

?. JRockit Management Console

  甚至可以配置该管理控制台Q以便如果发生堆使用量过大的情况Q或Z其他的事ӞQ控制台能够向您发送电子邮件。这明显使内存泄漏的查看变得更容易了?/p>

内存泄漏工?/strong>

  q有其他的专门进行内存泄漏检的工具。JRockit Memory Leak Detector可以用来查看内存泄漏Qƈ可以更深入地查出泄漏的根源。这个强大的工具是紧密集成到JRockit JVM中的Q其开销非常,对虚拟机的堆的访问也很容易?/p>

专业工具的优?/strong>

  一旦知道确实发生了内存泄漏Q就需要更专业的工h查明Z么会发生泄漏。JVM自己是不会告诉您的。这些专业工具从JVM获得内存pȝ信息的方法基本上有两U:JVMTI和字节码技?byte code instrumentation)。Java虚拟机工h?Java Virtual Machine Tools InterfaceQJVMTI)及其前nJava虚拟机监视程序接?Java Virtual Machine Profiling InterfaceQJVMPI)是外部工具与JVM通信q从JVM攉信息的标准化接口。字节码技术是指用探器处理字节码以获得工具所需的信息的技术?/p>

  对于内存泄漏来_q两U技术有两个~点Q这使它们不太适合用于生环境。首先,它们在内存占用和性能降低斚w的开销不可忽略。有兛_使用量的信息必须以某U方式从JVM导出Qƈ攉到工具中q行处理。这意味着要ؓ工具分配内存。信息的导出也媄响了JVM的性能。例如,当收集信息时Q垃圾收集器运行得比较慢。另外一个缺Ҏ需要始l将工具q在JVM上。这是不可能的:工兯在一个已l启动的JVM上,q行分析Q断开工具Qƈ保持JVMq行?/p>

  因ؓJRockit Memory Leak Detector是集成到JVM中的Q就没有q两个缺点了。首先,许多处理和分析工作是在JVM内部q行的,所以没有必要{换或重新创徏M数据。处理还可以背负(piggyback)在垃圾收集器本n上而进行,q意味着提高了速度。其ơ,只要JVM是?Xmanagement选项Q允讔R过q程JMX接口监控和管理JVMQ启动的QMemory Leak Detector可以与q行中的JVMq行q接或断开。当该工h开Ӟ没有M东西遗留在JVM中,JVM又将以全速运行代码,正如工具q接之前一栗?/p>

势分析

  让我们深入地研究一下该工具以及它是如何用来跟踪内存泄漏的。在知道发生内存泄漏之后Q第一步是要弄清楚泄漏了什么数?-哪个cȝ对象引v了泄漏?JRockit Memory Leak Detector是通过在每ơ垃圾收集时计算每个cȝ现有对象的数目来实现q一步的。如果特定类的对象数目随旉而增长(“增长率”)Q就可能发生了内存泄漏?


?. Memory Leak Detector的趋势分析视?/p>

  因ؓ泄漏可能像细一样非常小Q所以趋势分析必运行很长一D|间。在短时间内Q可能会发生一些类的局部增长,而之后它们又会跌落。但是趋势分析的开销很小Q最大开销也不q是在每ơ垃圾收集时数据包由JRockit发送到Memory Leak DetectorQ。开销不应该成ZQ何系l的问题——即使是一个全速运行的生中的pȝ?/p>

  起初数目会蟩跃不停,但是一D|间之后它们就会稳定下来,q显C出哪些cȝ数目在增ѝ?/p>

扑ևҎ原因

  有时候知道是哪些cȝ对象在泄漏就以说明问题了。这些类可能只用于代码中的非常有限的部分Q对代码q行一ơ快速检查就可以昄出问题所在。遗憑֜是,很有可能只有q类信息qƈ不够。例如,常见到泄漏出在类java.lang.String的对象上Q但是因为字W串在整个程序中都用,所以这q没有多大帮助?/p>

  我们想知道的是,另外q有哪些对象与泄漏对象关联?在本例中是String。ؓ什么泄漏的对象q存在?哪些对象保留了对q些对象的引用?但是能列出的所有保留对String的引用的对象会非常多,以至于没有什么实际用处。ؓ了限制数据的数量Q可以将数据按类分组Q以便可以看出其他哪些对象的cM泄漏对象(String)兌。例如,String在Hashtable中是很常见的Q因此我们可能会看到与String兌的Hashtable数据对象。由Hashtable数据倒推Q我们最l可以找Cq些数据Ҏ关的Hashtable对象以及StringQ如?所C)?


?. 在工具中看到的类型图的示例视?/p>

倒推

  因ؓ我们仍然是以cȝ对象而不是单独的对象来看待对象,所以我们不知道是哪个Hashtable在泄漏。如果我们可以弄清楚pȝ中所有的Hashtable都有多大Q我们就可以假定最大的Hashtable是正在泄漏的那一个(因ؓ随着旉的流逝它会篏U泄漏而增长得相当大)。因此,一份有x有Hashtable对象以及它们引用了多数据的列表Q将会帮助我们指出造成泄漏的确切Hashtabl?


?. 界面QHashtable对象以及它们所引用数据的数量的列表

  对对象引用数据数目的计算开销非常大(需要以该对象作为根遍历引用图)Q如果必d许多对象都这么做Q将会花很多旉。如果了解一点Hashtable的内部实现原理就可以扑ֈ一条捷径。Hashtable的内部有一个Hashtable数据的数组。该数组随着Hashtable中对象数目的增长而增ѝ因此,为找出最大的HashtableQ我们只需扑և引用Hashtable数据的最大数l。这栯快很多?


?. 界面Q最大的Hashtable数据Ҏl及其大的清单

更进一?/strong>

  当找到发生泄漏的Hashtable实例Ӟ我们可以看到其他哪些实例在引用该HashtableQƈ倒推回去看看是哪个Hashtable在泄漏?/p>


?6. q就是工具中的实例图

  例如Q该Hashtable可能是由MyServercd的对象在名ؓactiveSessions的字D中引用的。这U信息通常p以查找源代码以定位问题所在了?


?. 查对象以及它对其他对象的引用

扑և分配位置

  当跟t内存泄漏问题时Q查看对象分配到哪里是很有用的。只知道它们如何与其他对象相兌Q即哪些对象引用了它们)是不够的Q关于它们在何处创徏的信息也很有用。当然了Q您q不惛_建应用程序的辅助构gQ以打印每次分配的堆栈跟t?stack trace)。您也不想仅仅ؓ了跟t内存泄漏而在q行应用E序时将一个分析程序连接到生环境中?/p>

  借助于JRockit Memory Leak DetectorQ应用程序中的代码可以在分配时进行动态添加,以创建堆栈跟t。这些堆栈跟t可以在工具中进行篏U和分析。只要不启用׃会因该功能而生成本,q意味着随时可以q行分配跟踪。当h分配跟踪ӞJRockit ~译器动态插入代码以监控分配Q但是只针对所h的特定类。更好的是,在进行数据分析时Q添加的代码全部被移除,代码中没有留下Q何会引v应用E序性能降低的更攏V?


?. CZE序执行期间String的分配的堆栈跟踪

l束?/strong>

  内存泄漏是难以发现的。本文重点介l了几种避免内存泄漏的最佛_践,包括要始l记住在数据l构中所攄的内容,以及密切监控内存使用量以发现H然的增ѝ?/p>

  我们都已l看CJRockit Memory Leak Detector是如何用于生产中的系l以跟踪内存泄漏的。该工具使用一U三步式的方法来扑և泄漏。首先,q行势分析Q找出是哪个cȝ对象在泄漏。接下来Q看看有哪些其他的类与泄漏的cȝ对象相关联。最后,q一步研I单个对象,看看它们是如何互相关联的。也有可能对pȝ中所有对象分配进行动态的堆栈跟踪。这些功能以及该工具紧密集成到JVM中的Ҏ您可以以一U安全而强大的方式跟踪内存泄漏q进行修复?/p>

]]>
վ֩ģ壺 Ƶ߹ۿվ| ޸Ƶһ| ŮƵ| þùƷȰ׽| ŷ͵ҹɫ| ֱƵ| Ʒպһ| þWWW˳ɡƬ| ɫĻվ| ĻһƵ| ɫ͵ר| þùƷһ| ۺ˾þôý| ھƷ߹ۿ| ˾þں2019| 鶹Ƶѹۿ| Avһ| ޹˾þۺ| Ļ߹ۿ| þþþþaŷAV| 2022ĻƵ| Avһ| ˬˬձƵ| һһdvd߹ۿƵ | avר߹ۿ| һƬƵѿ| Ƶ | ձ19žžڵѶͼ| ҹƷ| þþƷҹɫAVվ| 91ƷѾþþþþ| ޾Ʒһۺ99þ| þþƷƷ| 98ƷȫѹۿƵ| ޾ǧ˾ղ| ޾Ʒרþþ| ѿ۳ҹվ| һƵ| һѹۿ| ۺ| hƵѹۿ|