|
2008年9月5日
1. Change to aliyun repository 2. Chinese input method sudo apt-get install ibus-pinyin
#remmeber to logout and re-logon to change system 'Region&Language' setting 3. Shadowsocks and genpac sudo apt install -y shadowsocks-libev
#sudo vi /etc/shadowsocks-libev/shadowsock.json { "server":"x.x.x.x", "server_port":xx, "local_port":1080, "password":"xxxxx", "timeout":60, "method":"aes-256-cfb" }
nohup ss-local -c /etc/shadowsocks-libev/shadowsock.json >/dev/null 2>&1 & sudo apt install phython-pip sudo -H pip install genpac
如果pip error "TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'" sudo python -m pip install --upgrade --force pip
mkdir pac cd pac touch user-rules.txt
genpac --pac-proxy "SOCKS5 127.0.0.1:1080" --gfwlist-proxy="SOCKS5 127.0.0.1:1080" --output="autoproxy.pac" --gfwlist-url="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt" --user-rule-from="user-rules.txt" 配置系統自動代理為: /home/xxx/pac/autoproxy.pac 4. JDK8
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html download and setup environment variable manually
5.gcloud
http://ubuntuhandbook.org/index.php/2014/10/google-cloud-sdk-made-into-canonical-partners-repository/
官方說明: http://source.android.com/source/initializing.html
環境:
Ubuntu 12.04 64bit
JDK6(installation: http://www.gaggl.com/2012/04/installing-java6-jdk-on-ubuntu-12-04/)
$ make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu
$ python -V
Python 2.7.3
android 當前 mainfest version: 4.2
按照官方說明從下載到運行emulator,沒有nexus,所以沒做實際機器燒錄。步驟請根據官方說明做,以下只列出過程遇到的問題: 1.repo sync 經常出現斷線,網上有很多參考辦法,我是每次忽略這些錯誤,直到運行完畢退出,我再重新運行: repo sync -f 知道所有代碼下載完畢(4.2的有16G) 2.每次跑emulator都要cd到代碼目錄先進行環境初始化 source build/envsetup.sh lunch full-eng 3.emulator出錯 $ emulator emulator: WARNING: system partition size adjusted to match image file (229 MB > 200 MB)
Spring 聲明式事務讓我們從復雜的事務處理中得到解脫。使得我們再也無需要去處理獲得連接、關閉連接、事務提交和回滾等這些操作。再也無需要我們在與事務相關的方法中處理大量的 try… catch … finally 代碼。 我們在使用 Spring 聲明式事務時,有一個非常重要的概念就是事務屬性。事務屬性通常由事務的傳播行為,事務的隔離級別,事務的超時值和事務只讀標志組成。我們在進行事務劃分時,需要進行事務定義,也就是配置事務的屬性。 Spring 在 TransactionDefinition 接口中定義這些屬性 , 以供 PlatfromTransactionManager 使用 , PlatfromTransactionManager 是 spring 事務管理的核心接口。 l getTimeout() 方法,它返回事務必須在多少秒內完成。 l isReadOnly() , 事務是否只讀,事務管理器能夠根據這個返回值進行優化,確保事務是只讀的。 l getIsolationLevel() 方法返回事務的隔離級別,事務管理器根據它來控制另外一個事務可以看到本事務內的哪些數據。 在 TransactionDefinition 接口中定義了五個不同的事務隔離級別: l ISOLATION_DEFAULT 這是一個 PlatfromTransactionManager 默認的隔離級別,使用數據庫默認的事務隔離級別 . 另外四個與 JDBC 的隔離級別相對應 l ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生臟讀,不可重復讀和幻像讀。 例如 : Mary的原工資為 1000, 財務人員將 Mary 的工資改為了 8000 ,但未提交事務 與此同時, Mary正在讀取自己的工資 Mary 發現自己的工資變為了 8000 ,歡天喜地! 而財務發現操作有誤,而回滾了事務 ,Mary 的工資又變為了 1000. 像這樣 ,Mary 記取的工資數 8000 是一個臟數據。 l ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免臟讀出現,但是可能會出現不可重復讀和幻像讀。 l ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生 ( 不可重復讀 ) 。 在事務 1 中, Mary 讀取了自己的工資為 1000, 操作并沒有完成 在事務 2 中,這時財務人員修改了 Mary 的工資為 2000, 并提交了事務 . 在事務 1 中,Mary 再次讀取自己的工資時,工資變為了 2000 在一個事務中前后兩次讀取的結果并不致,導致了不可重復讀。 使用 ISOLATION_REPEATABLE_READ 可以避免這種情況發生。 l ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止臟讀,不可重復讀外,還避免了幻像讀。 目前工資為 1000 的員工有 10人。 事務 1, 讀取所有工資為 1000 的員工。 共讀取 10 條記錄 這時另一個事務向 employee表插入了一條員工記錄,工資也為 1000 事務 1 再次讀取所有工資為 1000 的員工 共讀取到了 11 條記錄,這就產生了幻像讀。 ISOLATION_SERIALIZABLE 能避免這樣的情況發生。但是這樣也耗費了最大的資源。 getPropagationBehavior () 返回事務的傳播行為,由是否有一個活動的事務來決定一個事務調用。 在 TransactionDefinition 接口中定義了七個事務傳播行為: l PROPAGATION_REQUIRED 如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。 使用 spring 聲明式事務, spring 使用 AOP 來支持聲明式事務,會根據事務屬性,自動在方法調用之前決定是否開啟一個事務,并在方法執行之后決定事務提交或回滾事務。 單獨調用 methodB 方法 相當于 Spring 保證在 methodB 方法中所有的調用都獲得到一個相同的連接。在調用 methodB 時,沒有一個存在的事務,所以獲得一個新的連接,開啟了一個新的事務。 單獨調用 MethodA 時,在 MethodA 內又會調用 MethodB. 執行效果相當于 調用 MethodA 時,環境中沒有事務,所以開啟一個新的事務 . 當在 MethodA 中調用MethodB 時,環境中已經有了一個事務,所以 methodB 就加入當前事務。 l PROPAGATION_SUPPORTS 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對于事務同步的事務管理器, PROPAGATION_SUPPORTS 與不使用事務有少許不同。 單純的調用 methodB 時, methodB 方法是非事務的執行的。 當調用 methdA時 ,methodB 則加入了 methodA 的事務中 , 事務地執行。 l PROPAGATION_MANDATORY 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。 當單獨調用 methodB 時,因為當前沒有一個活動的事務,則會拋出異常 throw new IllegalTransactionStateException("Transaction propagation ''mandatory'' but no existing transaction found"); 當調用 methodA 時, methodB 則加入到 methodA 的事務中,事務地執行。 l PROPAGATION_REQUIRES_NEW 總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。 當單獨調用 methodB 時,相當于把 methodb 聲明為 REQUIRED 。開啟一個新的事務,事務地執行。 當調用 methodA 時 情況有些大不一樣 . 相當于下面的效果。 在這里,我把 ts1 稱為外層事務, ts2 稱為內層事務。從上面的代碼可以看出, ts2 與ts1 是兩個獨立的事務,互不相干。 Ts2 是否成功并不依賴于 ts1 。如果 methodA 方法在調用 methodB 方法后的 doSomeThingB 方法失敗了,而 methodB 方法所做的結果依然被提交。而除了 methodB 之外的其它代碼導致的結果卻被回滾了。 使用PROPAGATION_REQUIRES_NEW, 需要使用 JtaTransactionManager 作為事務管理器。 l PROPAGATION_NOT_SUPPORTED 總是非事務地執行,并掛起任何存在的事務。 當單獨調用 methodB 時,不啟用任何事務機制,非事務地執行。 當調用 methodA 時,相當于下面的效果 使用 PROPAGATION_NOT_SUPPORTED, 也需要使用 JtaTransactionManager 作為事務管理器。 l PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常 單獨調用methodB ,則非事務的執行。 調用 methodA 則會拋出異常 l PROPAGATION_NESTED 如果一個活動的事務存在,則運行在一個嵌套的事務中 . 如果沒有活動事務 , 則按 TransactionDefinition.PROPAGATION_REQUIRED 屬性執行 這是一個嵌套事務 , 使用 JDBC 3.0 驅動時 , 僅僅支持 DataSourceTransactionManager 作為事務管理器。需要 JDBC 驅動的 java.sql.Savepoint 類。有一些 JTA 的事務管理器實現可能也提供了同樣的功能。 使用 PROPAGATION_NESTED ,還需要把 PlatformTransactionManager 的nestedTransactionAllowed 屬性設為 true; 而 nestedTransactionAllowed 屬性值默認為false; 如果單獨調用 methodB 方法,則按 REQUIRED 屬性執行。 如果調用 methodA 方法,相當于下面的效果 當 methodB 方法調用之前,調用 setSavepoint 方法,保存當前的狀態到 savepoint 。如果 methodB 方法調用失敗,則恢復到之前保存的狀態。但是需要注意的是,這時的事務并沒有進行提交,如果后續的代碼 (doSomeThingB() 方法 ) 調用失敗,則回滾包括 methodB 方法的所有操作。 嵌套事務一個非常重要的概念就是內層事務依賴于外層事務。外層事務失敗時,會回滾內層事務所做的動作。而內層事務操作失敗并不會引起外層事務的回滾。 PROPAGATION_NESTED 與 PROPAGATION_REQUIRES_NEW 的區別: 它們非常類似 , 都像一個嵌套事務,如果不存在一個活動的事務,都會開啟一個新的事務。使用PROPAGATION_REQUIRES_NEW 時,內層事務與外層事務就像兩個獨立的事務一樣,一旦內層事務進行了提交后,外層事務不能對其進行回滾。兩個事務互不影響。兩個事務這是一個真正的嵌套事務。同時它需要 JTA 事務管理器的支持。 使用 PROPAGATION_NESTED 時,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常并不會導致外層事務的回滾,它是一個真正的嵌套事務。 DataSourceTransactionManager 使用 savepoint 支持PROPAGATION_NESTED 時,需要 JDBC 3.0 以上驅動及 1.4 以上的 JDK 版本支持。其它的JTA TrasactionManager 實現可能有不同的支持方式。 PROPAGATION_REQUIRED 應該是我們首先的事務傳播行為。它能夠滿足我們大多數的事務需求。
參考這篇文章: http://blog.csdn.net/bluishglc/article/details/6632280 一。Maven的執行方式 maven對構建(build)的過程進行了抽象和定義,這個過程被稱為構建的生命周期(lifecycle)。生命周期(lifecycle)由多個階段(phase)組成,每個階段(phase)會掛接一到多個goal。goal是maven里定義任務的最小單元,goal分為兩類,一類是綁定phase的,就是執行到某個phase,那么這個goal就會觸發,另外一類不綁定,就是單獨任務,這就相當于ant里的target。
1。以phase來構建 例如: mvn clean mvn compile mvn test mvn package 表明maven會執行到某個生命周期(lifecycle)的某個階段(phase) 這個phase以及它前面所有phase綁定的目標(goal)都會執行, 每個phase都會邦定maven默認的goal或者沒有goal, 或者自定義的goal。 也可以通過傳入參數跳過(skip)某些phase,例如: mvn install -Dmaven.test.skip=true 1。以goal來構建 這類就是沒有綁定phase的goal,但是這類goal卻通常會有個執行前提,就是project必須執行到某個phase, 那么執行這個goal,其實也會觸發maven執行到前提要求的phase。 例如jetty:run是個非綁定phase的goal,它的前提是 test-compile,這個前提是由plugin的代碼邏輯制定的/** * @goal run * @requiresDependencyResolution runtime * @execute phase="test-compile" * @description Runs jetty6 directly from a maven project */ public class Jetty6RunMojo extends AbstractJettyRunMojo { ... }
二。Maven lifecycle, phase概覽 Maven預設了三個Lifecycle ,各包含了下列Phases.- Clean Lifecycle
- Default Lifecycle
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
- Site Lifecycle
- pre-site
- site
- post-site
- site-deploy
1.Window
- java -classpath .;jar1;jar2 MainClass
注意: -classpath參數必須放于前面。
- java -jar jar1
jar包的MANIFEST.MF文件:
Manifest-Version: 1.0
Main-Class: com.Main1
Class-Path: jar1.jar;jar2.jar
注意: 使用-jar參數,那么主jar包必須含有MANIFEST.MF信息,并且指定Main-Class & Class-Path。命令行的-classpath參數將被忽略
2.Linux 區別: 目錄分隔符由\變成/ jar包分隔符由;變成: Window測試環境是Sun java version "1.6.0_14" 其他版本沒有驗證
1.綁定本地接口,自動生成代理對象 復制下面鏈接代碼 // Endpoint Address String endpointAddress = "http://localhost:8111/helloWorld"; // Add a port to the Service service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress); HelloService hw = service.getPort(HelloService.class);
java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8888
Java Keytool Commands for Creating and ImportingThese commands allow you to generate a new Java Keytool keystore file, create a CSR, and import certificates. Any root or intermediate certificates will need to be imported before importing the primary certificate for your domain. - Generate a Java keystore and key pair
keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048 - Generate a certificate signing request (CSR) for an existing Java keystore
keytool -certreq -alias mydomain -keystore keystore.jks -file mydomain.csr - Import a root or intermediate CA certificate to an existing Java keystore
keytool -import -trustcacerts -alias root -file Thawte.crt -keystore keystore.jks - Import a signed primary certificate to an existing Java keystore
keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks - Generate a keystore and self-signed certificate (see How to Create a Self Signed Certificate using Java Keytool for more info)
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
Java Keytool Commands for CheckingIf you need to check the information within a certificate, or Java keystore, use these commands. - Check a stand-alone certificate
keytool -printcert -v -file mydomain.crt - Check which certificates are in a Java keystore
keytool -list -v -keystore keystore.jks - Check a particular keystore entry using an alias
keytool -list -v -keystore keystore.jks -alias mydomain
Other Java Keytool Commands- Delete a certificate from a Java Keytool keystore
keytool -delete -alias mydomain -keystore keystore.jks - Change a Java keystore password
keytool -storepasswd -new new_storepass -keystore keystore.jks - Export a certificate from a keystore
keytool -export -alias mydomain -file mydomain.crt -keystore keystore.jks - List Trusted CA Certs
keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts - Import New CA into Trusted Certs
keytool -import -trustcacerts -file /path/to/ca/ca.pem -alias CA_ALIAS -keystore $JAVA_HOME/jre/lib/security/cacerts
第一種方式:適合于全部HTML標簽
<acronym title="World Wide Web">
WWW
</acronym>
第二種方式:IMG之類的標簽例如:
<img src="#" alt="鼠標移動到上方會顯示并且未加載圖片時也會顯示">
第三種方式:input之類的標簽例如:
<input type="button" value="確定" title="鼠標移動到上方會顯示并且未加載圖片時也會顯示">
|
第一:簡單的使用axis2包自己實現調用
package common;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class WebServiceUtils
{
// ----------------------------------------------------- Properties
public static int TIMEOUT = 100000;
// ----------------------------------------------------- Constructors
// ----------------------------------------------------- Methods
/**
*
* 調用axis2的webservice的方法
*
* @return
*/
@SuppressWarnings("unchecked")
static public Object[] invokeWebService( String url, String nameSpace, String method, Object[] args, Class[] returnTypes )
throws AxisFault
{
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference( url );
options.setTo( targetEPR );
options.setTimeOutInMilliSeconds( TIMEOUT );
QName opName = new QName( nameSpace, method );
Object[] results = serviceClient.invokeBlocking( opName, args, returnTypes );
return results;
}
}
第二:
public static OMElement getEchoOMElement() {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(
"http://example1.org/example1", "example1");
OMElement method = fac.createOMElement("echo", omNs);
OMElement value = fac.createOMElement("Text", omNs);
value.addChild(fac.createOMText(value, "Axis2 Echo String "));
method.addChild(value);
return method;
}
public static void main(String[] args) {
try {
OMElement payload = ClientUtil.getEchoOMElement();
Options options = new Options();
options.setTo(targetEPR);
options.setAction("urn:echo");
//Blocking invocation
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMElement result = sender.sendReceive(payload);
System.out.println(result);
System.out.println(options.getTo());
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
}
}
第三:
利用插件生成客戶端
private static String URL="http://localhost:8080/axis2/services/WeatherService";
public static void main(String[] args) throws RemoteException {
try {
WeatherServiceStub stub;
if (args != null && args.length != 0) {
stub = new WeatherServiceStub(args[0]);
} else {
stub = new WeatherServiceStub(URL);
}
WeatherServiceStub.SetWeather setWether = new WeatherServiceStub.SetWeather();
WeatherServiceStub.Weather wether = new WeatherServiceStub.Weather();
wether.setForecast("east");
wether.setRain(true);
wether.setTemperature(12.3f);
wether.setForecast("big");
setWether.setWeather(wether);
stub.setWeather(setWether);
WeatherServiceStub.GetWeatherResponse gw = new WeatherServiceStub.GetWeatherResponse();
System.out.println(gw.get_return());
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
本文部分來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yhhah/archive/2009/05/07/4158487.aspx
IE的 script 元素支持onreadystatechange事件,不支持onload事件。
FF的script 元素不支持onreadystatechange事件,只支持onload事件。
如果要在一個<script src="xx.js"> 加載完成執行一個操作,FF使用onload事件就行了,IE下則要結合onreadystatechange事件和this.readyState
var loadScript = function(fileName,callback) {
var scriptTag = document.createElement("script");
scriptTag.src = fileName;
document.body.appendChild(scriptTag);
if (callback) {
scriptTag.onload = callback;//ff
scriptTag.onreadystatechange = function()//ie
{
if (scriptTag.readyState == "loaded") {
callback();
}
}
}
}
關鍵是查詢v$locked_object
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;
或者
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;
殺掉進程:
alter system kill session 'sid,serial#';
--創建臨時表空間
create temporary tablespace dbuser_temp
tempfile 'D:\oracle\product\10.1.0\oradata\btx\dbuser_temp01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
--創建數據表空間
create tablespace dbuser_data
logging
datafile 'D:\oracle\product\10.1.0\oradata\btx\dbuser_data01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
--或者自己控制增長規則
--pctincreate表示下一次增長是前一次增長的110%
create tablespace dbuser_data logging datafile 'D:/oracle/product/10.1.0/oradata/btx/DBUSER_DATA01.DBF' size 32m autoextend on next 5m maxsize unlimited default storage (initial 32m next 5m pctincrease 10);
--修改表空間
alter tablespace dbuser_data add datafile 'D:/oracle/product/10.1.0/oradata/btx/DBUSER_DATA02.DBF' size 32m autoextend on next 5m maxsize unlimited;
--創建用戶與指定默認數據表空間與默認臨時表空間
create user dbuser identified by dbuser
default tablespace dbuser_data
temporary tablespace dbuser_temp;
--修改用戶表空間
alter user dbuser default tablespace dbuser_data temporary tablespace dbuser_temp;
--為用戶賦權
grant connect,resource to dbuser;
修改表空間
查詢oracle表空間使用狀況
SELECT b.tablespace_name "表空間名",total 表空間大小,free 表空間剩余大小,
(total-free) 表空間使用大小,
ROUND((total-free)/total,4)*100 "使用率 %"
FROM (SELECT tablespace_name,SUM(bytes) free FROM DBA_FREE_SPACE
GROUP BY tablespace_name ) a,
(SELECT tablespace_name,SUM(bytes) total FROM DBA_DATA_FILES
GROUP BY tablespace_name) b
WHERE a.tablespace_name=b.tablespace_name ;
恢復表數據:
alter table 表名 enable row movement;
flashback table 表名 TO TIMESTAMP to_timestamp('2009-08-07 18:34:00','yyyy-mm-dd hh24:mi:ss');
恢復存儲過程:
select text from dba_source as of timestamp to_timestamp('2009-03-06 09:45:00', 'YYYY-MM-DD HH24:MI:SS') where owner='IPRA' and name= 'P_IPACCHECK_NC' order by line;
需要sys用戶
否則不夠權限
或者登錄數據庫所在主機,使用數據庫管理者的系統用戶登錄
視圖:(受權限過濾了)
all_tables 所有表
all_indexs 所有索引
all_tab_columns 所有列,可以查看列的類型
(dba權限包括所有)
dba_tables
dba_tab_columns
dba_free_space 各對象的剩余空間
dba_data_files 各數據空間的文件信息
dba_tablespaces 表空間信息
常用字符函數
函數
|
描述
|
LOWER(char)
|
將字符串表達式char中的所有大寫字母轉換為小寫字母
|
UPPER(char)
|
將字符串表達式char中的所有小寫字母轉換為大寫字母
|
INITCAP(char)
|
首字母轉換成大寫
|
SUBSTR(char,start,length)
|
返回字符串表達式char中從第start開始的length個字符
|
LENGTH(char)
|
返回字符串表達式char的長度
|
LTRIM(char)
|
去掉字符串表達式char后面的空格
|
ASCII(char)
|
取char的ASCII值
|
CHAR(number)
|
取number的ASCII值
|
REPLACE(char,str1,str2)
|
將字符串中所有str1換成str2
|
INSTR(char1,char2,start,times)
|
在char1字符串中搜索char2字符串,start為執行搜索操作的起始位置,times為搜索次數
|
常用日期函數
函數
|
描述
|
SYSDATE
|
返回系統當前日期和時間
|
NEXT_DAY(day,char)
|
返回day指定的日期之后并滿足char指定條件的第一個日期,char所指條件只能為星期幾
|
LAST_DAY(day)
|
返回day日期所指定月份中最后一天所對應的日期
|
ADD_MONTH(day,n)
|
返回day日期在n個月后(n為正數)或前(n為負數)的日期
|
MONTH_BETWEEN(day1,day2)
|
返回day1日期和day2日期之間相差得月份
|
ROUND(day[,fmt])
|
按照fmt指定格式對日期數據day做舍入處理,默認舍入到日
|
TRUNC(day,[,fmt])
|
按照fmt指定格式對日期數據day做舍入處理,默認截斷到日
|
數據類型轉換函數
函數
|
描述
|
TO_CHAR
|
將一個數字或日期轉換成字符串
|
TO_NUMBER
|
將字符型數據轉換成數字型數據
|
TO_DATE
|
將字符型數據轉換為日期型數據
|
CONVERT
|
將一個字符串從一個字符集轉換為另一種字符集
|
CHARTORowid
|
將一個字符串轉換為Rowid數據類型
|
RowIDTOCHAR
|
將一個Rowid數據類型轉換為字符串
|
NEXTTORAW
|
將一個十六進制字符串轉換為RAW數據類型
|
RAWTOHEX
|
將一個RAW類型的二進制數據類型轉換為一個十六進制表達的字符串
|
TO_MULTI_BYTE
|
將一個單字節字符串轉換為多字節字符串
|
TO_SINGLE_BYTE
|
將一個多字節字符串轉換為單字節字符串
|
集合函數
函數
|
描述
|
AVG
|
計算一列值的平均值
|
COUNT
|
統計一列中值的個數
|
MAX
|
求一列值中的最大值
|
MIN
|
求一列值中的最小值
|
SUM
|
計算一列值的總和
|
STDDEV
|
計算一列值的標準差
|
VARIANCE
|
計算一列值的方差
|
1、
encodeURIComponent(”[string]“)
decodeURIComponent(”[encodedString]“)
2、
encodeURI(”[string]“)
decodeURI(”[encodedString]“)
3、
escape(”[string]“)
unescape(”[encodedString]“)
1、對每個字節進行編碼;
2、空格轉為”+”號;
3、安全字符不編碼。安全字符:大小寫英文字母(a-z以及A-Z) 阿拉伯數字(0-9) \’ ( ) * - . _ !
4、其他字節以十六進制顯示并加”%”前綴,例如用%25代表%號。
設置客戶端字符集:
# 常用中文字符集
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
# 常用unicode字符集
set NLS_LANG=american_america.AL32UTF8
exp 用戶名/密碼@主機 file=導出文件的文件名 tables=(逗號分割表名) log=aibsm.log feedback=200
1.Json的對象形式
{
property0 : true, //property0是一個布爾型的值
property1 : 0, //property1是一個數值型的值
property2 : "123", //property2是一個字符串型的值
property3 : function(){...} //property3是一個函數
}
使用key-value對構造json對象,注意屬性的key和value使用“:”分開,屬性之間使用“,”分開,注意最后的屬性沒有“,”,什么符號都不要有。將此結構直接賦值給js的對象,則可以使用這個對象調用這些屬性。
例如:var obj1 = {
property0 : true, //property0是一個布爾型的值
property1 : 0, //property1是一個數值型的值
property2 : "123", //property2是一個字符串型的值
property3 : function(){...}, //property3是一個函數
property4 : { p1 : p1Value, p2 : p2Value } //property4本身又是一個對象
}
那么可以調用
alert(obj1.property0);
obj1.property3();
……
在Java Web開發中,服務端負責輸出這串字符到jsp頁面的js,就可以使用了。
關鍵的是,字符串中可能具有js需要避免的特殊字符,建議查看一下spring的JavascriptUtils的javaScriptEscape方法就知道如何做啦
如果是Ajax調用的話,就是用prototype庫的方法,將字符串轉換為json對象
new Ajax.Request(" http://url/", {
method: "get",
onSuccess: function(transport) {
var json = transport.responseText.evalJSON();
// TODO: document.write(json.xxx);
}
prototype庫的官網: http://prototypejs.org/
});
2. Json的數組形式
其實js中的數組更像是一個Map對象,因為它的key不只是整數,還可以是字符串。
var array;
array["key0"] = key0Value;
array["key1"] = key1Value;
摘要: 基本javascript事件的列表介紹 閱讀全文
摘要: 首先介紹一個網站,我很多書本都是在上面下載的,很好。http://www.freebookspot.in/
我現在學習的書本是:Pro Javascript Design Pattern
首先簡單地為優雅的Javascript代碼開個頭
運用設計模式的三大原因:
可維護性
溝通交流性
性能追求
不使用設計模式的兩大原因:
復雜性
性能追求
閱讀全文
最大公約數:使用輪轉相除法,它的原理是:(n1>n2)n1與n2的最大公約數等于n2與n1%n2的最大公約數,即
gcd(n1, n2)=gcd(n2, n1%n2)
 最大公約數
1 public class MaxDivisor {
2 public static void main(String[] args){
3 int int1 = (int) Math.ceil(Math.random()*1000);
4 int int2 = (int) Math.ceil(Math.random()*1000);
5 System.out.print(int1+" " + int2+"\n");
6 System.out.println(findMaxDivisor(int1, int2));
7 }
8
9 public static int findMaxDivisor(int int1, int int2){
10 if(int1==int2) return int1;
11 else if(int1<int2){
12 int1 += int2;
13 int2 = int1 - int2;
14 int1 -= int2;
15 }
16 int temp;
17 while((temp = int1%int2) != 0){
18 return findMaxDivisor(int2, int1%int2);
19 }
20 return int2;
21 }
22 }
23
素數篩選法:原理是:
1)0與1不是素數;
2)素數的2倍以上倍數不是素數
所以剔除這些剩下的就是素數了
 素數篩選法
1 public class PrimeNum {
2 public static void primeNum(){
3 boolean[] array = new boolean[6500];
4 for(int i = 0; i<array.length; i++){
5 array[i] = true;
6 }
7 array[0] = array[1] = false;
8 int end = (int) Math.ceil(Math.sqrt(array.length-1));
9 for(int i=2; i<end; i++){
10 if(array[i] == true)
11 for(int j = i+i; j<array.length; j+=i){//若i是素數,則排除i的倍數
12 array[j] = false;
13 }
14 }
15 StringBuilder sb = new StringBuilder();
16 for(int i = 0; i<array.length; i++){
17 if(array[i] == true)
18 sb.append(i).append(" ");
19 }
20 System.out.println(sb.toString());
21 }
22
23 public static void main(String[] args){
24 primeNum();
25 }
26 }
27
http://wiki.ubuntu.org.cn/Tomcat%E8%AE%BE%E7%BD%AEJSP%E7%8E%AF%E5%A2%83
jms:
(Java Message Service)
JMS定義了Java中訪問消息中間件的接口。
JMS只是接口,并沒有給予實現,實現JMS接口的消息中間件叫JMS Provider,這樣的消息中間件可以從Java里通過JMS接口進行調用。
JMS 消息模型
JMS消息由兩部分構成:header和body。header包含消息的識別信息和路由信息,body包含消息的實際數據。
根據數據格式,JMS消息可分為以下五種:
BytesMessage 消息是字節流。
MapMessage 消息是一系列的命名和值的對應組合。
ObjectMessage 消息是一個流化的Java對象。
StreamMessage 消息是Java中的輸入輸出流。
TextMessage 消息是一個字符串,這種類型將會廣泛用于XML格式的數據。
cms:
Content Management System,CMS其實就是內容管理系統,,,可以理解為,CMS幫你把一個網站的程序部分的事全做完了 你要做的只是一個網站里面美工的部份,搞幾個靜態網頁模板,一個門戶級的網站就出來了!
CMS,大概2004以前,如果想進行網站內容管理,基本上都是靠手工維護,但千變萬化的信息流,但沒有好的程序支持,還繼續靠手工完成是不可能的事,如果有一個好的系統來支撐你的網站,那將節省大量的人力物力,開發者就可能給客戶一個軟件包,可以用它定期人工修改網站。只要你配置安裝好,你的編輯,在線記者,更新員只要定期更新數據,剩下的事就交給CMS去處理
基本類型:
布爾類型:boolean不能夠自動也不能強制轉換成其他類型,但是可以進行&,&&,|,||運算
字符類型:char(16)其他基本類型不能夠自動轉變為字符類型,但可以強制轉換為char,但是可以有截斷現象
整形類型:byte(8),short(16),int(32),long(64)初始化的時候都是使用整數字面量直接賦值,但是byte與byte,short與short變量相加,默認都得到int的值,所以必須強制轉換才能夠返回原來類型的值(例如:(byte)(b1+b2))
浮點類型:float(32),double(64)浮點數的字面量默認都是double類型,所以需要強制轉換成float才能夠初始化float,或者加上f或F后綴。(例如float f1 = 1.4F或者float f1 = (float)1.4
整形還可以使用八進制(以0開頭的整形數字字面量)、十六進制(以0x開頭的整形字面量)初始化;
浮點型:字面量不可以是八進制十六進制,但int可以自動轉化為浮點,所以仍然可以使用8進制16進制初始化,但是可以使用浮點計數法初始化,同樣可以加上f或d后綴,例1.23e+33F等
字符型char可以直接使用
unicode轉義符:
\uXXXX 四個16進制的數,在文本里面就是代表著某個字符,所以可以'\uXXXX'初始化一個char,可以\u0022\uXXXX\u0022初始化一個String,因為剛好\u0022代表雙引號。當然\uXXXX不能是雙引號,否則就編譯出錯了。
自動類型轉換:byte---short---int---long---float---double
但是short與char不能夠相互自動轉換,但是可以相互強制轉換
整型字面量可以初始化char,只要不超過65535的范圍,也就是也能夠使用8進制16進制初始化,但是整型變量不能夠賦值給char;
char可以自動轉換成int及以上
變量聲明與定義:
int[] intArray; //OK
int intArray[]; //OK
前面的加上 “= new int[變量or常量]” 都是可以的,但是“= new int(5)”是錯誤的
int[] intArray[]; //OK,但是代表的是數組的數組
int[5] intArray; //False
int intArray[5]; //False
三目運算符:
?:返回不同類型問題,跟C++稍微不同,無論返回值在第一表達式還是第二表達式,返回值都是根據高階類型返回,例子:
true ? 'a' : 9 返回結果是字符類型,所以字符類型是高階類型
true ? 'a' : 9.0 返回結果是浮點類型(對于double和float都是),所以浮點比字符類型高階
ture ? 9 : 9.0 返回結果是浮點類型,明顯
true ? "abc" : 9 返回結果是字符串類型,因為字符類型較高階
true ? 對象1實例 : 對象2實例 返回結果是最大共同父類,所以如果其中一個是另外一個的子類,那么就返回父類,如果互不繼承關系,則返回Object。
String總結:
首先聲明,==判斷是判斷對象引用的實例是否相同,即實例是否真正在相同的位置
Object默認的equals方法與==是一樣的(就是引用相同實例),String類重寫equals方法和hashCode方法,只要內容相同就返回ture(一般自己寫的類也建議重寫equals方法和hashCode方法)。所以這時候==與equals就具有不相同意義了。
http://www.javaeye.com/topic/122206
1. 首先String不屬于8種基本數據類型,String是一個對象。
因為對象的默認值是null,所以String的默認值也是null;但它又是一種特殊的對象,有其它對象沒有的一些特性。
2. new String()和new String("")都是申明一個新的空字符串,是空串不是null;
3. String str="string";
String str1="string";
String str2=new String ("string");
String str3="str" + new String("ing");
關于常量池概念,java虛擬機在常量池中只維持一個字符串的示例,所以str與str1引用都是引用常量池里面的共同實例,關鍵的是只有常量池里面的String才是唯一的,new空間里面的并不是。
但是str2,str3(而且str2與str3的空間地址也肯定不一樣的,引用的是新建空間堆里的實例,所以str==str1,str!=str2,str1!=str2,str1!=str3,str2!=str3
但是它們幾個使用equals都是返回true的,因為String類的hashCode函數根據內容返回hashCode碼,這個碼相同,則equals就返回true了,具體的equals與hashCode解釋可以參照《java核心技術 卷1 基礎知識》
注意:成員函數intern() :
當一個String實例str調用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等于str的字符串并返回它的引用;
所以:
String str1="string";
String str2=new String ("string");
str1==str2.intern() 返回true
參考java core總結,java 5與之前的不同包括:
1.泛型編程
2.包裝類的自動打包拆包
3.格式化輸出:增加printf函數
4.StringBuilder類:非線程安全的StringBuffer
5.可變參數列表:聲明方式public void mymethod(String arg1,Object… args),記住...號
6.增強的for循環:for(type variable:數組或數組列表)
7.靜態導入:import static 導入類 就可以使用本地方法一樣使用導入類的靜態方法
8.協變的返回類型,即override的函數可以返回原函數返回類型的子類型,而不是要求相同返回類型
9.控制臺輸入
10.內容窗格授權:Jframe、JDialog、JApplet可以使用add和setLayout函數,以前需要getContentPane().add(component)和getContentPane().setLayout(manager);
測試:定義為“在受控的條件下對應用程序進行操作,以對程序質量進行評估”。
質量:可以定義為“產品的優點(特性)減去其中存在的問題(bug)”。
測試的重要性:測試的反面是不測試,即把程序驗證工作都丟到軟件開發完畢或者交付給客戶。辯駁觀點是:越遲發現程序的問題,修復其的成本越高。
測試人員做什么:保證程序的bug是影響最小的bug,將程序的bug降到最小風險。
測試與QA(Quality Assurance)的區別:QA關注軟件工程的過程,通過改善過程提高軟件的質量,他不對軟件進行剖析以找出問題,而只是驗證軟件是否滿足一套已定義的質量標準和用戶協議。
測試更關心的是剖析軟件,觀察軟件的運行,并在質量內部層次進行報告,發現軟件的bug。
測試人員素質:驗證、檢測、防范、反映。
bug:是沒有預料到的行為,軟件做了某些認為是錯誤的事情。
自動化測試:使用軟件工具來代替手工進行的一系列動作,通常使用腳本或者代碼驅動應用程序,可以通過可視用戶界面完成,或者直接命令模擬客戶端功能。
構建版本驗證測試(Build verification test, BVT)針對軟件最新版本而做的一些列自動化測試;回歸測試(Regression testing)測試以前曾經正常工作的場景,確保代碼修改后沒有打破原來的功能或者產生其他方面的副作用。
線程生命周期:新建線程、排隊、運行、等待、死亡,明顯包含了下面線程生存期的三種狀態。
線程生存期三種狀態:就緒、運行、等待(掛起)
與線程相關的一些函數區別:
線程暫?;蛘咄V梗?/span>stop、suspend、sleep、wait
成員方法stop會解除由線程獲得的所有鎖定,并且使線程進入死亡狀態,相當于run方法的被強制中斷;
成員方法suspend仍然持有線程之前的所有鎖定,并且使線程進入等待狀態,需要使用resume重激活;
靜態方法 sleep不釋放對象鎖,可以指定暫停線程的mini Seconds數,暫停當前線程;
成員方法wait導致本線程放棄對象鎖,進入掛起狀態,并且需要通過notify或者notifyAll來使線程進入就緒狀態;
線程池機制:
線程池管理器:創建銷毀線程池、將工作線程放入線程池
工作線程:執行任務(即任務接口)的線程,在沒有任務時候等待
任務隊列:提供線程申請緩沖機制
任務接口:規定任務的入口、任務執行完后的收尾工作、任務的執行狀態
ZIP壓縮IO涉及類(包括操作文件夾壓縮)
ZipEntry標識zip文件中單個文件的入口,它也支持路徑加文件名,所以通過配置它,可以建立目錄層次的zip文件(見下例子)
ZipOutputStream,write數據到zip文件的對象
ZipInputStream,從zip文件中read數據的對象,其實基本上這個沒有作用
ZipFile,獲取zip文件里面單個文件入口,getInputStream()等信息的對象,初始化ZipFile zf = new ZipFile(zip壓縮文件的File對象);
Enumeration entries = =zf.entries()可以獲得所有的zip文件里面的文件入口。
原理就是:entry指定單個文件相對zip壓縮文件內部根目錄的位置,Stream操作輸出輸入,ZipFile代表的就是整個zip文件
 示例代碼
1 package zipLearning;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.util.zip.ZipEntry;
7 import java.util.zip.ZipOutputStream;
8
9 public class testZip {
10 private static final int BUFFER_SIZE = 100;
11
12 public static void main(String[] args) {
13 if (args.length == 2) {
14 File file = new File(args[0]);
15 if (file.exists())
16 file.delete();
17 zip(new File(args[0]), new File(args[1]).listFiles());
18 } else {
19 System.err.println("Command Parameters Error!");
20 System.out
21 .println("usage testZip zip_target_name in_file_or_dir_name");
22 }
23 }
24
25 public static void zip(File zipFile, File[] zippedFiles) {
26 try {
27 byte[] buffer = new byte[BUFFER_SIZE];
28 FileOutputStream fs = new FileOutputStream(zipFile);
29 ZipOutputStream zipOut = new ZipOutputStream(fs);
30
31 for (int i = 0, n = zippedFiles.length; i < n; i++) {
32 if (zippedFiles[i] == null || !zippedFiles[i].exists())
33 continue;
34 if (zippedFiles[i].isDirectory()) {
35 zip(zippedFiles[i].listFiles(), zipOut, buffer,
36 zippedFiles[i].getName());
37 continue;
38 }
39 ZipEntry zipAdd = new ZipEntry(zippedFiles[i].getName());
40 zipAdd.setTime(zippedFiles[i].lastModified());
41 zipOut.putNextEntry(zipAdd);
42
43 FileInputStream in = new FileInputStream(zippedFiles[i]);
44 while (true) {
45 int readSize = in.read(buffer, 0, buffer.length);
46 if (readSize < 0) {
47 break;
48 }
49 zipOut.write(buffer, 0, readSize);
50 }
51 in.close();
52 }
53 zipOut.close();
54 fs.close();
55 } catch (Exception e) {
56 e.printStackTrace();
57 }
58 }
59
60 public static void zip(File[] zippedFiles, ZipOutputStream zipOut,
61 byte[] buffer, String base) throws Exception {
62 base = base + "/";
63 for (int i = 0, n = zippedFiles.length; i < n; i++) {
64 if (zippedFiles[i] == null || !zippedFiles[i].exists())
65 continue;
66
67 if (zippedFiles[i].isDirectory()) {
68 zip(zippedFiles[i].listFiles(), zipOut, buffer, base
69 + zippedFiles[i].getName());
70 continue;
71 }
72
73 ZipEntry zipAdd = new ZipEntry(base + zippedFiles[i].getName());
74 zipAdd.setTime(zippedFiles[i].lastModified());
75 zipOut.putNextEntry(zipAdd);
76
77 FileInputStream in = new FileInputStream(zippedFiles[i]);
78 while (true) {
79 int readSize = in.read(buffer, 0, buffer.length);
80 if (readSize < 0) {
81 break;
82 }
83 zipOut.write(buffer, 0, readSize);
84 }
85 in.close();
86 }
87 }
88 }
89
JAR壓縮類與ZIP是幾乎一模一樣對應的分別為:JarEntry JarFile JarInputStream JarOutputStream
GZIP格式,只提供GZIPInputStream和GZIPOutputStream類,因為其作用是單純的壓縮與解壓,不維護文件結構。多數用于基于流的數據傳送過程實現數據壓縮。用法就如Bufer Stream一樣,是stream之間的又一個過濾類,只是Buffer提供緩沖,而GZIP提供壓縮。
例如需要網絡傳送壓縮就可以這樣做:
客戶端:
Socket socket = new Socket(服務器地址字符串, 服務器端口);
BufferOutputStream out = new BufferOutPutStream(new GZIPOutputStream(socket.getOutputStream()));
然后就可以操作數據輸出了
服務器端:
ServerSocket sSocket = new ServerSocket(服務器端口);
Socket socket = sSocket.accept();
BufferInputStream in = new BufferInputStream(new GZIPInputStream(socket.getInputStream()));
然后就可以讀入數據了。
明顯網絡數據傳送就加了一個壓縮,性能就可以提高了。
摘要: 元字符
\w 匹配字母或數字或下劃線或漢字等。等效于Unicode字符類別 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果用ECMAScript選項指定了符合 ECMAScript的行為,則\w只等效于[a-zA-Z_0-9]。
\b 單詞的開頭或結尾,如果需要更精確的說法,\b匹配這樣的位置:它的前一個字符和后一個字符不全是\w
. 除換行符以外的所有字符
* 表示數量,任意數量,所以 .* 加起來就表示除換行符以外的任意數量字符,\w*表示任意字符
+ 是和*類似的元字符,不同的是*匹配重復任意次(可能是0次),而+則匹配重復1次或更多次。
\d 單個數字
\s 匹配任意的空白符,包括空格,制表符(Tab),換行符,中文全角空格等。
^ 匹配你要用來查找的字符串的開頭,$匹配結尾。和忽略大小寫的選項類似,有些正則表達式處理工具還有一個處理多行的選項。如果選中了這個選項,^和$的意義就變成了匹配 閱讀全文
Pattern類:
例子:
Pattern pattern = Pattern.compile("[,\\s]+");
String[] result = pattern.split("one two three,four,five, six");
for(int i = 0; i<result.length; i++){
System.out.println(result[i]);
}
輸出結果是:
one
two
three
four
five
six
Pattern類的靜態方法compile用來編譯正則表達式,在此[,\\s]+表示若干個","或者若干個空格匹配
split方法使用正則匹配將字符串切割成各子串并且返回
Matcher類:
注意,Matcher的獲得是通過Pattern.matcher(CharSequence charSequence);輸入必須是實現了CharSequence接口的類
常用方法:
matches()判斷整個輸入串是否匹配,整個匹配則返回true
例如下面會輸出true
String str1 = "hello";
Pattern pattern1 = Pattern.compile("hello");
Matcher matcher1 = pattern1.matcher(str1);
System.out.println(matcher1.matches());
lookingAt()從頭開始尋找,找到匹配則返回true
例如下面會輸出true
String str2 = "hello yangfan!";
Pattern pattern2 = Pattern.compile("hello");
Matcher matcher2 = pattern2.matcher(str2);
System.out.println(matcher2.lookingAt());
find()掃描輸入串,尋找下一個匹配子串,存在則返回true
例如下面將會將所有no替換成yes
Pattern pattern = Pattern.compile("no");
Matcher matcher = pattern.matcher("Does jianyue love yangfan? no;" +
"Does jianyue love yangfan? no;Does jianyue love yangfan? no;");
StringBuffer sb = new StringBuffer();
boolean find = matcher.find();
while(find){
matcher.appendReplacement(sb, "yes");
find = matcher.find();
}
matcher.appendTail(sb);
System.out.println(sb.toString());
初始化:
StringTokenizer st = new StringTokenizer(String str);
默認的分隔符,即空白符(空格、制表符、回車)
或者
StringTokenizer st = new StringTokenizer(String str, String token);
使用token作為分隔符
常用函數:
st.countTokens()返回token的數量
st.hasMOreTokens()判斷時候當前位置之后是否還有token
st.nextToken()返回當前位置到下一個token之前或者字符串結束之前的字符串
簡單示例:
String str = "wo shi li jian yue, what your name? yangfan?";
String[] stringArray = new String[100];
StringTokenizer st = new StringTokenizer(str, ",");
int i;
for(i = 0; st.hasMoreTokens(); i++){
stringArray[i] = st.nextToken();
}
for(int j = 0; j<i; j++){
System.out.println(stringArray[j]);
}
以","為分隔符,將會輸出","之前和之后的兩行字符串
創建 Filter(過濾器)
實際開發中都需要開發一些很有用的過濾器,來解決中文表單提交問題啊,給請求和響
應加入 GZIP壓縮功能啊,用戶權限控制啊,等等,然而遺憾的 MyEclipse不支持直接創建
過濾器。在這里只好手工創建一個解決 Tomcat表單提交中文問題的過濾器。
選擇菜單 File > New > Class,來創建一個名為 TomcatFormFilter 的類,包名為
filters。然后把類的代碼修改為如下所示:
package filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class TomcatFormFilter implements Filter {
/**
* Request.java
* 對 HttpServletRequestWrapper 進行擴充, 不影響原來的功能并能提供所
有的 HttpServletRequest
* 接口中的功能. 它可以統一的對 Tomcat 默認設置下的中文問題進行解決而只
需要用新的 Request 對象替換頁面中的
* request 對象即可.
*/
class Request extends HttpServletRequestWrapper
{
public Request(HttpServletRequest request) {
super(request);
}
/**
* 轉換由表單讀取的數據的內碼.
* 從 ISO 字符轉到 GBK.
*/
public String toChi(String input) {
try {
byte[] bytes = input.getBytes("ISO8859-1");
return new String(bytes, "GBK");
}
catch (Exception ex) {
}
return null;
}
/**
* Return the HttpServletRequest holded by this object.
*/
private HttpServletRequest getHttpServletRequest()
{
return (HttpServletRequest)super.getRequest();
}
/**
* 讀取參數 -- 修正了中文問題.
*/
public String getParameter(String name)
{
return
toChi(getHttpServletRequest().getParameter(name));
}
/**
* 讀取參數列表 - 修正了中文問題.
*/
public String[] getParameterValues(String name)
{
String values[] =
getHttpServletRequest().getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = toChi(values[i]);
}
}
return values;
}
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse
response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest)request;
if(httpreq.getMethod().equals("POST")) {
request.setCharacterEncoding("GBK");
} else {
request = new Request(httpreq);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws
ServletException {
}
}
清單 8.5 過濾器代碼
然后修改 web.xml 加入 Servlet 定義,修改后的代碼清單如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<description>
This is the description of my J2EE component
</description>
<display-name>
This is the display name of my J2EE component
</display-name>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlets.LoginServlet</servlet-class>
</servlet>
<filter>
<filter-name>TomcatFormFilter</filter-name>
<filter-class>filters.TomcatFormFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TomcatFormFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.aspx</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
清單 8.6加入了過濾器的 web.xml 內容
清單中的粗斜體部分就是新加入的過濾器的映射信息。
一.繼承關系和關聯聚集關系映射
1.整個類層次使用一張表
2.每個葉結點使用一張表,該表保存了該類自己的和所繼承的所有屬性
3.每個類使用一張表,該表只保存OID以及對應類自己的屬性(不含所繼承的屬性)
1.“1對1”或“1對多”關系的映射,簡單地利用外鍵即可
2.“多對多”關系的映射,引入一個新的表,專門記錄這種“多對多”關系
二.編程步驟:事前準備包括建立一個project并且加入外部庫
新建一個Project HibernateSample,然后在Project上點右鍵,選擇Properties ? Java Build Path ? Libraries。選擇Add External JARs,然后將Hibernate目錄下的hibernate3.jar,以及Hibernate目錄下的lib文件夾中所有的jar文件添加進來。
另外我們還必須有MySQL的JDBC驅動,用上面的辦法同樣把mysql-connector-java-3.1.12-bin.jar添加進我們的Build Path中。
1.創建數據庫(例如User表)
2.建立對應數據庫的類的屬性與操作(例如User類)
3.編寫映射數據庫表hibernate mapping,命名為***.hbm.xml(例如User.hbm.xml)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="sample.User" table="user">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="name" column="name" type="java.lang.String" />
<property name="age" column="age" type="java.lang.Integer" />
</class>
</hibernate-mapping>
明顯可見關注點包括
A)class中包中的類與數據庫中table的對應
B)property中 類中ID和屬性與table中字段的對應
4.編寫Hibernate配置文件hibernate configurarion file,通常命名:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 是否顯示實際操作數據庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- JDBC驅動程序 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/Sample</property>
<!-- 數據庫用戶名 -->
<property name="connection.username">root</property>
<!-- 數據庫密碼 -->
<property name="connection.password">123456</property>
<!-- 以下設置對象與數據庫表格映像文件 -->
<mapping resource="sample/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
關注點包括:
A)數據庫路徑, 數據庫用戶名, 數據庫密碼,
B)還有就是指定數據庫映射文件mapping resource
5.配置log4j.properties
在src目錄下點右鍵,選擇import,然后選擇General ? File System,接著選擇Hibernate文件夾下的etc文件夾,再選擇log4j.properties文件,最后選擇Finish。
關鍵配置文件:
hbm是映射配置
cfg是密碼,用戶,以及hbm指定配置
properties是用于配置當前數據庫連接的屬性配置
6.編程操作數據庫過程
使用對象增加數據項:
A)Configuration配置Configuration config = new Configuration().configure();
B)Session工廠獲得SessionFactory sessionFactory = config.buildSessionFactory();
C)Session獲得Session session = sessionFactory.openSession();
D)Transaction事務啟動Transaction tx = session.beginTransaction();
E)建立映射數據的實體類(例如User的一個實例)
F)session操作(例如session.save(user)插入到數據庫一個user的對象)
G)關鍵的Transaction事務提交,tx.commit();
H)清理包括Transaction對象,session對象,sessionFactory對象的有順序清理
使用Criteria查詢數據
A)配置Configuration,SessionFactory,Session與上面相同
B)創建Criteria criteria=session.createCriteria(User.class);
C)創建User列表List users = criteria.list();
D)使用迭代器Iterator iterator = users.iterator();
E)iterator.hasNext(),iterator.next()的使用
F)criteria.add(Expression.eq("name","hibernateUser2"));加上查詢約束
G)users = criteria.list();將會按照查詢約束得到列表.
使用鼓勵的HQL的Query查詢
A)創建Query例如Query query = session.createQuery("from User");
B)獲得數據List uers = query.list();
C)遍歷器使用Iterator iterator = users.iterator();又如iterator.hasNext();和iterator.next();
D)使用過濾查詢
query = session.createQuery("from User user where user.name like ?");
query.setParameter(0, "hibernateUser2");Query的setParameter()方法第一個參數是指定 ? 出現的位置,從 0 開始,第二個參數則是設定查詢條件。
然后再List uers = query.list();獲得的將是滿足username==hibernateUser2的條件的結果
E)清除session和sessionFactory使用close方法.
hibernate_rar
- validate: validate the project is correct and all necessary information is available
- compile: compile the source code of the project
- test: test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
- package: take the compiled code and package it in its distributable format, such as a JAR.
- integration-test: process and deploy the package if necessary into an environment where integration tests can be run
- verify: run any checks to verify the package is valid and meets quality criteria
- install: install the package into the local repository, for use as a dependency in other projects locally
- deploy: done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
There are two other Maven lifecycles of note beyond the default list above. They are
- clean: cleans up artifacts created by prior builds
- site: generates site documentation for this project
官網文章:http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
|