首先下載 對應 eclipse 版本的 tomcat 插件版本,(這里要注意: Tomcat 插件是Tomcat 插件,Tomcat 是 Tomcat, 兩者不能混淆!)
下載地址:http://www.eclipsetotale.com/tomcatPlugin.html
然后將得到的壓縮包解壓,放入 eclipse 的 plugins 目錄中重啟 eclipse, Tomcat 插件安裝成功!
當然安裝成功不并代表能使用,這里還要配置 Tomcat, 才能正常使用 Tomcat 插件,
配置過程:
首先下載當前 Eclipse 能使用的 Tomcat 版本,
下載地址:http://tomcat.apache.org/
然后解壓到指定的目錄,然后配置
Eclipse - toolsbar -> Window -> Prefences -> Tomcat -> 指向剛才 Tomcat 解壓的目錄,
到此配置完成,使用 Tomcat 插件可以啟動、關閉 Tomcat.
使用 Eclipse 建立 Dynamic Web Project 如:HelloProject
右鍵 Run As –> Run On Server -> 如圖:
彈出如圖界面配置:
配置完成,會在看到這樣效果項目目錄下會有 Servers 一個目錄,是專屬 HelloProject 項目的 Tomcat 配置,
還會在控制臺那塊看到 Servers 如圖:
這時已經可以使用 Tomcat , Start、Stop、Restart 等.
重點要說的,也是下邊要講的是:
對于上圖紅圈中的 server.xml 和 Tomcat/conf/server.xml 文件,
我們說過了紅圈中的 server.xml 是針對 HelloProject 生成的配置文件,當然多個項目也可以共用 一個 Servers 目錄下的配置!這個暫時先不講。
而 Tomcat/conf/server.xml 是 Tomcat 本身所有,有更大的通用性。
為了便于區分我們把紅圈中的 server.xml 叫 project.server.xml, 把 Tomcat/conf/server.xml 叫 tomcat.server.xml。
本次主要講 server.xml 中的 <Context … />
來看 project.server.xml 中的 <Context docBase="HelloProject" path="/HelloProject" reloadable="true" source="org.eclipse.jst.jee.server:HelloProject"/>
docBase 指的是 相對 Servers 目錄 平級的 HelloProject 目錄 即項目目錄,如圖:
path 指的是 網站訪問路徑,如:http://locahost:8080/HelloProject
像這樣生成的這個 project.server.xml 我們一般不要動.
而對于 tomcat.server.xml 中 <Content … />
我們看這兩配置都是對的:
<!--<Context path="/HP" reloadable="true" docBase="C:\Documents and Settings\Administrator\workspace\HelloProject\WebContent" workDir=”D:\worDir” /> -->
<Context path="/HelloProject" reloadable="true" docBase="C:\Documents and Settings\Administrator\workspace\HelloProject" workDir=”C:\workDir” />
<Context path="/HPT" reloadable="true" docBase="C:\Documents and Settings\Administrator\workspace\HelloProject" workDir=”C:\workDir” />
網站訪問路徑分別是
http://localhost:8080/HP
http://localhost:8080/HelloProject
對于上邊的 HPT 我們可以這樣訪問:
http://localhost:8080/HPT/WebContent
這樣可以看到 如果是 docBase 指到了 WebContent 下則可用自己定義的 path,
如果 docBase 指到的是項目目錄則必須使用項目原來的 path, 或者路徑訪問做下修改
最后的 workDir 是部署后 jsp 發布的目錄,可以自己隨便指定,或不指定.
第一種方式:
<action name="adminEnterpriceculturesave" class="adminEnterpriceculturesaveAction" method="save">
<result name="success" type="redirectAction">/admin/adminEnterpriceculturelist.action?enterpriceculture.enterpricetype=A</result>
盡管不好看格式,但是卻很容易懂.
第一種方式的/admin不是命名空間,暫時我還沒時間去實踐他,現在有點忙..因為我的命名空間是這樣的
<struts>
<package name="enterpriceculture" namespace="/" extends="struts-default">
<action name="adminEnterpriceculturesave" class="adminEnterpriceculturesaveAction" method="save">
<result name="success" type="redirectAction">/admin/adminEnterpriceculturelist.action?enterpriceculture.enterpricetype=A</result>
<!-- <param name="enterpriceculture.enterpricetype">A</param>
<result name="success" type="chain">
<param name="actionName">adminEnterpriceculturelist</param>
<param name="namespace">/</param>
</result>-->
<!-- <result name="success">/admin/Enterpriceculture_List.jsp</result>-->
</action>
</package>
</struts>
第二種方式:
<param name="enterpriceculture.enterpricetype">A</param>
<result name="success" type="chain">
<param name="actionName">adminEnterpriceculturelist</param>
<param name="namespace">/</param>
</result>
去掉命名空間因為是在本文件的這個adminEnterpriceculturelist進行跳轉,所以理解起來容易很多..
綜合找到網上有關資料:如下:
chain類型 如下:
<action name="getTemplate" class="tabAction" method="getTemplateByParas">
<param name="objectId">${objectId}</param>
<param name="param1">${param1}</param>
<param name="items">${items}</param>
<result name="success" type="chain">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
</action>
這樣就可以實現傳參了,這里的參數所有對象都可以傳,包括map,List,set 等集合也可以。同時這里還需要注意一個小問題,chain這種類型是XWork中的result類型,它對應的類是:
com.opensymphony.xwork2.ActionChainResult . 這里需要注意一個小問題, actionName,namespace都是他的屬性,所以對于傳過的URL參數要做一下處理。
actionName必須是Action的名稱,namespace是他命名空間,必須以"/"開頭,如:
/tab/getTemplate.action 則 namespace="/tab" ; actionName=”getTemplate“;
--創建過程名稱
--create procedure 存儲過程名字 is begin
--create or replace procedure 如果有就替換掉
----------------------------------------------
案例1:
--創建一個表
create table mytest(name varchar2(30),passwd varchar2(30));
--創建過程
create procedure sq_pro1 is
begin
--執行部分
insert into mytest values('zgx','888666');
end;
-- / 斜線回車
----------------------------------------------
如何查看錯誤信息:
show error 回車
--調用存儲過程
1.exec 過程名(參數1,2....);
2.call 過程名(參數1,2....);
---------------------------------------------------
set serveroutput on;打開輸出選項
set serveroutput off;關閉輸出選項
dbms_ 是包名的意思!
案例2:
dbms_output.put_line('helloWorld');
-----------------
declare
v_ename varchar2(5);--定義字符串變量
begin
--into v_ename意思:把查詢出來數據 賦值給 v_ename;&no是執行的時候會彈出輸入框
select ename into v_ename from emp where empno=&no;
--||代表 連接符號;
dbms_output.put_line('用戶名是:'||v_ename);
end;
-----------
案例3:
declare
v_ename varchar2(5);--定義字符串變量
v_sal number(7,2);--定義字符串變量
begin
--如果是多個字段,用逗號隔開,順序必須一樣??!
select ename,sal into v_ename,v_sal from emp where empno=&no;
--||代表 連接符號;
dbms_output.put_line('用戶名是:'||v_ename||'工資:'||v_sal);
end;
---------------------
--異常的捕獲
exception
when no_data_found then --如果出現no_data_found異常就執行下一句
dbms_output.put_line('輸入有誤!');
end;
------------
過程:
案例4:
創建帶輸入參數的過程;
create procedure sp_pro3(spNma varchar2,newSal number) is
begin
update emp set sal=newSal where ename=spName;
end;
------------
函數:
函數用于返回特定的數據,當建立函數時,在函數頭部要求有return語句;
案例5:
--輸入雇員姓名,返回該雇員的年薪
--返回一個number類型;返回值名字是yearSal,類型是number(7,2);
create function sp_fun1(spName varchar2) return number is yearSal number(7,2);
begin
--執行部分
select sal*12+nvl(comm,0)*12 into yearSal from emp where enamee=spName;
return yearSal;
end;
調用函數中
--隨便定義一個值
var abc number;
--掉用函數把結果賦值給 abc
call sp_fun1()'SCOTT' into:abc;
-------------
包
創建包:
--創建了一個包 sp_package
--聲明該包里有一個過程update_sal
--生命該包里有一個函數annual_income
create package sp_package is
procedure update_sal(name,varchar2,newsal number);
function annual_income(name varchar2, return number;
end;
給包sp_package 實現包體--把定義包中的 過程和函數實現;
create package body sp_package is
procedure update_sal(name,varchar2,newsal number) is
begin
update emp set sal=newsal where ename=name;
end;
function annual_income(name varchar2)
return number isannual_salary number;
begin
select sal*12+nvl(comm,0) into annual_salary from emp where ename=name;
return annual_salary;
end;
end;
--------------
調用包中的過程或函數
exec sp_package.update_sal('SCOTT','120');
---------------------
觸發器
觸發器是指隱含的執行的存儲過程。當定義觸發器時,必須要指定觸發的時間和觸發的操作,常用觸發包括insert,pudate,delete語句,而觸發操作實際就是一個pl/sql塊??梢允褂胏reate trigger來建立觸發器。
觸發器是非常有用的,可維護數據庫的安全和一致性。
---------
定義并使用變量
包括:
1.標量類型(scalar)
2.符合類型()
---------
標量(scalar)-常用類型
語法:
identifier [constant] datatype [not null] [:=| default expr]
identifier:名稱
constant:指定常量。需要指定它的初始值,且其值是不能改變的
datatype:數據類型
not null: 指定變量值不能為null
:= 給變量或是常量指定初始值
default 用于指定初始值
expr:指定初始值的pl/sql表達式,文本值、其他變量、函數等
------------
標量定義的案例
1.定義一個變長字符串
v_ename varchar2(10)
2.定義一個小數 范圍 -9999.99~9999.99
v_sal number(6,2)
3.定義一個小數并給一個初始值為5.4 :=pl/sql的賦值號
v_sal2 number(6,2):=5.4
4.定義一個日期類型的數據
v_hiredate date;
5.定義一個布爾變量,不能為空,初始值為false
v_valid boolean not null default false;
---------------
如何使用標量
定義好變量后,就可以使用這些變量。這里需要說明的是pl/sql塊為變量賦值不同于其他的編程語言,需要在等號前面加冒號(:=)
下面以輸入員工號,顯示雇員名稱、工資、個人所得稅(稅率為0.03為例)。說明變量的使用,看看如何編寫:
declare
c_tax_rate number(3.2):=0.03; --定義賦值
--用戶名
v_ename varchar2(5);
v_sal number(7,2);
v_tax_sal number()7,2;
begin
--執行
select ename,sal into v_ename,v_sal from emp where empno=$no;
--計算所得稅
v_tax_sal:=v_sal*c_tax_rate;
--輸出
dbms_output.put_line('姓名是:'||v_ename||'工資:'||v_sal||'所得稅:'||v_tax_sal);
end;
-----
標量(scalar)--使用%type類型
對于上面的pl/sql塊有一個問題:
就是如果員工的姓名超過了5字符的話,就會有錯誤,為了降低pl/sql程序的維護工作量,可以使用%type屬性定義變量,這樣他會按照數據庫列來確定你定義的變量的類型和長度。
看看怎么使用。
語法: 標識符名 表名.列名%type;
declare
v_ename emp.ename%type; --定義變量v_ename 和emp表中列名ename大小類型保持一致;
---
復合變量(composite)
用于存放多個值的變量。
包括:
1.pl/sql記錄
2.pl/sql表
---------------
復合類型-pl/sql記錄
類似與高級語言的結構體,需要注意的是,當引用pl/sql記錄成員時,必須要加記錄變量作為前綴(記錄變量.記錄成員)
如下:
declare
--定義一個pl/sql記錄類型是:emp_record_type,類型包括三個數據name,salary,title;該類型中可以存放三個類型的數據;
type emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);
--定義了一個sp_record變量,類型是emp_record_type
sp_record emp_record_type;
begin
select ename,sal,job into sp_record from emp where empno=7788;
dbms_output.put_line('員工名:'||sp_record.name); --顯示定義emp_record_type類型中 name的值;
end;
end;
----------------
復合類型--pl/sql表
相當于高級語言中的數組。但是需要注意的是在高級語言中數組的下標不能為負數,而pl/sql是可以為負數的,并且表元素的下標沒有限制。實例如下:
declare
--定義了一個pl/sql表類型sp_table_type,該類型是用于存放emp.ename%type類型的數組
--index by binary_integer標識下標是整數
type sp_table_type is table of emp.ename%type index by binary_integer;
--定義了一個sp_table變量,變量類型是sp_table_type
sp_table sp_table_type;
begin
--把查詢出來的ename放到 table(0)下標為0的數據
select ename into sp_table(0) from emp where empno=7788;
dbms_output.put_lin('員工名:'||sp_table(0)); --要和存放下標一樣
end;
說明:
sp_table_type 是pl/sql表類型
emp.ename%type 指定了表的元素的類型和長度
sp_table 為pl/sql表變量
sp_table(0) 表示下標為0的
---------------
參照變量
參照變量是指用于存放數值指針的變量。通過使用參照變量,可以使用得應用程序共享相同對象,從而降低占用的空間。在編寫pl/sql程序時,可以使用游標變量和對象類型變量兩種參照變量類型
游標變量用的最多
-----------
參照變量---游標變量
使用游標時,當定義游標時不需要指定相應的select語句,但是當使用游標時需要指定select語句,這樣一個游標就與一個select語句結合了。
如下
1.請使用pl/sql編寫一個塊,可以輸入部門號,并顯示該部門所有員工姓名和他的工資。
declare
--定義游標類型
type sp_emp_cursor is ref cursor;
--定義一個游標變量
test_cursor sp_emp_cursor;
--定義變量
v_ename emp。ename%type;
v_sal emp。sal%type;
begin
--執行
--打開一個游標test_cursor和一個select結合
open test_cursor for select ename,sal from emp where deptno=&no;
--循環取出
loop
--fetch就是取出。取出test_cursor中的數據放到 v_ename,v_sal里面去;
fetch test_cursor into v_ename,v_sal;
--判斷是否test_cursor為空
exit when test_cursor%notfound;
dbms_output.put_line('名字:'||v_ename||'工資:'||v_sal);
end loop;
end;
2.在1?;A上,如果某個員工的工資低于200元,就增加100元。
declare
--定義游標類型
type sp_emp_cursor is ref cursor;
--定義一個游標變量
test_cursor sp_emp_cursor;
--定義變量
v_ename emp。ename%type;
v_sal emp。sal%type;
begin
--執行
--打開一個游標test_cursor和一個select結合
open test_cursor for select ename,sal from emp where deptno=&no;
--循環取出
loop
--fetch就是取出。取出test_cursor中的數據放到 v_ename,v_sal里面去;
fetch test_cursor into v_ename,v_sal;
if v_sal<200 then
update emp set sal=sal+100 where ename=v_ename;
end if;
--判斷是否test_cursor為空
exit when test_cursor%notfound;
dbms_output.put_line('名字:'||v_ename||'工資:'||v_sal);
end loop;
end;
----------
條件分支語句
if--then,
if--then--else,
if--then--elsif--else
----
循環語句
loop --end loop;至少會執行一次。
create or replace procedure sp_pro6() is
--定義賦值
v_num number:=1;
begin
loop
insert into users1 values(v_num,spName);
--判斷是否要退出循環
exit when v_num=10;
--自增
v_num:=v_num+1;
end loop;
end;
-------------
循環語句-while先判斷后執行
create or replace procedure sp_pro6() is
--定義賦值
v_num number:=11;
begin
while v_num<=20 loop
insert into users1 values(v_num,spName);
v_num:=v_num+1;
end loop;
end;
------------------
循環語句--for循環(不建議)
begin
for i in reverse 1。。10 loop
insert into users1 values(i,'aaa');
end loop;
end;
-------
循環語句--goto,null循環(不建議)
declare
i int:=1;
begin
loop
dbms_output.put_line('輸出i='||i);
if i=10 then
goto end_loop;
end if;
i:=i+1;
end loop;
<<end_loop>> --到i到10后直接跳到該標記
dbms_output.put_line('循環結束');
end;
---------------------------
無返回值的存儲過程(有輸入參數)
create table book(
bookId number;
bookName varchar2(100);
publishHouse varchar2(50);
);
--編寫過程
--in表示這是一個輸入參數,不寫默認是in
--out 表示一個輸出參數
create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is
begin
insert into book values(spBookId,spbookName,sppublishHouse);
end;
---------------
有返回值的存儲過程(有輸入和輸出參數)
create or replace procedure sp_pro8(ename in number,spName out varchar2) is
begin
--spName自動返回 因為他是out
select ename into spName from emp where empno=spno;
end;
----------------
有返回值是集合數組的存儲過程(有輸入和輸出參數)
1.建立一個包
--創建包 里面定義一個游標類型;
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
2.建立存儲過程。
create or replace procedure sp_pro8(spNo in number,p_cursor out testpackage.test_cursor) is
begin
--spName自動返回 因為他是out
open p_cursor for select * from emp where deptno=spNo;
end;
------------
oracle的分頁 rn是別名
select t1.*,rownum rn from(select * from emp) t1;//多加一個列記錄個數
select t1.*,rownum rn from(select * from emp) t1 where rownum<10;
select * from (select t1.*,rownum rn from(select * from emp) t1 where rownum<10) where rn>=6;
編寫oracle的分頁
--建立一個包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--建立存儲過程
create or replace procedure fenye
(tableName in varchar2,
pageSize in number, --一頁顯示幾條記錄
pageNow in number, --顯示哪一頁
myrows out number, --總記錄數
myPageCount out number,--總頁數
p_cursor out testpackage.test_cursor --返回的記錄集
) is
--定義部分
--定義sql語句 字符串
v_sql varchar2(1000);
--定義兩個整數
v_begin number:=(pageNow-1)*pageSize+1;
v_end number:=pageNow*pageSize;
begin
--執行部分
v_sql:='select * from (select t1.*,rownum rn from(select * from '||tableName||') t1 where rownum<10'||?||') where rn>='||?||';';
--把游標和sql語句關聯起來
open p_cursor for v_sql;
--計算myrows
v_sql:='select count(*) from '||tableName||'';
--執行sql,并把返回值,賦值給myrows;
execute immediate v_sql int myrows;
--計算myPagecount
if mod(myrows,pageSize)=0 then --mod()取余數
myPageCount:=myrows/pageSize;
else
myPageCount:=myrows/pagesize+1;
end if;
--關閉游標
--close p_cursor;
end;
------------------------
例外的分類
1.預定義例外用于處理常見的oracle錯誤
2.非預定義例外用于處理預定義例外不能處理的例外 6.53
3.自定義例外用于處理與oracle錯誤無關的其他情況
------------------------------------------------
-----------------------------------------------
-------JAVA中-調用無返回值的存儲過程-----------------
try{
Class.forName();
Connection ct=DriverManager.getConnerction();
//調用無返回值存儲過程
CallableStatement cs=ct.prepareCall("{call 存儲過程名稱(?,?,?)}") // ?代表存儲過程參數
cs.setIn(1,10);
cs.setString(2,'java調用存儲過程');
cs.setString(3,'人民出版社');
//執行
cs.execute();
}catch(Exception e)
{
e.printStackTrace();
}finally{
cs.close();
ct.close();
}
------------------------------------------------
-----------------------------------------------
------JAVA中--調用有回值的存儲過程-----------------
try{
Class.forName();
Connection ct=DriverManager.getConnerction();
//調用有返回值存儲過程
CallableStatement cs=ct.prepareCall("{call 存儲過程名稱(?,?)}") // ?代表存儲過程參數 第一是輸入,第二是輸出
//第一個?輸入參數
cs.setIn(1,10);
//給第二個?輸出值賦值
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); //
//執行
cs.execute();
//取出返回值,
String name=cs。getString(2);
System.out。println("名稱是:"+name);
}catch(Exception e)
{
e.printStackTrace();
}finally{
cs.close();
ct.close();
}
------------------------------------------------
-----------------------------------------------
-------JAVA中-調用有回值是多個 數組2011-12-5的存儲過程-----------------
try{
Class.forName();
Connection ct=DriverManager.getConnerction();
//調用有返回值存儲過程
CallableStatement cs=ct.prepareCall("{call 存儲過程名稱(?,?)}") // ?代表存儲過程參數 第一是輸入,第二是輸出
//第一個?輸入參數
cs.setIn(1,10);
//給第二個?輸出值賦值
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.cursor); //類型是cursor游標
//執行
cs.execute();
//取出返回值(結果集)
ReaultSet rs=(ResultSet)cs.getObject(2); //2是第二?
while(rs.next())
{
int =rs。getInt(1);
String name=rs。getString(2);
System.out。println("名稱是:"+name);
}
}catch(Exception e)
{
e.printStackTrace();
}finally{
cs.close();
ct.close();
}
------------------------------------------------
-----------------------------------------------
------JAVA中--調用有回值的存儲過程-----------------
try{
Class.forName();
Connection ct=DriverManager.getConnerction();
//調用有返回值存儲過程
CallableStatement cs=ct.prepareCall("{call 存儲過程名稱(?,?)}") // ?代表存儲過程參數 第一是輸入,第二是輸出
//第一個?輸入參數
cs.setIn(1,10);
//給第二個?輸出值賦值
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); //
//執行
cs.execute();
//取出返回值,
String name=cs。getString(2);
System.out。println("名稱是:"+name);
}catch(Exception e)
{
e.printStackTrace();
}finally{
cs.close();
ct.close();
}
------------------------------------------------
-----------------------------------------------
-------JAVA中-測試分頁調用存儲過程-----------------
try{
Class.forName();
Connection ct=DriverManager.getConnerction();
//調用有返回值存儲過程
CallableStatement cs=ct.prepareCall("{call 分頁存儲過程名稱(?,?,?,?,?,?)}") // ?代表存儲過程參數 第一是輸入,第二是輸出
//?輸入參數
cs.setString(1,'表名'); //表名
cs.setInt(2,5); //一頁顯示幾條記錄
cs.setInt(3,1); //顯示第幾頁
//?輸出參數
//注冊總記錄數
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
//注冊總頁數
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
//注冊返回的結果集
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.CURSOR); //類型是cursor游標
//執行
cs.execute();
//取出總記錄數
int rowNum=cs.getInt(4);//4表示參數中第四個?
//總頁數
int pageCount=cs.getInt(5);
//返回的記錄結果
ReaultSet rs=(ResultSet)cs.getObject(6);
while(rs.next())
{
int =rs。getInt(1);
String name=rs。getString(2);
System.out。println("名稱是:"+name);
}
}catch(Exception e)
{
e.printStackTrace();
}finally{
cs.close();
ct.close();
}
A . 嵌套表
1. 聲明數組類型
create or replace type tab_array is table of varchar2(38);暫時不要在包中聲明該類型
2. 創建存儲過程
-- 該例子存儲過程是在包中創建的,包名 arraydemo
procedure testArray(resNumber in tab_array,procResult out tab_array) is
begin
procResult := new tab_array();
for i in 1..resNumber.Count loop
procResult.EXTEND;
procResult(i) := resNumber(i) || 'lucifer' || i;
end loop;
end;
3. Java調用代碼
//必須使用Oracle的連接和Statement,使用了連接池的必須通過一些方法獲取原始的連接
OracleConnection conn = null;
OracleCallableStatement stmt = null;
String[] param = { "1001", "1002", "1006" };
stmt =(轉換類型) conn.prepareCall("{call arraydemo.testArray(?,?)}");
// 類型名必須大寫
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TAB_ARRAY", conn);
stmt.setARRAY(1, new ARRAY(descriptor,conn,param));
stmt.registerOutParameter(2, OracleTypes.ARRAY, "TAB_ARRAY");
stmt.execute();
ARRAY array = stmt.getARRAY(2);
Datum[] data = array.getOracleArray();
for (int i = 0; i < data.length; i++) {
System.out.println(i + " : " + new String(data.shareBytes()));
}
4 . 注意的問題及尚未解決的問題
拋出:Non supported character set: oracle-character-set-852 異常---解決:添加 nls_charset12.jar 到classpath,該包在oracle/ora92/jdbc/lib目錄下
待解決問題:
a) 如何調用在包聲明的自定義類型
b) 比較不同聲明類型的優缺點,及使用場合
嵌套表其它應用:http://zhouwf0726.itpub.net/post/9689/212253
B . 索引表
C . 內置數組
D . 游標方式
FCKEditor是一個很好的用于Web頁面中的格式化文本編譯控件。現在越來越多的論壇的發帖頁面中更多的使用了這個控件,我們這里將如何在基于Java的web開發中使用FCKEditor控件的步驟提供給大家,為的是讓更多的java開發者花費更少的時間去做重復勞動。
首先去下載FCKEditor2.6.3(當然本文編寫的時候,這個是最新版本,也許你現在看到的已經是更新的版本了,那么可能某些配置辦法已經變化了,本文也將跟進以保持最新動態,相反如果你使用的舊版本的控件,其配置和使用方法也有所區別),下載地址:http://www.fckeditor.net/download,我們需要下載兩個文件
第一是FCKeditor_2.6.3.zip,就是FCKEditor的控件;
第二是FCKeditor.Java(fckeditor-java-2.4.1-bin.zip),就是在Java代碼中使用FCKEditor的相關工具類;
有了這兩個文件,使用FCKEditor的基礎就具備了,接下來我們要做兩件事情,一件事情就是要把FCKEditor控件放到web項目中,這個控件是用于網頁的,所以其代碼是使用JavaScript腳本編寫的,需要和web網頁一起被下載的瀏覽器上才能執行,第二件事情就是這個網頁上的控件因為支持圖片的上傳與下載,所以在上傳與下載的時候需要服務端的支持,那么我們我的java服務端如何支持這個控件的工作呢?FCKEditor自身提供了相關的java工具,就是我們下載的第二個文件。因此我們要做的第二件事情就是在服務端配置java工具,使得FCKEditor控件在處理上傳圖片時能夠正確工作。
接下來我們就開始對配置FCKEditor控件進行兩項工作:
第一:解壓縮FCKeditor_2.6.3.zip,在其中我們能找到一個文件夾叫fckeditor,那么將這個文件夾整個復制到你的web應用的根目錄下,就是存放jsp頁面的地方。
第二:解壓縮fckeditor-java-2.4.1-bin.zip,將這樣幾個jar文件復制到web應用的WEB-INF\lib目錄中(commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar,java-core-2.4.1.jar,slf4j-api-1.5.2.jar,slf4j-simple-1.5.2.jar),其中最后一個文件在這個zip包中可能不存在,那么你可以去這個鏈接地址下載一個文件叫fckeditor-java-2.4.1-bin.zip (下載地址:http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=129511),在這個war文件中的lib中存在上述的5個jar文件,其實在war中也包含了FCKEditor控件的內容,也就是說如果你只是下載了war也可以了。然后在classpath目錄中創建一個名叫為fckeditor.properties的文件,文件中放置一行內容為:connector.userActionImpl=net.fckeditor.requestcycle.impl.UserActionImpl,
在web.xml中添加一個Servlet的配置,配置內容如下:
<servlet>
<servlet>
<servlet-name>Connector</servlet-name>
<servlet-class>net.fckeditor.connector.ConnectorServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Connector</servlet-name>
<url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern>
</servlet-mapping>
好了,現在你已經完成了配置的過程,接下來我們需要在jsp中使用FCKEditor控件了,在需要使用這個控件的jsp文件的開頭添加標簽庫的引入語句:<%@ taglib uri="http://java.fckeditor.net" prefix="FCK" %>,在使用控件進行文本格式化輸入的地方(原來你可能使用的textarea標簽)使用如下的內容來替換原來的輸入控件:
<FCK:editor instanceName="EditorDefault">
控件中要顯示的初始內容
</FCK:editor>
其中instanceName屬性的值就相當于form表單中的input的name值。就是表單提交時候的鍵值對中的鍵的名字。