2009年6月7日
#
http://www.iteye.com/topic/930648
RBAC(Role-Based Access Control,基于角色的訪問控制),就是用戶通過角色與權(quán)限進(jìn)行關(guān)聯(lián)。簡單地說,一個用戶擁有若干角色,每一個角色擁有若干權(quán)限。這樣,就構(gòu)造成“用戶-角色-權(quán)限”的授權(quán)模型。在這種模型中,用戶與角色之間,角色與權(quán)限之間,一般者是多對多的關(guān)系。(如下圖)

角色是什么?可以理解為一定數(shù)量的權(quán)限的集合,權(quán)限的載體。例如:一個論壇系統(tǒng),“超級管理員”、“版主”都是角色。版主可管理版內(nèi)的帖子、可管理版內(nèi)的用戶等,這些是權(quán)限。要給某個用戶授予這些權(quán)限,不需要直接將權(quán)限授予用戶,可將“版主”這個角色賦予該用戶。
當(dāng)用戶的數(shù)量非常大時,要給系統(tǒng)每個用戶逐一授權(quán)(授角色),是件非常煩瑣的事情。這時,就需要給用戶分組,每個用戶組內(nèi)有多個用戶。除了可給用戶授權(quán)外,還可以給用戶組授權(quán)。這樣一來,用戶擁有的所有權(quán)限,就是用戶個人擁有的權(quán)限與該用戶所在用戶組擁有的權(quán)限之和。(下圖為用戶組、用戶與角色三者的關(guān)聯(lián)關(guān)系)

在應(yīng)用系統(tǒng)中,權(quán)限表現(xiàn)成什么?對功能模塊的操作,對上傳文件的刪改,菜單的訪問,甚至頁面上某個按鈕、某個圖片的可見性控制,都可屬于權(quán)限的范疇。有些權(quán)限設(shè)計(jì),會把功能操作作為一類,而把文件、菜單、頁面元素等作為另一類,這樣構(gòu)成“用戶-角色-權(quán)限-資源”的授權(quán)模型。而在做數(shù)據(jù)表建模時,可把功能操作和資源統(tǒng)一管理,也就是都直接與權(quán)限表進(jìn)行關(guān)聯(lián),這樣可能更具便捷性和易擴(kuò)展性。(見下圖)

請留意權(quán)限表中有一列“權(quán)限類型”,我們根據(jù)它的取值來區(qū)分是哪一類權(quán)限,如“MENU”表示菜單的訪問權(quán)限、“OPERATION”表示功能模塊的操作權(quán)限、“FILE”表示文件的修改權(quán)限、“ELEMENT”表示頁面元素的可見性控制等。
這樣設(shè)計(jì)的好處有二。其一,不需要區(qū)分哪些是權(quán)限操作,哪些是資源,(實(shí)際上,有時候也不好區(qū)分,如菜單,把它理解為資源呢還是功能模塊權(quán)限呢?)。其二,方便擴(kuò)展,當(dāng)系統(tǒng)要對新的東西進(jìn)行權(quán)限控制時,我只需要建立一個新的關(guān)聯(lián)表“權(quán)限XX關(guān)聯(lián)表”,并確定這類權(quán)限的權(quán)限類型字符串。
這里要注意的是,權(quán)限表與權(quán)限菜單關(guān)聯(lián)表、權(quán)限菜單關(guān)聯(lián)表與菜單表都是一對一的關(guān)系。(文件、頁面權(quán)限點(diǎn)、功能操作等同理)。也就是每添加一個菜單,就得同時往這三個表中各插入一條記錄。這樣,可以不需要權(quán)限菜單關(guān)聯(lián)表,讓權(quán)限表與菜單表直接關(guān)聯(lián),此時,須在權(quán)限表中新增一列用來保存菜單的ID,權(quán)限表通過“權(quán)限類型”和這個ID來區(qū)分是種類型下的哪條記錄。
到這里,RBAC權(quán)限模型的擴(kuò)展模型的完整設(shè)計(jì)圖如下:

