当开发Browser/Server结构的应用时,往往涉及到大于4K的大字段文本的数据库存取以及Web页面的显示问题,比如,新闻或技术论题的内容,或者某些项目的详述。而这些大字段文本在数据库中进行存储时,最好的办法是采用SQL99定义的CLOB字段类型来实现。如果不采用CMP进行存取管理,那么,手工写代码管理存储与显示有一些繁杂,本文力求能够给大家提供一种高效、运行稳定的代码段,供大家实现参考。
本文共分成以下几个部分:
l 大字段上载到服务器SERVLET
l 用JavaBean实现大字段的数据库存储
l 用JavaBean实现大字段的数据库提取
l CLOB内容的页面显示
推荐使用平台:
操作系统:TurboLinux 6.1 Data Server
应用服务器:IBM Websphere Application Server 3.5
数据库:IBM DB2 7.0
一、 大字段CLOB上载到服务器Servlet
在web页面上,通过制作post属性的form,让servlet响应form的action,就可以将客户端利用form上载的内容在Servlet中截获,并存储在String类型的实例中,参照如下代码段:
1、 Web页面(htm或jsp文件)
<form method = ”post” action = “/servlet/ClobHandlerServlet”>
<input type=”textarea” name=”content”>
<input type=”submit” label=”提交”>
</form>
2、 CLOB处理——ClobHandlerServelt
public class ClobHandlerServlet extends HttpServlet
{
public void service(ServletRequest arg1, ServletResponse arg2) throws ServletException, IOException
{
HttpServletRequest req = (HttpServletRequest)arg1;
HttpServletResponse res = (HttpServletResponse)arg2;
String content = req.getParameter(“content”);
}
}
这样,我们就把客户端上载的大字段内容存储到String 实例content中。
二、 用JavaBean实现大字段的数据库存储
接下来,我们将把实例content交给商业逻辑实现JavaBean——ClobHandler,这个Bean的主要作用有:
l 从Websphere Application Server的JNDI树中查找并获取本示例用DataSource;
l 创建一个新的连接;
l 实现CLOB字段添加(或修改);
l 实现CLOB字段提取。
本示例涉及到数据库连结与操作,我们通过J2EE推荐的DataSource来完成,有关在VAJ或WAS里配置数据源的详细信息请参照VAJ或WAS联机帮助或其他文献,这里不多重复。
配置成功的DataSource的JNDI名为:clobDS。
因为类ClobHandler是用来处理与数据库交换信息的专用类,所以有必要让它保留一个DataSource实例的引用,我们在ClobHandler构造时就完成这项工作:
public class ClobHandler
{
private static DataSource clobDS = null;
//class constructor
public ClobHandler ()
{
if(clobDS == null)
try
{
Context ctx = new InitialContext();
clobDS = (DataSource)ctx.lookup("jdbc/clobDS");
}
catch(Exception _ex)
{
System.err.println(“Exception when lookup DataSource :” + _ex);
}
}
接下来,创建一个用来获取连接的私有函数,因为涉及到自己写transaction,所以要将连接的autoCommit属性设置为false:
private Connection conn = null;
private void initConnection()
{
if(this.conn == null)
try
{
conn = clobDS.getConnection();
conn.setAutoCommit(false);
}
catch(Exception e)
{
System.out.println("Get a connection error:" + e);
}
}
好了,准备工作已经完成,现在开始进行数据操作,这里只介绍大字段的插入与读取,参考这些实现就可以方便的完成更新和删除等操作的实现。
假设存取表的关键字为ID(varchar2),大字段内容存储的字段名为CONTENT(CLOB),我们来完成插入函数insert:
public void insert(String id, String content)
首先要获得一个连接:
initConnection();
然后是对变量的定义:
PreparedStatement ps = null;
ResultSet rs = null;
Writer wt = null;
接下来,将进行Clob数据的插入,这个过程分成两步,第一步,将ID插入新记录,同时获得该操作返回的ResultSet;第二步,用此ResultSet进行CLOB的写入;第三步,完成提交,如果出现例外则进行回滚。代码实现为:
try
{
String sqlStr = “insert into TAB_TEST (id) values (“+id+”)”;
ps = this.conn.preparedStatement(sqlStr);
rs=ps.executeQuery();
while(rs.next())
{
Clob cb=rs.getClob(“content”);
wt=cb.getCharacterOutputStream();
wt.write(param.getContent());
wt.flush();
}
conn.commit();
conn.close();
}catch(Exception e)
{
System.out.println(“Function insert excetption : ” + e);
conn.rollback();
}
好了,到此为止,我们的上限可达到4G的文本数据,已经成功的插入了数据库,接下来,我们研究对它的读取与显示。
三、 用JavaBean实现大字段的数据库提取
还是在类ClobHandler中,实现CLOB字段提取的函数:
public String getContent(String id)
同样,需要先进行连接获取和变量声明:
initConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String content = null;
接下来,对CLOB字段的读取,共三步:第一步,执行SQL查询并获得操作返回的ResultSet;第二步,将CLOB数据读入char[]中;第三步,形成存放内容的String对象并返回。详细代码段:
String sqlStr = “ select content from TAB_TEST where id=”+id;
ps = this.conn.preparedStatement(sqlStr);
rs=ps.executeQuery();
while(rs.next())
{
Clob cb=rs.getClob(“content”);
Reader instream = cb.getCharacterStream();
char buffer[] = new char[CLOB_SIZE_MAX];
int length=0;
while((length=instream.read(buffer))!=-1)
{
System.out.println("Read clob size : "+length);
}
content = new String(buffer);
}
return content;
通过调用此函数,Servlet或JSP就能获得需要的大字段内容content了,下一步,就是考虑怎么去显示它了。
四、 CLOB内容的页面显示
如果用Servlet做控制,那么,将获取的content对象放到request中,传给JSP,这里对用request传输BEAN不作说明,可参考相应 J2EE规范等资料。如果直接用JSP调用的获取方法,则content已经在JSP端。
在大字段中,包含回车、空格、TAB符号等,如果直接按String显示在JSP页上,则不能进行分段等显示。
其实,进行一个简单的转化,你的文章的原有格式就会正确的显示在WEB页面上,这个应用就是利用类StringTokenizer来完成。
在JSP页面中,用下面的代码进行显示:
<%
java.util.StringTokenizer st=new java.util.StringTokenizer(content,"\r");
while (st.hasMoreTokens())
{
String curstr=st.nextToken();
%>
<%= curstr %>
<%}%>
这里,是按照回车来进行分段显示的,也就是用"\r",当然,你可以完全定制你自己的显示模式,这里就不再详细叙述。
相信大家掌握了Clob和Blob之后,对WEB开发就会容易多了。
这方面的例子最好是参考数据库驱动提供商的文档和示例