通過文本文檔實現信息的批量導入(轉)
2005-08-05? ?來源:CSDN ?作者:CMTobby |
最近參與了一個網上直報項目的維護工作,該網上直報應用程序有一個功能就是通過導入文本文檔的方式向后臺數據庫中批量導入直報用戶,包括用戶各項信息如單位名稱、企業資質等級等等。其核心之處就是如何獲取所上載文本文檔中的內容,現將該部分程序簡單介紹如下:
??????? 首先是后臺的javabean程序如下所示: |
package
?Util;
import ?javax.servlet. * ;
import ?javax.servlet.http.HttpServletRequest;
import ?java.util.LinkedList;
import ?java.io. * ;
public ? class ?ReadRequest{
? public ?LinkedList?getRequest(HttpServletRequest?request){
??LinkedList?output = new ?LinkedList();
?? try {
??????ServletInputStream?in = request.getInputStream();
?????? int ?len = request.getContentLength();
??????System.out.println?(len);
?????? byte ?[]b = new ? byte [len];
??????in.read(b, 0 ,len);
??????String?str = new ?String(b);
??????System.out.println?(str);
??????BufferedReader?con = new ?BufferedReader( new ?StringReader(str));
??????String?c = "" ;
?????? while ((c = con.readLine()) != null ){
???????output.add(c);
??????????????????????????????????}
?????????}
????? catch (Exception?e){e.printStackTrace();}
????? return ?output;
????????????????????????????????????????????????????}
????????????????}
然后是寫相應的jsp測試頁面,此頁面沒有經過美工處理,僅為測試之用:)。
import ?javax.servlet. * ;
import ?javax.servlet.http.HttpServletRequest;
import ?java.util.LinkedList;
import ?java.io. * ;
public ? class ?ReadRequest{
? public ?LinkedList?getRequest(HttpServletRequest?request){
??LinkedList?output = new ?LinkedList();
?? try {
??????ServletInputStream?in = request.getInputStream();
?????? int ?len = request.getContentLength();
??????System.out.println?(len);
?????? byte ?[]b = new ? byte [len];
??????in.read(b, 0 ,len);
??????String?str = new ?String(b);
??????System.out.println?(str);
??????BufferedReader?con = new ?BufferedReader( new ?StringReader(str));
??????String?c = "" ;
?????? while ((c = con.readLine()) != null ){
???????output.add(c);
??????????????????????????????????}
?????????}
????? catch (Exception?e){e.printStackTrace();}
????? return ?output;
????????????????????????????????????????????????????}
????????????????}
??????? index.jsp
<%
@?page?contentType
=
"
text/html;?charset=gb2312
"
?language
=
"
java
"
?
import
=
"
java.sql.*
"
?errorPage
=
""
?
%>
<! DOCTYPE?HTML?PUBLIC? " -//W3C//DTD?HTML?4.01?Transitional//EN " ? " http://www.w3.org/TR/html4/loose.dtd " >
< jsp:useBean?id = " pn " ?scope = " page " ? class = " Util.ReadRequest " />
<%--< jsp:useBean?id = " pn " ?scope = " request " ? class = " Util.GetFile " />--%>
<% @?page? import = " java.util.* " %>
< html >
< head >
< meta?http - equiv = " Content-Type " ?content = " text/html;?charset=gb2312 " >
< title > 測試 </ title >
</ head >
< body >
< form?name = " form1 " ?action = " index.jsp " ?method = " post " ?enctype = " multipart/form-data " >
? < input?name = " sdf " ?type = " file " >< input?name = " aa " ?type = " submit " ?value = " 提交 " >
?
? <% ?
LinkedList?output = new ?LinkedList();
output = pn.getRequest(request);
// output=pn.readHttpData(request);
System.out.println(output.size());
for ( int ?i = 0 ;i < output.size();i ++ ){
????out.println(output.get(i) + " <br> " );
???????????????????????????????????????????????????}
? %>
</ form >
</ body >
</ html >
這樣就會輸出文檔中的內容來了,當然還有一些其他的內容,可根據實際需要對內容進行處理。需要注意的是,在該網上直報程序中,文檔的格式是有要求的,每行為一個公司的基本信息,各個屬性之間用“,”隔開(也可以是其他的符號如“@”),并且各個屬性出現的順序也是固定的(如必須第一項是法人代碼,第二項是公司名稱)。得到了文檔中的內容后,就可以用一個循環批量的插入用戶信息了。比如說,我上載的文本文檔內容如下所示:
<! DOCTYPE?HTML?PUBLIC? " -//W3C//DTD?HTML?4.01?Transitional//EN " ? " http://www.w3.org/TR/html4/loose.dtd " >
< jsp:useBean?id = " pn " ?scope = " page " ? class = " Util.ReadRequest " />
<%--< jsp:useBean?id = " pn " ?scope = " request " ? class = " Util.GetFile " />--%>
<% @?page? import = " java.util.* " %>
< html >
< head >
< meta?http - equiv = " Content-Type " ?content = " text/html;?charset=gb2312 " >
< title > 測試 </ title >
</ head >
< body >
< form?name = " form1 " ?action = " index.jsp " ?method = " post " ?enctype = " multipart/form-data " >
? < input?name = " sdf " ?type = " file " >< input?name = " aa " ?type = " submit " ?value = " 提交 " >
?
? <% ?
LinkedList?output = new ?LinkedList();
output = pn.getRequest(request);
// output=pn.readHttpData(request);
System.out.println(output.size());
for ( int ?i = 0 ;i < output.size();i ++ ){
????out.println(output.get(i) + " <br> " );
???????????????????????????????????????????????????}
? %>
</ form >
</ body >
</ html >
??????? 300000000,武漢,420101,230,A304,A211,4700
??????? 300000001,武漢,420101,230,A304,A211,4700
??????? 300000002,武漢,420101,230,A304,A211,4700
??????? 300000003,武漢,420101,230,A304,A211,4700
首先對output進行處理,把前面的http頭內容如:Content-Disposition: form-data; name="sdf"; filename="C:\Documents and Settings\yy\桌面\test_jz.txt"以及尾remove掉,現在的output就只有文檔中的內容了。然后就開始插入數據庫(只給出代碼片斷):
//以下代碼僅適合本人的例子,具體情況具體而定
for
(
int
?i
=
0
;i
<
output.size();i
++
){
? if ?(output.get(i)? == ? null ? || ?(?(String)?output.get(i)).equals( "" ))?{
?????????? continue ;? // 空行則自動換行????????}
?String?s? = ?(String)?output.get(i);? // 取得一行?String[]?ss?=?s.split(",");
?String?sql = " insert?into?xt_user(f001,f002,f003,f004,f005,f006)?values(?,?,?,?,?,?) " ;
?PreparedStatement?ps = con.prepareStatement(sql);
?ps.setString( 1 ,ss[ 0 ]);
?ps.setString( 2 ,ss[ 1 ]);
?ps.setString( 3 ,ss[ 2 ]);
?ps.setString( 4 ,ss[ 3 ]);
?ps.setString( 5 ,ss[ 4 ]);
?ps.setString( 6 ,ss[ 5 ]);
?ps.executeUpdate();
?????????????????????????????}
? if ?(output.get(i)? == ? null ? || ?(?(String)?output.get(i)).equals( "" ))?{
?????????? continue ;? // 空行則自動換行????????}
?String?s? = ?(String)?output.get(i);? // 取得一行?String[]?ss?=?s.split(",");
?String?sql = " insert?into?xt_user(f001,f002,f003,f004,f005,f006)?values(?,?,?,?,?,?) " ;
?PreparedStatement?ps = con.prepareStatement(sql);
?ps.setString( 1 ,ss[ 0 ]);
?ps.setString( 2 ,ss[ 1 ]);
?ps.setString( 3 ,ss[ 2 ]);
?ps.setString( 4 ,ss[ 3 ]);
?ps.setString( 5 ,ss[ 4 ]);
?ps.setString( 6 ,ss[ 5 ]);
?ps.executeUpdate();
?????????????????????????????}
posted on 2006-07-18 11:01 freebird 閱讀(314) 評論(0) 編輯 收藏 所屬分類: java