国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

一個Jsp初學者的學習過程(七)

2024-09-05 00:19:31
字體:
來源:轉載
供稿:網友

商業源碼熱門下載www.html.org.cn

一個jsp初學者的學習過程(七)

theunforgiven


第七章 超長文本的操作——clob類型數據的存取

回到我編寫留言板的時候,當時要存放留言板的正文內容,發現varchar2()(可變長度的字符串)只能存4000字節,也就是2000個漢字,這也太少了啊,查一下數據庫類型的資料,發現有這么幾個類型:long,2g(要是我沒記錯的話,它是為了向前兼容,不推薦使用);clob,4g,字符;blob,4g,二進制??磥沓L文本應該使用clob了,圖片自然是用blob了,詢問了一下別人,知道這兩種類型是不能像varchar2()那樣直接存的,只好作罷,先用varchar2()頂一陣。
后來我終于有空了,決心要完成這個任務,在網上查了一番資料,看了別人的例子,總算是無師自通看明白了:存的時候需要使用empty_clob()(這個不是java的函數)先存一個空的標識(用我的理解就是先初始化一下),然后通過“流”將數據寫入。下面是代碼,其中try里面的是clob類型的存操作:
-----------------------------------save_new.jsp------------------------------------------
<%@ include file="include.inc"%>
<%@ page contenttype="text/html;charset=gb2312" errorpage="request_error.htm"%>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312" />
<title>無標題文檔</title>
</head>
<body>
<%
string title = request.getparameter("title");
string kind=request.getparameter("kind");
string newtitle=title.replaceall("'","''");//用replaceall()將text字串中所有的單引號改成連續兩個單引號

string text = request.getparameter("text");
//string text1=text.replaceall("'","''");存clob時不需將單引號改成連續兩個單引號
string text2=text.replaceall("<","&lt");//用replaceall()將字串中所有的<改成&lt
string newtext=text2.replaceall(">","&gt");//用replaceall()將字串中所有的>改成&gt
//replace只能處理單個字符?。?br>//改'是為了不影響數據庫的查詢語句
//改<>是防止網頁把他們生成標簽,比如:<table>,<form>等
string author=session.getattribute("name").tostring();
out.println(author);
long id=system.currenttimemillis();//取得一個時間,從1970-1-1 0:00:00開始到當前時間的毫秒數,用這個數作為該文章的id標識
java.text.simpledateformat formatter = new java.text.simpledateformat("yyyy-mm-dd hh:mm:ss"); //格式化日期
java.util.date currenttime_1 = new java.util.date();//得到當前系統時間
string strdate = formatter.format(currenttime_1); //將日期時間轉換成字符串形式

connection con = null;
preparedstatement stmt = null;//不能用statement,我也不知道為什么,查了api,說這個preparedstatement可以用于
//高效的多次執行語句,沒查到statement這個類
resultset rs = null;
try
{
class.forname(classforname);//載入驅動程式類別
con=drivermanager.getconnection(servanddb);//建立數據庫連接
con.setautocommit(false);//設置不自動提交
string sql="insert into article(id,author,title,time,kind,text_clob) values ('"+id+"','"+author+"','"+newtitle+"','"+strdate+"','"+kind+"',empty_clob())";//我的數據庫中存文本的clob型字段名為:text_clob
stmt=con.preparestatement(sql);//添加一條clob字段為空的記錄,
stmt.executeupdate();//執行
stmt=null;//下次使用前清空
sql="select text_clob from article where id='"+id+"' for update";//正是由于這條語句,id這個標識就必須得唯一!!?。?br> //如果數據庫中已有一條記錄的id與當前的id值相同,那么會查到那條記錄,也就無法向新插入的記錄中的clob字段進行寫入!
stmt=con.preparestatement(sql);//查找剛剛添加的那條記錄
rs=stmt.executequery();

oracle.sql.clob osc = null;//初始化一個空的clob對象
if (rs.next())
osc=(oracle.sql.clob)rs.getclob("text_clob");
writer w=osc.getcharacteroutputstream();//使用字符輸出流
w.write(newtext);//將字符串str_text寫到流中
w.flush();//輸出流中數據,大概是正式向clob中寫了
w.close();
con.commit();//執行
response.sendredirect("index.jsp?page=1");//回主頁面
}
catch(exception e)
{out.println(e);}
finally
{
if (rs!=null)
rs.close();
if (stmt!=null)
stmt.close();
if (con!=null)
con.close();
}
%>
</body>
</html>
--------------------------------------------------------------------------
取的時候就相對簡單了,主要就兩句,看下面的代碼:
--------------------------------------------------------------------------
<%
connection con = null;
statement stmt = null;
resultset rs = null;
long id=long.parselong(request.getparameter("id"));//將接收到的字符串轉成long型
try
{
class.forname(classforname);//載入驅動程式類別
con=drivermanager.getconnection(servanddb);//建立數據庫連接
stmt=con.createstatement();
string sql="select * from article where id='"+id+"'";
rs=stmt.executequery(sql);
if (rs.next())
{ //下2行是用于從clob類型里讀數據的,轉成字符串。
oracle.sql.clob osc=(oracle.sql.clob)rs.getclob("text_clob");//我的數據庫中存文本的clob型字段名為:text_clob
string str_text=osc.getsubstring((long)1,(int)osc.length());//substring是截取字符串(從1截到length),如果用 osc.getstring的話出錯。
out.print(str_text);
}//if
}//try
catch(exception e){}
rs.close();
stmt.close();
con.close();
%>
--------------------------------------------------------------------------
現在對clob類型的存取問題已經解決,但是當你操作文本字符串的時候你會發現很多問題,比如說,文本里有單引號(')、標簽(如<table>、<br>),還有回車和空格的問題等等,都需要你在實踐中發現并解決。
下一章說說blob。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 公安县| 上思县| 陵水| 凯里市| 潜江市| 蒙城县| 屏东市| 准格尔旗| 惠东县| 合江县| 清水县| 繁昌县| 仲巴县| 扎鲁特旗| 阜康市| 壤塘县| 长沙县| 姜堰市| 峨山| 昭通市| 青州市| 博野县| 蓬溪县| 突泉县| 红安县| 福建省| 萨迦县| 托里县| 英超| 连南| 隆化县| 宁河县| 颍上县| 寻乌县| 南汇区| 疏勒县| 当涂县| 宜春市| 嘉祥县| 都匀市| 木里|