隨著系統(tǒng)的日益龐大,為了方便管理,可引入角色組對角色進(jìn)行分類管理,跟用戶組不同,角色組不參與授權(quán)。例如:某電網(wǎng)系統(tǒng)的權(quán)限管理模塊中,角色就是掛在區(qū)局下,而區(qū)局在這里可當(dāng)作角色組,它不參于權(quán)限分配。另外,為方便上面各主表自身的管理與查找,可采用樹型結(jié)構(gòu),如菜單樹、功能樹等,當(dāng)然這些可不需要參于權(quán)限分配。
http://developer.51cto.com/art/200907/136668.htmspring 中已經(jīng)提供了很好的實(shí)現(xiàn),所以這又省去了很多的功夫,接下來看看
iBATIS是如何支持
Clob和blob的。
iBATIS提供了TypeHandler接口,用于處理數(shù)據(jù)類型,基本的實(shí)現(xiàn)類為BaseTypeHandler
在spring 中,提供了AbstractLobTypeHandler作為基礎(chǔ)類,并且提供了相應(yīng)的模版方法,所有的工作由LobHandler處理。
BlobByteArrayTypeHandler 主要用于處理blob類型數(shù)據(jù),使用byte[]來映射相應(yīng)的Blob
ClobStringTypeHandler 用于處理Clob類型數(shù)據(jù),使用字符串來映射Clob
有一點(diǎn)需要注意的是,AbstractLobTypeHandler中實(shí)現(xiàn)了事務(wù)支持,需要用來釋放相應(yīng)的資源,所以一定需要在事務(wù)環(huán)境中進(jìn)行。
下面是一個簡單的例子:
- public class Food {
- private String content;
-
- private String id;
-
- private byte[] image;
-
- private String name;
- ...
- }
xml如下:說明一下,在resultMap中可以通過typeHandler來指定具體的handler.在inline變量中,可以通過handler來定義相應(yīng)的typeHandler
- ﹤sqlMap namespace="Food"﹥
-
- ﹤typeAlias alias="Food" type="org.esoft.hdb.bo.Food"/﹥
- ﹤resultMap id="foodResult" class="Food"﹥
- ﹤result property="id" column="C_ID"/﹥
- ﹤result property="name" column="C_NAME"/﹥
- ﹤result property="content" column="C_content"
- typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/﹥
- ﹤result property="image" column="C_image"
- typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/﹥
- ﹤/resultMap﹥
- ﹤sql id="foodFragment"﹥select C_ID,C_NAME,C_CONTENT,C_IMAGE from T_FOOD﹤/sql﹥
- ﹤select id="getAll" resultMap="foodResult"﹥
- ﹤include refid="foodFragment"/﹥
- ﹤/select﹥
- ﹤select id="selectById" parameterClass="string" resultMap="foodResult"﹥
- ﹤include refid="foodFragment"/﹥ where C_ID=#id#﹤/select﹥
-
- ﹤insert id="insert" parameterClass="Food"﹥ insert into T_FOOD ( C_ID,
- C_NAME,C_CONTENT, C_IMAGE) values ( #id#,
- #name#,#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,
- #image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#)
- ﹤/insert﹥
-
- ﹤update id="update" parameterClass="Food"﹥ update T_FOOD set C_NAME = #name#,
- C_CONTENT =
- #content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,
- C_IMAGE =
- #image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#
- where C_ID = #id# ﹤/update﹥
-
- ﹤delete id="deleteById" parameterClass="string"﹥ delete from T_FOOD where C_ID = #id#
- ﹤/delete﹥
-
- ﹤/sqlMap﹥
-
-
- public interface FoodService {
-
-
- void save(Food food);
- Food get(String id);
- /**
- * @param food
- */
- void update(Food food);
- }
-
- public class FoodServiceImpl implements FoodService {
- private FoodDAO foodDAO;
-
- private DaoCreator creator;
-
- public void setCreator(DaoCreator creator) {
- this.creator = creator;
- }
-
- protected FoodDAO getFoodDAO() {
- if (foodDAO == null) {
- foodDAO = (FoodDAO) creator.createDao(FoodDAO.class, Food.class);
- }
- return foodDAO;
- }
-
- public Food get(String id) {
- return getFoodDAO().get(id);
- }
- public void save(Food food) {
- getFoodDAO().save(food);
- }
- public void update(Food food) {
- getFoodDAO().update(food);
- }
-
- }
-
- spring xml 配置:
-
- 。。。
- ﹤bean id="lobHandler"
- class="org.springframework.jdbc.support.lob.DefaultLobHandler"/﹥
-
- ﹤bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager"﹥
- ﹤property name="dataSource" ref="dataSource"/﹥
- ﹤/bean﹥
-
- ﹤bean id="sqlMapClient"
- class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"﹥
- ﹤property name="dataSource" ref="dataSource"/﹥
- ﹤property name="configLocation"﹥
- ﹤value﹥SqlMapConfig.xml﹤/value﹥
- ﹤/property﹥
- ﹤property name="lobHandler" ref="lobHandler"/﹥
- ﹤/bean﹥
-
- ﹤bean id="daoCreate" class="org.esoft.hdb.ibatis.IbatisDaoCreator"﹥
- ﹤property name="sqlMapClient" ref="sqlMapClient"/﹥
- ﹤/bean﹥
-
- ﹤bean id="foodService" class="org.esoft.hdb.service.FoodServiceImpl"﹥
- ﹤property name="creator" ref="daoCreate"/﹥
- ﹤/bean﹥
-
-
- ﹤aop:config﹥
- ﹤aop:pointcut id="foodServiceMethods"
- expression="execution(* org.esoft.hdb.service.FoodService.*(..))"/﹥
- ﹤aop:advisor advice-ref="txAdvice" pointcut-ref="foodServiceMethods"/﹥
- ﹤/aop:config﹥
- ﹤tx:advice id="txAdvice" transaction-manager="transactionManager"﹥
- ﹤tx:attributes﹥
- ﹤tx:method name="*" propagation="REQUIRED"/﹥
- ﹤/tx:attributes﹥
- ﹤/tx:advice﹥
簡單的測試:
- save :
- Food food = new Food();
- food.setPk("1");
- food.setName("food1");
- BufferedInputStream in = new BufferedInputStream(getClass()
- .getResourceAsStream("/1.gif"));
- byte[] b = FileCopyUtils.copyToByteArray(in);
- food.setImage(b);
- in = new BufferedInputStream(getClass().getResourceAsStream(
- "/hibernate.cfg.xml"));
- b = FileCopyUtils.copyToByteArray(in);
- food.setContent(new String(b));
- foodService.save(food);
- update:
- Food food = foodService.get("1");
- BufferedInputStream in = new BufferedInputStream(getClass()
- .getResourceAsStream("/jdbc.properties"));
- byte[] b = FileCopyUtils.copyToByteArray(in);
- food.setContent(new String(b));
- foodService.update(food);
- food = foodService.get("1");
- assertNotNull(food.getImage());
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.SID;獲得未提交的事物的列表和基礎(chǔ)信息
然后根據(jù) sessionID和serial#號強(qiáng)制關(guān)閉事物:
ALTER SYSTEM KILL SESSION '9,108';
--'9,108'為sessionID和serial#號,逗號分開
http://www.javaeye.com/topic/37302
類與類之間的關(guān)系對于理解面向?qū)ο缶哂泻苤匾淖饔茫郧霸诿嬖嚨臅r候也經(jīng)常被問到這個問題,在這里我就介紹一下。
類與類之間存在以下關(guān)系:
(1)泛化(Generalization)
(2)關(guān)聯(lián)(Association)
(3)依賴(Dependency)
(4)聚合(Aggregation)
UML圖與應(yīng)用代碼例子:
1.泛化(Generalization)
[泛化]
表示類與類之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,或類對接口的實(shí)現(xiàn)關(guān)系。一般化的關(guān)系是從子類指向父類的,與繼承或?qū)崿F(xiàn)的方法相反。
[具體表現(xiàn)]
父類 父類實(shí)例=new 子類()
[UML圖](圖1.1)


圖1.1 Animal類與Tiger類,Dog類的泛化關(guān)系
[代碼表現(xiàn)]
- class Animal{}
- class Tiger extends Animal{}
- public class Test
- {
- public void test()
- {
- Animal a=new Tiger();
- }
- }
2.依賴(Dependency)
[依賴]
對于兩個相對獨(dú)立的對象,當(dāng)一個對象負(fù)責(zé)構(gòu)造另一個對象的實(shí)例,或者依賴另一個對象的服務(wù)時,這兩個對象之間主要體現(xiàn)為依賴關(guān)系。
[具體表現(xiàn)]
依賴關(guān)系表現(xiàn)在局部變量,方法的參數(shù),以及對靜態(tài)方法的調(diào)用
[現(xiàn)實(shí)例子]
比如說你要去擰螺絲,你是不是要借助(也就是依賴)螺絲刀(Screwdriver)來幫助你完成擰螺絲(screw)的工作
[UML表現(xiàn)](圖1.2)

