2005年10月26日
先來看一下默認的連接SQL Server數據庫配置 <connectionStrings> ?? <add name="LocalSqlServer" connectionString="Data Source=.\SQLExpress;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> </connectionStrings>
SqlConnectionStringBuilder實例化時需要使用connectionString。如:SqlConnectionStringBuild builder = new SqlConnectionStringBuild(connectionString);
一、Data Source SqlConnectionStringBuilder的DataSource屬性,對應connectionString中的Data Source,“Data Source”可以由下列字符串代替:“Server”,“Address”,“Addr”和“Network Address”。 Data Source=.\SQLExpress也可以寫成這樣Data Source=(local)\SQLExpress。
二、Integrated Security SqlConnectionStringBuilder 的 IntegratedSecurity 屬性,對應 connectionString 中的I ntegrated Security,“Integrated Security”可以寫成“trusted_connection”。 為 True 時,使用當前的 Windows 帳戶憑據進行身份驗證,為 False 時,需要在連接中指定用戶 ID 和密碼。可識別的值為 True、False、Yes、No 以及與 True 等效的 SSPI。 如果沒有些則必須寫上 uid=sa;pwd=123 之類的設置“uid”也可使用“User ID”,“pwd”也可換為“PassWord”。
SSPI:Microsoft安全支持提供器接口(SSPI)是定義得較全面的公用API,用來獲得驗證、信息完整性、信息隱私等集成安全服務,以及用于所有分布式應用程序協議的安全方面的服務。 應用程序協議設計者能夠利用該接口獲得不同的安全性服務而不必修改協議本身。
三、AttachDBFilename SqlConnectionStringBuilder 的 AttachDBFilename 屬性,對應 connectionString 中的 AttachDBFilename,“AttachDBFilename”可以寫成“extended properties”,“initial file name”。 AttachDbFileName 屬性指定連接打開的時候動態附加到服務器上的數據庫文件的位置。 這個屬性可以接受數據庫的完整路徑和相對路徑(例如使用|DataDirectory|語法),在運行時這個路徑會被應用程序的 App_Data 目錄所代替。
四、User Instance SqlConnectionStringBuilder 的 UserInstance 屬性,對應 connectionString 中的 User Instance ,該值指示是否將連接從默認的 SQL Server 實例重定向到在調用方帳戶之下運行并且在運行時啟動的實例。 UserInstance=true 時,SQLServerExpress 為了把數據庫附加到新的實例,建立一個新的進程,在打開連接的用戶身份下運行。 在 ASP.NET 應用程序中,這個用戶是本地的 ASPNET 帳號或默認的 NetworkService,這依賴于操作系統。 為了安全地附加非系統管理員帳號(例如ASP.NET帳號)提供的數據庫文件,建立一個獨立的 SQLServer 用戶實例是必要的。
五、Initial Catalog 等同于 Database。
六、providerName 指定值“System.Data.OracleClient”,該值指定 ASP.NET 在使用此連接字符串進行連接時應使用 ADO.NET System.Data.OracleClient 提供程序。
PS: DataDirectory是什么?
asp.net 2.0有一個特殊目錄app_data,通常Sql Server 2005 express數據文件就放在這個目錄,相應的數據庫連接串就是: connectionString="…… data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|data.mdf;User Instance=true" 這里有一個DataDirectory的宏,它表示什么意義呢?
DataDirectory是表示數據庫路徑的替換字符串。由于無需對完整路徑進行硬編碼,DataDirectory 簡化了項目的共享和應用程序的部署。例如,無需使用以下連接字符串: "Data Source= c:\program files\MyApp\app_data\Mydb.mdf" 通過使用|DataDirectory|(包含在如下所示的豎線中),即可具有以下連接字符串: "Data Source = |DataDirectory|\Mydb.mdf" 。
不僅僅是Sql server 2005 express中使用,也可以在其它的文件數據庫中使用,例如Sqllite數據庫文件的連接字符串:
<add name="DefaultDB" connectionString="DriverClass=NHibernate.Driver.SQLite20Driver;Dialect=NHibernate.Dialect.SQLiteDialect;Data Source=|DataDirectory|\data.db3" />
---------------------------------------??? 附加一些連接語句例子??? ---------------------------------------
<--普通例子1--> <configuration> <connectionStrings> ??? <add name="Sales" providerName="System.Data.SqlClient" connectionString="server=myserver;database=Products;uid=salesUser;pwd=sellMoreProducts" />
??? <add name="NorthWind" providerName="System.Data.SqlClient" connectionString="server=.;database=NorthWind;Integrated Security=SSPI" />
</connectionStrings> </configuration>
<--普通例子2--> <configuration> <connectionStrings> ??? <add name="NorthWind" connectionString="Provider=SQLOLEDB;Integrated Security=SSPI;Initial Catalog=da;Data Source=bar" /> </configuration>
----------------------------------------------------------------------------------------------------------
<connectionStrings> ?? <add name="LocalSqlServer" connectionString="Data Source=.\SQLExpress;Initial Catalog=NorthWind;Integrated Security=SSPI" providerName="System.Data.SqlClient" /> </connectionStrings> <--也可寫為--> <connectionStrings> ?? <add name="LocalSqlServer" connectionString="Server=.\SQLExpress;Database=NorthWind;Integrated Security=Yes" providerName="System.Data.SqlClient" /> </connectionStrings>
----------------------------------------------------------------------------------------------------------
<configuration> <connectionStrings> ??? <add name="DB2005_2" ??? providerName="System.Data.SqlClient" ??? connectionString="Data Source=.;Initial Catalog=Northwind;User ID=dbtester;Password=zhi;Trusted_Connection=False;Connect Timeout=30;Min Pool Size=16;Max Pool Size=100"/>
??? <add name="DB2005_1" ??? providerName="System.Data.SqlClient" ??? connectionString="Server=.;Database=Northwind;User ID=dbtester;Password=zhi;Trusted_Connection=False;Connect Timeout=30;Min Pool Size=16;Max Pool Size=100"/>
??? <add name="Northword2000" ??? providerName="System.Data.SqlClient" ??? connectionString="Initial Catalog=Northwind;User ID=dbtester;PassWord=zhi;Persist Security Info=false;Data Source=(local);Connect Timeout=30;Min Pool Size=16;Max Pool Size=100;"/>
??? <add name="SQLExp" ?????? providerName="System.Data.SqlClient" ?????? connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\northwnd1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"/> ??? ??? <add name="Oracle" ????? connectionString="Data Source=TEST;User ID=sa;Password=sa;" ????? providerName="System.Data.OracleClient" />
??? <add name="oleconn" ?????? providerName="System.Data.OleDb" ?????? connectionString="Provider=Microsoft.Jet.OleDb.4.0;Data Source=|DataDirectory|northwind.mdb"/>
??? <add name="MySql" ??? providerName="MySql.Data.MySqlClient" ??? connectionString="Server=172.29.131.27;Port=3311;DataBase=comctl;Persist Security Info=False;User ID=root;Password=123456;Allow Zero Datetime=true;" /> </connectionStrings> ??? <system.data> ??????? <DbProviderFactories> ??????????? <add name="MySQL Data Provider" ???????????????? invariant="MySql.Data.MySqlClient" ???????????????? description=".Net Framework Data Provider for MySQL" ???????????????? type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=5.2.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> ??????? </DbProviderFactories> ??? </system.data> </configuration>
======================================????? 可以保存為(以下轉自他處).cs????? ======================================
using System.Data.SqlClient; using System.Configuration; public class Class1 { ??? public Class1() ??? { ??????? //Persist Security Info如果數據庫連接成功后不再需要連接的密碼,建議False ??????? //string sql2000 = "Initial Catalog=Northwind;User ID=dbtester;PassWord=zhi;Persist Security Info=false;Data Source=(local);Connect Timeout=30;Min Pool Size=16;Max Pool Size=100;"; ??????? //string sql2000 = "Initial Catalog=Northwind;User ID=sa;PassWord=5;Persist Security Info=false;Data Source=."; ??????? //string sql2000 = "Initial Catalog=Northwind;User ID=sa;PassWord=5;Persist Security Info=false;Data Source=newtime"; ??????? string source = "server=(local);integrated security=SSPI;database=Northwind"; ??????? string expressSource = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\northwnd.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; ??????? //Integrated Security采用windows的集成身份驗證,integraged?? Security=SSPI; ??????? //Integrated Security=SSPI 這個表示以當前WINDOWS系統用戶身去登錄SQL SERVER服務器,如果SQL SERVER服務器不支持這種方式登錄時,就會出錯 ??????? //表示你的連接安全驗證方式,可用trusted_connection=yes取代 ??????? //Integrated Security 為 True。用戶實例僅與集成安全性一起使用,帶有用戶名和密碼的 SQL Server 用戶不起作用。 ??????? //string source3 = @"Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog= pubs;UserID=sa;Password=asdasd;"; ??????? //(DBMSSOCN=TCP/IP instead of Named Pipes, at the end of the Data Source is the port to use (1433 is the default)) ??????? //Standard Security: ??????? string source4 = "Data Source=Aron1;Initial Catalog= pubs;UserId=sa;Password=asdasd;"; ??????? string source5 = "Server=Aron1;Database=pubs;UserID=sa;Password=asdasd;Trusted_Connection=False"; ??????? //Trusted_Connection 'false' 當為 false 時,將在連接中指定用戶 ID 和密碼。當為 true 時,將使用當前的 Windows 帳戶憑據進行身份驗證。 ??????? //可識別的值為 true、false、yes、no 以及與 true 等效的 sspi(強烈推薦)。所以一定要設置Trusted_Connection= false,以防被別人"登錄"、"注入語句"等 ??????? string source6 = "Data Source=Aron1;Initial Catalog=pubs;Integrated Security=SSPI;"; ??????? string source7 = "Server=Aron1;Database=pubs;Trusted_Connection=True;"; ??????? //(use serverName\instanceName as Data Source to use an specifik SQLServer instance, only SQLServer2000) ??????? //Integrated?? Security或Trusted_Connection?? 'false'?? 當為?? false?? 時, ??????? //將在連接中指定用戶?? ID?? 和密碼。當為?? true?? 時,將使用當前的?? Windows?? 帳戶憑據進行身份驗證 ??????? //VS2003:string connStr=System.Configuration.ConfigurationSettings.AppSettings["SQLCONNECTIONSTRING"];2003中用的 ??????? //VS2005:string connStr=System.Configuration.ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ToString();2005-8中用 ??????? System.Configuration.ConnectionStringSettings i = System.Configuration.ConfigurationManager.ConnectionStrings["Northword2000"]; ??? } } ?
?先來了解一下文件屬性, 在shell環境里輸入:ls -l 可以查看當前目錄文件。如: drwxr-xr-x 2 nsf users 1024 12-10 17:37 下載文件備份 分別對應的是: 文件屬性 連接數 文件擁有者 所屬群組 文件大小 文件修改時間 文件名 這里r是可讀,w可寫,x 可執行,其中文件屬性分為四段,---- --- --- 10個位置 例如: d rwx r-x r-x 第一個字符指定了文件類型。在通常意義上,一個目錄也是一個文件。如果第一個字符是橫線,表示是一個非目錄的文件。如果是d,表示是一個目錄。 第二段是文件擁有者的屬性, 第三段是文件所屬群組的屬性, 第四段是對于其它用戶的屬性, 如上面文件夾“下載文件備份” 的訪問權限,表示文件夾“下載文件備份” 是一個目錄文件;文件夾“下載文件備份” 的屬主有讀寫可執行權限;與文件夾“下載文件備份” 屬主同組的用戶只有讀和可執行權限;其他用戶也有讀和可執行權限。 確定了一個文件的訪問權限后,用戶可以利用Linux系統提供的chmod命令來重新設定不同的訪問權限。也可以利用chown命令來更改某個文件或目錄的所有者。利用chgrp命令來更改某個文件或目錄的用戶組。 chmod 命令 功能:chmod命令是非常重要的,用于改變文件或目錄的訪問權限.用戶用它控制文件或目錄的訪問權限. 語法:該命令有兩種用法。一種是包含字母和操作符表達式的文字設定法;另一種是包含數字的數字設定法。 1. 文字設定法 chmod [who] [+ | - | =] [mode] 文件名? 參數: 操作對象who可是下述字母中的任一個或者它們的組合: u 表示“用戶(user)”,即文件或目錄的所有者。 g 表示“同組(group)用戶”,即與文件屬主有相同組ID的所有用戶。 o 表示“其他(others)用戶”。 a 表示“所有(all)用戶”。它是系統默認值。 操作符號可以是: + 添加某個權限。 - 取消某個權限。 = 賦予給定權限并取消其他所有權限(如果有的話)。
設置mode所表示的權限可用下述字母的任意組合: r 可讀。 w 可寫。 x 可執行。 X 只有目標文件對某些用戶是可執行的或該目標文件是目錄時才追加x 屬性。 s 在文件執行時把進程的屬主或組ID置為該文件的文件屬主。方式“u+s”設置文件的用???????? 戶ID位,“g+s”設置組ID位。 t 保存程序的文本到交換設備上。 u 與文件屬主擁有一樣的權限。 g 與和文件屬主同組的用戶擁有一樣的權限。 o 與其他用戶擁有一樣的權限。 文件名:以空格分開的要改變權限的文件列表,支持通配符。 在一個命令行中可給出多個權限方式,其間用逗號隔開。例如:chmod g+r,o+r example 使同組和其他用戶對文件example 有讀權限。 chgrp命令 功能:改變文件或目錄所屬的組。 語法:chgrp [選項] group filename? 該命令改變指定指定文件所屬的用戶組。其中group可以是用戶組ID,也可以是/etc/group文件中用戶組的組名。文件名是以空格分開的要改變屬組的文件列表,支持通配符。如果用戶不是該文件的屬主或超級用戶,則不能改變該文件的組。 參數: - R 遞歸式地改變指定目錄及其下的所有子目錄和文件的屬組。 例1:$ chgrp - R book /opt/local /book 改變/opt/local /book/及其子目錄下的所有文件的屬組為book。 chown 命令 功能:更改某個文件或目錄的屬主和屬組。這個命令也很常用。例如root用戶把自己的一個文件拷貝給用戶xu,為了讓用戶xu能夠存取這個文件,root用戶應該把這個文件的屬主設為xu,否則,用戶xu無法存取這個文件。 語法:chown [選項] 用戶或組 文件 說明:chown將指定文件的擁有者改為指定的用戶或組。用戶可以是用戶名或用戶ID。組可以是組名或組ID。文件是以空格分開的要改變權限的文件列表,支持通配符。 參數: - R 遞歸式地改變指定目錄及其下的所有子目錄和文件的擁有者。 - v 顯示chown命令所做的工作。 例1:把文件shiyan.c的所有者改為wang。 $ chown wang shiyan.c 例2:把目錄/his及其下的所有文件和子目錄的屬主改成wang,屬組改成users。 $ chown - R wang.users /his
2TrLinux聯盟用sqlplus鏈接數據庫,運行以下命令 2TrLinux聯盟 set pagesize 02TrLinux聯盟 2TrLinux聯盟 set long 900002TrLinux聯盟 2TrLinux聯盟 set feedback off2TrLinux聯盟 2TrLinux聯盟 set echo off 2TrLinux聯盟 2TrLinux聯盟 spool d:/get_schema.sql 2TrLinux聯盟 2TrLinux聯盟2TrLinux聯盟 2TrLinux聯盟 SELECT DBMS_METADATA.GET_DDL(TABLE,u.table_name)2TrLinux聯盟 2TrLinux聯盟 FROM USER_TABLES u;2TrLinux聯盟 2TrLinux聯盟 SELECT DBMS_METADATA.GET_DDL(INDEX,u.index_name)2TrLinux聯盟 2TrLinux聯盟 FROM USER_INDEXES u;2TrLinux聯盟 2TrLinux聯盟 spool off;
ArrayList中存放的對象,他的contains方法 是調用對象的equals方法。 比較的是對象的地址是否相等。 我們可以重寫對象里面的equals方法: ?//重寫equals方法 ??? public?? boolean?? equals(Object?? test)?? {???? //參數類型一定要是Object?? ??????? if?? (Integer.parseInt(this.id) ==Integer.parseInt(((ChatRoom)test).id))?? {? ??????????? return?? true;? ??????? }? ??????? else?? {? ??????????? return?? false;? ??????? }? ??? } 變成之比較對象里面的id值是否相等。
GROUP BY 是分組查詢, 一般是和聚合函數配合使用. group by 有一個原則,就是 select 后面的所有列中,沒有使用聚合函數的列,必須出現在 group by 后面
1. 選用適合的ORACLE優化器
ORACLE的優化器共有3種:
a. RULE (基于規則) b. COST (基于成本) c. CHOOSE (選擇性)
設置缺省的優化器,可以通過對init.ora文件中OPTIMIZER_MODE參數的各種聲明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你當然也在SQL句級或是會話(session)級對其進行覆蓋.
為了使用基于成本的優化器(CBO, Cost-Based Optimizer) , 你必須經常運行analyze 命令,以增加數據庫中的對象統計信息(object statistics)的準確性.
如果數據庫的優化器模式設置為選擇性(CHOOSE),那么實際的優化器模式將和是否運行過analyze命令有關. 如果table已經被analyze過, 優化器模式將自動成為CBO , 反之,數據庫將采用RULE形式的優化器.
在缺省情況下,ORACLE采用CHOOSE優化器, 為了避免那些不必要的全表掃描(full table scan) , 你必須盡量避免使用CHOOSE優化器,而直接采用基于規則或者基于成本的優化器.
2. 訪問Table的方式
ORACLE 采用兩種訪問表中記錄的方式:
a. 全表掃描
全表掃描就是順序地訪問表中每條記錄. ORACLE采用一次讀入多個數據塊(database block)的方式優化全表掃描.
b. 通過ROWID訪問表
你可以采用基于ROWID的訪問方式情況,提高訪問表的效率, ,
ROWID包含了表中記錄的物理位置信息..ORACLE采用索引(INDEX)實現了數據和存放數據的物理位置(ROWID)之間的聯系.
通常索引提供了快速訪問ROWID的方法,因此那些基于索引列的查詢就可以得到性能上的提高. 3. 共享SQL語句
為了不重復解析相同的SQL語句,在第一次解析之后, ORACLE將SQL語句存放在內存中.這塊位于系統全局區域SGA(system
global area)的共享池(shared buffer pool)中的內存可以被所有的數據庫用戶共享.
因此,當你執行一個SQL語句(有時被稱為一個游標)時,如果它 和之前的執行過的語句完全相同,
ORACLE就能很快獲得已經被解析的語句以及最好的執行路徑. ORACLE的這個功能大大地提高了SQL的執行性能并節省了內存的使用. 可惜的是ORACLE只對簡單的表提供高速緩沖(cache buffering) ,這個功能并不適用于多表連接查詢.
數據庫管理員必須在init.ora中為這個區域設置合適的參數,當這個內存區域越大,就可以保留更多的語句,當然被共享的可能性也就越大了.
當你向ORACLE 提交一個SQL語句,ORACLE會首先在這塊內存中查找相同的語句.
這里需要注明的是,ORACLE對兩者采取的是一種嚴格匹配,要達成共享,SQL語句必須完全相同(包括空格,換行等).
共享的語句必須滿足三個條件:
A. 字符級的比較:
當前被執行的語句和共享池中的語句必須完全相同.
例如:
SELECT * FROM EMP;
和下列每一個都不同
SELECT * from EMP;
Select * From Emp;
SELECT * FROM EMP;
B. 兩個語句所指的對象必須完全相同:
例如:
用戶 對象名 如何訪問
Jack sal_limit private synonym
Work_city public synonym
Plant_detail public synonym
Jill sal_limit private synonym
Work_city public synonym
Plant_detail table owner
考慮一下下列SQL語句能否在這兩個用戶之間共享.
SQL能否共享,原因
select max(sal_cap) from sal_limit;
不能。每個用戶都有一個private synonym - sal_limit , 它們是不同的對象
select count(*0 from work_city where sdesc like 'NEW%';
能。兩個用戶訪問相同的對象public synonym - work_city
select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id
不能。用戶jack 通過private synonym訪問plant_detail 而jill 是表的所有者,對象不同.
C. 兩個SQL語句中必須使用相同的名字的綁定變量(bind variables)
例如:
第一組的兩個SQL語句是相同的(可以共享),而第二組中的兩個語句是不同的(即使在運行時,賦于不同的綁定變量相同的值)
a.
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;
b.
select pin , name from people where pin = :blk1.ot_ind;
select pin , name from people where pin = :blk1.ov_ind;
4. 選擇最有效率的表名順序(只在基于規則的優化器中有效)
ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表(基礎表 driving
table)將被最先處理. 在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.當ORACLE處理多個表時,
會運用排序及合并的方式連接它們.首先,掃描第一個表(FROM子句中最后的那個表)并對記錄進行派序,然后掃描第二個表(FROM子句中最后第二個
表),最后將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合并. 例如:
表 TAB1 16,384 條記錄
表 TAB2 1 條記錄
選擇TAB2作為基礎表 (最好的方法)
select count(*) from tab1,tab2 執行時間0.96秒
選擇TAB2作為基礎表 (不佳的方法)
select count(*) from tab2,tab1 執行時間26.09秒
如果有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表.
例如:
EMP表描述了LOCATION表和CATEGORY表的交集.
SELECT *
FROM LOCATION L ,
CATEGORY C,
EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
將比下列SQL更有效率
SELECT *
FROM EMP E ,
LOCATION L ,
CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000
5. WHERE子句中的連接順序.
ORACLE采用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾.
例如: (低效,執行時間156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER'
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效,執行時間10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER';
6. SELECT子句中避免使用 ‘ * ‘
當你想在SELECT子句中列出所有的COLUMN時,使用動態SQL列引用 ‘*'
是一個方便的方法.不幸的是,這是一個非常低效的方法. 實際上,ORACLE在解析的過程中, 會將'*' 依次轉換成所有的列名,
這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間. 7. 減少訪問數據庫的次數
當執行每條SQL語句時, ORACLE在內部執行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數據塊等等. 由此可見, 減少訪問數據庫的次數 , 就能實際上減少ORACLE的工作量.
例如, 以下有三種方法可以檢索出雇員號等于0342或0291的職員.
方法1 (最低效)
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 291;
方法2 (次低效)
DECLARE
CURSOR C1 (E_NO NUMBER) IS
SELECT EMP_NAME,SALARY,GRADE
FROM EMP
WHERE EMP_NO = E_NO;
BEGIN
OPEN C1(342);
FETCH C1 INTO …,..,.. ;
…..
OPEN C1(291);
FETCH C1 INTO …,..,.. ;
CLOSE C1;
END;
方法3 (高效)
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
B.EMP_NAME , B.SALARY , B.GRADE
FROM EMP A,EMP B
WHERE A.EMP_NO = 342
AND B.EMP_NO = 291;
注意:
在SQL*Plus , SQL*Forms和Pro*C中重新設置ARRAYSIZE參數, 可以增加每次數據庫訪問的檢索數據量 ,建議值為200。
8. 使用DECODE函數來減少處理時間
使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表.
例如:
SELECT COUNT(*),SUM(SAL) FROM EMP
WHERE DEPT_NO = 0020
AND ENAME LIKE ‘SMITH%';
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0030
AND ENAME LIKE ‘SMITH%';
你可以用DECODE函數高效地得到相同結果
SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE ‘SMITH%';
類似的,DECODE函數也可以運用于GROUP BY 和ORDER BY子句中.
9. 整合簡單,無關聯的數據庫訪問
如果你有幾個簡單的數據庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關系)
例如:
SELECT NAME FROM EMP
WHERE EMP_NO = 1234;
SELECT NAME FROM DPT
WHERE DPT_NO = 10 ;
SELECT NAME FROM CAT
WHERE CAT_TYPE = ‘RD';
上面的3個查詢可以被合并成一個:
SELECT E.NAME , D.NAME , C.NAME FROM CAT C , DPT D , EMP E,DUAL X
WHERE NVL(‘X',X.DUMMY) = NVL(‘X',E.ROWID(+))
AND NVL(‘X',X.DUMMY) = NVL(‘X',D.ROWID(+))
AND NVL(‘X',X.DUMMY) = NVL(‘X',C.ROWID(+))
AND E.EMP_NO(+) = 1234
AND D.DEPT_NO(+) = 10
AND C.CAT_TYPE(+) = ‘RD';
(譯者按: 雖然采取這種方法,效率得到提高,但是程序的可讀性大大降低,所以讀者 還是要權衡之間的利弊)
10. 刪除重復記錄
最高效的刪除重復記錄方法 ( 因為使用了ROWID)
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);
11. 用TRUNCATE替代DELETE
當刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的信息.
如果你沒有COMMIT事務,ORACLE會將數據恢復到刪除之前的狀態(準確地說是恢復到執行刪除命令之前的狀況) ,而當運用TRUNCATE時,
回滾段不再存放任何可被恢復的信息.當命令運行后,數據不能被恢復.因此很少的資源被調用,執行時間也會很短。(注:
TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML) 12. 盡量多使用COMMIT
只要有可能,在程序中盡量多使用COMMIT, 這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少:
COMMIT所釋放的資源:
a. 回滾段上用于恢復數據的信息.
b. 被程序語句獲得的鎖
c. redo log buffer 中的空間
d. Oracle為管理上述3種資源中的內部花費
(注:在使用COMMIT時必須要注意到事務的完整性,現實中效率和事務完整性往往是魚和熊掌不可得兼)
如果DECODE取值為NULL,SUM(NULL)的值是NULL -->如果所有的值都是NULL , SUM(NULL) = NULL 但是只要有一個值不是NULL,SUM() <> NULL 所以原SQL應該沒有什么邏輯上的問題
關于第八點的個人看法:如果DECODE取值為NULL,SUM(NULL)的值是NULL,不會正常求和的。可以改成如下所示就好了:
SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,0)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,0)) D0030_SAL FROM EMP WHERE ENAME LIKE
‘SMITH%';
采用華為包發送短信:
CMPPSubmitMessage中定義:
int msg_Fmt = 15;
content.getBytes("GBK");
必須定義GBK字符才不會出現亂碼。
主要區別在加密方面:
加密算法:DES(); sun下jdk自帶這個算法的jar包 而ibm下jdk沒有這個包 需要自己加上sunjce_provider.jar這個包(weblogic下可以找到這個包)。
keytool工具也是對不同版本的jdk依賴性非常大,不能通用。
#1 定義了兩個輸出端
log4j.rootLogger = INFO, A1, A2,A3
#2 定義A1輸出到控制器
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
#3 定義A1的布局模式為PatternLayout
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
#4 定義A1的輸出格式
log4j.appender.A1.layout.ConversionPattern = %-4r [%t] %-5p %c - %m%n
#5 定義A2輸出到文件
log4j.appender.A2 = org.apache.log4j.RollingFileAppender
#6 定義A2要輸出到哪一個文件
log4j.appender.A2.File = F:\\nepalon\\classes\\example3.log
#7 定義A2的輸出文件的最大長度
log4j.appender.A2.MaxFileSize = 1KB
#8 定義A2的備份文件數
log4j.appender.A2.MaxBackupIndex = 3
#9 定義A2的布局模式為PatternLayout
log4j.appender.A2.layout = org.apache.log4j.PatternLayout
#10 定義A2的輸出格式
log4j.appender.A2.layout.ConversionPattern = %d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n
#11區 定義A3輸出到數據庫
log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.BufferSize = 40
log4j.appender.A3.Driver = com.microsoft.jdbc.sqlserver.SQLServerDriver
log4j.appender.A3.URL = jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=nepalon
log4j.appender.A3.User = sa
log4j.appender.A3.Password =
log4j.appender.A3.layout = org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern = INSERT INTO log4j
(createDate, thread, priority, category, message) values(getdate(),
'%t', '%-5p', '%c', '%m')
JSTL教程- -
??????????????????????????????????????
JSP 標準標記庫(JSP Standard Tag Library,JSTL)是一個實現 Web 應用程序中常見的通用功能的定制標記庫集,這些功能包括迭代和條件判斷、數據管理格式化、XML 操作以及數據庫訪問。在 developerWorks 上其新系列的第一篇文章中,軟件工程師 Mark Kolb 向您展示了如何使用 JSTL 標記來避免在 JSP 頁面中使用腳本編制元素。您還將了解如何通過從表示層刪除源代碼來簡化軟件維護。最后,您將了解 JSTL 經過簡化的表達式語言,它允許在不必使用功能齊全的編程語言的情況下對 JSTL 操作指定動態屬性值。
JavaServer Pages(JSP)是用于 J2EE 平臺的標準表示層技術。JSP 技術提供了用于執行計算(這些計算用來動態地生成頁面內容)的腳本編制元素和操作。腳本編制元素允許在 JSP 頁面中包括程序源代碼,在為響應用戶請求而呈現頁面時可以執行這些源代碼。操作將計算操作封裝到很象 HTML 或 XML 標記的標記中,JSP 頁面的模板文本通常包含這些標記。JSP 規范只將幾種操作定義成了標準,但從 JSP 1.1 開始,開發人員已經能夠以定制標記庫的方式創建其自己的操作了。
JSP 標準標記庫(JSTL)是 JSP 1.2 定制標記庫集,這些標記庫實現大量服務器端 Java 應用程序常用的基本功能。通過為典型表示層任務(如數據格式化和迭代或條件內容)提供標準實現,JSTL 使 JSP 作者可以專注于特定于應用程序的開發需求,而不是為這些通用操作“另起爐灶”。
當然,您可以使用 JSP 腳本編制元素(scriptlet、表達式和聲明)來實現此類任務。例如,可以使用三個 scriptlet 實現條件內容,清單 1 中著重顯示了這三個 scriptlet。但是,因為腳本編制元素依賴于在頁面中嵌入程序源代碼(通常是 Java 代碼),所以對于使用這些腳本編制元素的 JSP 頁面,其軟件維護任務的復雜度大大增加了。例如,清單 1 中的 scriptlet 示例嚴格地依賴于花括號的正確匹配。如果不經意間引入了一個語法錯誤,則條件內容中的嵌套其它 scriptlet 可能會造成嚴重破壞,并且在 JSP 容器編譯該頁面時,要使所產生的錯誤信息有意義可能會很困難。
清單 1. 通過 scriptlet 實現條件內容 <% if (user.getRole() == "member")) { %>
<p>Welcome, member!</p>
<% } else { %>
<p>Welcome, guest!</p>
<% } %>/PRE>
|
BR> 修正此類問題通常需要相當豐富的編程經驗。盡管通常會由十分精通頁面布局和圖形設計的設計人員來開發和維護 JSP,但是同一頁面中的腳本編制元素出現問題時,需要程序員的介入。這種狀況將單個文件中代碼的責任分擔給多人,因而使得開發、調試和增強此類 JSP 頁面成為很麻煩的任務。通過將常用功能包裝到定制標記庫的標準集合中,JSTL 使 JSP 作者可以減少對編制腳本元素的需求,甚至可以不需要它們,并避免了相關的維護成本。
JSTL 1.0
JSTL 1.0 發布于 2002 年 6 月,由四個定制標記庫(core、format、xml 和 sql)和一對通用標記庫驗證器(ScriptFreeTLV 和 PermittedTaglibsTLV)組成。core 標記庫提供了定制操作,通過限制了作用域的變量管理數據,以及執行頁面內容的迭代和條件操作。它還提供了用來生成和操作 URL 的標記。顧名思義,format 標記庫定義了用來格式化數據(尤其是數字和日期)的操作。它還支持使用本地化資源束進行 JSP 頁面的國際化。xml 庫包含一些標記,這些標記用來操作通過 XML 表示的數據,而 sql 庫定義了用來查詢關系數據庫的操作。
兩個 JSTL 標記庫驗證器允許開發人員在其 JSP 應用程序中強制使用編碼標準。可以配置 ScriptFreeTLV 驗證器以在 JSP 頁面中禁用各種類型的 JSP 腳本元素 — scriptlet、表達式和聲明。類似地,PermittedTaglibsTLV 驗證器可以用來限制可能由應用程序的 JSP 頁面訪問的定制標記庫集(包括 JSTL 標記庫)。
盡管 JSTL 最終將會成為 J2EE 平臺的必需組件,但目前只有少數應用程序服務器包括它。JSTL 1.0 的參考實現可作為 Apache 軟件基金會(Apache Software Foundation)的 Jakarta Taglibs 項目(請參閱參考資料)的一部分而獲得。可以將該參考實現中的定制標記庫合并到任何支持 JSP 1.2 和 Servlet 2.3 規范的服務器,以添加對 JSTL 的支持。
表達式語言
在 JSP 1.2 中,可以使用靜態字符串或表達式(如果允許的話)指定 JSP 操作的屬性。例如,在清單 2 中,對 <jsp:setProperty> 操作的 name 和 property 屬性指定了靜態值,而用表達式指定了其 value 屬性。這個操作的效果是將請求參數的當前值賦予命名的 bean 特性。以這種形式使用的表達式被稱為請求時屬性值(request-time attribute value),這是構建到 JSP 規范中的用于動態指定屬性值的唯一機制。
清單 2. 合并請求時屬性值的 JSP 操作
<jsp:setProperty name="user" property="timezonePref"
value='<%= request.getParameter("timezone") %>'/>/PRE> | BR> 因為請求時屬性值是用表達式指定的,所以它們往往有和其它腳本元素一樣的軟件維護問題。因此,JSTL 定制標記支持另一種用于指定動態屬性值的機制。可以用簡化的表達式語言(EL)而不使用完整的 JSP 表達式來指定 JSTL 操作的屬性值。EL 提供了一些標識符、存取器和運算符,用來檢索和操作駐留在 JSP 容器中的數據。EL 在某種程度上以 EcmaScript(請參閱參考資料)和 XML 路徑語言(XML Path Language,XPath)為基礎,因此頁面設計人員和程序員都應該熟悉它的語法。EL 擅長尋找對象及其特性,然后對它們執行簡單操作;它不是編程語言,甚至不是腳本編制語言。但是,與 JSTL 標記一起使用時,它就能使用簡單而又方便的符號來表示復雜的行為。EL 表達式的格式是這樣的:用美元符號($)定界,內容包括在花括號({})中,如清單 3 所示。
清單 3. 說明 EL 表達式定界符的 JSTL 操作
<c:out value="${user.firstName}"/>
此外,您可以將多個表達式與靜態文本組合在一起以通過字符串并置來構造動態屬性值,如清單 4 所示。單獨的表達式由標識符、存取器、文字和運算符組成。標識符用來引用存儲在數據中心中的數據對象。EL 有 11 個保留標識符,對應于 11 個 EL 隱式對象。假定所有其它標識符都引用限制了作用域的變量。存取器用來檢索對象的特性或集合的元素。文字表示固定的值 — 數字、字符、字符串、布爾型或空值。運算符允許對數據和文字進行組合以及比較。
清單 4. 組合靜態文本和多個 EL 表達式以指定動態屬性值
<c:out value="Hello ${user.firstName} ${user.lastName}"/>
限制了作用域的變量
JSP API 通過 <jsp:useBean> 操作允許從 JSP 容器內的四個不同作用域中存儲和檢索數據。JSTL 通過提供用于指定和除去這些作用域中的對象的附加操作來擴展這一能力。此外,EL 提供將這些對象作為限制了作用域的變量進行檢索的內置支持。特別地,任何出現在 EL 表達式中但不對應于任何 EL 隱式對象的標識符,都被自動假定為引用存儲在四個 JSP 作用域的其中某個中的對象,這四個作用域是:
·頁面作用域
·請求作用域
·會話作用域
·應用程序作用域
您可能還記得,只有在為特定請求處理頁面期間才能檢索存儲在該頁面作用域中的對象。如果對象是存儲在請求作用域中的,可以在處理所有參與處理某請求的頁面期間檢索這些對象(譬如在對某個請求的處理中遇到了一個或多個 <jsp:include> 或 <jsp:forward> 操作)。如果對象是存儲在會話作用域中的,則在與 Web 應用程序的交互式會話期間,可以由用戶訪問的任何頁面檢索它(即,直到與該用戶交互相關聯的 HttpSession 對象無效為止)。可以由任何用戶從任何頁面訪問存儲在應用程序作用域中的對象,直到卸載 Web 應用程序本身為止(通常是由于關閉 JSP 容器所致)。
通過將字符串映射為期望作用域中的對象來將對象存儲到該作用域。然后,就可以通過提供相同字符串來從該作用域檢索該對象。在作用域的映射中查找字符串,并返回被映射的對象。在 Servlet API 中,將此類對象稱為相應作用域的屬性。但是,在 EL 的上下文中,也將與屬性相關聯的字符串看作變量的名稱,該變量通過屬性映射的方式獲得特定的值。
在 EL 中,與隱式對象無關聯的標識符被認為是存儲在四個 JSP 作用域中的名稱對象。首先對頁面作用域檢查是否存在這樣的標識符,其次對請求作用域、然后對會話作用域、最后對應用程序作用域依次進行這樣的檢查,然后測試該標識符的名稱是否與存儲在該作用域中的某個對象的名稱匹配。第一個這樣的匹配作為 EL 標識符的值被返回。通過這種方法,可以將 EL 標識符看作引用限制了作用域的變量。
從更技術的方面來說,沒有映射到隱式對象的標識符是用 PageContext 實例的 findAttribute() 方法求值的,該實例表示對頁面的處理,在該頁面上,當前正在處理用于請求的表達式。標識符的名稱作為參數傳遞給這個方法,然后該方法依次在四個作用域中搜索具有相同名稱的屬性。并將所找到的第一個匹配項作為 findAttribute() 方法的值返回。如果未在這四個作用域中找到這樣的屬性,則返回 null。
最終,限制了作用域的變量是四個 JSP 作用域的屬性,這些屬性具有可以用作 EL 標識符的名稱。只要對限制了作用域的變量賦予由字母數字組成的名稱,就可以通過 JSP 中提供的用于設置屬性的任何機制來創建它們。這包括內置的 <jsp:useBean> 操作,以及由 Servlet API 中的幾個類定義的 setAttribute() 方法。此外,四個 JSTL 庫中定義的許多定制標記本身就能夠設置作為限制了作用域的變量使用的屬性值。
隱式對象
表 1 中列出了 11 個 EL 隱式對象的標識符。不要將這些對象與 JSP 隱式對象(一共只有九個)混淆,其中只有一個對象是它們所共有的。
表 1. EL 隱式對象
類別 標識符 描述
JSP pageContext PageContext 實例對應于當前頁面的處理
作用域 pageScope 與頁面作用域屬性的名稱和值相關聯的 Map 類
requestScope 與請求作用域屬性的名稱和值相關聯的 Map 類
sessionScope 與會話作用域屬性的名稱和值相關聯的 Map 類
applicationScope 與應用程序作用域屬性的名稱和值相關聯的 Map 類
請求參數 param 按名稱存儲請求參數的主要值的 Map 類
paramValues 將請求參數的所有值作為 String 數組存儲的 Map 類
請求頭 header 按名稱存儲請求頭主要值的 Map 類
headerValues 將請求頭的所有值作為 String 數組存儲的 Map 類
Cookie cookie 按名稱存儲請求附帶的 cookie 的 Map 類
初始化參數 initParam 按名稱存儲 Web 應用程序上下文初始化參數的 Map 類
盡管 JSP 和 EL 隱式對象中只有一個公共對象(pageContext),但通過 EL 也可以訪問其它 JSP 隱式對象。原因是 pageContext 擁有訪問所有其它八個 JSP 隱式對象的特性。實際上,這是將它包括在 EL 隱式對象中的主要理由。
其余所有 EL 隱式對象都是映射,可以用來查找對應于名稱的對象。前四個映射表示先前討論的各種屬性作用域。可以用它們來查找特定作用域中的標識符,而不用依賴于 EL 在缺省情況下使用的順序查找過程。
接下來的四個映射用來獲取請求參數和請求頭的值。因為 HTTP 協議允許請求參數和請求頭具有多個值,所以它們各有一對映射。每對中的第一個映射返回請求參數或頭的主要值,通常是恰巧在實際請求中首先指定的那個值。每對中第二個映射允許檢索參數或頭的所有值。這些映射中的鍵是參數或頭的名稱,但這些值是 String 對象的數組,其中的每個元素都是單一參數值或頭值。
cookie 隱式對象提供了對由請求設置的 cookie 名稱的訪問。這個對象將所有與請求相關聯的 cookie 名稱映射到表示那些 cookie 特性的 Cookie 對象。
最后一個 EL 隱式對象 initParam 是一個映射,它儲存與 Web 應用程序相關聯的所有上下文的初始化參數的名稱和值。初始化參數是通過 web.xml 部署描述符文件指定的,該文件位于應用程序的 WEB-INF 目錄中。
存取器
因為 EL 標識符是作為隱式對象或限制了作用域的變量(通過屬性來實現)解析的,因此有必要將它們轉換成 Java 對象。EL 可以自動包裝和解包其相應的 Java 類中的基本類型(例如,可以在后臺將 int 強制轉換成 Integer 類,反之亦可),但大多數的標識符將成為指向完整的 Java 對象的指針。
結果是,對這些對象的特性或(在對象是數組和集合的情況下)對其元素的訪問通常是令人滿意的。就為了實現這種用途,EL 提供了兩種不同的存取器(點運算符(.)和方括號運算符([])),也支持通過 EL 操作特性和元素。
點運算符通常用于訪問對象的特性。例如,在表達式 ${user.firstName} 中,使用點運算符來訪問 user 標識符所引用對象的名為 firstName 的特性。EL 使用 Java bean 約定訪問對象特性,因此必須定義這個特性的 getter 方法(通常是名為 getFirstName() 的方法),以便表達式正確求值。當被訪問的特性本身是對象時,可以遞歸地應用點運算符。例如,如果我們虛構的 user 對象有一個實現為 Java 對象的 address 特性,那么也可以用點運算符來訪問這個對象的特性。例如,表達式 ${user.address.city} 將會返回這個地址對象嵌套的 city 特性。
方括號運算符用來檢索數組和集合的元素。在數組和有序集合(也即,實現了 java.util.List 接口的集合)的情況下,把要檢索的元素的下標放在方括號中。例如,表達式 ${urls[3]} 返回 urls 標識符所引用的數組或集合的第四個元素(和 Java 語言以及 JavaScript 中一樣,EL 中的下標是從零開始的)。
對于實現 java.util.Map 接口的集合,方括號運算符使用關聯的鍵查找存儲在映射中的值。在方括號中指定鍵,并將相應的值作為表達式的值返回。例如,表達式 ${commands["dir"]} 返回與 commands 標識符所引用的 Map 中的 "dir" 鍵相關聯的值。
對于上述兩種情況,都可允許表達式出現在方括號中。對嵌套表達式求值的結果將被作為下標或鍵,用來檢索集合或數組的適當元素。和點運算符一樣,方括號運算符也可以遞歸應用。這使得 EL 能夠從多維數組、嵌套集合或兩者的任意組合中檢索元素。此外,點運算符和方括號運算符還可以互操作。例如,如果數組的元素本身是對象,則可以使用方括號運算符來檢索該數組的元素,并結合點運算符來檢索該元素的一個特性(例如 ${urls[3].protocol})。
假定 EL 充當指定動態屬性值的簡化語言,EL 存取器有一個有趣的功能(與 Java 語言的存取器不同),那就是它們在應用于 null 時不拋出異常。如果應用 EL 存取器的對象(例如,${foo.bar} 和 ${foo["bar"]} 中的 foo 標識符)是 null,那么應用存取器的結果也是 null。事實證明,在大多數情況下,這是一個相當有用的行為,不久您就會了解這一點。
最后,點運算符和方括號運算符可能實現某種程度的互換。例如,也可以使用 ${user["firstName"]} 來檢索 user 對象的 firstName 特性,正如可以用 ${commands.dir} 獲取與 commands 映射中的 "dir" 鍵相關聯的值一樣。
運算符
EL 還可以通過使用標識符和存取器,遍歷包含應用程序數據(通過限制了作用域的變量公開)或關于環境的信息(通過 EL 隱式對象)的對象層次結構。但是,只是訪問這些數據,通常不足以實現許多 JSP 應用程序所需的表示邏輯。
最終,EL 還包括了幾個用來操作和比較 EL 表達式所訪問數據的運算符。表 2 中匯總了這些運算符。
表 2. EL 運算符
類別 運算符
算術運算符 +、-、*、/(或 div)和 %(或 mod)
關系運算符 ==(或 eq)、!=(或 ne)、<</code>(或 lt)、>(或 gt)、<=(或 le)和 >=(或 ge)
邏輯運算符 &&(或 and)、||(或 or)和 !(或 not)
驗證運算符 empty
算術運算符支持數值的加法、減法、乘法和除法。還提供了一個求余運算符。注:除法和求余運算符都有替代的、非符號的名稱(為的是與 XPath 保持一致)。清單 5 中顯示了一個演示算術運算符用法的示例表達式。對幾個 EL 表達式應用算術運算符的結果是將該算術運算符應用于這些表達式返回的數值所得的結果。
清單 5. 利用算術運算符的 EL 表達式
${item.price * (1 + taxRate[user.address.zipcode])}/PRE> | BR> 關系運算符允許比較數字或文本數據。比較的結果作為布爾值返回。邏輯運算符允許合并布爾值,返回新的布爾值。因此,可以將 EL 邏輯運算符應用于嵌套的關系或邏輯運算符的結果,如清單 6 所示。
清單 6. 利用關系和邏輯運算符的 EL 表達式
${(x >= min) && (x <= max)}/PRE> | BR> 最后一種 EL 運算符是 empty,它對于驗證數據特別有用。empty 運算符采用單個表達式作為其變量(也即,${empty input}),并返回一個布爾值,該布爾值表示對表達式求值的結果是不是“空”值。求值結果為 null 的表達式被認為是空,即無元素的集合或數組。如果參數是對長度為零的 String 求值所得的結果,則 empty 運算符也將返回 true。
表 3 顯示了 EL 運算符的優先級。正如清單 5 和 6 所示,可以用圓括號對表達式分組,高于普通的優先級規則。
表 3. EL 運算符優先級(自頂到底,從左到右)
[], .
()
unary -、not、!、empty
*、/、div、%、mod
+、binary -
() <</code>、>、<=、>=、lt、gt、le、ge
==、!=、eq、ne
&&、and
||、or/PRE> | BR> 文字
在 EL 表達式中,數字、字符串、布爾值和 null 都可以被指定為文字值。字符串可以用單引號或雙引號定界。布爾值被指定為 true 和 false。
Taglib 偽指令
正如我們先前討論的,JSTL 1.0 包括四個定制標記庫。為了演示 JSTL 標記和表達式語言的交互,我們將研究幾個來自 JSTL core 庫的標記。和使用任何 JSP 定制標記庫一樣,必須在您想要使用這個庫標記的任何頁面中包括 taglib 偽指令。清單 7 顯示了用于這個特定庫的偽指令。
清單 7. 用于 JSTL core 庫 EL 版本的 taglib 偽指令
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>/PRE> | BR> 實際上,對應于 JSTL core 庫的 taglib 偽指令有兩種,因為在 JSTL 1.0 中,EL 是可選的。所有四個 JSTL 1.0 定制標記庫都有使用 JSP 表達式(而不是 EL)指定動態屬性值的備用版本。因為這些備用庫依賴于 JSP 的更傳統的請求時屬性值,所以它們被稱為 RT 庫,而那些使用表達式語言的則被稱為 EL 庫。開發人員用不同的 taglib 偽指令來區分每個庫的這兩個版本。清單 8 顯示了使用 core 庫的 RT 版本的偽指令。但是,由于現在我們討論的重點是 EL,所以首先需要這些偽指令。
清單 8. 用于 JSTL core 庫 RT 版本的 taglib 偽指令
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt" %>/PRE> | BR> 變量標記
我們首先要考慮的 JSTL 定制標記是 <c:set> 操作。正如已經說明的,限制了作用域的變量在 JSTL 中起關鍵作用,<c:set> 操作提供基于標記的機制來創建和設置限制了作用域的變量。清單 9 中顯示了該操作的語法,其中 var 屬性指定了限制了作用域的變量的名稱,scope 屬性表明了該變量駐留在哪個作用域中,value 屬性指定了分配給該變量的值。如果指定變量已經存在,則簡單地將所指明的值賦給它。如果不存在,則創建新的限制了作用域的變量,并用該值初始化這個變量。
清單 9. <c:set> 操作的語法
<c:set var="name" scope="scope" value="expression"/>/PRE> | BR> scope 屬性是可選的,其缺省值是 page。
清單 10 中顯示了 <c:set> 的兩個示例。在第一個示例中,將會話作用域變量設置成 String 值。在第二個示例中,用表達式來設置數值:將頁面作用域內名為 square 的變量賦值為名為 x 的請求參數的值的平方。
清單 10. <c:set> 操作示例
<c:set var="timezone" scope="session" value="CST"/>
<c:set var="square" value="${param['x'] * param['x']}"/>/PRE> | BR> 您還可以將限制了作用域的變量的值指定為 <c:set> 操作的主體內容,而不是使用屬性。使用這種方法,您可以重新編寫清單 10 中的第一個示例,如清單 11 所示。此外,正如我們馬上可以看到的,<c:set> 標記的主體內容本身也可以使用定制標記。<c:set> 主體內生成的所有內容都將作為一個 String 值賦給指定變量。
清單 11. 通過主體內容指定 <c:set> 操作的值
<c:set var="timezone" scope="session">CST</c:set>/PRE> | BR> JSTL core 庫包含第二個用于管理限制了作用域的變量的標記 — <c:remove>。顧名思義,<c:remove> 操作是用來刪除限制了作用域的變量的,它獲取兩個屬性。var 屬性指定待刪除變量的名稱,scope 屬性是可選的,它表示待刪除變量來自哪個作用域,缺省為 page,如清單 12 所示。
清單 12. <c:remove> 操作示例
<c:remove var="timezone" scope="session"/>/PRE> | BR> 輸出
盡管 <c:set> 操作允許將表達式結果賦給限制了作用域的變量,但開發人員通常會希望只顯示表達式的值,而不存儲它。JSTL <c:out> 定制標記承擔這一任務,其語法如清單 13 所示。該標記對由其 value 屬性指定的表達式進行求值,然后打印結果。如果指定了可選屬性 default,那么,在對 value 屬性的表達式求值所得結果為 null 或空 String 的情況下,<c:out> 將打印其值。
清單 13. <c:out> 操作的語法
<c:out value="expression" default="expression" escapeXml="boolean"/>/PRE> | BR> escapeXml 屬性也是可選的。它控制當用 <c:out> 標記輸出諸如“<”、“>”和“&”之類的字符(在 HTML 和 XML 中具有特殊意義)時是否應該進行轉義。如果將 escapeXml 設置為 true,則會自動將這些字符轉換成相應的 XML 實體(此處提到的字符分別轉換成 <、> 和 &)。
例如,假定有一個名為 user 的會話作用域變量,它是一個類的實例,該類為用戶定義了兩個特性:username 和 company。每當用戶訪問站點時,這個對象被自動分配給會話,但直到用戶實際登錄后,才會設置這兩個特性。假定是這種方案,請考慮清單 14 中的 JSP 片段。在用戶登錄之后,這個片段將顯示單詞“Hello”,其后是他/她的用戶名和一個驚嘆號。但是,在用戶登錄之前,由這個片段生成的內容則是短語“Hello Guest!”。在這種情況下,因為 username 特性還有待初始化,所以 <c:out> 標記將轉而打印出 default 屬性的值(即字符串“Guest”)。
清單 14. 帶缺省內容的 <c:out> 操作示例 Hello
<c:out value="${user.username}" default=="Guest"/>!/PRE> | BR> 接下來,考慮清單 15,它使用了 <c:out> 標記的 escapeXml 屬性。如果在這種情況下已經將 company 特性設置成 Java String 值 "Flynn & Sons",那么,實際上該操作生成的內容將是 Flynn & Sons。如果這個操作是生成 HTML 或 XML 內容的 JSP 頁面的一部分,那么,這個字符串中間的“&”符號最終可能被解釋為 HTML 或 XML 控制字符,從而妨礙了對該內容的顯示或解析。但是,如果將 escapeXml 屬性值設置成 true,則所生成的內容將是 Flynn & Sons。瀏覽器或解析器不會因在解釋時遇到這種內容而出問題。假定 HTML 和 XML 是 JSP 應用程序中最常見的內容類型,所以 escapeXml 屬性的缺省值是 true 就不足為奇了。
清單 15. 禁用轉義的 <c:out> 操作示例
<c:out value="${user.company}" escapeXml=="false"/>/PRE> | BR> 用缺省值設置變量
除了簡化動態數據的顯示之外,當通過 <c:set> 設置變量值時,<c:out> 指定缺省值的能力也很有用。正如清單 11 所示,用來賦給限制了作用域的變量的值可以指定為 <c:set> 標記的主體內容,也可以通過其值屬性來指定。通過將 <c:out> 操作嵌套在 <c:set> 標記的主體內容中,變量賦值就可以利用其缺省值能力。
清單 16 中說明了這種方法。外部 <c:set> 標記的行為非常簡單:它根據其主體內容設置會話作用域 timezone 變量的值。但是,在這種情況下,主體內容是通過 <c:out> 操作生成的。這個嵌套操作的值屬性是表達式 ${cookie['tzPref'].value},它嘗試通過 cookie 隱式對象返回名為 tzPref 的 cookie 值。(cookie 隱式對象將 cookie 名稱映射到相應的 Cookie 實例,這意味著必須通過對象的 value 特性使用點運算符來檢索儲存在 cookie 中的實際數據。)
清單 16. 合并 <c:set> 和 <c:out> 以提供缺省變量值
<c:set var="timezone" scope=="session">
<c:out value="${cookie['tzPref'].value}" default=="CST"/>
</c:set>/PRE> | BR> 但是,請考慮以下情況,用戶是第一次嘗試使用這段代碼的 Web 應用程序。結果是,請求中沒有提供名為 tzPref 的 cookie。這意味著使用隱式對象的查找將返回 null,在這種情況下整個表達式將返回 null。因為對 <c:out> 標記的 value 屬性求值的結果是 null,所以 <c:out> 標記會轉而輸出對其 default 屬性求值的結果。在這里是字符串 CST。因此,實際的結果是將 timezone 限制了作用域的變量設置成用戶的 tzPref cookie 中存儲的時區,或者,如果沒有,則使用缺省時區 CST。
EL 和 JSP 2.0
目前,表達式語言僅可用于指定 JSTL 定制標記中的動態屬性值。但 JSTL 1.0 表達式語言的一個擴展已經被提出,會把它包括到 JSP 2.0 中去,眼下正在進行最后評審。這個擴展將允許開發人員通過自己的定制標記來使用 EL。頁面作者將可以在目前允許使用 JSP 表達式的任何地方使用 EL 表達式,譬如將動態值插入模板文本中:<p>Your preferred time zone is ${timezone}</p>。
這個 JSP 2.0 功能(就象 JSTL 本身一樣)將支持頁面作者進一步減少對 JSP 編制腳本元素的依賴,從而改進 JSP 應用程序的可維護性。
結束語
EL(與四個 JSTL 定制標記庫提供的操作結合起來)允許頁面作者不使用腳本元素即可實現表示層邏輯。例如,對比本文開頭清單 1 中的 JSP 代碼和清單 17 中顯示的通過 JSTL 實現的同樣功能。(JSTL core 庫中其余的標記,包括 <c:choose> 及其子標記,將在本系列的下一篇文章中討論。)盡管顯然執行了條件邏輯,但是 JSTL 版本中沒有 Java 語言源代碼,并且標記之間的關系(尤其是關于嵌套需求)對于任何精通 HTML 語法的人都應該是熟悉的。
清單 17. 合并 <c:set> 和 <c:out> 以提供缺省變量值
<c:choose><c:when test="${user.role == 'member'}">
<p>Welcome, member!</p>
</c:when><c:otherwise>
<p>Welcome, guest!</p>
</c:otherwise></c:choose>/PRE> |
BR> 通過提供大多數 Web 應用程序常用功能的標準實現,JSTL 有助于加速開發周期。與 EL 結合起來,JSTL 可以不需要對表示層程序編寫代碼,這極大地簡化了 JSP 應用程序的維護。
轉:刪節 Firefox 不支持 document.all
解決也很簡單 不用document.all就行了 那么用什么呢? 如下: getElementsByTagName("*") 可以得到得到所有元素的集合 getElemntById 可以按id得到某一元素 getElementsByName 可以得到按name屬性得到某一元素
(轉) ??????<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title> New Document </title> </head> <body> <form action="somepage.asp"> <input type="text" value="0" name="txt1"/> <input type="button" value="開始" name="btnStart"/> <input type="button" value="重置" name="btnReset"/> </form> </body> </html> <script language="JavaScript" type="text/javascript"> <!-- //獲取表單中的表單域 var txt=document.forms[0].elements["txt1"]; var btnStart=document.forms[0].elements["btnStart"]; var btnReset=document.forms[0].elements["btnReset"] //定義定時器的id var id; //每10毫秒該值增加1 var seed=0; btnStart.onclick=function(){ ????? //根據按鈕文本來判斷當前操作 ????? if(this.value=="開始"){ ????????????? //使按鈕文本變為停止 ????????????? this.value="停止"; ????????????? //使重置按鈕不可用 ????????????? btnReset.disabled=true; ????????????? //設置定時器,每0.01s跳一次 ????????????? id=window.setInterval(tip,10); ????? }else{ ????????????? //使按鈕文本變為開始 ????????????? this.value="開始"; ????????????? //使重置按鈕可用 ????????????? btnReset.disabled=false; ????????????? //取消定時 ????????????? window.clearInterval(id); ????? } }
//重置按鈕 btnReset.onclick=function(){ ???? seed=0; } //讓秒表跳一格 function tip(){ ????? seed++; ????? txt.value=seed/100; } //--> </script>
摘要: 計算機只能讀懂0或者1,而我們用高級語言編寫的程序(原程序)是抽象的符號化了的東西,為了讓計算機讀懂我們寫的程序,必須把我們書寫的程序翻譯成某臺機器能夠讀懂的(機器)語言(目標程序),這就是翻譯程序的作用。而“編譯”則是翻譯程序實現的一種方式。
???
編譯程序的工作過程通常是詞法分析、語法分析、語義分析、代碼生成、代碼優化。編譯程序的這些... 閱讀全文
href="javascript:void(0)" onClick="javascript:method()"
原因就在這兩個javascript方法上了 2個在一個連接下同時使用會出這種錯誤
convert??? c:??? /FS:NTFS
1.建立連接 : XMLHttpReq=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Msxml2.XMLHTTP"); 2.發送請求: XMLHttpReq.open("GET",url,true); 3.返回請求: XMLHttpReq.onreadystatechange=function() { ???if(XMLHttpReq.readystate==4) ???{ ??????if(XMLHttpReq.status==200) ??????{ ?????????updateObj(); ??????} ??????else ??????{ ?????????alert("error:"+XMLHttpReq.status); ??????} ???} } 4.頁面取數據: var resCode=XMLHttpReq.responseXML.getElementByTagName("code");
元字符:"+","*","?" + ,規定前導字符必須在目標對象中出現一次或多次 * ,規定前導字符必須在目標對象中出現零次或多次 ? ,規定前導字符必須在目標對象中出現零次或一次
{n},{n,},{n,m}:最少比配N次最多匹配M次 例: o{2} "bood" o{2,} "boooooooood" o{2,3} 注意,逗號和兩個數之間不能有空格
具體: var patrn=/^[0,9]{1,10}$/ if(!patrn.exec(s)) return false; return true;
javascript 中的replace方法 s=s.replace(/\./,"!")? 只替換第一個 s=s.replace(/\./g,"!")替換全部 s=s.replace(/^\./g,"!") 替換開頭 s=s.replace(/\.$/g,"!")替換結尾
<div style="border:10px red solid"> <input type="button" value="父元素標簽" onclick="alert(event.srcElement.parentNode.tagName)"> </div>
event.srcElement有關問題- - ??????????????????????????????????????
event.srcElement的子標簽 和父標簽: 第一個子標簽為 event.srcElement.firstChild 最后個一個是 event.srcElement.lastChild 當然也可以用 event.srcElement.children[i] event.srcElement.ChildNode[i] 至于event.srcElement.parentElement是指在鼠標所在對象的上一個對象. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ <script> function a() { alert("您點擊的標記是:" + event.srcElement.tagName) } </script>
<body onclick="a()"> 點鼠標測試<br> <input><a href=#>test</a> <div>測試</div> <p>測試</p> <span>測試</span> <span> <a href="/" onmouseover="alert(event.srcElement.parentElement.tagName);">放在我上面</a> </span> </body> \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ <input type=button value=GO title="?page=1" onclick=f()> <script language="JavaScript"> function f() { ? alert('index.asp'+event.srcElement.title) ? location.href='index.asp'+event.srcElement.title } </script> <a title="a測試" onclick="alert(event.srcElement.title)" >a測試</a> <br> <table border=1 width="200"> <tr title="tr測試" onclick="alert(event.srcElement.parentElement.title)"><td>tr</td></tr> </table> <table border=1 width="200"> <tr><td title="td測試" onclick="alert(event.srcElement.title)">td</td></tr> </table> <select name="selectname" onchange="alert(event.srcElement.options[event.srcElement.selectedIndex].value)" > <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> </select> 可以調用的方法還有: event.srcElement.id event.srcElement.tagname event.srcElement.type event.srcElement.value event.srcElement.name event.srcElement.classname event.srcElement.parentelement event.srcElement.getattribute event.srcElement.children event.srcElement.lastChild event.srcElement.ChildNode event.srcElement.selectedIndex baidu
/** ? ? ? * ? 當數據庫字段為Text類型時調用 ? ? ? * ? @param ? rs ? ? ? * ? @param ? col ? ? ? * ? @return ? ? ? */ ? ? public ? static ? String ? getClobString(ResultSet ? rs, ? String ? col) ? { ? ? ? ? ? ? try ? { ? ? ? ? ? ? ? ? ? ? Reader ? reader ? = ? rs.getCharacterStream(col); ? ? ? ? ? ? ? ? ? ? if ? (reader ? == ? null) ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? return ? null; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? StringBuffer ? sb ? = ? new ? StringBuffer(); ? ? ? ? ? ? ? ? ? ? char[] ? charbuf ? = ? new ? char[4096]; ? ? ? ? ? ? ? ? ? ? for ? (int ? i ? = ? reader.read(charbuf); ? i ? > ? 0; ? i ? = ? reader.read(charbuf)) ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? sb.append(charbuf, ? 0, ? i); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? return ? sb.toString(); ? ? ? ? ? ? } ? catch ? (Exception ? e) ? { ? ? ? ? ? ? ? ? ? ? return ? ""; ? ? ? ? ? ? } ? ? }
剛開始使用SQL Server 2000,就給了我一個下馬威。不過最終還是解決了。具體情況和解決方法: 安裝SQL Server 2000的操作系統是Windows 2000 Profession Edition,安裝簡體中文標準版。會提示該版本的操作系統不能安裝服務器組件,只能安裝SQL Server 2000個人版。于是退出,選擇安裝個人版。卻出現了新的錯誤: “以前的某個程序安裝已在安裝計算機上創建掛起的文件操作。運行安裝程序之前必須重新啟動計算機。” 接著按照提示重啟計算機,再安裝,仍然出現同樣的提示。再網上查找相關資料,得知是安裝程序在先前的安裝過程中在系統注冊表留下某些信息,導致不能安裝。于是經過多次試,發現刪除掉如下鍵值信息即可安裝: 在運行窗口輸入regedit,打開注冊表編輯器,在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager中找到PendingFileRenameOperations,刪除該鍵值,關閉注冊表編輯器。重新安裝SQL Server 2000,哈哈,久違的安裝界面終于浮出水面了。 這個鍵值是安裝程序暫掛項目,只要找到對應的應用程序清除掉就行了。
//建立分區 create?tablespace?tsp_jn?
datafile?'E:\oracle\oradata\testtable\tsp_jn.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_jni?
datafile?'E:\oracle\oradata\testtable\tsp_jni.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_ta?
datafile?'E:\oracle\oradata\testtable\tsp_ta.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_lw?
datafile?'E:\oracle\oradata\testtable\tsp_lw.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_ly?
datafile?'E:\oracle\oradata\testtable\tsp_ly.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_zz?
datafile?'E:\oracle\oradata\testtable\tsp_zz.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_hz?
datafile?'E:\oracle\oradata\testtable\tsp_hz.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_wh?
datafile?'E:\oracle\oradata\testtable\tsp_wh.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_rz?
datafile?'E:\oracle\oradata\testtable\tsp_rz.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_zb?
datafile?'E:\oracle\oradata\testtable\tsp_zb.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_bz?
datafile?'E:\oracle\oradata\testtable\tsp_bz.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_dy?
datafile?'E:\oracle\oradata\testtable\tsp_dy.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_lc?
datafile?'E:\oracle\oradata\testtable\tsp_lc.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_dz?
datafile?'E:\oracle\oradata\testtable\tsp_dz.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_sd?
datafile?'E:\oracle\oradata\testtable\tsp_sd.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_yt?
datafile?'E:\oracle\oradata\testtable\tsp_yt.dbf'?
size?50m?
autoextend?on?
next?5m;

