﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-落叶归根-文章分类-Java</title><link>http://www.blogjava.net/allan-oy/category/9958.html</link><description>一个人首先要尊重别人，然后才能得到别人的尊重；一个人首先要对自己负责，然后才有资格去对别人负责。</description><language>zh-cn</language><lastBuildDate>Wed, 09 Jan 2008 15:52:28 GMT</lastBuildDate><pubDate>Wed, 09 Jan 2008 15:52:28 GMT</pubDate><ttl>60</ttl><item><title>jbuilder2005实战jsp之(登录和退出)日志和部署</title><link>http://www.blogjava.net/allan-oy/articles/173842.html</link><dc:creator>落叶归根</dc:creator><author>落叶归根</author><pubDate>Tue, 08 Jan 2008 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/allan-oy/articles/173842.html</guid><wfw:comment>http://www.blogjava.net/allan-oy/comments/173842.html</wfw:comment><comments>http://www.blogjava.net/allan-oy/articles/173842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/allan-oy/comments/commentRss/173842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/allan-oy/services/trackbacks/173842.html</trackback:ping><description><![CDATA[<strong>用户登录和退出日志<br />
</strong><br />
（摘自：<a href="http://www.readygo.com.cn/J2EE/070501/202306UESE.htm">http://www.readygo.com.cn/J2EE/070501/202306UESE.htm</a>）<br />
　　<br />
　　当用户登录系统时，在日志表中插入一条记录，记录用户登录的时间，在用户退出系统时记录用户退出系统的时间。<br />
　　<br />
　　我们利用httpsessionbindinglistener接口来完成记录登录和退出日志的功能，该接口中定义了两个方法：<br />
　　<br />
　　&#183;valuebound(httpsessionbindingevent event)<br />
　　<br />
　　&#183;valueunbound(httpsessionbindingevent event)<br />
　　<br />
　　如果一个类实现了httpsessionbindinglistener接口，当对象通过session.setattribute()被绑定到session中时，则对象的接口方法valuebound()被自动调用，当对象从session中移出时(通过调用session.invalidate()、session.removeattribute()或session自动过期时)，valueunbound()方法将被自动调用。<br />
　　<br />
　　下面我们使user.java类实现httpsessionbindinglistener接口，调整后的代码如下所示：<br />
　　<br />
　　代码清单 18 实现了httpsessionbindinglistener的user.java<br />
　　<br />
　　1. package bookstore;<br />
　　2. import javax.servlet.http.httpsessionbindinglistener;<br />
　　3. import javax.servlet.http.httpsessionbindingevent;<br />
　　4. import java.sql.*;<br />
　　5. import java.text.simpledate表单at;<br />
　　6. import java.util.date;<br />
　　7.<br />
　　8. public class user implements httpsessionbindinglistener<br />
　　9. {<br />
　　10. 　&#8230;<br />
　　11. 　private string logindatetime;//用户登录时间<br />
　　12. 　&#8230;<br />
　　13. 　public void valuebound(httpsessionbindingevent event)<br />
　　14. 　{<br />
　　15. 　　connection conn = null;<br />
　　16. 　　string sqlstr = "insert into t_login_log(id, user_id, dt_login) " +<br />
　　17. 　　　　　　" values(seq_login_log_id.nextval,?,? )";<br />
　　18. 　　try<br />
　　19. 　　{<br />
　　20. 　　　conn = dbconnection.getconnection();<br />
　　21. 　　　preparedstatement pstat = conn.preparestatement(sqlstr);<br />
　　22. 　　　logindatetime = getcurrdatetimestr(); //当前时间串<br />
　　23. 　　　pstat.setstring(1, userid);<br />
　　24. 　　　pstat.setstring(2, logindatetime);<br />
　　25. 　　　pstat.executeupdate();<br />
　　26.<br />
　　27. 　　} catch (sqlexception e)<br />
　　28. 　　{<br />
　　29. 　　　throw new runtimeexception(<br />
　　30. 　　　　"用户登陆日志写入出错");<br />
　　31. 　　} finally<br />
　　32. 　{<br />
　　33. 　try<br />
　　34. 　{<br />
　　35. 　　if (conn != null)<br />
　　36. 　　{<br />
　　37. 　　　conn.close();<br />
　　38. 　　}<br />
　　39. 　} catch (sqlexception ex)<br />
　　40. 　{<br />
　　41. 　　ex.printstacktrace();<br />
　　42. 　}<br />
　　43. 　}<br />
　　44. }<br />
　　45.<br />
　　46. public void valueunbound(httpsessionbindingevent event)<br />
　　47. {<br />
　　48. 　connection conn = null;<br />
　　49. 　string sqlstr = " update t_login_log set dt_lonout = ? " +<br />
　　50. 　　　　　" where user_id=? and dt_login = ?";<br />
　　51. 　try<br />
　　52. 　{<br />
　　53. 　　conn = dbconnection.getconnection();<br />
　　54. 　　preparedstatement pstat = conn.preparestatement(sqlstr);<br />
　　55. 　　pstat.setstring(1, getcurrdatetimestr());<br />
　　56. 　　pstat.setstring(2, userid);<br />
　　57. 　　pstat.setstring(3, logindatetime);<br />
　　58. 　　pstat.executeupdate();<br />
　　59.<br />
　　60. 　} catch (sqlexception e)<br />
　　61. 　{<br />
　　62. 　　throw new runtimeexception(<br />
　　63. 　　　"用户退出日志写入出错");<br />
　　64. 　} finally<br />
　　65. 　{<br />
　　66. 　　try<br />
　　67. 　　{<br />
　　68. 　　　if (conn != null)<br />
　　69. 　　　{<br />
　　70. 　　　　conn.close();<br />
　　71. 　　　}<br />
　　72. 　　} catch (sqlexception ex)<br />
　　73. 　　{<br />
　　74. 　　　ex.printstacktrace();<br />
　　75. 　　}<br />
　　76. 　}<br />
　　77. }<br />
　　78.<br />
　　79. //获取当前时间字串，以yyyymmddhhmmss格式返回，如20050505010101<br />
　　80. private static string getcurrdatetimestr()<br />
　　81. {<br />
　　82. 　simpledate表单at sdf = new simpledate表单at("yyyymmddhhmmss");<br />
　　83. 　return sdf.表单at(new date());<br />
　　84. }<br />
　　85. }<br />
　　<br />
　　valuebound()方法向t_login_log表插入一条登录日志，在valueunbound()方法中更新日志表的退出时间，此外第80~84行提供了一个获取当前时间串的方法getcurrdatetimestr()，通过该方法获取登录和退出时间点的时间字符串。<br />
　　<br />
　　下面通过描述用户登录系统直到退出时所经历的步骤说明程序如何记录用户的登录和退出时间的：<br />
　　<br />
　　1．用户通过login.jsp输入密码登录后，程序转向switch.jsp控制页面。<br />
　　<br />
　　2．在switch.jsp中，我们通过session.setattribute("ses_userbean", userbean)方法将user.java类的对象userbean绑定到session中。<br />
　　<br />
　　3．此时userbean对象的httpsessionbindinglistener接口方法valuebound()被调用，向t_login_log表插入一条登录日志。<br />
　　<br />
　　4．switch.jsp转向welcome.jsp页面。<br />
　　<br />
　　5．用户点击welcome.jsp页面中的链接退出系统时，转向quit.jsp页面。<br />
　　<br />
　　6．quit.jsp调用session.invalidate()方法，userbean对象从session中清除。<br />
　　<br />
　　7．此时userbean对象的httpsessionbindinglistener接口方法valueunbound()方法被调用，更新日志的退出时间，关闭浏览器窗口。<br />
　　<br />
　　httpsessionbindinglistener接口是web容器的事件接口，实现接口的类在某个事件发生时自动被调用，web容器有多个这样的事件接口，它们分别是：<br />
　　<br />
　　&#183;servletcontextlistener 接口：web容器启动和销毁的事件处理接口，接口中定义了两个方法。<br />
　　<br />
　　&#183;servletcontextattributelistener接口：web上下文属性发生更改时的事件处理接口。<br />
　　<br />
　　&#183;httpsessionlistener接口：session创建和销毁事件的事件处理接口。<br />
　　<br />
　　&#183;httpsessionattributelistener接口：session会话中属性对象更改的事件处理接口，该接口和我们在前面使用的httpsessionbindinglistener接口相似。<br />
　　<br />
　　此外在j2ee1.4中还提供了另外两个事件处理接口，它们是：<br />
　　<br />
　　&#183;servletrequestlistener接口：request请求对象创建和销毁事件处理接口。<br />
　　<br />
　　&#183;servletrequestattributelistener接口：更改request中属性对象时的事件处理接口。<br />
　　<br />
　　<strong>程序部署</strong><br />
　　<br />
　　在web程序开发完成后，我们开始着手程序部署的工作，我们希望将这个web应用程序部署到tomcat5.0的web应用服务器中。<br />
　　<br />
　　首先我们设置web应用程序的默认首页，然后再将整个web程序打成一个war档案文件包。<br />
　　<br />
　　1．设置默认访问的页面，双击工程窗格中的webmodule节点，jbuilder在内容窗格显示如下的页面：<br />
　　
<center>　</center><br />
　　<br />
　　
<center>图 26 设置web程序默认访问的页面</center><br />
　　<br />
　　点击welcome files列表右边的add&#8230;按钮，在弹出的对话框中录入login.jsp并按确定按钮，将login.jsp页面作为默认页面，这样web.xml部署描述文件中将新增以下粗体的部署信息：<br />
　　<br />
　　代码清单 19 web应用程序默认页面<br />
　　<br />
　　1. &#8230;<br />
　　2. ＜web-app＞<br />
　　3. ＜display-name＞webmodule＜/display-name＞<br />
　　4. ＜welcome-file-list＞<br />
　　5. ＜welcome-file＞login.jsp＜/welcome-file＞<br />
　　6. ＜/welcome-file-list＞<br />
　　7. &#8230;<br />
　　8. ＜/web-app＞<br />
　　<br />
　　当用户在url中没有指定具体的访问文件名时，web容器自动查看uri下是否有login.jsp文件，如果直接调出这个文件。<br />
　　<br />
　　2．在工程窗格中的资源树中右击webmodule节点，properties&#8230;-＞build-＞在build设置面中，将build web archive设置为when building project or module选项，如下图所示：<br />
　　
<center>　</center><br />
　　
<center>图 27 设置在rebuild工程或web模块时创建war档案文件</center><br />
　　<br />
　　3．在工程窗格中右击chapter13.jpx，在弹出的菜单中选择rebuild编译整个工程。<br />
　　<br />
　　4．编译完成后，在工程根目录下将产生一个webmodule.war文件。<br />
　　<br />
　　5．拷贝webmodule.war文件至＜jbuilder2005安装目录＞/thirdparty/jakarta-tomcat-5.0.27/webapps目录下。<br />
　　<br />
　　这样就完成web应用程序的部署了，下面我们启动tomcat 5.0 web应用程序服务器，并访问刚才部署的webmodule.war应用程序。<br />
　　<br />
　　1．双击＜jbuilder2005安装目录＞/thirdparty/jakarta-tomcat-5.0.27/bin下的startup.bat启动tomcat 5.0 web应用服务器（请保证这时jbuilder中没有运行web应用程序，以免冲突）。<br />
　　<br />
　　2．打开ie，键入http://localhost:8080/webmodule，将正确访问到刚才部署的web应用程序，如下图所示：<br />
　　
<center></center><br />
　　
<center>图 28 部署后login.jsp的访问效果</center><br />
　　<br />
　　tomcat 服务器默认工作于8080端口，所以在机器名后需要添加端口号，可以通过更改tomca位于conf目录下的server.xml配置文件可以更改这个端口号。 <br />
<br />
（摘自：<a href="http://www.readygo.com.cn/J2EE/070501/202306UESE.htm">http://www.readygo.com.cn/J2EE/070501/202306UESE.htm</a>）
<img src ="http://www.blogjava.net/allan-oy/aggbug/173842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/allan-oy/" target="_blank">落叶归根</a> 2008-01-08 23:53 <a href="http://www.blogjava.net/allan-oy/articles/173842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2SE 5.0的三个新特性</title><link>http://www.blogjava.net/allan-oy/articles/40848.html</link><dc:creator>落叶归根</dc:creator><author>落叶归根</author><pubDate>Thu, 13 Apr 2006 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/allan-oy/articles/40848.html</guid><wfw:comment>http://www.blogjava.net/allan-oy/comments/40848.html</wfw:comment><comments>http://www.blogjava.net/allan-oy/articles/40848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/allan-oy/comments/commentRss/40848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/allan-oy/services/trackbacks/40848.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
												<tbody>
														<tr>
																<td class="title1" align="middle" width="100%" bgcolor="#eeeeee" colspan="3" height="40">
																		<b>J2SE 5.0的三个新特性</b>
																</td>
														</tr>
														<tr>
																<td align="middle" width="100%" bgcolor="#eeeeee">
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<!-- end of article title -->
						<tr>
								<td valign="top" align="middle" width="100%">
										<!--start of article content -->
										<table width="98%" border="0">
												<tbody>
														<tr>
																<td class="text" align="left" width="100%">
																		<br />这里介绍J2SE 5.0中三个比较重要的特性: 枚举类型, 注释类型, 范型.<br /><br />J2SE 5.0 (Tiger)的发布是Java语言发展史上的一个重要的里程碑, 是迄今为止在 Java 编程方面所取得的最大进步.<br /><br />J2SE 5.0提供了很多令人激动的特性.这些特性包括范型(generics)的支持, 枚举类型(enumeration)的支持, 元数据(metadata)的支持, 自动拆箱(unboxing)/装箱(autoboxing), 可变个数参数(varargs), 静态导入(static imports), 以及新的线程架构(Thread framework).<br /><br />一. 枚举类型<br /><br />J2SE 5.0 以及之前的JDK有两种基本方法可以来定义新类型：通过Classes 以及Interface. 对于大部分面向对象编程来说，<br /><br />这两种方法看起来似乎足够了.但是在一些特殊情况下，这些方法就不适合.例如，我们想定义一个类型 Priority， 它只能接<br /><br />受 High, Medium, Low 三种值. 其他任何值都是非法的.J2SE 5.0 以前的JDK是可以构造这种类型的，但是需要做很多工作，<br /><br />有可能会带来如不安全(类型安全性问题???)等潜在问题，而J2SE 5.0的枚举类型（Enum） 能避免这些问题.<br /><br />public enum Priority {High, Medium, Low };<br /><br />它包括一个关键字enum　，一个新枚举类型的名字 Priority 以及为Priority定义的一组值.<br /><br />二. 注释类型<br /><br />J2SE 5.0提供了很多新的特性。其中的一个很重要的特性，就是对元数据(Metadata)的支持。在J2SE5.0中，这种元数据叫作<br /><br />注释(Annotation)。通过使用注释, 程序开发人员可以在不改变原有逻辑的情况下，在源文件嵌入一些补充的信息。代码分析<br /><br />工具，开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。举个例子，比如说你希望某个方法的参数或者返回<br /><br />值不为空，虽然我们可以在Java doc中说明，但是表达同样意思的说法有很多，比如"The return value should not be <br /><br />null"或者"null is not allowed here"。测试工具很难根据这些语言来分析出程序员所期望的前提条件(Pre-condition)和执<br /><br />行后的条件(Post-condition)。 而使用注释(Annotation)，这个问题就可以轻而易举的解决了。<br /><br />J2SE5.0支持用户自己定义注释。定义注释很简单，注释是由@Interface关键字来声明的。比如下面是一个最简单的注<br /><br />释（Annotation）。<br /><br />public @interface TODO{}<br /><br />标记注释的用法<br /><br />@MarkerAnnotation<br />@SingleValueAnnotation("some value")<br />@MultipleValueAnnotation(<br />    key1=value1,<br />    key2=value2,<br />      key3=value3,<br />)<br /><br />在程序中不仅可以使用自己定义的注释，还可以使用J2SE5.0中内建的注释类型。J2SE 5.0中预定义了三种注释注释类型：<br /><br />Override ：java.lang.Override 表示当前的方法重写了父类的某个方法，如果父类的对应的方法并不存在，将会发生编译错<br /><br />误。<br /><br />Deprecated：java.lang.Deprecated 表示 并不鼓励使用当前的方法或者域变量。<br /><br />SuppressWarnings: java.lang.SuppressWarnings关闭编译器告警，这样，在编译1.5之前的代码的时候，不会出现大量不关<br /><br />心的无关的告警。 <br /><br />值得注意的是，J2SE5.0还提供了四种用于注释的注释类型。有以下的四种：<br /><br />1. Target：用来指定这个注释（Annotation）是为哪种类型而定义的。比如，这个类型可能只是为method定义的。比<br /><br />如override,不能用@override来修饰class或者field。<br /><br />2.Retention：Retention的策略可以从以下三种中选取：<br /><br />RetentionPolicy.SOURCE：编译器编译之后会会从class file中除去注释（Annotation）。 <br />Retention.CLASS:注释（Annotation）保留在class file中，但是VM不会处理。 <br />RetentionPolicy.RUNTIME,：注释（Annotation）保留在class file,VM会进行处理。<br />请注意，如果你希望在运行时查找到这些注释在什么地方被用到，一定要在定义注释的时候，选择RetentionPolicy.RUNTIME,<br /><br />否则即使你用注释修饰了类变量或者方法，在运行时也没有办法获得这个信息的。<br /><br />3.Documented：这个注释（Annotation）将作为public API的一部分。<br /><br />4.Inherited ： 假设注释（Annotation）定义的时候使用了Inherited,那么如果这个注释（Annotation）修饰某个class，这<br /><br />个类的子类也被这个注释（Annotation）所修饰。<br /><br />小结<br />所谓元数据，指的是关于信息的信息。一般而言，代码分析工具，测试工具或者部署工具会使用元数据来产生配置信息以及使<br /><br />用配置信息产生控制逻辑。这些工具通常使用Java的反射特性，重构元数据的信息，并对这些信息进行解释。<br /><br />新的技术会不断改变程序设计和开发人员的设计思想。那么注释（Annotation）给我们带来了什么呢? 仅仅在代码分析，或者<br /><br />是开发测试框架和部署框架的时候才有用么？ 在我们的应用中充分的利用元数据，可以提高的软件的质量和可维护性。<br /><br /><br />三. 范型<br /><br />J2SE 5.0中的最显著的变化之一是添加对泛型类型的支持. 在J2SE 1.4 以及之前的版本中, Java程序并不是类型安全的. 例<br /><br />如, Collection framework中定义的List, Map等容器类的元素都是Object类型, 即这个类包含的元素是Object对象. 使用这<br /><br />种方式实现的列表, 可以用来操作整数, 实数, 字符串或者任何对象类型. 例如<br /><br />List stringList = new ArrayList();<br />stringList.add("abcde");<br />String str = (String)stringList.get(0);<br /><br /><br />这种方法实现的列表需要使用强制类型转换(又称显示造型), 因此不是类型安全的. 在上面这段代码种, 虽然变量名<br /><br />为stringList, 但是我们仍然可以把一个整型对象添加到这个队列中, 例如,<br /><br />stringList.add(new Integer(5));<br /><br />在这种情况下, 从字符列表中获取对象时, 强制类型转换就会导致运行时异常.<br /><br />范型是Java迈向类型安全的一个重要步骤, 使用范型可以构造出类型安全的代码.<br /><br />所谓范型是指类型参数化(parameterized types). Java是一种强类型的语言, 在J2SE 1.4以及以前的版本中, 我们在定义一<br /><br />个Java类, 接口或者方法的时候, 必须指定变量的类型. 在声明范型类、接口或者函数时, 定义变量的时候不指定某些变量的<br /><br />具体类型, 而是用一个类型参数代替. 在使用这个类, 接口, 或者方法的时候, 这个类型参数由一个具体类型所代替.<br /><br /><br />下面的例子中介绍了如何创建一个最简单范型类<br /><br />public class GenSample&lt;T&gt; {}<br /><br />类名后面带有&lt;T&gt;表明了这个类是范型类, 其中T被成为类型参数(type parameter), 在使用范型的时候, 类型参数可以被替换<br /><br />为任何的类类型, 但是不能是原始类型(primitive type), 例如int, double. <br />下面通过一个列表的例子来具体说明如果声明范型类和类型参数的用法.<br /><br /><br />public class GenList &lt;T&gt;{<br />    private T[] elements;<br />    private int size = 0;<br />    private int length = 0;<br /><br />    public GenList(int size) {<br />        elements = (T[])new Object[size];<br />        this.size = size;<br />    }<br /><br />    public T get(int i) {<br />        if (i &lt; length) {<br />            return elements[i];<br />        }<br />        return null;<br />    }<br />    <br />    public void add(T e) {<br />        if (length &lt; size - 1)<br />            elements[length++] = e;<br />    }<br />}<br /><br /><br /><br />在列表的例子中, 类型参数T被用来表示列表中的元素的类型, 即, 这个列表中的元素是T类型的.<br /><br />在使用这个列表时, 这个类型参数T会被具体的类型所替代. <br /><br />注意, 由于T时类型参数不是具体的类, 所以不能使用new操作符创建T的对象,例如new T(), 或者, new T[10].<br /><br />在J2SE 5.0中, 不仅仅可以声明范型类, 也可以声明范型接口, 声明范型接口和声明范型类的语法类似, 也是在接口命称后面<br /><br />加上&lt;T&gt;. 例如,<br /><br />public interface GenInterface&lt;T&gt; {<br />    void func(T t);<br />}<br /><br />在声明范型类的时候, 可是使用多个类型参数. 多个类型参数之间用逗号分开, 例如,<br /><br />public class GenMap&lt;T, V&gt; {}<br /><br />范型是J2SE 5.0所提供的一项强大的功能, 使用范型可以创建类型安全的、可重用的代码, 虽然目前Java的范型还无法和C++的范型相提并论, 但是, 随着Java语言本事的演进, 范型会在Java语言中发挥更大的作用的.</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>来源：<a href="http://www.javaresearch.org/article/showarticle.jsp?column=1&amp;thread=34057">http://www.javaresearch.org/article/showarticle.jsp?column=1&amp;thread=34057</a><img src ="http://www.blogjava.net/allan-oy/aggbug/40848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/allan-oy/" target="_blank">落叶归根</a> 2006-04-13 11:49 <a href="http://www.blogjava.net/allan-oy/articles/40848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java抽取word,pdf的四种武器</title><link>http://www.blogjava.net/allan-oy/articles/40846.html</link><dc:creator>落叶归根</dc:creator><author>落叶归根</author><pubDate>Thu, 13 Apr 2006 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/allan-oy/articles/40846.html</guid><wfw:comment>http://www.blogjava.net/allan-oy/comments/40846.html</wfw:comment><comments>http://www.blogjava.net/allan-oy/articles/40846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/allan-oy/comments/commentRss/40846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/allan-oy/services/trackbacks/40846.html</trackback:ping><description><![CDATA[来源： <a href="http://www.javaresearch.org/article/showarticle.jsp?column=544&amp;thread=35283">http://www.javaresearch.org/article/showarticle.jsp?column=544&amp;thread=35283</a><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0"><tbody><tr><td class="title1" align="middle" width="100%" bgcolor="#eeeeee" colspan="3" height="40"><b>java抽取word,pdf的四种武器</b></td></tr><tr><td align="middle" width="100%" bgcolor="#eeeeee"></td></tr></tbody></table></td></tr><!-- end of article title --><tr><td valign="top" align="middle" width="100%"><!--start of article content --><table width="98%" border="0"><tbody><tr><td class="text" align="left" width="100%"><br />很多人用java进行文档操作时经常会遇到一个问题，就是如何获得word，excel，pdf等文档的内容？<br />我研究了一下，在这里总结一下抽取word,pdf的几种方法。<br />1 .用jacob<br />其实jacob是一个bridage，连接java和com或者win32函数的一个中间件，jacob并不能直接抽取word,<br />excel等文件，需要自己写dll哦，不过已经有为你写好的了，就是jacob的作者一并提供了。 <br /><br />jacob jar与dll文件下载： <a href="http://www.matrix.org.cn/down_view.asp?id=13">http://www.matrix.org.cn/down_view.asp?id=13</a> <br /><br />下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath)，就可以写你自己的抽取<br />程序了，下面是一个简单的例子： <br /><br /><br />import java.io.File;<br />import com.jacob.com.*;<br />import com.jacob.activeX.*;<br />/**<br /> * Title: pdf extraction<br /> * Description: email:chris@matrix.org.cn<br /> * Copyright: Matrix Copyright (c) 2003<br /> * Company: Matrix.org.cn<br /> * @author chris<br /> * @version 1.0,who use this example pls remain the declare<br /> */<br />public class FileExtracter{<br /> public static void main(String[] args) {<br />  ActiveXComponent component = new ActiveXComponent("Word.Application");<br />  String inFile = "c:\\test.doc";<br /> String tpFile = "c:\\temp.htm";<br />  String otFile = "c:\\temp.xml";<br />  boolean flag = false;<br />  try {<br />   component.setProperty("Visible", new Variant(false));<br />   Object wordacc = component.getProperty("document．").toDispatch();<br />   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, <br />                                     new Object[]{inFile,new Variant(false), new Variant(true)},<br />                                     new int[1] ).toDispatch();<br />   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);<br />   Variant f = new Variant(false);<br />   Dispatch.call(wordfile, "Close", f);<br />   flag = true;<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  } finally {<br />   component.invoke("Quit", new Variant[] {});<br />  }<br /> }<br />}<br /><br /> <br /><br /><br />2. 用apache的poi来抽取word，excel。<br />poi是apache的一个项目，不过就算用poi你可能都觉得很烦，不过不要紧，这里提供了更加简单的一个<br />接口给你： <br /><br />下载经过封装后的poi包： <a href="http://www.matrix.org.cn/down_view.asp?id=14">http://www.matrix.org.cn/down_view.asp?id=14</a> <br /><br />下载之后，放到你的classpath就可以了，下面是如何使用它的一个例子： <br /><br /><br />import java.io.*;<br />import  org.textmining.text.extraction.WordExtractor;<br />/**<br /> * Title: word extraction<br /> * Description: email:chris@matrix.org.cn<br /> * Copyright: Matrix Copyright (c) 2003<br /> * Company: Matrix.org.cn<br /> * @author chris<br /> * @version 1.0,who use this example pls remain the declare<br /> */<br /><br />public class PdfExtractor {<br />  public PdfExtractor() {<br />  }<br />  public static void main(String args[]) throws Exception<br />  {<br />  FileInputStream in = new FileInputStream ("c:\\a.doc");<br />  WordExtractor extractor = new WordExtractor();<br />  String str = extractor.extractText(in);<br />  System.out.println("the result length is"+str.length());<br />   System.out.println("the result is"+str);<br />}<br />}<br /><br /> <br /><br /><br />3. pdfbox-用来抽取pdf文件<br />但是pdfbox对中文支持还不好，先下载pdfbox： <a href="http://www.matrix.org.cn/down_view.asp?id=12">http://www.matrix.org.cn/down_view.asp?id=12</a> <br /><br />下面是一个如何使用pdfbox抽取pdf文件的例子： <br /><br /><br />import org.pdfbox.pdmodel.PDdocument．<br />import org.pdfbox.pdfparser.PDFParser;<br />import java.io.*;<br />import org.pdfbox.util.PDFTextStripper;<br />import java.util.Date;<br />/**<br /> * Title: pdf extraction<br /> * Description: email:chris@matrix.org.cn<br /> * Copyright: Matrix Copyright (c) 2003<br /> * Company: Matrix.org.cn<br /> * @author chris<br /> * @version 1.0,who use this example pls remain the declare<br /> */<br /><br />public class PdfExtracter{<br /><br />public PdfExtracter(){<br />  }<br />public String GetTextFromPdf(String filename) throws Exception<br />  {<br />  String temp=null;<br />  PDdocument．nbsppdfdocument．null;<br />  FileInputStream is=new FileInputStream(filename);<br />  PDFParser parser = new PDFParser( is );<br />  parser.parse();<br />  pdfdocument．nbsp= parser.getPDdocument．);<br />  ByteArrayOutputStream out = new ByteArrayOutputStream();<br />  OutputStreamWriter writer = new OutputStreamWriter( out );<br />  PDFTextStripper stripper = new PDFTextStripper();<br />  stripper.writeText(pdfdocument．getdocument．), writer );<br />  writer.close();<br />  byte[] contents = out.toByteArray();<br /><br />  String ts=new String(contents);<br />  System.out.println("the string length is"+contents.length+"\n");<br />  return ts;<br />}<br />public static void main(String args[])<br />{<br />PdfExtracter pf=new PdfExtracter();<br />PDdocument．nbsppdfdocument．nbsp= null;<br /><br />try{<br />String ts=pf.GetTextFromPdf("c:\\a.pdf");<br />System.out.println(ts);<br />}<br />catch(Exception e)<br />  {<br />  e.printStackTrace();<br />  }<br />}<br /><br />}<br /><br /> <br /><br /><br />4. 抽取支持中文的pdf文件－xpdf<br />xpdf是一个开源项目，我们可以调用他的本地方法来实现抽取中文pdf文件。 <br /><br />下载xpdf函数包： <a href="http://www.matrix.org.cn/down_view.asp?id=15">http://www.matrix.org.cn/down_view.asp?id=15</a> <br /><br />同时需要下载支持中文的补丁包： <a href="http://www.matrix.org.cn/down_view.asp?id=16">http://www.matrix.org.cn/down_view.asp?id=16</a> <br /><br />按照readme放好中文的patch，就可以开始写调用本地方法的java程序了 <br /><br />下面是一个如何调用的例子： <br /><br /><br />import java.io.*;<br />/**<br /> * Title: pdf extraction<br /> * Description: email:chris@matrix.org.cn<br /> * Copyright: Matrix Copyright (c) 2003<br /> * Company: Matrix.org.cn<br /> * @author chris<br /> * @version 1.0,who use this example pls remain the declare<br /> */<br /><br /><br />public class PdfWin {<br />  public PdfWin() {<br />  }<br />  public static void main(String args[]) throws Exception<br />  {<br />    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";<br />    String filename="c:\\a.pdf";<br />    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};<br />    Process p = Runtime.getRuntime().exec(cmd);<br />    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());<br />    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");<br />    StringWriter out = new StringWriter();<br />    char [] buf = new char[10000];<br />    int len;<br />    while((len = reader.read(buf))&gt;= 0) {<br />    //out.write(buf, 0, len);<br />    System.out.println("the length is"+len);<br />    }<br />    reader.close();<br />    String ts=new String(buf);<br />    System.out.println("the str is"+ts);<br />  }<br />}<br /></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/allan-oy/aggbug/40846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/allan-oy/" target="_blank">落叶归根</a> 2006-04-13 11:48 <a href="http://www.blogjava.net/allan-oy/articles/40846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>