在文件所在目錄下,
D:\>jar cvf jspsmart.jar jspsmart
學習 學習 再學習學習才是唯一的出路 |
SQL語句大全/ SQL 經典語句
--語 句 功 能
--數據操作
SELECT --從數據庫表中檢索數據行和列
INSERT --向數據庫表添加新數據行
DELETE --從數據庫表中刪除數據行
UPDATE --更新數據庫表中的數據
--數據定義
CREATE TABLE --創建一個數據庫表
DROP TABLE --從數據庫中刪除表
ALTER TABLE --修改數據庫表結構
CREATE VIEW --創建一個視圖
DROP VIEW --從數據庫中刪除視圖
CREATE INDEX --為數據庫表創建一個索引
DROP INDEX --從數據庫中刪除索引
CREATE PROCEDURE --創建一個存儲過程
DROP PROCEDURE --從數據庫中刪除存儲過程
CREATE TRIGGER --創建一個觸發器
DROP TRIGGER --從數據庫中刪除觸發器
CREATE SCHEMA --向數據庫添加一個新模式
DROP SCHEMA --從數據庫中刪除一個模式
CREATE DOMAIN --創建一個數據值域
ALTER DOMAIN --改變域定義
DROP DOMAIN --從數據庫中刪除一個域
--數據控制
GRANT --授予用戶訪問權限
DENY --拒絕用戶訪問
REVOKE --解除用戶訪問權限
--事務控制
COMMIT --結束當前事務
ROLLBACK --中止當前事務
SET TRANSACTION --定義當前事務數據訪問特征
--程序化SQL
DECLARE --為查詢設定游標
EXPLAN --為查詢描述數據訪問計劃
OPEN --檢索查詢結果打開一個游標
FETCH --檢索一行查詢結果
CLOSE --關閉游標
PREPARE --為動態執行準備SQL 語句
EXECUTE --動態地執行SQL 語句
DESCRIBE --描述準備好的查詢
---局部變量
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'
---全局變量
---必須以@@開頭
--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --打印字符串'x > y'
else if @y > @z
print 'y > z'
else print 'z > y'
--CASE
use pangu
update employee
set e_wage =
case
when job_level = ’1’ then e_wage*1.08
when job_level = ’2’ then e_wage*1.07
when job_level = ’3’ then e_wage*1.06
else e_wage*1.05
end
--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --打印變量x 的值
while @y < 3
begin
select @c = 100*@x + @y
print @c --打印變量c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
--WAITFOR
--例 等待1 小時2 分零3 秒后才執行SELECT 語句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 點零8 分后才執行SELECT 語句
waitfor time ’23:08:00’
select * from employee
***SELECT***
select *(列名) from table_name(表名) where column_name operator value
ex:(宿主)
select * from stock_information where stockid = str(nid)
stockname = 'str_name'
stockname like '% find this %'
stockname like '[a-zA-Z]%' --------- ([]指定值的范圍)
stockname like '[^F-M]%' --------- (^排除指定范圍)
--------- 只能在使用like關鍵字的where子句中使用通配符)
or stockpath = 'stock_path'
or stocknumber < 1000
and stockindex = 24
not stock*** = 'man'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by列號
stockname = (select stockname from stock_information where stockid = 4)
--------- 子查詢
--------- 除非能確保內層select只返回一個行的值,
--------- 否則應在外層where子句中用一個in限定符
select distinct column_name form table_name --------- distinct指定檢索獨有的列值,不重復
select stocknumber ,stocknumber + 10 = stocknumber + 10 from table_name
select stockname , stocknumber = count(*) from table_name group by stockname
--------- group by 將表按行分組,指定列中有相同的值
having count(*) = 2 --------- having選定指定的組
select *
from table1, table2
where table1.id *= table2.id -------- 左外部連接,table1中有的而table2中沒有得以null表示
table1.id =* table2.id -------- 右外部連接
select stockname from table1
union [all] ----- union合并查詢結果集,all-保留重復行
select stockname from table2
***insert***
insert into table_name (Stock_name,Stock_number) value (xxx,xxxx)
value (select Stockname , Stocknumber from Stock_table2)---value為select語句
***update***
update table_name set Stockname = xxx [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4
***delete***
delete from table_name where Stockid = 3
truncate table_name ----------- 刪除表中所有行,仍保持表的完整性
drop table table_name --------------- 完全刪除表
***alter table*** --- 修改數據庫表結構
alter table database.owner.table_name add column_name char(2) null .....
sp_help table_name ---- 顯示表已有特征
create table table_name (name char(20), age smallint, lname varchar(30))
insert into table_name select ......... ----- 實現刪除列的方法(創建新表)
alter table table_name drop constraint Stockname_default ---- 刪除Stockname的default約束
***function(/*常用函數*/)***
----統計函數----
***G --求平均值
COUNT --統計數目
MAX --求最大值
MIN --求最小值
SUM --求和
--***G
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id
--MAX
--求工資最高的員工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)
--STDEV()
--STDEV()函數返回表達式中所有數據的標準差
--STDEVP()
--STDEVP()函數返回總體標準差
--VAR()
--VAR()函數返回表達式中所有值的統計變異數
--VARP()
--VARP()函數返回總體變異數
----算術函數----
/***三角函數***/
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
/***反三角函數***/
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
--把弧度轉換為角度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT 類型
RADIANS(numeric_expression) --把角度轉換為弧度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT 類型
EXP(float_expression) --返回表達式的指數值
LOG(float_expression) --返回表達式的自然對數值
LOG10(float_expression)--返回表達式的以10 為底的對數值
SQRT(float_expression) --返回表達式的平方根
/***取近似值函數***/
CEILING(numeric_expression) --返回>=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
FLOOR(numeric_expression) --返回<=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
ROUND(numeric_expression) --返回以integer_expression 為精度的四舍五入值返回的數據
--類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
ABS(numeric_expression) --返回表達式的絕對值返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
SIGN(numeric_expression) --測試參數的正負號返回0 零值1 正數或-1 負數返回的數據類型
--與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
PI() --返回值為π 即3.1415926535897936
RAND([integer_expression]) --用任選的[integer_expression]做種子值得出0-1 間的隨機浮點數
----字符串函數----
ASCII() --函數返回字符表達式最左端字符的ASCII 碼值
CHAR() --函數用于將ASCII 碼轉換為字符
--如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數會返回一個NULL 值
LOWER() --函數把字符串全部轉換為小寫
UPPER() --函數把字符串全部轉換為大寫
STR() --函數把數值型數據轉換為字符型數據
LTRIM() --函數把字符串頭部的空格去掉
RTRIM() --函數把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函數返回部分字符串
CHARINDEX(),PATINDEX() --函數返回字符串中某個指定的子串出現的開始位置
SOUNDEX() --函數返回一個四位字符碼
--SOUNDEX函數可用來查找聲音相似的字符串但SOUNDEX函數對數字和漢字均只返回0 值
DIFFERENCE() --函數返回由SOUNDEX 函數返回的兩個字符表達式的值的差異
--0 兩個SOUNDEX 函數返回值的第一個字符不同
--1 兩個SOUNDEX 函數返回值的第一個字符相同
--2 兩個SOUNDEX 函數返回值的第一二個字符相同
--3 兩個SOUNDEX 函數返回值的第一二三個字符相同
--4 兩個SOUNDEX 函數返回值完全相同
QUOTENAME() --函數返回被特定字符括起來的字符串
/*select quotename('abc', '{') quotename('abc')
運行結果如下
----------------------------------{
{abc} [abc]*/
REPLICATE() --函數返回一個重復character_expression 指定次數的字符串
/*select replicate('abc', 3) replicate( 'abc', -2)
運行結果如下
----------- -----------
abcabcabc NULL*/
REVERSE() --函數將指定的字符串的字符排列順序顛倒
REPLACE() --函數返回被替換了指定子串的字符串
/*select replace('abc123g', '123', 'def')
運行結果如下
----------- -----------
abcdefg*/
SPACE() --函數返回一個有指定長度的空白字符串
STUFF() --函數用另一子串替換字符串指定位置長度的子串
----數據類型轉換函數----
CAST() 函數語法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函數語法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])
select cast(100+99 as char) convert(varchar(12), getdate())
運行結果如下
------------------------------ ------------
199 Jan 15 2000
----日期函數----
DAY() --函數返回date_expression 中的日期值
MONTH() --函數返回date_expression 中的月份值
YEAR() --函數返回date_expression 中的年份值
DATEADD(<datepart> ,<number> ,<date>)
--函數返回指定日期date 加上指定的額外日期間隔number 產生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
--函數返回兩個指定日期在datepart 方面的不同之處
DATENAME(<datepart> , <date>) --函數以字符串的形式返回日期的指定部分
DATEPART(<datepart> , <date>) --函數以整數值的形式返回日期的指定部分
GETDATE() --函數以DATETIME 的缺省格式返回系統當前的日期和時間
----系統函數----
APP_NAME() --函數返回當前執行的應用程序的名稱
COALESCE() --函數返回眾多表達式中第一個非NULL 表達式的值
COL_LENGTH(<'table_name'>, <'column_name'>) --函數返回表中指定字段的長度值
COL_NAME(<table_id>, <column_id>) --函數返回表中指定字段的名稱即列名
DATALENGTH() --函數返回數據表達式的數據的實際長度
DB_ID(['database_name']) --函數返回數據庫的編號
DB_NAME(database_id) --函數返回數據庫的名稱
HOST_ID() --函數返回服務器端計算機的名稱
HOST_NAME() --函數返回服務器端計算機的名稱
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函數只在SELECT INTO 語句中使用用于插入一個identity column列到新表中
/*select identity(int, 1, 1) as column_name
into newtable
from oldtable*/
ISDATE() --函數判斷所給定的表達式是否為合理日期
ISNULL(<check_expression>, <replacement_value>) --函數將表達式中的NULL 值用指定值替換
ISNUMERIC() --函數判斷所給定的表達式是否為合理的數值
NEWID() --函數返回一個UNIQUEIDENTIFIER 類型的數值
NULLIF(<expression1>, <expression2>)
--NULLIF 函數在expression1 與expression2 相等時返回NULL 值若不相等時則返回expression1 的值
----------------------------------------------------------------------------------------------------------
sql 經典語句
SQL分類:
DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE)
DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT)
DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,簡要介紹基礎語句:
1、說明:創建數據庫
CREATE DATABASE database-name
2、說明:刪除數據庫
drop database dbname
3、說明:備份sql server
--- 創建 備份數據的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 開始 備份
BACKUP DATABASE pubs TO testBack
4、說明:創建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根據已有的表創建新表:
A:create table tab_new like tab_old (使用舊表創建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、說明:刪除新表drop table tabname
6、說明:增加一個列
Alter table tabname add column col type
注:列增加后將不能刪除。DB2中列加上后數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
7、說明:添加主鍵: Alter table tabname add primary key(col)
說明:刪除主鍵: Alter table tabname drop primary key(col)
8、說明:創建索引:create [unique] index idxname on tabname(col….)
刪除索引:drop index idxname
注:索引是不可更改的,想更改必須刪除重新建。
9、說明:創建視圖:create view viewname as select statement
刪除視圖:drop view viewname
10、說明:幾個簡單的基本的sql語句
選擇:select * from table1 where 范圍
插入:insert into table1(field1,field2) values(value1,value2)
刪除:delete from table1 where 范圍
更新:update table1 set field1=value1 where 范圍
查找:select * from table1 where field1 like ’%value1%’ ---like的語法很精妙,查資料!
排序:select * from table1 order by field1,field2 [desc]
總數:select count * as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、說明:幾個高級查詢運算詞
A: UNION 運算符
UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)并消去表中任何重復行而派生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B: EXCEPT 運算符
EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。
C: INTERSECT 運算符
INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復行。
注:使用運算詞的幾個查詢結果行必須是一致的。
12、說明:使用外連接
A、left outer join:
左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。
C:full outer join:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
其次,大家來看一些不錯的sql語句
1、說明:復制表(只復制結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、說明:子查詢(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、說明:顯示文章、提交人和最后回復時間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、說明:外連接查詢(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、說明:在線視圖查詢(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、說明:between的用法,between限制查詢數據范圍時包括了邊界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值1 and 數值2
9、說明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、說明:四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、說明:日程安排提前五分鐘提醒
SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5
13、說明:一條sql 語句搞定數據庫分頁
select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段
14、說明:前10條記錄
select top 10 * form table1 where 范圍
15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重復行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、說明:隨機取出10條數據
select top 10 * from tablename order by newid()
18、說明:隨機選擇記錄
select newid()
19、說明:刪除重復記錄
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、說明:列出數據庫里所有的表名
select name from sysobjects where type='U'
21、說明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光盤 B 2
光盤 A 2
手機 B 3
手機 C 3
23、說明:初始化表table1
TRUNCATE TABLE table1
24、說明:選擇從10到15的記錄
select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc
隨機選擇數據庫記錄的方法(使用Randomize函數,通過SQL語句實現)
對存儲在數據庫中的數據來說,隨機數特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP“找個隨機數”然后打印出來。實際上常見的解決方案是建立如下所示的循環:
Randomize
RNumber = Int(Rnd*499) +1
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 這里是執行腳本 ...
end if
objRec.MoveNext
Wend
這很容易理解。首先,你取出1到500范圍之內的一個隨機數(假設500就是數據庫內記錄的總數)。然后,你遍歷每一記錄來測試ID 的值、檢查其是否匹配RNumber。滿足條件的話就執行由THEN 關鍵字開始的那一塊代碼。假如你的RNumber 等于495,那么要循環一遍數據庫花的時間可就長了。雖然500這個數字看起來大了些,但相比更為穩固的企業解決方案這還是個小型數據庫了,后者通常在一個數據庫內就包含了成千上萬條記錄。這時候不就死定了?
采用SQL,你就可以很快地找出準確的記錄并且打開一個只包含該記錄的recordset,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
不必寫出RNumber 和ID,你只需要檢查匹配情況即可。只要你對以上代碼的工作滿意,你自可按需操作“隨機”記錄。Recordset沒有包含其他內容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時間。
再談隨機數
現在你下定決心要榨干Random 函數的最后一滴油,那么你可能會一次取出多條隨機記錄或者想采用一定隨機范圍內的記錄。把上面的標準Random 示例擴展一下就可以用SQL應對上面兩種情況了。
為了取出幾條隨機選擇的記錄并存放在同一recordset內,你可以存儲三個隨機數,然后查詢數據庫獲得匹配這些數字的記錄:
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想選出10條記錄(也許是每次頁面裝載時的10條鏈接的列表),你可以用BETWEEN 或者數學等式選出第一條記錄和適當數量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 SELECT 語句只顯示一種可能(這里的ID 是自動生成的號碼):
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
注意:以上代碼的執行目的不是檢查數據庫內是否有9條并發記錄。
隨機讀取若干條記錄,測試過
Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 Order By rand() Limit n
Access左連接語法(最近開發要用左連接,Access幫助什么都沒有,網上沒有Access的SQL說明,只有自己測試, 現在記下以備后查)
語法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用SQL語句 用...代替過長的字符串顯示
語法:
SQL數據庫:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
Access數據庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
Conn.Execute說明
Execute方法
該方法用于執行SQL語句。根據SQL語句執行后是否返回記錄集,該方法的使用格式分為以下兩種:
1.執行SQL查詢語句時,將返回查詢得到的記錄集。用法為:
Set 對象變量名=連接對象.Execute("SQL 查詢語言")
Execute方法調用后,會自動創建記錄集對象,并將查詢結果存儲在該記錄對象中,通過Set方法,將記錄集賦給指定的對象保存,以后對象變量就代表了該記錄集對象。
2.執行SQL的操作性語言時,沒有記錄集的返回。此時用法為:
連接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option]
·RecordAffected 為可選項,此出可放置一個變量,SQL語句執行后,所生效的記錄數會自動保存到該變量中。通過訪問該變量,就可知道SQL語句隊多少條記錄進行了操作。
·Option 可選項,該參數的取值通常為adCMDText,它用于告訴ADO,應該將Execute方法之后的第一個字符解釋為命令文本。通過指定該參數,可使執行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
這三個方法是連接對象提供的用于事務處理的方法。BeginTrans用于開始一個事物;RollbackTrans用于回滾事務;CommitTrans用于提交所有的事務處理結果,即確認事務的處理。
事務處理可以將一組操作視為一個整體,只有全部語句都成功執行后,事務處理才算成功;若其中有一個語句執行失敗,則整個處理就算失敗,并恢復到處里前的狀態。
BeginTrans和CommitTrans用于標記事務的開始和結束,在這兩個之間的語句,就是作為事務處理的語句。判斷事務處理是否成功,可通過連接對象的Error集合來實現,若Error集合的成員個數不為0,則說明有錯誤發生,事務處理失敗。Error集合中的每一個Error對象,代表一個錯誤信息。
徹底解決中文名文件下載和下載文件內容亂碼問題!!!!! 之前,寫過一個Download.jsp文件,可以解決下載文件亂碼問題(諸如:DOC,XSL文件等等).
后來發現,遇到中文名的文件的時候,文件下載將會報錯~~~~
今天,通過改寫原Download.jsp文件已經徹底解決了這個問題~
現在,把一整套的文件上傳下載的方法給貼出來~~~以便大家借鑒!~!~!~!~!
作者:古埃及法老
-------------------------------------------------------------------------------------------------------------------
測試環境:WEBLOGIC 8.1,WIN XP SP4,IE 6.0
-----------------------------------------------------
文件上傳:
-----------------------------------------
準備工作:導入著名的SmartUpload.jar組件包
upload.jsp文件
---------------------------------------------------------
<%@ page contentType="text/html; charset=gb2312" %>
<%
request.setCharacterEncoding("gb2312"); // 這句話很重要,否則遇到中文就出錯~
%>
<HTML><HEAD><TITLE>上傳</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
</HEAD>
<BODY leftMargin=0 topMargin=0>
<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#DEE7EF">
<tr>
<td align="center">
<FORM action="upload_ok.jsp" method=post name="Upload" enctype="multipart/form-data">
<br>
請輸入附件文件的所在路徑<FONT color=red> * </FONT>為必填項目<br>
<br>
<TABLE width="317" border=0 cellPadding=0>
<TBODY>
<TR>
<TD align=right valign=middle nowrap>附件路徑:</TD>
<TD><input type="file" name="file" style="border: 1px #FFFFFF solid;background:#efefef" > <FONT color=red>*</FONT></TD>
</TR>
<TR align="center">
<TD height=60 colspan="2" valign=middle nowrap> <INPUT style="height:22px" name=B1 type=submit value=" 確 定 " >
<INPUT style="height:22px" name=B2 type=reset value=" 取 消 " >
</TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</td>
</tr>
</table>
</BODY></HTML>
---------------------------------------------------------
upload_ok.jsp文件
---------------------------------------------------------
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="com.jspsmart.upload.*" %>
<HTML><HEAD><TITLE>上傳成功!</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
</HEAD>
<BODY leftMargin=0 topMargin=0>
<jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" />
<table width="80%" border="0" cellpadding="0" cellspacing="0" bgcolor="#DEE7EF">
<tr>
<td align="center">
<%
int count=0;
String fileName = null;
mySmartUpload.initialize(pageContext);
mySmartUpload.upload();
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(0);
if (!myFile.isMissing()) {
//String ext=myFile.getFileExt();//得到后綴
fileName = myFile.getFileName();
myFile.saveAs("/files/" + fileName);//你要存放文件所在文件夾的相對路徑
out.println("文件:<b>"+fileName+"</b>上傳成功!<br>文件大小:" + myFile.getSize() + "kb<BR>");
}
%>
</BODY></HTML>
---------------------------------------------------------
文件下載:
-----------------------------------------
文件的超連接寫法范例:
<% String fname ="中文測試.xsl"; //假設你的文件名是:中文測試.xsl
%>
<A target="_blank" href="Download.jsp?filename=<%=fname%>">下 載</A>
文件的超連接寫法范例-2 重新用utf-8對文件名編碼:
<%@ page contentType="text/html;charset=gb2312" session="true"%>
<% String name=java.net.URLEncoder.encode("世界文化.doc","UTF-8"));%> <a href="c:\<%=name%>">世界文化.doc</a>
Download.jsp文件
---------------------------------------------------------
<%
java.io.BufferedInputStream bis=null;
java.io.BufferedOutputStream bos=null;
try{
String filename=request.getParameter("filename");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));
bis =new java.io.BufferedInputStream(new java.io.FileInputStream(config.getServletContext().getRealPath("files/" + filename)));
bos=new java.io.BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff,0,bytesRead);
}
}
catch(Exception e){
e.printStackTrace();
}
finally {
if (bis != null)bis.close();
if (bos != null)bos.close();
}
%>
myEclipse打開JSP時老是要等上好幾秒原因?
這個問題的確很煩人,其實都是MyEclipse的“自作聰明”的結果(它默認用Visual Designer來打開的),進行下列設置即可有效緩解之。
1. 要么右鍵單擊文件,選擇 Open With -》 MyEclipse JSP Editor 打開,這樣不會采用可視化的打開,耗資源少,自動提示也非常快。
2. 要么采取一勞永逸的方法 Window -》 Preferences -》 General -》 Editors -》 File Associations
將默認打*.jsp的editor關聯設置為MyEclipse JSP Editor .
jsp頁面提示功能卡的解決方法
上一篇文章只是解決單個工程表面問題,也就是提示的時候用了我自己的這個servlet-api.jar這個jar包,所以會解決問題,如果你不想加入jar包,那么請看以下說明:
最終原因為:
新建的工程中加入了j2ee1.4 lib庫,庫中的javax.servelet.jar這個包中的javadoc location 位置設置的官方網站。這樣你每次提示的時候都要去官方網站去找doc所以導致myeclipse會很卡,當禁用網卡或者拔掉網線的時候,就不會在卡了。
http://hanbao.javaeye.com/blog/244272
最終解決方法:
菜單 [Window]->[Preferences]->[MyEclipse]->[JavaEnterprise Project]->[Library Sets] [J2EE1.4]和[J2EE1.3]下的javax.servelet.jar
點開樹 選擇[javadoc location]這個節點 雙擊 然后在對話框中,把這個 那個地址去掉為空或者選擇你本地javadoc地址即可解決 jsp 自動提示 卡 慢 的問題。
在JSP頁面的前面加上:
<%
response.setHeader("Cache-Control","no-store");
response.setHeader("Pragrma","no-cache");
response.setDateHeader("Expires",0);
%>
JSP文件下載類整理完成。可以在JSP頁面中實現簡單的下載,支持文件打包下載功能。支持將字符串或者流生成文件提供下載的功能。但是也有一些缺點。現把這個類的基本介紹總結如下。
名稱:jsp頁面下載類
特點及功能介紹:
現介紹下使用者可見的方法的功能。
設定實現下載必須的response對象。
public void setResponse(HttpServletResponse response)
設定下載方式:0 為普通單文件下載。 1 為多文件壓縮成zip包下載。 2 為將指定的字符串等拼接成文件內容提供給用戶下載。
public void setDownType(int fileType)
設定下載時顯示給用的文件名。
public void setDisFileName(String fileName)
壓縮文件下載時,設定壓縮文件暫時保存的路徑(路徑為絕對路徑)
public void setZipFilePath( String path )
壓縮文件下載時,設定服務器端生成的壓縮文件是否刪除。True 刪除;false 保留。
public void setZipDelFlag(boolean b)
壓縮文件下載時,設定要壓縮的文件的文件路徑(路徑為絕對路徑)
public void setZipFileNames(String[] fileNames)
單文件下載時,設定下載文件的路徑(絕對路徑)
public void setDownFileName(String fileName)
將字符串生成文件內容模擬下載時,設定文件的內容。參數為字符串(可多次調用)
public int setFileContent(String fileContent)
將字符串生成文件內容模擬下載時,設定文件的內容。參數為byte數組(可多次調用)
返回值:0 操作正常; 9 出現IO異常。
public int setFileContent(byte[] fileContent)
將字符串生成文件內容模擬下載時,調用此方法結束文件內容設定。
返回值:0 操作正常; 9 出現IO異常。
public int setFileContentEnd()
主處理函數。
返回值: 0 處理正常;1 未設定response對象。 2 未設定文件下載方式。 3 未設定要顯示的文件名。 4 未設定要下載的文件路徑,或者設定的下載的文件路徑不存在。 9 IO異常。
public int process()
現在介紹不同下載模式下的簡單流程:
單文件下載流程:
//實例初始化
JspFileDownload jfd = new JspFileDownload();
//設定response對象
jfd.setResponse(response);
//設定文件下載模式 0 單文件下載。
jfd.setDownType(0);
//設定顯示的文件名 xxxx.xxx
jfd.setDisFileName(filename);
//設定要下載的文件的路徑,絕對路徑
jfd.setDownFileName(filePath);
//主處理函數。注意處理返回值。
int result = jfd.process();
多文件壓縮成ZIP文件下載:
//實例初始化
JspFileDownload jfd = new JspFileDownload();
//設定response對象。
jfd.setResponse(response);
//設定下載模式 1 多文件壓縮成ZIP文件下載。
jfd.setDownType(1);
//設定顯示的文件名
jfd.setDisFileName(filename);
//設定要下載的文件的路徑(數組,絕對路徑)
jfd.setZipFileNames(fileNames);
//設定服務器端生成的zip文件是否保留。 true 刪除 false 保留,默認為false
jfd.setZipDelFlag(true);
//設定zip文件暫時保存的路徑 (是文件夾)
jfd.setZipFilePath(zipfolder);
//主處理函數 注意返回值
Int result = jfd.process();
將字符串生成為文件內容,模擬文件下載:
//實例初始化
JspFileDownload jfd = new JspFileDownload();
//設定response對象。
jfd.setResponse(response);
//設定下載模式 2 將字符串作為文件內容,實現文件下載。
jfd.setDownType(2);
//設定文件顯示的名稱。
jfd.setDisFileName(request.getParameter("filename"));
//主處理函數,下載前check,注意返回值
out.print(jfd.process());
//設定要寫入文件的內容,參數可為字符串或者byte數組。可多次調用。
jfd.setFileContent(request.getParameter("name"));
//文件內容設定完了,調用函數。
jfd.setFileContentEnd();
以上就是簡單的使用介紹。下面貼出主處理類的代碼。由于在日文系統下編輯的文件。注釋只能寫英文,英文太差-_-b。多包涵。
package com.vogoal.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletResponse;
/*
* vogoalAPI 1.0
* Auther SinNeR@blueidea.com
* by vogoal.com
* mail: vogoals@hotmail.com
*/
/**
* JSP FILE DOWNLOAD SUPPORT
*
* @author SinNeR
* @version 1.0
*/
public class JspFileDownload {
/** request object */
private HttpServletResponse response = null;
/** file type: -1 un-setting; 0 normal file; 1 zip file ;2 stream*/
private int fileType = -1;
/** file name to be displayed */
private String disFileName = null;
/** zip file path */
private String zipFilePath = null;
/** file to be zipped */
private String[] zipFileNames = null;
private boolean zipDelFlag = false;
/** file to be downloaded */
private String downFileName = null;
/** error code 0 */
private static final int PROCESS_OK = 0;
/** error code 1 */
private static final int RESPONSE_IS_NULL = 1;
/** error code 2 */
private static final int UNSET_DOWNLOADTYPE = 2;
/** error code 3 */
private static final int UNSET_DIS_FILE_NAME = 3;
/** error code 4 */
private static final int UNSET_DOWN_FILE_NAME = 4;
/** error code 9 */
private static final int IO_EXCEPTION = 9;
/**
* set response object
* @param response response Object
*/
public void setResponse(HttpServletResponse response){
this.response = response;
}
/**
* set file type 0 normal file; 1 zip file ;2 stream
* @param fileType
*/
public void setDownType(int fileType){
this.fileType = fileType;
}
/**
* set display file name
* @param fileName
*/
public void setDisFileName(String fileName){
this.disFileName = fileName;
}
/**
* set zip file path
* @param fileNames
*/
public void setZipFilePath( String path ){
this.zipFilePath = path;
}
public void setZipDelFlag(boolean b){
this.zipDelFlag = b;
}
/**
* set zip file names
* @param fileNames
*/
public void setZipFileNames(String[] fileNames){
this.zipFileNames = fileNames;
}
/**
* set download file name
* @param fileName
*/
public void setDownFileName(String fileName){
this.downFileName = fileName;
}
/**
* set file content
* @param fileContent
*/
public int setFileContent(String fileContent){
try{
byte[] buffs = fileContent.getBytes("UTF-8");
response.getOutputStream().write(buffs);
}catch(IOException e){
return IO_EXCEPTION;
}
return PROCESS_OK;
}
/**
* set file content
* @param fileContent
*/
public int setFileContent(byte[] fileContent){
try{
response.getOutputStream().write(fileContent);
}catch(IOException e){
return IO_EXCEPTION;
}
return PROCESS_OK;
}
/**
* set file content end
*
*/
public int setFileContentEnd(){
try{
response.getOutputStream().close();
}catch(IOException e){
return IO_EXCEPTION;
}
return PROCESS_OK;
}
/**
* main process
* @return
*/
public int process(){
int status = PROCESS_OK;
status = preCheck();
if ( status != PROCESS_OK )
return status;
String fileName = disFileName;
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");
int BUFSIZE = 1024 * 8;
int rtnPos = 0;
byte[] buffs = new byte[ BUFSIZE ];
FileInputStream inStream = null;
ZipOutputStream zos = null;
InputStream is = null;
String filepath = null;
try{
if ( fileType == 0 || fileType == 1){
if ( fileType == 0 ){
filepath = downFileName;
}else{
filepath = zipFilePath + fileName;
String[] fileToZip = zipFileNames;
zos=new ZipOutputStream(new FileOutputStream(filepath));
ZipEntry ze=null;
byte[] buf=new byte[BUFSIZE];
int readLen=0;
for (int i= 0;i<fileToZip.length;i++){
File f= new File(fileToZip[i]);
ze=new ZipEntry(f.getName());
ze.setSize(f.length());
ze.setTime(f.lastModified());
zos.putNextEntry(ze);
is=new BufferedInputStream(new FileInputStream(f));
while ((readLen=is.read(buf, 0, BUFSIZE))!=-1) {
zos.write(buf, 0, readLen);
}
is.close();
}
zos.close();
}
inStream =new FileInputStream(filepath);
while((rtnPos=inStream.read(buffs)) >0)
response.getOutputStream().write(buffs,0,rtnPos);
response.getOutputStream().close();
inStream.close();
}
if ( zipDelFlag ){
File fToDel = new File(filepath);
fToDel.delete();
}
}catch(IOException e){
return IO_EXCEPTION;
}finally{
try{
if ( inStream != null ){
inStream.close();
inStream = null;
}
if ( zos != null ){
zos.close();
zos = null;
}
if ( is != null ){
is.close();
is = null;
}
}catch (IOException e){
}
}
return status;
}
/**
* pre check.
* @return
*/
private int preCheck(){
if ( response == null )
return RESPONSE_IS_NULL;
if ( disFileName == null || disFileName.trim().length() == 0 )
return UNSET_DIS_FILE_NAME;
if ( fileType == -1 )
return UNSET_DOWNLOADTYPE;
else if ( fileType == 0 ){
if ( downFileName == null || downFileName.trim().length() == 0 )
return UNSET_DOWN_FILE_NAME;
else{
if ( !isFile( downFileName ) )
return UNSET_DOWN_FILE_NAME;
}
}else if ( fileType == 1 ){
if ( zipFilePath == null || zipFilePath.length() == 0 )
return UNSET_DOWN_FILE_NAME;
else{
if ( !isDirect(zipFilePath) )
return UNSET_DOWN_FILE_NAME;
}
if ( zipFileNames == null || zipFileNames.length == 0 )
return UNSET_DOWN_FILE_NAME;
else{
for ( int i=0;i<zipFileNames.length;i++ ){
if ( zipFileNames[i] == null || zipFileNames[i].trim().length() == 0 )
return UNSET_DOWN_FILE_NAME;
else{
if ( !isFile( zipFileNames[i] ) )
return UNSET_DOWN_FILE_NAME;
}
}
}
}else if ( fileType == 2 ){
//doing nothing
}else{
return UNSET_DOWNLOADTYPE;
}
return PROCESS_OK;
}
private boolean isFile(String fileName){
File f = new File(fileName);
if (!f.exists() || !f.isFile())
return false;
return true;
}
private boolean isDirect(String filePath){
File f = new File(filePath);
if (!f.exists() || !f.isDirectory())
return false;
return true;
}
}
至此,jsp頁面文件下載介紹完成。
使用的時候,把這個類生成的class文件拷貝到WEB-INF/classes下。(注意保持包的路徑)
然后在使用的頁面import進這個class即可。
<%@ page contentType="text/html;charset=GBK"%>
注意:
可能存在編碼方式的問題,如果出現或者有別的bug請聯系我,我來debug。
附件為這個類的source以及測試程序。
附件說明:
名稱:jsp頁面上傳類
特點:
先貼上傳類,JspFileUpload
package com.vogoal.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
/*
* vogoalAPI 1.0
* Auther SinNeR@blueidea.com
* by vogoal.com
* mail: vogoals@hotmail.com
*/
/**
* JSP上傳文件類
*
* @author SinNeR
* @version 1.0
*/
public class JspFileUpload {
/** request對象 */
private HttpServletRequest request = null;
/** 上傳文件的路徑 */
private String uploadPath = null;
/** 每次讀取得字節的大小 */
private static int BUFSIZE = 1024 * 8;
/** 存儲參數的Hashtable */
private Hashtable paramHt = new Hasptable();
/** 存儲上傳的文件的文件名的ArrayList */
private ArrayList updFileArr = new ArrayList();
/**
* 設定request對象。
*
* @param request
* HttpServletRequest request對象
*/
public void setRequest(HttpServletRequest request) {
this.request = request;
}
/**
* 設定文件上傳路徑。
*
* @param path
* 用戶指定的文件的上傳路徑。
*/
public void setUploadPath(String path) {
this.uploadPath = path;
}
/**
* 文件上傳處理主程序。�������B
*
* @return int 操作結果 0 文件操作成功;1 request對象不存在。 2 沒有設定文件保存路徑或者文件保存路徑不正確;3
* 沒有設定正確的enctype;4 文件操作異常。
*/
public int process() {
int status = 0;
// 文件上傳前,對request對象,上傳路徑以及enctype進行check。
status = preCheck();
// 出錯的時候返回錯誤代碼。
if (status != 0)
return status;
try {
// ��參數或者文件名�u��
String name = null;
// 參數的value
String value = null;
// 讀取的流是否為文件的標志位
boolean fileFlag = false;
// 要存儲的文件。
File tmpFile = null;
// 上傳的文件的名字
String fName = null;
FileOutputStream baos = null;
BufferedOutputStream bos = null;
// ��存儲參數的Hashtable
paramHt = new Hashtable();
updFileArr = new ArrayList();
int rtnPos = 0;
byte[] buffs = new byte[BUFSIZE * 8];
// �取得ContentType
String contentType = request.getContentType();
int index = contentType.indexOf("boundary=");
String boundary = "--" + contentType.substring(index + 9);
String endBoundary = boundary + "--";
// �從request對象中取得流。
ServletInputStream sis = request.getInputStream();
// 讀取1行
while ((rtnPos = sis.readLine(buffs, 0, buffs.length)) != -1) {
String strBuff = new String(buffs, 0, rtnPos);
// 讀取1行數據�n��
if (strBuff.startsWith(boundary)) {
if (name != null && name.trim().length() > 0) {
if (fileFlag) {
bos.flush();
baos.close();
bos.close();
baos = null;
bos = null;
updFileArr.add(fName);
} else {
Object obj = paramHt.get(name);
ArrayList al = new ArrayList();
if (obj != null) {
al = (ArrayList) obj;
}
al.add(value);
System.out.println(value);
paramHt.put(name, al);
}
}
name = new String();
value = new String();
fileFlag = false;
fName = new String();
rtnPos = sis.readLine(buffs, 0, buffs.length);
if (rtnPos != -1) {
strBuff = new String(buffs, 0, rtnPos);
if (strBuff.toLowerCase().startsWith(
"content-disposition: form-data; ")) {
int nIndex = strBuff.toLowerCase().indexOf(
"name=\"");
int nLastIndex = strBuff.toLowerCase().indexOf(
"\"", nIndex + 6);
name = strBuff.substring(nIndex + 6, nLastIndex);
}
int fIndex = strBuff.toLowerCase().indexOf(
"filename=\"");
if (fIndex != -1) {
fileFlag = true;
int fLastIndex = strBuff.toLowerCase().indexOf(
"\"", fIndex + 10);
fName = strBuff.substring(fIndex + 10, fLastIndex);
fName = getFileName(fName);
if (fName == null || fName.trim().length() == 0) {
fileFlag = false;
sis.readLine(buffs, 0, buffs.length);
sis.readLine(buffs, 0, buffs.length);
sis.readLine(buffs, 0, buffs.length);
continue;
}else{
fName = getFileNameByTime(fName);
sis.readLine(buffs, 0, buffs.length);
sis.readLine(buffs, 0, buffs.length);
}
}
}
} else if (strBuff.startsWith(endBoundary)) {
if (name != null && name.trim().length() > 0) {
if (fileFlag) {
bos.flush();
baos.close();
bos.close();
baos = null;
bos = null;
updFileArr.add(fName);
} else {
Object obj = paramHt.get(name);
ArrayList al = new ArrayList();
if (obj != null) {
al = (ArrayList) obj;
}
al.add(value);
paramHt.put(name, al);
}
}
} else {
if (fileFlag) {
if (baos == null && bos == null) {
tmpFile = new File(uploadPath + fName);
baos = new FileOutputStream(tmpFile);
bos = new BufferedOutputStream(baos);
}
bos.write(buffs, 0, rtnPos);
baos.flush();
} else {
System.out.println("test :" + value + "--" + strBuff);
value = value + strBuff;
}
}
}
} catch (IOException e) {
status = 4;
}
return status;
}
private int preCheck() {
int errCode = 0;
if ( request == null )
return 1;
if ( uploadPath == null || uploadPath.trim().length() == 0 )
return 2;
else{
File tmpF = new File(uploadPath);
if (!tmpF.exists())
return 2;
}
String contentType = request.getContentType();
if ( contentType.indexOf("multipart/form-data") == -1 )
return 3;
return errCode;
}
public String getParameter(String name){
String value = "";
if ( name == null || name.trim().length() == 0 )
return value;
value = (paramHt.get(name) == null)?"":(String)((ArrayList)paramHt.get(name)).get(0);
return value;
}
public String[] getParameters(String name){
if ( name == null || name.trim().length() == 0 )
return null;
if ( paramHt.get(name) == null )
return null;
ArrayList al = (ArrayList)paramHt.get(name);
String[] strArr = new String[al.size()];
for ( int i=0;i<al.size();i++ )
strArr[i] = (String)al.get(i);
return strArr;
}
public int getUpdFileSize(){
return updFileArr.size();
}
public String[] getUpdFileNames(){
String[] strArr = new String[updFileArr.size()];
for ( int i=0;i<updFileArr.size();i++ )
strArr[i] = (String)updFileArr.get(i);
return strArr;
}
private String getFileName(String input){
int fIndex = input.lastIndexOf("\\");
if (fIndex == -1) {
fIndex = input.lastIndexOf("/");
if (fIndex == -1) {
return input;
}
}
input = input.substring(fIndex + 1);
return input;
}
private String getFileNameByTime(String input){
int index = input.indexOf(".");
Date dt = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
return input.substring(0,index) + sdf.format(dt) + input.substring(index);
}
}
說明:
這個類基本解決了上一貼的上一貼說的存在的bug和不足。主要做了如下修正。
現在介紹下JSP頁面中如何用這個類實現上傳。
首先,要把這個類編譯后的class文件拷貝到WEB-INF/classes/目錄下。注意保持package的結構。
在jsp頁面中引用這個類
<%@page import="com.vogoal.util.JspFileUpload"%>
<%
//初始化
JspFileUpload jfu = new JspFileUpload();
//設定request對象
jfu.setRequest(request);
//設定上傳的文件路徑
jfu.setUploadPath("C:\\");
//上傳處理
int rtn = jfu.process();
//取得form中其他input控件參數的值
String username = jfu.getParameter("username");
//如果對應同一個參數有多個input控件,返回數組
String[] usernameArr = jfu.getParameters("username");
//取得上傳的文件的名字
String[] fileArr = jfu.getUpdFileNames();
//取得上傳文件的個數,這個方法有點雞肋
int fileNumber = jfu.getUpdFileSize();
//下面的是測試輸出的代碼。
// out.println("parameter:" + username);
// out.println("parameter size:" + usernameArr.length);
// out.println("fileArr size:" + fileArr.length);
// if (fileArr.length > 0)
// out.println("fileArr 0:" + fileArr[0]);
%>
使用的時候的注意事項:
1,2兩點如果沒有做到的話,process方法執行的時候匯報錯。
各個用戶可用的方法及說明:
設定requet對象。
public void setRequest(HttpServletRequest request)
設定文件上傳的路徑。
public void setUploadPath(String path)
文件上傳處理主程序。
@return int 操作結果 0 文件操作成功;1 request對象不存在。 2 沒有設定文件保存路徑或者文件保存路徑不正確;3
沒有設定正確的enctype;4 文件操作異常。
public int process()
根據name取得form表單中其他傳遞的參數的值(多個的話返回其中一個)
public String getParameter(String name)
根據name取得form表單中其他傳遞的參數的值(返回數組,可有多個)
public String[] getParameters(String name)
取得上傳成功文件的個數
public int getUpdFileSize()
取得上傳的文件名對應的數組。
public String[] getUpdFileNames()
注意process方法地返回值,在不是0的情況下操作失敗。
以下提供測試類以及測試頁面(見附件):
HelloPostFile.html
HelloPostFile.jsp
寫在jsp中的代碼的測試文件。
HelloPostFileWithClass.html
HelloPostFileWithClass.jsp
抽出class后的測試文件。
src在
WEB-INF/src/
class在
WEB-INF/classes/
另:
由于這個文件被我在中文日文系統下編輯過,注釋出現亂碼,所以大部分都刪掉了,見諒。
適用于JSP,將jspSmartUpload.jar置于WEB-INF\lib下
----------------------------------------------------------
Jspsmart1.html
<html>
<head>
<title>Jspsmart1.html</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
</head>
<body>
<h2>文件上傳范例 - jspSmart</h2>
<form name="Form1" enctype="multipart/form-data" method="post" action="Jspsmart1.jsp">
<p>上傳文件 1:<input type="file" name="File1" size="20" maxlength="20"></p>
<input type="submit" value="上傳">
<input type="reset" value="清除">
</form>
</body>
</html>
Jspsmart1.jsp
<%@ page import="com.jspsmart.upload.*" %>
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
<title>Jspsmart1.jsp</title>
</head>
<body>
<h2>文件上傳范例 - jspSmart</h2>
<jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" />
<%
//計算文件上傳個數
int count=0;
//SmartUpload的初始化,使用這個jspsmart一定要在一開始就這樣聲明
mySmartUpload.initialize(pageContext);
//生命限制上傳的文件大小為 5 MB
mySmartUpload.setMaxFileSize(5 * 1024 * 1024);
//依據form的內容上傳
mySmartUpload.upload();
try {
//將文件存放于D:\totalExample\jsp\UploadFile\
count = mySmartUpload.save("D:\\totalExample\\jsp\\UploadFile\\");
//打印出上傳文件的個數
out.println("您成功上傳"+count + "個文件.");
} catch (Exception e) {
out.println(e.toString());
}
%>
</body>
</html>
---------------------------------------------------------------------
Jspsmart2.html
<html>
<head>
<title>Jspsmart3.html</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
</head>
<body>
<h2>文件上傳范例 - jspSmart</h2>
<form name="Form1" enctype="multipart/form-data" method="post" action="Jspsmart2.jsp">
<p>上傳文件 1:<input type="file" name="File1" size="20" maxlength="20"></p>
<input type="submit" value="上傳">
<input type="reset" value="清除">
</form>
</body>
</html>
Jspsmart2.jsp
<%@ page import="com.jspsmart.upload.*" %>
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
<title>Jspsmart2.jsp</title>
</head>
<body>
<h2>文件上傳范例 - jspSmart</h2>
<jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" />
<%
//計算文件上傳個數
int count=0;
//SmartUpload的初始化,使用這個jspsmart一定要在一開始就這樣聲明
mySmartUpload.initialize(pageContext);
//依據form的內容上傳
mySmartUpload.upload();
//將上傳的文件一個一個取出來處理
for (int i=0;i<mySmartUpload.getFiles().getCount();i++)
{
//取出一個文件
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);
//如果文件存在,則做存檔操作
if (!myFile.isMissing()) {
//將文件存放于絕對路徑的位置
myFile.saveAs("D:\\totalExample\\jsp\\UploadFile\\" + myFile.getFileName(), mySmartUpload.SAVE_PHYSICAL);
//顯示此上傳文件的詳細信息
out.println("FieldName = " + myFile.getFieldName() + "<BR>");
out.println("Size = " + myFile.getSize() + "<BR>");
out.println("FileName = " + myFile.getFileName() + "<BR>");
out.println("FileExt = " + myFile.getFileExt() + "<BR>");
out.println("FilePathName = " + myFile.getFilePathName() + "<BR>");
out.println("ContentType = " + myFile.getContentType() + "<BR>");
out.println("ContentDisp = " + myFile.getContentDisp() +"<BR>");
out.println("TypeMIME = " + myFile.getTypeMIME() +"<BR>");
out.println("SubTypeMIME = " + myFile.getSubTypeMIME() + "<BR>");
count ++;
}
}
// 顯示應該上傳的文件數目
out.println("<BR>" + mySmartUpload.getFiles().getCount() + " files could be uploaded.<BR>");
// 顯示成功上傳的文件數目
out.println(count + "file(s) uploaded.");
%>
</body>
</html>
------------------------------------------------------------------------------
Jspsmart3.html
<html>
<head>
<title>Jspsmart3.html</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
</head>
<body>
<h2>文件上傳范例 - jspSmart</h2>
<form name="Form1" enctype="multipart/form-data" method="post" action="Jspsmart2.jsp">
<p>上傳文件 1:<input type="file" name="File1" size="20" maxlength="20"></p>
<input type="submit" value="上傳">
<input type="reset" value="清除">
</form>
</body>
</html>
Jspsmart3.jsp
<%@ page import="com.jspsmart.upload.*" %>
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
<title>Jspsmart3.jsp</title>
</head>
<body>
<h2>文件上傳范例 - jspSmart</h2>
<jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" />
<%
//計算文件上傳個數
int count=0;
//SmartUpload之初始化,使用這個jspsmart一定要在一開始就這樣聲明
mySmartUpload.initialize(pageContext);
//聲明可以上傳的文件類型
mySmartUpload.setAllowedFilesList("htm,html,txt,,");
//限制存檔位置,可存檔于絕對位置
mySmartUpload.setDenyPhysicalPath(false);
//依據 form之內容上傳
mySmartUpload.upload();
//將文件用原本的名字存放于server上的相對路徑
try {
count = mySmartUpload.save("D:\\totalExample\\jsp\\UploadFile\\", mySmartUpload.SAVE_PHYSICAL);
} catch (Exception e) {
out.println("<b>Wrong selection : </b>" + e.toString());
}
//打印出總共上傳文件個數
out.println(count + " file(s) uploaded.");
%>
</body>
</html>
---------------------------------------------------------------
download.jsp
<%@ page import="com.jspsmart.upload.*" %>
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
<title> download.jsp</title>
</head>
<body>
<h2>文件下載范例 - jspSmart</h2>
<jsp:useBean id="mySmartUpload" scope="page"
class="com.jspsmart.upload.SmartUpload" />
<%
// SmartUpload之初始化
mySmartUpload.initialize(pageContext);
//必須如此聲明,否則將會把文件顯示于瀏覽器中
mySmartUpload.setContentDisposition("inline;");
//將 sample.zip下載,下載默認名稱為downloaded.zip
mySmartUpload.downloadFile("C:\\upload\\sample.zip",
"application/x-zip-compressed",
"downloaded.zip");
%>
</body>
</html>