create?tablespace?tsp_wf?
datafile?'E:\oracle\oradata\testtable\tsp_wf.dbf'?
size?50m?
autoextend?on?
next?5m;

 //建分區索引 CREATE?INDEX?fit_main_code?ON?fit_main(BRAND_CODE,FIT_CODE,PART_CODE,STYLE_CODE)?
PARALLEL
LOCAL?
(?
PARTITION?part_fit_main_jn?TABLESPACE?tsp_jn,?
PARTITION?part_fit_main_jni?TABLESPACE?tsp_jni,?
PARTITION?part_fit_main_ta?TABLESPACE?tsp_ta,?
PARTITION?part_fit_main_dz?TABLESPACE?tsp_dz,
PARTITION?part_fit_main_lc?TABLESPACE?tsp_lc,
PARTITION?part_fit_main_hz?TABLESPACE?tsp_hz,?
PARTITION?part_fit_main_ly?TABLESPACE?tsp_ly,?
PARTITION?part_fit_main_rz?TABLESPACE?tsp_rz,?
PARTITION?part_fit_main_wh?TABLESPACE?tsp_wh,
PARTITION?part_fit_main_yt?TABLESPACE?tsp_yt,
PARTITION?part_fit_main_wf?TABLESPACE?tsp_wf,?
PARTITION?part_fit_main_zb?TABLESPACE?tsp_zb,?
PARTITION?part_fit_main_bz?TABLESPACE?tsp_bz,?
PARTITION?part_fit_main_dy?TABLESPACE?tsp_dy,??
PARTITION?part_fit_main_lw?TABLESPACE?tsp_lw,?
PARTITION?part_fit_main_zz?TABLESPACE?tsp_zz,?
PARTITION?part_fit_main_sd?TABLESPACE?tsp_sd
);?
mysql: 1.修改mysql.ini 字符格式 2.修改連接池url encode infomix: 在連接的url后加一段 強制字符類型:";NEWCODESET=gb18030,8859-1,819" postgresql : 建立數據庫時選擇utf8
按下面的步驟處理
: 1.新建一個同名的數據庫
2.再停掉sqlserver服務(注意不要分離數據庫) 3.用原數據庫的數據文件覆蓋掉這個新建的數據庫
4.再重啟sqlserver服務 5.此時打開企業管理器時會出現置疑,先不管,執行下面的語句(注意修改其中的數據庫名)
6.完成后一般就可以訪問數據庫中的數據了。這時,數據庫本身一般還有問題,解決辦法是:利用數據庫的腳本創建一個新的數據庫,然后通過DTS將數據導進去就行了
use master go sp_configure 'allow updates',1 reconfigure with override go update sysdatabases set status =32768 where name='置疑的數據庫名' go sp_dboption '置疑的數據庫名', 'single user', 'true' go dbcc checkdb('置疑的數據庫名') go update sysdatabases set status =28 where name='置疑的數據庫名' go sp_configure 'allow updates', 0 reconfigure with override go sp_dboption '置疑的數據庫名', 'single user', 'false' go
(此方法只是針對那種用普通方法附加時報:缺少日志文件,保日志物理文件錯誤的情況時適用)
修改安裝目錄下的pdflm12.dll文件,使用二進制編輯器打開此文件,查找:83 C4 14 8B 85 E4 FE FF FF將此字符串改為83 C4 14 33 C0 90 90 90 90
blogjava現在的編輯器特難用。打著字經常的刷頁面,反應還有點遲鈍。
昨天做了一個交叉表的統計: 得到的統計表有30列 4行,需要執行120個select count當時要的比較急匆忙的做了一個 總感覺有些的麻煩,想今天到網上找找有沒有更好的方法。搜了一天也沒找到個效率更高一點的方法 現在把我的思路先發出來: 我的工程是web project 用的是struts 用DBManager聯數據庫 120個select 如果要聯120次數據庫是恐怖的, 即使用連接池 如果被多個用戶同時使用也難以承受。 我先建了一個table 120個字段 然后用update table set abc="select count ..",set bbc="select count ".. 用建好的一個類 取出數據 放到頁面上。
后來用戶又提出了 每一列都需要一個合計 ,我就直接在頁面上用取出的值進行相加。
統計表做完后 眼睛都看花了,現在正在找一些簡單的方法替代這種笨辦法。
Unicode字符介紹
2007年02月16日 星期五 12:25
java使用的字符集是Unicode字符集,所以了解Unicode字符集,對學好java是必不可少的,
Unicode是一種字符編碼規范 。 先從ASCII說起。ASCII是用來表示英文字符的一種編碼規范,每個ASCII字符占用1個字節(1byte=8bits)
因此,ASCII編碼可以表示的最大字符數是256,其實英文字符并沒有那么多,一般只用前128個(最高位為0),其中包括了控制字符、數字、大小寫字母和其他一些符號 。
而最高位為1的另128個字符被成為“擴展ASCII”,一般用來存放英文的制表符、部分音標字符等等的一些其他符號
這種字符編碼規范顯然用來處理英文沒有什么問題 。(實際上也可以用來處理法文、德文等一些其他的西歐字符,但是不能和英文通用),但是面對中文、阿拉伯文之類復雜的文字,255個字符顯然不夠用
于是,各個國家紛紛制定了自己的文字編碼規范,其中中文的文字編碼規范叫做“GB2312-80”,它是和ASCII兼容的一種編碼規范,其實就是利用擴展ASCII沒有真正標準化這一點,把一個中文字符用兩個擴展ASCII字符來表示。
但 是這個方法有問題,最大的問題就是,中文文字沒有真正屬于自己的編碼,因為擴展ASCII碼雖然沒有真正的標準化,但是PC里的ASCII碼還是有一個事 實標準的(存放著英文制表符),所以很多軟件利用這些符號來畫表格。這樣的軟件用到中文系統中,這些表格符就會被誤認作中文字,破壞版面。而且,統計中英 文混合字符串中的字數,也是比較復雜的,我們必須判斷一個ASCII碼是否擴展,以及它的下一個ASCII是否擴展,然后才“猜”那可能是一個中文字 。
總之當時處理中文是很痛苦的。而更痛苦的是GB2312是國家標準,臺灣當時有一個Big5編碼標準,很多編碼和GB是相同的,所以……,嘿嘿。
這 時候,我們就知道,要真正解決中文問題,不能從擴展ASCII的角度入手,也不能僅靠中國一家來解決。而必須有一個全新的編碼系統,這個系統要可以將中 文、英文、法文、德文……等等所有的文字統一起來考慮,為每個文字都分配一個單獨的編碼,這樣才不會有上面那種現象出現。
于是,Unicode誕生了。
Unicode有兩套標準,一套叫UCS-2(Unicode-16),用2個字節為字符編碼,另一套叫UCS-4(Unicode-32),用4個字節為字符編碼。
以目前常用的UCS-2為例,它可以表示的字符數為2^16=65535,基本上可以容納所有的歐美字符和絕大部分的亞洲字符 。
UTF-8的問題后面會提到 。
在Unicode里,所有的字符被一視同仁。漢字不再使用“兩個擴展ASCII”,而是使用“1個Unicode”,注意,現在的漢字是“一個字符”了,于是,拆字、統計字數這些問題也就自然而然的解決了 。
但是,這個世界不是理想的,不可能在一夜之間所有的系統都使用Unicode來處理字符,所以Unicode在誕生之日,就必須考慮一個嚴峻的問題:和ASCII字符集之間的不兼容問題。
我們知道,ASCII字符是單個字節的,比如“A”的ASCII是65。而Unicode是雙字節的,比如“A”的Unicode是0065,這就造成了一個非常大的問題:以前處理ASCII的那套機制不能被用來處理Unicode了 。
另一個更加嚴重的問題是,C語言使用'\0'作為字符串結尾,而Unicode里恰恰有很多字符都有一個字節為0,這樣一來,C語言的字符串函數將無法正常處理Unicode,除非把世界上所有用C寫的程序以及他們所用的函數庫全部換掉 。
于是,比Unicode更偉大的東東誕生了,之所以說它更偉大是因為它讓Unicode不再存在于紙上,而是真實的存在于我們大家的電腦中。那就是:UTF 。
UTF= UCS Transformation Format UCS轉換格式
它是將Unicode編碼規則和計算機的實際編碼對應起來的一個規則。現在流行的UTF有2種:UTF-8和UTF-16 。
其中UTF-16和上面提到的Unicode本身的編碼規范是一致的,這里不多說了。而UTF-8不同,它定義了一種“區間規則”,這種規則可以和ASCII編碼保持最大程度的兼容 。
UTF-8有點類似于Haffman編碼,它將Unicode編碼為00000000-0000007F的字符,用單個字節來表示;
00000080-000007FF的字符用兩個字節表示
00000800-0000FFFF的字符用3字節表示
因為目前為止Unicode-16規范沒有指定FFFF以上的字符,所以UTF-8最多是使用3個字節來表示一個字符。但理論上來說,UTF-8最多需要用6字節表示一個字符。
在UTF-8里,英文字符仍然跟ASCII編碼一樣,因此原先的函數庫可以繼續使用。而中文的編碼范圍是在0080-07FF之間,因此是2個字節表示(但這兩個字節和GB編碼的兩個字節是不同的),用專門的Unicode處理類可以對UTF編碼進行處理。
下面說說中文的問題。
由于歷史的原因,在Unicode之前,一共存在過3套中文編碼標準。
GB2312-80,是中國大陸使用的國家標準,其中一共編碼了6763個常用簡體漢字。Big5,是臺灣使用的編碼標準,編碼了臺灣使用的繁體漢字,大概有8千多個。HKSCS,是中國香港使用的編碼標準,字體也是繁體,但跟Big5有所不同。
這3套編碼標準都采用了兩個擴展ASCII的方法,因此,幾套編碼互不兼容,而且編碼區間也各有不同
因為其不兼容性,在同一個系統中同時顯示GB和Big5基本上是不可能的。當時的南極星、RichWin等等軟件,在自動識別中文編碼、自動顯示正確編碼方面都做了很多努力 。
他們用了怎樣的技術我就不得而知了,我知道好像南極星曾經以同屏顯示繁簡中文為賣點。
后來,由于各方面的原因,國際上又制定了針對中文的統一字符集GBK和GB18030,其中GBK已經在Windows、Linux等多種操作系統中被實現。
GBK兼容GB2312,并增加了大量不常用漢字,還加入了幾乎所有的Big5中的繁體漢字。但是GBK中的繁體漢字和Big5中的幾乎不兼容。
GB18030相當于是GBK的超集,比GBK包含的字符更多。據我所知目前還沒有操作系統直接支持GB18030。
談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞 這是一篇程序員寫給程序員的趣味讀物。所謂趣味是指可以比較輕松地了解一些原來不清楚的概念,增進知識,類似于打RPG游戲的升級。整理這篇文章的動機是兩個問題:
問題一: 使用Windows記事本的“另存為”,可以在GBK、Unicode、Unicode big endian和UTF-8這幾種編碼方式間相互轉換。同樣是txt文件,Windows是怎樣識別編碼方式的呢?
我 很早前就發現Unicode、Unicode big endian和UTF-8編碼的txt文件的開頭會多出幾個字節,分別是FF、FE (Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但這些標記是基于什么標準呢?
問題二: 最 近在網上看到一個ConvertUTF.c,實現了UTF-32、UTF-16和UTF-8這三種編碼方式的相互轉換。對于Unicode(UCS2)、 GBK、UTF-8這些編碼方式,我原來就了解。但這個程序讓我有些糊涂,想不起來UTF-16和UCS2有什么關系。 查了查相關資料,總算將這些問題弄清楚了,順帶也了解了一些Unicode的細節。寫成一篇文章,送給有過類似疑問的朋友。本文在寫作時盡量做到通俗易懂,但要求讀者知道什么是字節,什么是十六進制。
0、big endian和little endian big endian 和little endian是CPU處理多字節數的不同方式。例如“漢”字的Unicode編碼是6C49。那么寫到文件里時,究竟是將6C寫在前面, 還是將49寫在前面?如果將6C寫在前面,就是big endian。還是將49寫在前面,就是little endian。
“endian”這個詞出自《格列佛游記》。小人國的內戰就源于吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開,由此曾發生過六次叛亂,其中一個皇帝送了命,另一個丟了王位。
我們一般將endian翻譯成“字節序”,將big endian和little endian稱作“大尾”和“小尾”。
1、字符編碼、內碼,順帶介紹漢字編碼 字符必須編碼后才能被計算機處理。計算機使用的缺省編碼方式就是計算機的內碼。早期的計算機使用7位的ASCII編碼,為了處理漢字,程序員設計了用于簡體中文的GB2312和用于繁體中文的big5。
GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區的內碼范圍高字節從B0-F7,低字節從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
GB2312 支持的漢字太少。1995年的漢字擴展規范GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字符。2000年的 GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平 臺必須支持GB18030,對嵌入式產品暫不作要求。所以手機、MP3一般只支持GB2312。
從ASCII、GB2312、GBK到 GB18030,這些編碼方法是向下兼容的,即同一個字符在這些方案中總是有相同的編碼,后面的標準支持更多的字符。在這些編碼中,英文和中文可以統一地 處理。區分中文編碼的方法是高字節的最高位不為0。按照程序員的稱呼,GB2312、GBK到GB18030都屬于雙字節字符集 (DBCS)。
有的中文Windows的缺省內碼還是GBK,可以通過GB18030升級包升級到GB18030。不過GB18030相對GBK增加的字符,普通人是很難用到的,通常我們還是用GBK指代中文Windows內碼。
這里還有一些細節:
GB2312的原文還是區位碼,從區位碼到內碼,需要在高字節和低字節上分別加上A0。
在DBCS中,GB內碼的存儲格式始終是big endian,即高位在前。
GB2312 的兩個字節的最高位都是1。但符合這個條件的碼位只有128*128=16384個。所以GBK和GB18030的低字節最高位都可能不是1。不過這不影 響DBCS字符流的解析:在讀取DBCS字符流時,只要遇到高位為1的字節,就可以將下兩個字節作為一個雙字節編碼,而不用管低字節的高位是什么。
2、Unicode、UCS和UTF 前面提到從ASCII、GB2312、GBK到GB18030的編碼方法是向下兼容的。而Unicode只與ASCII兼容(更準確地說,是與ISO-8859-1兼容),與GB碼不兼容。例如“漢”字的Unicode編碼是6C49,而GB碼是BABA。
Unicode 也是一種字符編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。Unicode的學名是"Universal Multiple -Octet Coded Character Set",簡稱為UCS。UCS可以看作是"Unicode Character Set"的縮寫。
根據維基百科全書(http://zh.wikipedia.org/wiki/)的記載:歷史上存在兩個試圖獨立設計Unicode的組織,即國際標準化組織(ISO)和一個軟件制造商的協會(unicode.org)。ISO開發了ISO 10646項目,Unicode協會開發了Unicode項目。
在1991年前后,雙方都認識到世界不需要兩個不兼容的字符集。于是它們開始合并雙方的工作成果,并為創立一個單一編碼表而協同工作。從Unicode2.0開始,Unicode項目采用了與ISO 10646-1相同的字庫和字碼。
目前兩個項目仍都存在,并獨立地公布各自的標準。Unicode協會現在的最新版本是2005年的Unicode 4.1.0。ISO的最新標準是10646-3:2003。
UCS規定了怎么用多個字節表示各種文字。怎樣傳輸這些編碼,是由UTF(UCS Transformation Format)規范規定的,常見的UTF規范包括UTF-8、UTF-7、UTF-16。
IETF 的RFC2781和RFC3629以RFC的一貫風格,清晰、明快又不失嚴謹地描述了UTF-16和UTF-8的編碼方法。我總是記不得IETF是 Internet Engineering Task Force的縮寫。但IETF負責維護的RFC是Internet上一切規范的基礎。
3、UCS-2、UCS-4、BMP
UCS有兩種格式:UCS-2和UCS-4。顧名思義,UCS-2就是用兩個字節編碼,UCS-4就是用4個字節(實際上只用了31位,最高位必須為0)編碼。下面讓我們做一些簡單的數學游戲:
UCS-2有2^16=65536個碼位,UCS-4有2^31=2147483648個碼位。
UCS -4根據最高位為0的最高字節分成2^7=128個group。每個group再根據次高字節分為256個plane。每個plane根據第3個字節分為 256行 (rows),每行包含256個cells。當然同一行的cells只是最后一個字節不同,其余都相同。
group 0的plane 0被稱作Basic Multilingual Plane, 即BMP。或者說UCS-4中,高兩個字節為0的碼位被稱作BMP。
將UCS-4的BMP去掉前面的兩個零字節就得到了UCS-2。在UCS-2的兩個字節前加上兩個零字節,就得到了UCS-4的BMP。而目前的UCS-4規范中還沒有任何字符被分配在BMP之外。
4、UTF編碼
UTF-8就是以8位為單元對UCS進行編碼。從UCS-2到UTF-8的編碼方式如下:
UCS-2編碼(16進制) UTF-8 字節流(二進制) 0000 - 007F 0xxxxxxx 0080 - 07FF 110xxxxx 10xxxxxx 0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
例 如“漢”字的Unicode編碼是6C49。6C49在0800-FFFF之間,所以肯定要用3字節模板了: 1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001, 用這個比特流依次代替模板中 的x,得到:11100110 10110001 10001001,即E6 B1 89。
讀者可以用記事本測試一下我們的編碼是否正確。
UTF -16以16位為單元對UCS進行編碼。對于小于0x10000的UCS碼,UTF-16編碼就等于UCS碼對應的16位無符號整數。對于不小于 0x10000的UCS碼,定義了一個算法。不過由于實際使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以認為UTF -16和UCS-2基本相同。但UCS-2只是一個編碼方案,UTF-16卻要用于實際的傳輸,所以就不得不考慮字節序的問題。
5、UTF的字節序和BOM UTF -8以字節為編碼單元,沒有字節序的問題。UTF-16以兩個字節為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字節序。例如收 到一個“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節流“594E”,那么這是“奎”還是 “乙”?
Unicode規范中推薦的標記字節順序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一個有點小聰明的想法:
在UCS 編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應該 出現在實際傳輸中。UCS規范建議我們在傳輸字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。
這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。
UTF -8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是 EF BB BF(讀者可以用我們前面介紹的編碼方法驗證一下)。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。
Windows就是使用BOM來標記文本文件的編碼方式的。
|
STATIC: 1.可以聲明變量,加載時初始化變量,并賦值; 2.聲明一個方法,加載時初始化該方法的引用; 3.聲明一個類,加載時初始化該類中的變量和語句,此類中只能有變量和語句,不能有方法。
在Java中你要調用一個class某一個方法時 你必須 你顯示列化它 或者你把它申明為 靜態的(static)
SUN公司的一道測試題:
public class X{ public static void main(String[] args){ String s=new String("Hello"); modify(s); System.out.println(s); } public static void modify(String s){ s+=" World"; }
}
what is the result? 分析一下: 1.執行main,定義了字符串s 并賦值hello 2.調用方法modify(變量S) 我們注意到 modify方法是靜態的,即他在內存中地址是固定的。也就是說不管上面的方法引用modify時 傳過來的變量S是多少,對于modify方法都不重要,因為他的作用是把自己的S變量改變。 而外面的 引用 不起任何的作用; 把這個題目改改就好理解了: public class X{ public static void main(String[] args){ String s=new String("Hello"); modify(s); System.out.println(s); } public static void modify(String s){ s+=" World"; System.out.println(s); }
}
result: HelloWord Hello
3.有一點需要注意的是,當傳過來的變量S是個數組,前面定義了S[0],傳的是S(起始地址)這種修改變的有意思了,也變得有意義了。modify才真正的有用
Oracle數據導入導出imp/exp就相當于oracle數據還原與備份。exp命令可以把數據從遠程數據庫服務器導出到本地的dmp文件,imp命令可以把dmp文件從本地導入到遠處的數據庫服務器中。 利用這個功能可以構建兩個相同的數據庫,一個用來測試,一個用來正式使用。 執行環境:可以在SQLPLUS.EXE或者DOS(命令行)中執行, DOS中可以執行時由于 在oracle 8i 中 安裝目錄ora81BIN被設置為全局路徑, 該目錄下有EXP.EXE與IMP.EXE文件被用來執行導入導出。 oracle用java編寫,SQLPLUS.EXE、EXP.EXE、IMP.EXE這兩個文件有可能是被包裝后的類文件。 SQLPLUS.EXE調用EXP.EXE、IMP.EXE所包裹的類,完成導入導出功能。 下面介紹的是導入導出的實例。 數據導出: 1 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:daochu.dmp中 exp system/manager@TEST file=d:daochu.dmp full=y 2 將數據庫中system用戶與sys用戶的表導出 exp system/manager@TEST file=d:daochu.dmp owner=(system,sys) 3 將數據庫中的表inner_notify、notify_staff_relat導出 exp aichannel/aichannel@TESTDB2 file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)
4 將數據庫中的表table1中的字段filed1以"00"打頭的數據導出 exp system/manager@TEST file=d:daochu.dmp tables=(table1) query=" where filed1 like '00%'" 上面是常用的導出,對于壓縮,既用winzip把dmp文件可以很好的壓縮。 也可以在上面命令后面 加上 compress=y 來實現。
數據的導入 1 將D:daochu.dmp 中的數據導入 TEST數據庫中。 imp system/manager@TEST file=d:daochu.dmp imp aichannel/aichannel@HUST full=y file=d:datanewsmgnt.dmp ignore=y 上面可能有點問題,因為有的表已經存在,然后它就報錯,對該表就不進行導入。 在后面加上 ignore=y 就可以了。 2 將d:daochu.dmp中的表table1 導入 imp system/manager@TEST file=d:daochu.dmp tables=(table1) 基本上上面的導入導出夠用了。不少情況要先是將表徹底刪除,然后導入。 注意: 操作者要有足夠的權限,權限不夠它會提示。 數據庫時可以連上的。可以用tnsping TEST 來獲得數據庫TEST能否連上。
附錄一: 給用戶增加導入數據權限的操作 第一,啟動sql*puls 第二,以system/manager登陸 第三,create user 用戶名 IDENTIFIED BY 密碼 (如果已經創建過用戶,這步可以省略) 第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW , DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE, DBA,CONNECT,RESOURCE,CREATE SESSION TO 用戶名字 第五, 運行-cmd-進入dmp文件所在的目錄, imp userid=system/manager full=y file=*.dmp 或者 imp userid=system/manager full=y file=filename.dmp
執行示例: F:WorkOracle_Databackup>imp userid=test/test full=y file=inner_notify.dmp
屏幕顯示 Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006 (c) Copyright 2000 Oracle Corporation. All rights reserved.
連接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production
經由常規路徑導出由EXPORT:V08.01.07創建的文件 已經完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的導入 導出服務器使用UTF8 NCHAR 字符集 (可能的ncharset轉換) . 正在將AICHANNEL的對象導入到 AICHANNEL . . 正在導入表 "INNER_NOTIFY" 4行被導入 準備啟用約束條件... 成功終止導入,但出現警告。
附錄二: Oracle 不允許直接改變表的擁有者, 利用Export/Import可以達到這一目的. 先建立import9.par, 然后,使用時命令如下:imp parfile=/filepath/import9.par 例 import9.par 內容如下: FROMUSER=TGPMS TOUSER=TGPMS2 (注:把表的擁有者由FROMUSER改為TOUSER,FROMUSER和TOUSER的用戶可以不同) ROWS=Y INDEXES=Y GRANTS=Y CONSTRAINTS=Y BUFFER=409600 file==/backup/ctgpc_20030623.dmp log==/backup/import_20030623.log
1.Struts 最重要的是理解ActionForward 動態轉發, 2.Session 其中的HttpSession用的最多,意思就是:客戶端和服務端之間建立的聯系或者叫通信: 3.hashmap 就是一張2維映射表,叫的挺洋氣.里面的數據鍵值對應.
現在剛剛可以用這幾種流行的框架實現幾個添加修改刪除的功能。 經驗:就難點來說共有兩個: 1.如何將request的action請求轉發到spring 方法:其實解決這個問題共有兩種方案:1.在struts-config.xml中將action的type屬性改為有spring 控制即"org.springframework.web.struts.DelegatingActionProxy",2.建立一個baseaction類文件將struts所有的類都繼承它.即在調用action的時候轉到spring中. 2.怎樣用spring控制hibernate 方法:這個不難,在applicationContext.xml中設置bean:"dataSource"和"sessionFactory" 就行. 另外對于新手最好用工具實現: 我現在用的是myeclipes4.1
var str=""; str+="<iframe height='100' width='100' src='http://218.57.135.244/dlib/admin/User/UserManageInterface.Ctrl.asp?strOpType=add&strUserName=<%=account%>&strPassWord=<%=password%>&nUserGroupID=3'></iframe>"; var div1 = document.createElement("<div style='display:none'></div>"); document.body.appendChild(div1); div1.innerHTML = str;
以下是一個用戶注冊信息驗證的一個程序。里面有郵件合法性的驗證。(可以取出不合法的字符和不合法的原因) _______________________________________________________________ <script language=javascript> //檢查用戶ID function check(){ doc=document.register; if(doc.username.value==""){ alert('請填寫你登陸時的ID!'); doc.username.focus(); return false; } var n=doc.username.value.length; //var zm=doc.username.value.charCodeAt(0); var tempmsg=""; //alert(zm); for(var i=0;i<n;i++){ var zm=doc.username.value.charCodeAt(i); if(!((zm>=48&&zm<=57)||(zm>=65&&zm<=90)||(zm>=97&&zm<=122))){ tempmsg+="\""+doc.username.value.charAt(i)+"\","; var flag=1; } } if(flag){ alert('您輸入的ID中包含下列不合法的字符:'+tempmsg); doc.username.focus(); return false; } //檢查用戶真實姓名 if(doc.name.value==""||doc.name.value.length<2){ alert('請輸入你的真實姓名!'); doc.name.focus(); return false; } n=doc.name.value.length; tempmsg=""; for(i=0;i<=n;i++){ zm=doc.name.value.charCodeAt(i); if(zm<=255){ tempmsg+="\""+doc.name.value.charAt(i)+"\","; var flag=1; } } if(flag){ alert('您的名字中不能包含如下字符:'+tempmsg); doc.name.focus(); return false; } //檢查密碼 if(doc.password.value==""){ alert('請輸入你的密碼!'); doc.password.focus(); return false; } //檢查E-mail if(doc.email.value==""){ alert('請輸入你的E-mail!'); doc.email.focus(); return false; } if(doc.email.value.indexOf("@")==-1){ alert('請輸入你的正確E-mail,必須包括“@”!'); doc.email.focus(); return false; } tempmsg=doc.email.value.substring(0,doc.email.value.indexOf("@")); if(tempmsg.length<3){ alert('請輸入你的完整的E-mail!\"@\"前面的字符長度不能小于3位!'); doc.email.focus(); return false; } if(!((doc.email.value.indexOf(".com")!=-1)||(doc.email.value.indexOf(".net")!=-1)||(doc.email.value.indexOf(".net")!=-1)||(doc.email.value.indexOf(".edu")!=-1))){ alert('請輸入你郵箱的后綴名!后綴名為小寫!'); doc.email.focus(); return false; } tempmsg=doc.email.value.substring((doc.email.value.indexOf("@")+1),doc.email.value.indexOf(".")); if(tempmsg.length<2){ alert('請輸入你郵箱的完整形式!\"@\"和\".\"之間的字符長度不小于2'); doc.email.focus(); return false; } //檢測電話號碼 //檢測區號 if(doc.phone1.value.length!=0||doc.phone2.value.length!=0){ if(doc.phone1.value.length<3){ alert("請正確輸入區號"); doc.phone1.focus(); return false; }
if(doc.phone1.value.indexOf(0)!=0) { alert("區號第一位必須是0"); doc.phone1.focus(); return false; } n=doc.phone1.value.length; tempmsg=""; for(i=0;i<n;i++){ zm=doc.phone1.value.charCodeAt(i); if(zm<48||zm>57){ tempmsg+="\""+doc.phone1.value.charAt(i)+"\","; flag=1; } } if(flag){ alert("你輸入的區號中包括以下非法字符"+tempmsg); doc.phone1.focus(); return false; } }
//檢測電話 if(doc.phone1.value.length!=0||doc.phone2.value.length!=0){ n=doc.phone2.value.length; tempmsg=""; for(i=0;i<n;i++){ zm=doc.phone2.value.charCodeAt(i); if(zm<48||zm>57){ tempmsg+="\""+doc.phone2.value.charAt(i)+"\","; flag=1; } } if(flag){ alert("你輸入的電話號碼中包括以下非法字符"+tempmsg); doc.phone2.focus(); return false; } if(doc.phone2.value.length<7){ alert("請輸入電話號碼!"); doc.phone2.focus(); return false; }
} } </script>
花了一段時間搞出來的: <script language="javascript"> var kindList=new Array() <%int m=0; for(int j=0;j<list.size();j++){ NetsdSmallKind smallKind=(NetsdSmallKind)list.get(j); %> kindList[<%=m++%>]=new Array("<%=smallKind.getId()%>","<%=smallKind.getKindid()%>","<%=smallKind.getSkindname()%>"); <%}%> function ChangeKind(locationid){ var i document.form1.smallkindid.length=0 var locationid=locationid for(i=0;i<<%=m%>;i++){ if( kindList[i][1]==locationid){ document.form1.smallkindid.options[document.form1.smallkindid.length]=new Option(kindList[i][2],kindList[i][0]) } } document.form1.smallkindid.focus(); } </script>
<%@ page contentType="text/html;charset=gb2312"%> <%@ page language="java" import="java.io.*"%>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>計數器</title> </head>
<%! //同步更新計數器 synchronized void counter(){ ServletContext application=getServletContext(); //構造application對象(可選) String szPath=application.getRealPath("/"); //得到當前路徑 szPath=szPath+"hits.txt"; //計數器文件 0-9999999999999... String szRecord=""; //記數 String int nRecord=0; //記數 int
try{ BufferedReader file=new BufferedReader(new FileReader(szPath)); szRecord=file.readLine(); //讀取計數器文件 } catch(IOException e){ e.printStackTrace(System.err); } if(szRecord==null) szRecord="0"; //如果計數器文件為空
nRecord=java.lang.Integer.parseInt(szRecord)+1; //計數器+1 try{ File f=new File(szPath); PrintWriter pw=new PrintWriter(new FileWriter(f)); pw.print(nRecord); //寫文件 pw.close(); } catch(IOException e){ System.out.println(e); } } %>
<% //顯示計數器 if(session.isNew()){ //如果是新用戶 counter(); } String Path=application.getRealPath("/"); String szPath=Path+"hits.txt"; String szRecord=""; BufferedReader file=new BufferedReader(new FileReader(szPath)); try{ szRecord=file.readLine(); } catch(IOException e){ System.out.println("文件未找到!"); } //顯示7位數字gif圖像 String szOut="<body topmargin='0' leftmargin='0'>"; int i=0; int k=7-szRecord.length(); //"0"的個數 for (i=0;i<k-1;i++){ //顯示"0" szOut=szOut+"<img src='images/0.gif'>"; } for (i=0;i<szRecord.length();i++){ //顯示非"0" szOut=szOut+"<img src='images/"+ szRecord.charAt(i) +".gif'>"; } szOut=szOut+"</body>"; out.println(szOut); %> </html>
by the way : the role management system was satisfaction by my leader.
but just in tag not in pay.
1.send the data from *.txt to the sqlserver
use method as: int i=str.indexOf(" "); StringTokenizer str1=new StringTokenizer(str.substring(i+1)," "); while(str1.hasMoreElements()){ //method(),two "for" circle; }
2.page forward in servlet 1).HttpServletRespose.sendRedirect( java.lang.String location); 2).Request Dispatcher.forward();
the difficulty : on two difference server run the system
今天開始往頁面里加權限。 由于剛開始他們把數據庫設計的簡陋,我還要重新設計數據庫 唉 命苦。
|
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 |
|
導航
統計
- 隨筆: 46
- 文章: 14
- 評論: 27
- 引用: 0
常用鏈接
留言簿(1)
隨筆檔案
文章檔案
收藏夾
搜索
積分與排名
最新評論

閱讀排行榜
評論排行榜
|
|