圖1.2 Person類與Screwdriver類的依賴關(guān)系
[代碼表現(xiàn)]
- public class Person{
-
- public void screw(Screwdriver screwdriver){
- screwdriver.screw();
- }
- }
3.關(guān)聯(lián)(Association)
[關(guān)聯(lián)]
對于兩個相對獨(dú)立的對象,當(dāng)一個對象的實(shí)例與另一個對象的一些特定實(shí)例存在固定的對應(yīng)關(guān)系時,這兩個對象之間為關(guān)聯(lián)關(guān)系。
[具體表現(xiàn)]
關(guān)聯(lián)關(guān)系是使用實(shí)例變量來實(shí)現(xiàn)
[現(xiàn)實(shí)例子]
比如客戶和訂單,每個訂單對應(yīng)特定的客戶,每個客戶對應(yīng)一些特定的訂單;再例如公司和員工,每個公司對應(yīng)一些特定的員工,每個員工對應(yīng)一特定的公司
[UML圖] (圖1.3)

圖1.3 公司和員工的關(guān)聯(lián)關(guān)系
[代碼表現(xiàn)]
- public class Company{
- private Employee employee;
- public Employee getEmployee(){
- return employee;
- }
- public void setEmployee(Employee employee){
- this.employee=employee;
- }
-
- public void run(){
- employee.startWorking();
- }
- }
(4)聚合(Aggregation)
[聚合]
當(dāng)對象A被加入到對象B中,成為對象B的組成部分時,對象B和對象A之間為聚集關(guān)系。聚合是關(guān)聯(lián)關(guān)系的一種,是較強(qiáng)的關(guān)聯(lián)關(guān)系,強(qiáng)調(diào)的是整體與部分之間的關(guān)系。
[具體表現(xiàn)]
與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過實(shí)例變量來實(shí)現(xiàn)這樣關(guān)系的。關(guān)聯(lián)關(guān)系和聚合關(guān)系來語法上是沒辦法區(qū)分的,從語義上才能更好的區(qū)分兩者的區(qū)別。
[關(guān)聯(lián)與聚合的區(qū)別]
(1)關(guān)聯(lián)關(guān)系所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關(guān)聯(lián)關(guān)系,而不是聚合關(guān)系,因?yàn)槿瞬皇怯勺孕熊嚱M成的。
聚合關(guān)系涉及的兩個對象處于不平等的層次上,一個代表整體,一個代表部分。比如電腦和它的顯示器、鍵盤、主板以及內(nèi)存就是聚集關(guān)系,因?yàn)橹靼迨请娔X的組成部分。
(2)對于具有聚集關(guān)系(尤其是強(qiáng)聚集關(guān)系)的兩個對象,整體對象會制約它的組成對象的生命周期。部分類的對象不能單獨(dú)存在,它的生命周期依賴于整體類的對象的生命周期,當(dāng)整體消失,部分也就隨之消失。比如張三的電腦被偷了,那么電腦的所有組件也不存在了,除非張三事先把一些電腦的組件(比如硬盤和內(nèi)存)拆了下來。
[UML圖](圖1.4)

圖1.3 電腦和組件的聚合關(guān)系
[代碼表現(xiàn)]
- public class Computer{
- private CPU cpu;
- public CPU getCPU(){
- return cpu;
- }
- public void setCPU(CPU cpu){
- this.cpu=cpu;
- }
-
- public void start(){
-
- cpu.run();
- }
- }
在快捷方式屬性-目標(biāo)里加入 -vm "%JAVA_HOME%/jre/bin/javaw.exe"
Oracle 10g Express Edition是Oracle專門為小型用戶提供的免費(fèi)版本。Oracle XE十分小巧,安裝簡單,可供第三方軟件開發(fā)商部署較小的應(yīng)用。
不過Oracle XE目前的beta2缺省安裝的字符集是WE8MSWIN1252,不是中文字符集,并且不能通過直接運(yùn)行 alter database character set ZHS16GBK ; 來修改,因?yàn)閆HS16GBK不是缺省字符集的超集。過去流傳很廣的直接修改sys用戶下的PROPS$表的方法,也會給字符集的變更留下很多潛在的問題.
不過在安裝完Oracle XE后,可以在sqlplus(即Oracle XE的run SQL command line)中, 進(jìn)行如下的操作來修改字符集:
connect system/oracle9i as sysdba
shutdown immediate
startup mount
alter system enable restricted session ;
alter system set JOB_QUEUE_PROCESSES=0;
alter system set AQ_TM_PROCESSES=0;
alter database open ;
alter database character set internal_use ZHS16GBK ;
shutdown immediate
startup
這樣字符集的修改就完成了
摘自紅色黑客聯(lián)盟(www.7747.net) 原文:http://www.7747.net/px/200902/34068.html
在數(shù)據(jù)庫服務(wù)器上運(yùn)行 sqlplus system/password@xe (其中 system 是數(shù)據(jù)庫用戶無需改變;password 是數(shù)據(jù)庫密碼應(yīng)指定為實(shí)際密碼;xe 是數(shù)據(jù)庫實(shí)例名稱) ,然后執(zhí)行:
alter system set session_cached_cursors=200 scope=spfile;
alter system set session_max_open_files=200 scope=spfile;
alter system set sessions=20 scope=spfile;
alter system set license_max_sessions=200 scope=spfile;
alter system set license_sessions_warning=200 scope=spfile;
alter system set processes=200 scope=spfile;
執(zhí)行后,重啟 Oracle XE 數(shù)據(jù)庫實(shí)例即可。要重啟 Oracle XE 數(shù)據(jù)庫實(shí)例:
1. 如安裝于 Windows 上,先運(yùn)行 net stop oracleservicexe,再運(yùn)行 net start oracleservicexe 即可。也可通過“服務(wù)”管理控制臺重啟 OracleServiceXE 服務(wù)。
2. 如安裝于 Linux 上,先運(yùn)行 /etc/init.d/oracle-xe start,再運(yùn)行 /etc/init.d/oracle-xe stop 即可。
此時,可以支持 179 個額外的連接會話。
選擇“運(yùn)行SQL命令”,進(jìn)入如下提示符
SQL>
首先連接到服務(wù)器
connect 用戶名/密碼
登陸后輸入如下命令:
sql 代碼
1.call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081));
其中8081是修改后的端口,可以任意。
這樣你就不會與Tomcat的默認(rèn)端口沖突了,方便開發(fā)。
ftp服務(wù)占用2100端口,更改命令是:
sql 代碼
1.call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get() , '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()', 2111));
1. 把插件文件直接覆蓋到eclipse目錄里
2. 使用link文件,就是把插件存放到任一的地方(例如/eclipse/MyPuls),然后 在eclipse的文件夾里新建一個links的文件,在里面添加一些后追名為.link的文件(例如emfPlugins.link)結(jié)構(gòu)是這樣的:
/eclipse/
links/
emfPlugins.link
webtools.link
updateManager.link
...
...
link文件的里包含這樣一條 “path=D:\\JavaDev\\plugins\\vssplugin”這個路徑就是插件的存放路徑。
3. 使用eclipse自帶的圖形界面的插件安裝方法:選擇Help > Software Updates > Manager Configuration
在選擇Add > Extension Location 找到你要安裝插件的目錄就可以了。強(qiáng)烈推薦這種方法,優(yōu)點(diǎn)很多比如可以方便的添加刪除,也不用自己寫link文件!
備注:Eclipse插件的目錄結(jié)構(gòu)
/eclipse-plugins/
eclipse/
.eclipseextension
features/
plugins/
第2、3種方法所指向的目錄都指的是"eclipse"目錄,
如果用第3種方法,在eclipse這個目錄下必須有文件.eclipseextension,如果你下的插件沒有這個文件,那就隨便eclipse安裝目錄下的那個文件靠過去就行了!只有有這么個文件就可以了,內(nèi)容沒什么用,主要是一些版本信息!例如:
id=org.eclipse.platform name=Eclipse Platformversion=3.3.1
創(chuàng)建XMLHtttRequest對象(針對mozilla,IE8,FF,IE5,IE5.5,IE6,IE7)
//2、創(chuàng)建XMLHttpRequest對象
//這其實(shí)是XMLHttpReqest對象使用最復(fù)雜的一步
//針對IE和其他類型瀏覽器建立這個對象的不同方式寫不同的代碼
if(window.XMLHttpRequest){
//針對firefox,mozillaz,opera,IE7,IE8
xmlhttp = new XMLHttpRequest();
//用于修復(fù)某些Mozillaz瀏覽器bug
if(xmlhttp.overrideMimeType)
{
xmlhttp.overrideMimeType("text/xml");
}
}
else if(window.ActiveXObject){
//針對IE6,IE5.5,IE5
//兩個都可以創(chuàng)建XMLHttpRequest對象,保存在js數(shù)組中
var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
//var activeName= ['MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.5.0', //'MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0', //'MSXML2.XMLHTTP','Microsoft.XMLHTTP'];
for(var i =0;i<activeName.length;i++)
{//取出一個控件名來創(chuàng)建XMLHttpRequest對象,創(chuàng)建成功就終止循環(huán),如果創(chuàng)建失敗可以繼續(xù)創(chuàng)建
//可以拋出異常,繼續(xù)創(chuàng)建
try{
xmlhttp= new ActiveXObject(activeName[i]);
break;
}catch(e){
}
}
}
//確認(rèn)XMLHttpRequest對象已經(jīng)創(chuàng)建成功
if(!xmlhttp)
{
alert("XmlHttpRequest創(chuàng)建失敗");
return;
}
//3、注冊回調(diào)函數(shù),函數(shù)名后面不要加括號
//如果加了括號,就變成了調(diào)用函數(shù),會把函數(shù)的返回值發(fā)揮給xmlhttp,沒有達(dá)到我們的目的
xmlhttp.onreadystatechange=callback;
//4、設(shè)置連接信息
//第一個參數(shù)設(shè)置http請求方式,主要是get和post兩種方式
//第二個參數(shù)是uri地址
//第三個參數(shù)表示異步交互還是同步交互方式,true表示異步,false表示同步
xmlhttp.open("GET","/JQuery/servlet/AjaxServlet?name="+username,true);
//5、發(fā)送數(shù)據(jù)開始和服務(wù)器端交互
//同步方式下,send這句話會在服務(wù)器端的數(shù)據(jù)回來后,才執(zhí)行完
//異步方式下,send會立即執(zhí)行完
xmlhttp.send(null);
}
//5、寫回調(diào)函數(shù)
//回調(diào)函數(shù)
function callback(){
//接收相應(yīng)的相應(yīng)數(shù)據(jù)
//判斷交互狀態(tài)已經(jīng)完成
if(xmlhttp.readyState ==4)
{
//判斷http的交互狀態(tài)
if(xmlhttp.status == 200)
{
//獲取服務(wù)器端返回的數(shù)據(jù)
//獲取服務(wù)器端純文本數(shù)據(jù)
var responseText = xmlhttp.responseText;
//將數(shù)據(jù)顯示在頁面上
//通過dom獲取div元素節(jié)點(diǎn)
var divNode =document.getElementById("result");
//設(shè)置元素節(jié)點(diǎn)的html內(nèi)容
divNode.innerHTML=responseText;
}
}
1,<meta name="Robots" contect="all|none|index|noindex|follow|nofollow"> 默認(rèn)是all
其中的屬性說明如下:
設(shè)定為all:文件將被檢索,且頁面上的鏈接可以被查詢;
設(shè)定為none:文件將不被檢索,且頁面上的鏈接不可以被查詢;
設(shè)定為index:文件將被檢索;
設(shè)定為follow:頁面上的鏈接可以被查詢;
設(shè)定為noindex:文件將不被檢索,但頁面上的鏈接可以被查詢;
設(shè)定為nofollow:文件將不被檢索,頁面上的鏈接可以被查詢。
2,revisit-after (重訪)
<META name="revisit-after" CONTENT="7 days" >
通知搜索引擎多少天訪問一次
其他的:
<META NAME="GENERATOR" CONTENT="Macromedia Dreamweaver MX">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<Meta http-equiv="Content-Language" Content="zh-CN">
<Meta http-equiv="Refresh" Content="5; Url=http://hi.baidu.com/pihi">
<Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT">
<meta http-equiv="cache-control" content="no-cache">
<META name="keywords" content="關(guān)鍵字">
<meta name="description" content="描述">
<meta name="author" content="作者">
<meta name="build" content="日期">
<meta name="coprright" content="版權(quán)">
<meta name="reply-to" content="email">
<meta name="robots" content="all">
<meta http-equiv="Page-Enter" content="RevealTrans (Duration=3, Transition=23)">
<meta http-equiv="Page-Exit" content="RevealTrans (Duration=3, Transition=23)">
<link rel="shortcut icon" href="favicon.ico">
------------------------------------------------------------------------------------------------------------
meta標(biāo)簽分兩大部分:HTTP標(biāo)題信息(HTTP-EQUIV)和頁面描述信息(NAME)。
1、Content-Type和Content-Language (顯示字符集的設(shè)定)
說明:設(shè)定頁面使用的字符集,用以說明主頁制作所使用的文字已經(jīng)語言,瀏覽器會根據(jù)此來調(diào)用相應(yīng)的字符集顯示page內(nèi)容。
注意: 該meta標(biāo)簽定義了HTML頁面所使用的字符集為GB2132,就是國標(biāo)漢字碼。如果將其中的“charset=GB2312”替換成“BIG5”,則該頁面所用的字符集就是繁體中文Big5碼。當(dāng)你瀏覽一些國外的站點(diǎn)時,IE瀏覽器會提示你要正確顯示該頁面需要下載xx語支持。這個功能就是通過讀取HTML頁面Meta標(biāo)簽的Content-Type屬性而得知需要使用哪種字符集顯示該頁面的。如果系統(tǒng)里沒有裝相應(yīng)的字符集,則IE就提示下載。其他的語言也對應(yīng)不同的charset,比如日文的字符集是“iso-2022-jp ”,韓文的是“ks_c_5601”。
Charset選項(xiàng):ISO-8859-1(英文)、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii, x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw, x-cns11643-1,x-cns11643-2等字符集;Content-Language的Content還可以是:EN、FR等語言代碼。
2、Refresh (刷新)
3、Expires (期限)
說明:指定網(wǎng)頁在緩存中的過期時間,一旦網(wǎng)頁過期,必須到服務(wù)器上重新調(diào)閱。
注意:必須使用GMT的時間格式,或直接設(shè)為0(數(shù)字表示多少時間后過期)。
4、Pragma (cach模式)
說明:禁止瀏覽器從本地機(jī)的緩存中調(diào)閱頁面內(nèi)容。
注意:網(wǎng)頁不保存在緩存中,每次訪問都刷新頁面。這樣設(shè)定,訪問者將無法脫機(jī)瀏覽。
5、Set-Cookie (cookie設(shè)定)
說明:瀏覽器訪問某個頁面時會將它存在緩存中,下次再次訪問時就可從緩存中讀取,以提高速度。當(dāng)你希望訪問者每次都刷新你廣告的圖標(biāo),或每次都刷新你的計(jì)數(shù)器,就要禁用緩存了。通常HTML文件沒有必要禁用緩存,對于ASP等頁面,就可以使用禁用緩存,因?yàn)槊看慰吹降捻撁娑际窃诜?wù)器動態(tài)生成的,緩存就失去意義。如果網(wǎng)頁過期,那么存盤的cookie將被刪除。
用法:<Meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday,
21-Oct-98 16:14:21 GMT; path=/">
注意:必須使用GMT的時間格式。
6、Window-target (顯示窗口的設(shè)定)
說明:強(qiáng)制頁面在當(dāng)前窗口以獨(dú)立頁面顯示。
用法:<Meta http-equiv="Widow-target" Content="_top">
注意:這個屬性是用來防止別人在框架里調(diào)用你的頁面。Content選項(xiàng):_blank、_top、_self、_parent。
7、Pics-label (網(wǎng)頁RSAC等級評定)
說明:在IE的Internet選項(xiàng)中有一項(xiàng)內(nèi)容設(shè)置,可以防止瀏覽一些受限制的網(wǎng)站,而網(wǎng)站的限制級
別就是通過該參數(shù)來設(shè)置的。
用法:<META http-equiv="Pics-label" Contect=
"(PICS-1.1'http://www.rsac.org/ratingsv01.html'
I gen comment 'RSACi North America Sever' by 'inet@microsoft.com'
for 'http://www.microsoft.com' on '1997.06.30T14:21-0500' r(n0 s0 v0 l0))">
注意:不要將級別設(shè)置的太高。RSAC的評估系統(tǒng)提供了一種用來評價(jià)Web站點(diǎn)內(nèi)容的標(biāo)準(zhǔn)。用戶可以設(shè)置Microsoft Internet Explorer(IE3.0以上)來排除包含有色情和暴力內(nèi)容的站點(diǎn)。上面這個例子中的HTML取自Microsoft的主頁。代碼中的(n 0 s 0 v 0 l 0)表示該站點(diǎn)不包含不健康內(nèi)容。級別的評定是由RSAC,即美國娛樂委員會的評級機(jī)構(gòu)評定的,如果你想進(jìn)一步了解RSAC評估系統(tǒng)的等級內(nèi)容,或者你需要評價(jià)自己的網(wǎng)站,可以訪問RSAC的站點(diǎn):http://www.rsac.org/。
8、Page-Enter、Page-Exit (進(jìn)入與退出)
說明:這個是頁面被載入和調(diào)出時的一些特效。
用法:<Meta http-equiv="Page-Enter" Content="blendTrans(Duration=0.5)">
<Meta http-equiv="Page-Exit" Content="blendTrans(Duration=0.5)">
注意:blendTrans是動態(tài)濾鏡的一種,產(chǎn)生漸隱效果。另一種動態(tài)濾鏡RevealTrans也可以用于頁面進(jìn)入與退出效果:
<Meta http-equiv="Page-Enter" Content="revealTrans(duration=x, transition=y)">
<Meta http-equiv="Page-Exit" Content="revealTrans(duration=x, transition=y)">
Duration 表示濾鏡特效的持續(xù)時間(單位:秒)
Transition 濾鏡類型。表示使用哪種特效,取值為0-23。
0 矩形縮小
1 矩形擴(kuò)大
2 圓形縮小
3 圓形擴(kuò)大
4 下到上刷新
5 上到下刷新
6 左到右刷新
7 右到左刷新
8 豎百葉窗
9 橫百葉窗
10 錯位橫百葉窗
11 錯位豎百葉窗
12 點(diǎn)擴(kuò)散
13 左右到中間刷新
14 中間到左右刷新
15 中間到上下
16 上下到中間
17 右下到左上
18 右上到左下
19 左上到右下
20 左下到右上
21 橫條
22 豎條
23 以上22種隨機(jī)選擇一種
9、MSThemeCompatible (XP主題)
說明:是否在IE中關(guān)閉 xp 的主題
用法:<Meta http-equiv="MSThemeCompatible" Content="Yes">
注意:關(guān)閉 xp 的藍(lán)色立體按鈕系統(tǒng)顯示樣式,從而和win2k 很象。
10、IE6 (頁面生成器)
說明:頁面生成器generator,是ie6
用法:<Meta http-equiv="IE6" Content="Generator">
注意:用什么東西做的,類似商品出廠廠商。
11、Content-Script-Type (腳本相關(guān))
說明:這是近來W3C的規(guī)范,指明頁面中腳本的類型。
用法:<Meta http-equiv="Content-Script-Type" Content="text/javascript">
★NAME變量
name是描述網(wǎng)頁的,對應(yīng)于Content(網(wǎng)頁內(nèi)容),以便于搜索引擎機(jī)器人查找、分類(目前幾乎所有的搜索引擎都使用網(wǎng)上機(jī)器人自動查找meta值來給網(wǎng)頁分類)。
name的value值(name="")指定所提供信息的類型。有些值是已經(jīng)定義好的。例如description(說明)、keyword(關(guān)鍵字)、refresh(刷新)等。還可以指定其他任意值,如:creationdate(創(chuàng)建日期) 、
document ID(文檔編號)和level(等級)等。
name的content指定實(shí)際內(nèi)容。如:如果指定level(等級)為value(值),則Content可能是beginner(初級)、intermediate(中級)、advanced(高級)。
1、Keywords (關(guān)鍵字)
說明:為搜索引擎提供的關(guān)鍵字列表
用法:<Meta name="Keywords" Content="關(guān)鍵詞1,關(guān)鍵詞2,關(guān)鍵詞3,關(guān)鍵詞4,……">
注意:各關(guān)鍵詞間用英文逗號“,”隔開。META的通常用處是指定搜索引擎用來提高搜索質(zhì)量的關(guān)鍵詞。當(dāng)數(shù)個META元素提供文檔語言從屬信息時,搜索引擎會使用lang特性來過濾并通過用戶的語言優(yōu)先參照來顯示搜索結(jié)果。例如:
<Meta name="Kyewords" Lang="EN" Content="vacation,greece,sunshine">
<Meta name="Kyewords" Lang="FR" Content="vacances,grè:ce,soleil">
2、Description (簡介)
說明:Description用來告訴搜索引擎你的網(wǎng)站主要內(nèi)容。
用法:<Meta name="Description" Content="你網(wǎng)頁的簡述">
注意:
3、Robots (機(jī)器人向?qū)?
說明:Robots用來告訴搜索機(jī)器人哪些頁面需要索引,哪些頁面不需要索引。Content的參數(shù)有all、none、index、noindex、follow、nofollow。默認(rèn)是all。
用法:<Meta name="Robots" Content="All|None|Index|Noindex|Follow|Nofollow">
注意:許多搜索引擎都通過放出robot/spider搜索來登錄網(wǎng)站,這些robot/spider就要用到meta元素的一些特性來決定怎樣登錄。
all:文件將被檢索,且頁面上的鏈接可以被查詢;
none:文件將不被檢索,且頁面上的鏈接不可以被查詢;(和 "noindex, no follow" 起相同作用)
index:文件將被檢索;(讓robot/spider登錄)
follow:頁面上的鏈接可以被查詢;
noindex:文件將不被檢索,但頁面上的鏈接可以被查詢;(不讓robot/spider登錄)
nofollow:文件將不被檢索,頁面上的鏈接可以被查詢。(不讓robot/spider順著此頁的連接往下探找)
4、Author (作者)
說明:標(biāo)注網(wǎng)頁的作者或制作組
用法:<Meta name="Author" Content="張三,abc@sina.com">
注意:Content可以是:你或你的制作組的名字,或Email
5、Copyright (版權(quán))
說明:標(biāo)注版權(quán)
用法:<Meta name="Copyright" Content="本頁版權(quán)歸Zerospace所有。All Rights Reserved">
注意:
6、Generator (編輯器)
說明:編輯器的說明
用法:<Meta name="Generator" Content="PCDATA|FrontPage|">
注意:Content="你所用編輯器"
7、revisit-after (重訪)
說明:
用法:<META name="revisit-after" CONTENT="7 days" >
PostgreSQL支持管理員直接手動安裝數(shù)據(jù)庫,給用戶提供了更大的方便。
1. 在PostgreSQL官方網(wǎng)站上下載免安裝二進(jìn)制的包,名字類似于postgresql-*.*.*.*-binaries-no-installer.tar.gz之類的。
下載到本地,解壓到某路徑PATH下。
2. 在PATH目錄中創(chuàng)建data文件夾,用于存放數(shù)據(jù)。
3. 開始-->運(yùn)行-->cmd 進(jìn)入命令行。并cd到PATH\bin目錄下執(zhí)行下面的命令用來初始化數(shù)據(jù)庫:
PATH\bin> initdb.exe -D PATH\data -E UTF8 --locale=C
4. 將pgsql注冊為windows服務(wù),便于操作和控制:
PATH\bin> pg_ctl.exe register -D PATH\data -N pgsql
其中-N參數(shù)用來設(shè)置pgsql作為windows服務(wù)的名稱。
5. 啟動和關(guān)閉數(shù)據(jù)庫,在命令行下:
> net start pgsql (開啟數(shù)據(jù)庫)
> net stop pgsql (關(guān)閉數(shù)據(jù)庫)
注:為避免以后可能發(fā)生的亞州大字符集的亂碼問題,統(tǒng)一使用UTF8編碼。
需要一個非管理員帳號來運(yùn)行PostgreSQL?
當(dāng)一個駭客通過軟件的缺陷獲得了侵入一臺計(jì)算機(jī)的入口時,她獲得的是這個程序運(yùn)行所用用戶帳號的對應(yīng)權(quán)限。由于我們無法預(yù)知PostgreSQL中是否還存在這樣的bug,所以我們強(qiáng)制使用一個非管理員的服務(wù)帳號來最小化潛在的駭客利用此類漏洞對系統(tǒng)進(jìn)行破壞的風(fēng)險(xiǎn)。這樣的設(shè)置已是Unix界的慣例做法,同時在Windows世界中,Microsoft以及其他供應(yīng)商也開始采用這樣的做法來改進(jìn)他們系統(tǒng)的安全性。補(bǔ)充: 自PostgreSQL 8.2發(fā)行后,從管理帳號啟動變得可行。PostgreSQL 8.2及后續(xù)版本會在啟動后不可撤銷地放棄管理權(quán)限,從而保證了當(dāng)極端不可能事件,當(dāng)PostgreSQL受到入侵時,系統(tǒng)的安全性。
<script type="text/javascript">
//** iframe自動適應(yīng)頁面 **//
//輸入你希望根據(jù)頁面高度自動調(diào)整高度的iframe的名稱的列表
//用逗號把每個iframe的ID分隔. 例如: ["myframe1", "myframe2"],可以只有一個窗體,則不用逗號。
//定義iframe的ID
var iframeids=["test"]
//如果用戶的瀏覽器不支持iframe是否將iframe隱藏 yes 表示隱藏,no表示不隱藏
var iframehide="yes"
function dyniframesize()
{
var dyniframe=new Array()
for (i=0; i<iframeids.length; i++)
{
if (document.getElementById)
{
//自動調(diào)整iframe高度
dyniframe[dyniframe.length] = document.getElementById(iframeids[i]);
if (dyniframe[i] && !window.opera)
{
dyniframe[i].style.display="block"
if (dyniframe[i].contentDocument && dyniframe[i].contentDocument.body.offsetHeight) //如果用戶的瀏覽器是NetScape
dyniframe[i].height = dyniframe[i].contentDocument.body.offsetHeight;
else if (dyniframe[i].Document && dyniframe[i].Document.body.scrollHeight) //如果用戶的瀏覽器是IE
dyniframe[i].height = dyniframe[i].Document.body.scrollHeight;
}
}
//根據(jù)設(shè)定的參數(shù)來處理不支持iframe的瀏覽器的顯示問題
if ((document.all || document.getElementById) && iframehide=="no")
{
var tempobj=document.all? document.all[iframeids[i]] : document.getElementById(iframeids[i])
tempobj.style.display="block"
}
}
}
if (window.addEventListener)
window.addEventListener("load", dyniframesize, false)
else if (window.attachEvent)
window.attachEvent("onload", dyniframesize)
else
window.onload=dyniframesize
</script>
使用的時候只要貼在<head></head>里面就可以
歡迎各位大俠加入IT精英俱樂部(QQ群:11672321)
一、使用mod_jk.so方式
1.無集群方式
1)下載、安裝Apache2.2.11,Tomcat6.0.20略
2)下載mod_jk-1.2.28-httpd-2.2.3.so改名為mod_jk.so放到%APACHE_HOME%\modules下(不改名會出錯,不知道為什么)
3)打開%APACHE_HOME%\conf\httpd.conf,找到最末一個Include節(jié)點(diǎn),加入mod-jk_nocluster.conf
4)在%APACHE_HOME%\conf\新建mod-jk_nocluster.conf,加入以下內(nèi)容:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers_nocluster.properties
JkLogFile logs/mod_jk_nocluster.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /* ajp13
#關(guān)掉主機(jī)Lookup,如果為on,很影響性能,可以有10多秒鐘的延遲。
HostnameLookups Off
5)在%APACHE_HOME%\conf\新建workers_nocluster.properties,加入以下內(nèi)容:
worker.list=ajp13
worker.maintain=60
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1
6)啟動Apache,tomcat,在地址欄輸入http://localhost看到tomcat畫面成功了
2.使用集群(以兩個tomcat為例)
1)、2)同上
3)打開%APACHE_HOME%\conf\httpd.conf,找到最末一個Include節(jié)點(diǎn),更改mod-jk_nocluster.conf為mod-jk_cluster.conf
4)在%APACHE_HOME%\conf\新建mod-jk_cluster.conf,加入以下內(nèi)容:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers_cluster.properties
JkLogFile logs/mod_jk_cluster.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /* controller
HostnameLookups Off
5)在%APACHE_HOME%\conf\新建workers_cluster.properties,加入以下內(nèi)容:
worker.list = controller,tomcat1,tomcat2 #server 列表
#========tomcat1========
worker.tomcat1.port=18109 #ajp13 端口號,在tomcat下server.xml配置,默認(rèn)8009
worker.tomcat1.host=localhost #tomcat的主機(jī)地址,如不為本機(jī),請?zhí)顚慽p地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加權(quán)比重,值越高,分得的請求越多
#worker.tomcat1.redirect=tomcat2 #是在cluster環(huán)境之下,當(dāng)tomcat1掛點(diǎn)或無回應(yīng),jk會將request導(dǎo)向這個指令指定的其他worker作處理。
#========tomcat2========
worker.tomcat2.port=18209 #ajp13 端口號,在tomcat下server.xml配置,默認(rèn)8009
worker.tomcat2.host=localhost #tomcat的主機(jī)地址,如不為本機(jī),請?zhí)顚慽p地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加權(quán)比重,值越高,分得的請求越多
#worker.tomcat2.activation=disabled #
#========controller,負(fù)載均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分擔(dān)請求的tomcat
worker.controller.sticky_session=1
6)修改tomcat1配置文件server.xml,tomcat2配置修改地方同tomcat1,僅需注意相關(guān)端口號,在同一臺服務(wù)器上時不能重復(fù)
以下列出需修改節(jié)點(diǎn)地方:
#默認(rèn)為8005
<Server port="8105" shutdown="SHUTDOWN">
#默認(rèn)8080,此處可根據(jù)需求修改線程并發(fā)等
<Connector port="8180" ...>
#默認(rèn)8009,
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
#name可為Standalone
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager
className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false" notifyListenersOnReplication="true"
mapSendOptions="6" />
<!--
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
-->
<Channel
className="org.apache.catalina.tribes.group.GroupChannel">
<Membership
className="org.apache.catalina.tribes.membership.McastService"
mcastBindAddress="127.0.0.1" #安裝了VPN、svn等,會導(dǎo)致綁定失敗需加上此句
address="228.0.0.4" port="45564"
frequency="500" dropTime="3000" />
<Receiver
className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" port="4001" selectorTimeout="100" maxThreads="6" />
<Sender
className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport
className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Interceptor
className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor
className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
<Interceptor
className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" />
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" />
<ClusterListener
className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
在<Host>節(jié)點(diǎn)加入
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/xxx/"
deployDir="/tmp/war-deploy/xxx/"
watchDir="/tmp/war-listen/xxx/"
watchEnabled="false"/>
7)將Web應(yīng)用打成war包放到每一個webapps下,確保web.xml中加了
<display-name>xxx<display-name>
<distributable />
或者直接放到tomcat的web.xml中
至此mod-jk.so方式全配好了,啟動服務(wù)就OK了!
待續(xù)Apache新增的配置方式。。。。。。
1.安裝Apache-httpd-2.2.11
2.下載svn-win32-1.6.3.zip for Apache-httpd-2.2.11,解壓到某個目錄
3.添加環(huán)境變量%SVN_HOME%,修改%PATH%,增加%SVN_HOME%\bin
4.新建空目錄x:\Respository\test\
5.進(jìn)入命令行:svnadmin create --fs-type fsfs x:\Respository\test\
6.進(jìn)入x:\Respository\test\conf\svnserve.conf
去掉注釋
auth-access = write
password-db = passwd
在本目錄passwd文件中新建用戶 xxx = xxx
7.新增服務(wù)
sc create svnservice binPath= "%SVN_HOME%\bin\svnserve.exe --service -r x:\Respository" displayname= "SVNService" depend= Tcpip start= auto
刪除服務(wù)運(yùn)行"sc delete svnservice"
8.復(fù)制%SVN_HOME%\bin中的文件mod_dav_svn.so和mod_authz_svn.so到%APACHE_HOME%\modules目錄,
復(fù)制%SVN_HOME%\bin\libdb44.dll、libeay32.dll、 ssleay32.dll到%APACHE_HOME%\bin
9.%APACHE_HOME%\conf\httd.conf做如下修改:
去掉以下行的注釋(將開頭的#刪除):
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so
在LoadModule節(jié)的最后添加以下兩行:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
在文件末尾加入:
<Location /svn>
DAV svn
SVNParentPath x:\Respository
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile x:\Respository\conf\passwd
#AuthzSVNAccessFile x:\Respository\conf\authz
Require valid-user
</Location>
可是現(xiàn)在啟動不了Apache ,那位大俠能幫幫我,網(wǎng)上找了好多都試過了還是不行
<script language="javascript">
var oPopup=null; //彈出菜單
var popWidth=110; //彈出菜單的寬度
var popHeight=140; //彈出菜單的高度
var curRow=null; //記錄彈出菜單最后指向的行
function init(){
oPopup = window.createPopup();
var oPopBody = oPopup.document.body;
//設(shè)置菜單樣式
oPopBody.style.backgroundColor = "scrollbar";
oPopBody.style.border = "2px solid";
oPopBody.style.borderColor = "buttonhighlight buttonshadow buttonshadow buttonhighlight"
var strHTML=""
strHTML+='<table oncontextmenu="return false;" onselectstart="return false;" id="tbMenu" ';
strHTML+=' style="cursor:default; width:100%; height:100%;font-size:12px;" border=0 cellpadding=0 cellspacing=2>';
//在這里擴(kuò)展菜單的選項(xiàng)start
strHTML+='<tr operation="edit"><td> 編輯</td></tr>';
strHTML+='<tr operation="refresh"><td> 刷新</td></tr>';
strHTML+='<tr operation="addrowup"><td> 添加新行(上)</td></tr>';
strHTML+='<tr operation="addrowdown"><td> 添加新行(下)</td></tr>';
strHTML+='<tr operation="delrow"><td> 刪除該行</td></tr>';
strHTML+='<tr operation="moveup"><td> 向上移動一行</td></tr>';
strHTML+='<tr operation="movedown"><td> 向下移動一行</td></tr>';
//在這里擴(kuò)展菜單的選項(xiàng)end
strHTML+='</table>';
oPopBody.innerHTML=strHTML;
var tb = oPopup.document.getElementById("tbMenu");
var rs=tb.rows;
for(var i=0;i<rs.length;i++){
var row=rs[i];
addEvent(row);
}
}
function showMenu(){
var e=window.event;
var src=e.srcElement;
oPopup.show(window.event.clientX, window.event.clientY, popWidth, popHeight, document.body);
window.event.returnValue=false;
}
function addEvent(row){
row.attachEvent("onmouseover",function(){selRow(row)});
row.attachEvent("onclick",function(){onEvent(row)});
}
function selRow(src){
if(curRow!=null){ curRow.style.backgroundColor="scrollbar"; curRow.style.color="black";}
curRow=src; curRow.style.backgroundColor="midnightblue"; curRow.style.color="white";
}
function onEvent(src){
oPopup.hide();
switch(src.operation){
//在這里為菜單項(xiàng)的點(diǎn)擊事件添加處理方法
//本示例的方法只供參考,沒有實(shí)現(xiàn)
case "edit": example(src.operation); break;
case "refresh": example(src.operation); break;
case "addrowup": example(src.operation); break;
case "addrowdown": example(src.operation); break;
case "delrow": example(src.operation); break;
case "moveup": example(src.operation); break;
case "movedown": example(src.operation); break;
default: return;
}
src.style.backgroundColor="scrollbar";
src.style.color="black";
curRow=null;
}
function example(str){
alert("您選擇了"+str+"操作!");
}
</script>
<body onload="init();showMenu()">
</body>
我們在數(shù)據(jù)庫插入一條數(shù)據(jù)的時候,經(jīng)常是需要返回插入這條數(shù)據(jù)的主鍵。但是數(shù)據(jù)庫供應(yīng)商之間生成主鍵的方式都不一樣。
有些是預(yù)先生成(pre-generate)主鍵的,如Oracle和PostgreSQL;有些是事后生成(post-generate)主鍵的,如MySQL和SQL Server。但是不管是哪種方式,我們都可以用iBATIS的節(jié)點(diǎn)來獲取語句所產(chǎn)生的主鍵。
例子如下:
xml 代碼
<insert id="insertProduct-ORACLE" parameterClass="product">
<selectKey resultClass="int" type="pre" keyProperty="Id" >
SELECT YOURPKSEQUENCE.NEXTVAL AS VALUE FROM DUAL
<selectKey>
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)
<insert>
<insert id="insertProduct-MS-SQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
<selectKey resultClass="int" type="post" keyProperty="id" >
select @@IDENTITY as value
<selectKey>
<insert>
<insert id="insertProduct-MYSQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
<selectKey resultClass="int" type="post" keyProperty="id" >
select LAST_INSERT_ID() as value
<selectKey>
<insert>
alter database datafile 'D:\DevTools\Oracle\oradata\ora92\USERS01.DBF' offline drop;
alter database open;
在Oracle9i中執(zhí)行下面的SQL重建exu81rls視圖即可。
CREATE OR REPLACE view exu81rls
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)
AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,
decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')
|| decode(bitand(r.stmt_type,2), 0,'', 'INSERT,')
|| decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')
|| decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),
r.check_opt, r.enable_flag,
DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)
from user$ u, obj$ o, rls$ r
where u.user# = o.owner#
and r.obj# = o.obj#
and (uid = 0 or
uid = o.owner# or
exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')
)
/
grant select on sys.exu81rls to public;
/