歡迎和你們交流技術相關問題:
郵箱: jiangxinnju@163.com
博客園地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnjujavascript
JDK(Java Development Kit)是一個寫Java程序所需的開發環境。它由一個處於操做系統層之上的運行環境,還有開發者編譯、調試和運行Java應用程序所需的工具組成。JDK是Sun Microsystems爲Java程序員提供的產品。目前JDK已經成爲使用最普遍的Java SDK(Software development kit)。 JDK包含的基本組件包括:css
JDK中還包括完整的JRE(Java Runtime Environment,Java運行環境),也被稱爲private runtime。包括了用於產品環境的各類庫類,以及給開發員使用的補充庫,如國際化的庫、IDL庫。 JDK中還包括各類例子程序,用以展現Java API中的各部分。html
安裝jdk之後,須要配置一下環境變量,在個人電腦->屬性->高級->環境變量->系統變量中添加如下環境變量(假定你的jdk安裝在c:\jdk1.6):html5
JAVA_HOME=c:\jdk1.6
JAVA_HOME指向的是JDK的安裝路徑,在這路徑下你應該可以找到bin、lib等目錄。JDK的安裝路徑能夠選擇任意磁盤目錄,不過建議你放的目錄層次淺一點。java
CLASSPATH=. ;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
注:.;必定不能少,由於它表明當前路徑。linux
在系統變量裏找到Path變量,這是系統自帶的,不用新建。你只需修改一下,使他指向JDK的bin目錄,這樣你在控制檯下面編譯、執行程序時就不須要再鍵入一大串路徑了。雙擊Path,在已有的變量後加上:git
;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
注:注意前面的分號。程序員
注:要以管理員身份運行cmd才能夠更改系統變量。github
Debian, Ubuntu等系統:在命令行中,鍵入:web
$sudo apt-get install openjdk-7-jre $sudo apt-get install openjdk-6-jre
須要注意的是,openjdk-?-jre包只包含Java運行時環境(Java Runtime Environment)。若是是要開發Java應用程序,則須要安裝openjdk-?-jdk包。命令以下:
$sudo apt-get install openjdk-7-jdk $sudo apt-get install openjdk-6-jdk
Fedora, OracleLinux, Red Hat Enterprise Linux等系統:在命令行中,鍵入:
$ su -c "yum install java-1.7.0-openjdk" $ su -c "yum install java-1.6.0-openjdk"
須要注意的是,java-1.?.0-openjdk包只包含Java運行時環境(Java Runtime Environment)。若是是要開發Java應用程序,則須要安裝java-1.?.0-openjdk-devel包。命令以下:
$ su -c "yum install java-1.7.0-openjdk-devel" $ su -c "yum install java-1.6.0-openjdk-devel"
貌似一個簡單的問題(也許還真是簡單的)可是卻把曾經自認爲弄清楚的我弄得莫名其妙 。char在Java中應該是16個字節 ,byte在Java中應該是8個字節 ,char x = '編'; //這樣是合法的,輸出也是16個字節 ,可是
String str = "編"; byte[] bytes = str.getBytes(); //我想不明白,爲何這裏要佔用3個byte呢?
3個byte一共是3*8=24個字節,那麼char x怎麼又放得下?我堅信char是16個字節, 可是str.getBytes()這個東西到底又怎麼回事?
首先,要搞清楚 code point 和 encoding 的區別。Java 是遵循 unicode 4.0 標準的,而內部的 character 以 utf-16 做爲 encoding。unicode 4.0 標準包含從 U+0000-U+FFFF 的基本多語言平面和 U+10000-U+10FFFF 的擴展平面的文字,這是 code point。Java 的 char 類型是 16 bit 的,因此單個 char 只支持基本平面內的文字,而擴展平面的文字是由一對 char 來表示的。 而 String.getBytes() 這個方法是按照指定的 encoding 返回字符串,通常中文系統的默認編碼是 utf-8 (linux, mac) 或者 gbk/gb18030 (windows)。只要是基本平面內的文字,utf-8碼的中文都是3字節的,而 gbk/gbk18030 是2字節的。
這是一道Java面試題:try { }裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後?(若是try後面有個catch塊,裏面有return語句,那麼finally語句會不會執行?)
finally語句塊的做用就是爲了保證不管出現什麼狀況,必定要執行的,那麼finally裏的code確定會執行,而且是在return前執行。(只要語句執行了,確定是在return前執行的。 finally中也能夠有return,而且會覆蓋其餘的return)
根據java規範:在try-catch-finally中,若是try-finally或者catch-finally中都有return,則兩個return語句都執行而且最終返回到調用者那裏的是finally中return的值;而若是finally中沒有return,則理所固然的返回的是try或者catch中return的值,可是finally中的代碼是必需要執行的,方法在return的時候並非把它所擁有的那個值給返回了,而是複製一份返回!所以,對於基本類型的數據,在finally中改變return的值對返回值沒有任何影響,而對於引用類型的數據,就有影響。
public class FinallyTest{ public static void main(String[] args) { System.out.println("x的值是"+new FinallyTest().test());; } @SuppressWarnings("finally") static int test() { int x = 1; try { //x++; return x; } finally { ++x; System.out.println("x的值當前值是" +x); //return x; } } }
執行結果:x的值當前值是2\nx的值是1
若finally中包含return語句
public class FinallyTest { public static void main(String[] args) { System.out.println("x的值是"+new FinallyTest().test());; } @SuppressWarnings("finally") static int test() { int x = 1; try { //x++; return x; } finally { ++x; System.out.println("x的值當前值是" +x); return x; } } }
執行結果是:x的值當前值是2\nx的值是2
若引用類型的數據,就有影響,
public class FinallyTest4 { public static void main(String[] args) { System.out.print("k的最終返回值是: "+tt()); } public static StringBuffer tt() { StringBuffer k = new StringBuffer(); try { k.append(2); return k; } catch(Exception e){ k.append(3); return k; } finally { k.append(5); } } }
執行結果是:的最終返回值是: 25
一、abstract是抽象的,指的是方法只有聲明而沒有實現,他的實現要放入聲明該類的子類中實現。
二、static是靜態的,是一種屬於類而不屬於對象的方法或者屬性,而咱們知道,類其實也是一個對象,他是在class文件加載到虛擬機之後就會產生的對象,一般來講它是單例的,就是整個虛擬機中只有一個這樣的類對象(固然,若是用新的類加載器也會生成新的類的對象)。
三、synchronized 是同步,是一種相對線程的鎖。
四、native 本地方法,這種方法和抽象方法及其相似,它也只有方法聲明,沒有方法實現,可是它與抽象方法不一樣的是,它把具體實現移交給了本地系統的函數庫,而沒有經過虛擬機,能夠說是java與其它語言通信的一種機制。
五、那麼咱們就來談談這些關鍵字爲何不能和abstract混用。
首先abstract與static,其實一看他們的做用和屬性就很容易辨別,abstract是沒有實現的,而static必定要有實現,由於 abstract的類不能生產對象,可是static是屬於類,而類已是一個存在的對象,這兩個關鍵字在這上面有一個關鍵的矛盾點。
synchronized 是同步,然而同步是須要有具體操做才能同步的,若是像abstract只有方法聲明,那同步一些什麼東西就會成爲一個問題了,固然抽象方法在被子類繼承之後,能夠添加同步。
native,這個東西自己就和abstract衝突,他們都是方法的聲明,只是一個吧方法實現移交給子類,另外一個是移交給本地操做系統。若是同時出現,就至關於即把實現移交給子類,又把實現移交給本地操做系統,那到底誰來實現具體方法呢!
Java經過面向對象的方法進行異常處理,把各類不一樣的異常進行分類,並提供了良好的接口。在Java中,每一個異常都是一個對象,它是Throwable類或其它子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法能夠捕獲到這個異常並進行處理。Java的異常處理是經過5個關鍵詞來實現的:try、catch、throw、throws和finally。通常狀況下是用try來執行一段程序,若是出現異常,系統會拋出(throws)一個異常,這時候你能夠經過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理。用try來指定一塊預防全部」異常」的程序。緊跟在try程序後面,應包含一個catch子句來指定你想要捕捉的」異常」的類型。
throw語句用來明確地拋出一個」異常」。throws用來標明一個成員函數可能拋出的各類」異常」。Finally爲確保一段代碼無論發生什麼」異常」都被執行一段代碼。
能夠在一個成員函數調用的外面寫一個try語句,在這個成員函數內部寫另外一個try語句保護其餘代碼。每當遇到一個try語句,」異常」的框架就放到堆棧上面,直到全部的try語句都完成。若是下一級的try語句沒有對某種」異常」進行處理,堆棧就會展開,直到遇到有處理這種」異常」的try語句。
/WEB-INF/web.xml: Web應用程序配置文件,描述了 servlet 和其餘的應用組件配置及命名規則。 /WEB-INF/classes/: 包含了站點全部用的 class 文件,包括 servlet class 和非servlet class,他們不能包含在 .jar文件中。 /WEB-INF/lib/: 存放web應用須要的各類JAR文件,放置僅在這個應用中要求使用的jar文件,如數據庫驅動jar文件。 /WEB-INF/src/: 源碼目錄,按照包名結構放置各個java文件。 /WEB-INF/database.properties: 數據庫配置文件 /WEB-INF/tags/: 存放了自定義標籤文件,該目錄並不必定爲 tags,能夠根據本身的喜愛和習慣爲本身的標籤文件庫命名,當使用自定義的標籤文件庫名稱時,在使用標籤文件時就必須聲明正確的標籤文件庫路徑。例如:當自定義標籤文件庫名稱爲 simpleTags 時,在使用 simpleTags 目錄下的標籤文件時,就必須在 jsp 文件頭聲明爲:<%@ taglibprefix="tags" tagdir="/WEB-INF /simpleTags" % >。 /WEB-INF/jsp/: jsp 1.2 如下版本的文件存放位置。改目錄沒有特定的聲明,一樣,能夠根據本身的喜愛與習慣來命名。此目錄主要存放的是 jsp 1.2 如下版本的文件,爲區分 jsp 2.0 文件,一般使用 jsp 命名,固然你也能夠命名爲 jspOldEdition 。 /WEB-INF/jsp2/: 與 jsp 文件目錄相比,該目錄下主要存放 Jsp 2.0 如下版本的文件,固然,它也是能夠任意命名的,一樣爲區別 Jsp 1.2如下版本的文件目錄,一般才命名爲 jsp2。 META-INF: 至關於一個信息包,目錄中的文件和目錄得到Java 2平臺的承認與解釋,用來配置應用程序、擴展程序、類加載器和服務 manifest.mf文件,在用jar打包時自動生成。
靜態初始化是指由程序員本身爲數組對象的每一個元素賦值,由系統自動計算出數組的長度,例如:
String[] a=new String[]{"Hello","World","Yes"};
動態初始化是指由程序員本身指定數組對象的長度,由系統先自動爲其賦值。程序中程序員能夠爲元素從新賦值,例如:
String [] b=new String[4]; for(int i=0;i<b.length;i++){ b[i]=i+"hello "; }
一般基本整數類型byte,short,int,long,初始值爲0;浮點型float,double,初始值爲0.0;boolean類型,初始值爲false;引用類型:類、String、數組等均爲null;
在使用數組的時候,咱們一般有兩個步驟:首先,聲明數組引用變量,即String[] a,此時的a並非一個數組對象,而只是一個至關於指針的變量;而後,當咱們執行new String[]{"Hello","World","Yes"}之後才真正建立了一個數組對象,此時變量a 才指向了堆內存裏面的數組對象。
近日,筆者在java編程中由於疏忽對String數組的初始化定義錯誤,致使程序運行出錯。現將所理解的String數組在此進行說明,並對String數組初始化進行分析。
//一維數組 String[] str = new String[5]; //建立一個長度爲5的String(字符串)型的一維數組 String[] str = new String[]{"","","","",""}; String[] str = {"","","","",""}; //二維數組 String[][] str = new String[2][2]; //建立一個2行2列的二維數組
String數組初始化區別
String[] str = {"1","2","3"}與String[] str = new String[]{"1","2","3"}在內存裏有什麼區別?
編譯執行結果沒有任何區別。更不可能像有些人想固然說的在棧上分配空間,Java的對象都是在堆上分配空間的。這裏的區別僅僅是代碼書寫上的:String[] str = {"1","2","3"}; 這種形式叫數組初始化式(Array Initializer),只能用在聲明同時賦值的狀況下。而 String[] str = new String[]{"1","2","3"} 是通常形式的賦值,=號的右邊叫數組字面量(Array Literal),數組字面量能夠用在任何須要一個數組的地方(類型兼容的狀況下)。如:
String[] str = {"1","2","3"}; // 正確的 String[] str = new String[]{"1","2","3"} // 也是正確的
而
String[] str; str = {"1","2","3"}; // 編譯錯誤
由於數組初始化式只能用於聲明同時賦值的狀況下。改成:
String[] str; str = new String[] {"1","2","3"}; // 正確了
又如:
void f(String[] str) { } f({"1","2","3"}); // 編譯錯誤
正確的應該是:
f(new String[] {"1","2","3"});
筆者所犯錯誤爲在初始化數組的時候定義爲String[] str = new String[]{},如此定義至關於建立了建立一個長度爲0的String型的一維數組。在後期爲其賦值的時候str[0]="A",就會拋出異常。
java中的String類是按照unicode進行編碼的,當使用String(byte[] bytes, String encoding)構造字符串時,encoding所指的是bytes中的數據是按照那種方式編碼的,而不是最後產生的String是什麼編碼方式,換句話說,是讓系統把bytes中的數據由encoding編碼方式轉換成unicode編碼。若是不指明,bytes的編碼方式將由jdk根據操做系統決定。
當咱們從文件中讀數據時,最好使用InputStream方式,而後採用String(byte[] bytes, String encoding)指明文件的編碼方式。不要使用Reader方式,由於Reader方式會自動根據jdk指明的編碼方式把文件內容轉換成unicode編碼。
當咱們從數據庫中讀文本數據時,採用ResultSet.getBytes()方法取得字節數組,一樣採用帶編碼方式的字符串構造方法便可。
ResultSet rs; bytep[] bytes = rs.getBytes(); String str = new String(bytes, "gb2312");
不要採起下面的步驟:
ResultSet rs; String str = rs.getString(); str = new String(str.getBytes("iso8859-1"), "gb2312");
這種編碼轉換方式效率底。之因此這麼作的緣由是,ResultSet在getString()方法執行時,默認數據庫裏的數據編碼方式爲iso8859-1。系統會把數據依照iso8859-1的編碼方式轉換成unicode。使用str.getBytes("iso8859-1")把數據還原,而後利用new String(bytes, "gb2312")把數據從gb2312轉換成unicode,中間多了好多步驟。
從HttpRequest中讀參數時,利用reqeust.setCharacterEncoding()方法設置編碼方式,讀出的內容就是正確的了。
【Selenium】 -> 【FireFox】 2.25.0 -> 18 2.30.0 -> 19 2.31.0 -> 20 2.42.2 -> 29 2.44.0 -> 33 (不支持31,2014/12/1)
PS:可是selenium-java-2.42.2版本和firefox 29.0.1版本兼容,若是升級到firefox 30+,則瀏覽器啓動失敗。多是selenium還未同步升級,後面估計能夠正常支持。切記,關掉forefox的升級功能,不然連本地Windows上的腳本都跑不起來,做者曾經爲此還降級了forefox。
升級後,selenium腳本正常啓動firefox。
Started InternetExplorerDriver server (64-bit) 2.25.2.0 Listening on port 40961Exception in thread "main" org.openqa.selenium.WebDriverException: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones. (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 1.18 seconds Build info: version: '2.25.0', revision: '17482', time: '2012-07-18 22:18:01'System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_29'Driver info: driver.version: InternetExplorerDriver Session ID: 01e30b64-e403-440c-bed8-4859ef2128f9 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:188) at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:498) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:182) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:167) at org.openqa.selenium.ie.InternetExplorerDriver.startSession(InternetExplorerDriver.java:133) at org.openqa.selenium.ie.InternetExplorerDriver.setup(InternetExplorerDriver.java:106) at org.openqa.selenium.ie.InternetExplorerDriver.(InternetExplorerDriver.java:52) at com.selenium.test.TempGoogle.main(TempGoogle.java:15)
若是遇到上面的問題
解決方法有兩種:
1.是修改掉IE的設置,不要在任何狀況下使用保護模式(protected mode)
2.另外一種便是前面代碼中以下片斷在運行時設置IE的Capabilities。
DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
ieCapabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
WebDriver oWebDriver = new InternetExplorerDriver(ieCapabilities);
<black>使文字呈現閃爍效果 不斷行的空白格,是英文的一個空格   半方大的空白,至關於半個中文字的位置   全方大的空白,至關於一箇中文字的位置
JavaScript利用對象的能力比VBScript強,可使用JavaScript定義類,是Object-Based的腳本語言。雖然它貌似Java,但語法上和C類似,是一種獨立的語言。
當您在Web頁中插入層時,Dreamweaver將這些層的HTML標籤插入到您的代碼中。您能夠爲您的層設置四種不一樣的標籤:div,span,layer和ilayer。其中div和span是最多見的標籤,推薦您使用,這樣纔能有最普遍的受衆能夠看到您的層。Internet Explorer 4.0和Netscape Navigator 4.0都支持使用div和span標籤建立的層。只有Navigator 4.0版本支持使用layer和ilayer建立的層(Netscape在其後續版本瀏覽器中中止了對這兩種標籤的支持)。這些瀏覽器的早期版本均可以顯示層的內容,但不能顯示其位置。
默認狀況下,Dreamweaver使用div標籤建立層,並在插入點或頁面頂部body標籤後面放置層代碼。若是您建立嵌套層,Dreamweaver將把代碼插入到您定義的父層標籤中。若要改變默認標籤,請參看設置層參數。
下面是一個單個的層的HTML代碼示例(在Dreamweaver中的狀況):
<div id="Layer1" style="position:absolute; visibility:inherit; width:200px; height:115px; z-index:1"> </div>
下面是一個嵌套層的HTML代碼示例(在Dreamweaver中的狀況):
<div id="Parent" style="position:absolute; left:56px; top:54px; width:124px; height:158px; z-index:1;"> Content inside the parent layer. <div id="Nested" style="position:absolute; left:97px; top:114px; width:54px; height:69px; z-index:1;"> Content inside the nested layer. </div> </div>
您能夠設置層在頁面上的位置屬性。這些屬性包括左邊和頂部(分別對應x和y座標),Z軸(也稱爲堆疊順序),和可見性。如須要更多信息,請參看設置層屬性。
在咱們瀏覽網站的時候,必定都遇到過頁面上帶紅叉的無效圖片或者「沒法找到網頁」的提示,出現如此現象通常都是由於連接文件的位置發生變化、被誤刪除或者文件名的拼寫錯誤形成的。 爲了不出現無效連接的尷尬,樹立良好的網站形象,當咱們完成一個網站的設計製做後,必定要認真地檢查是否存在失效連接,以便及時修改。將無效連接扼殺在上傳前。
爲了預防網站上傳後出現無效連接,在上傳前咱們可使用FrontPage的超連接報表功能來檢查整個網站的連接狀況,若是遇到無效連接還能夠及時編輯修復。首先咱們要把須要檢查連接的站點設置爲FrontPage的網站,運行FrontPage,選擇「文件→新建→由一個網頁組成的網站」進入「網站模板」窗口,單擊「瀏覽」指定到你的站點目錄,「肯定」後便可打開整個網站。執行「視圖→報表→問題→超連接」,彈出對話框詢問是否驗證網站中的超連接,單擊「是」驗證全部超連接,包括指向站內網頁的內部連接和指向外部網站的外部連接,稍等一下子FrontPage就會將驗證結果顯示出來。驗證結果包括連接所在的網頁、網頁標題、連接目標和類型等。對於無效連接,FrontPage會在「狀態」欄下標註「中斷」,選中並雙擊一個「中斷」的無效超連接,在彈出的超連接編輯窗口中就能夠對錯誤的超連接進行修復了。咱們能夠直接鍵入正確的連接地址或在「瀏覽」中選擇指定到正確的文件,若是在其餘網頁中也有這個相同的錯誤連接,咱們能夠勾選「對全部網頁進行更改」,而後點擊「替換」按鈕便可修復網站中全部包含這個無效連接的網頁了。
網站上傳運行後,若是網站中引用了大量的外來網站內容的連接,而咱們又沒法控制外來內容連接的有效性,咱們只有常常對網站測試其連接的可靠性,以免無效連接的出現。若要繼續使用FrontPage對網站無效連接進行檢查,還須要將網站所有下載到本地,這樣會顯得很麻煩,這裏咱們推薦使用一個小工具Xenu Link Sleuth來對網站進行在線檢查。打開軟件,執行「File→Check URL」打開一個對話窗口,輸入你要檢查的網站地址,「OK」後軟件就會自動訪問網站並驗證每一個連接地址,驗證結束後就會將結果顯示在驗證列表中,對於無效的連接,軟件會以紅色字體加以區別。在失效連接的右鍵菜單中選擇「Properties」,而後在「Properties」窗口中的「Pages linking to」下能夠查看到哪些網頁使用了這個無效連接,對這些網頁單獨下載加以修復就能夠了。
提示:驗證結束後,軟件還能夠生成一份詳細的無效連接報告,包括無效連接頁面以及使用無效連接的頁面等以供修復時查閱。
<link rel="shortcut icon" href="favicon.ico" />
顯示不了圖標,ie顯示不了小圖片,但Firefox能顯示出來請教各位,怎麼能讓IE最好是IE7也能顯示出來?謝謝了
解決方法:
一、<link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
二、IE要7以上版本才支持,低於7的,除非用Maxhon之類的殼才能出現該圖標。
三、這種問題應該是安裝了別的瀏覽器引發的,好比:我就安裝了Firefox.打開註冊表找到以下內容:[HKEY_LOCAL_MACHINE\SOFTWARE\Classes.htm]下的默認值改成htmlfile(好比:我是由FirefoxHTML改成htmlfile.),問題解決.^_^。最好事先把這個鍵值導出備份一下。
直接查看代碼或者使用瀏覽器debug
個人工程目錄
/WebRoot/manage/css
/WebRoot/manage/js
/WebRoot/manage/images
/WebRoot/manage/mian.jsp
我以前在 mian.jsp 裏引用方式是這樣的,但發佈的時候找不到樣式:
<link rel="stylesheet" href="css/mian.css" type="text/css" /> <script language="javascript" src="js/main.js"> </script>
解決方案:
<link rel="stylesheet" href="<%=request.getContextPath()%>/manage/css/mian.css" type="text/css" /> <script language="javascript" src="<%=request.getContextPath()%>/manage/js/main.js"> </script>
<%=request.getConetxtPath%>
這句話的意思就是引入你當前的項目的名字 輸出出來是「/當前項目的名字」
各位大哥小弟用dtd文件限制XML總報這個錯誤,是什麼意思啊,個人XML確定沒錯,由於不用DTD能夠運行
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pets[ <!ELEMENT pets(dogs,penguins)> <!ELEMENT dogs(dog*)> <!ELEMENT penguins(penguin+)> <!ELEMENT dog (name,health,love,strain?)> <!ATTLIST dog id CDATA #REQUIRED> <!ELEMENT penguin(name,health,love,sex)> <!ATTLIST penguin id CDATA #REQUIRED> <!ELEMENT name(#PCDATA)> <!ELEMENT health(#PCDATA)> <!ELEMENT love(#PCDATA)> <!ELEMENT strain(#PCDATA)> <!ELEMENT sex(#PCDATA)> ]>
你這個事內部的dtd文件,要放在XML文件中,若是要作成外部dtd,那麼要把你的<!DOCTYPE pets[ ]> 去掉。
修改servlet須要重啓tomcat,修改jsp不須要
@WebFilter
註解怎麼指定Filter的順序?在Servlet3.0當中關於@WebFilter
並無提供順序的參數。
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
public class SingleTon { private static SingleTon singleTon = null; public SingleTon() { // TODO Auto-generated constructor stub } public static SingleTon getInstance(){ if (singleTon == null) { synchronized (SingleTon.class) { if (singleTon == null) { singleTon = new SingleTon(); } } } return singleTon; } }
爲什麼要使用雙重檢查鎖定呢?考慮這樣一種狀況,就是有兩個線程同時到達,即同時調用 getInstance() 方法,此時因爲 singleTon == null ,因此很明顯,兩個線程均可以經過第一重的 singleTon == null ,進入第一重 if 語句後,因爲存在鎖機制,因此會有一個線程進入 lock 語句並進入第二重 singleTon == null ,而另外的一個線程則會在 lock 語句的外面等待。而當第一個線程執行完 new SingleTon()語句後,便會退出鎖定區域,此時,第二個線程即可以進入 lock 語句塊,此時,若是沒有第二重 singleTon == null 的話,那麼第二個線程仍是能夠調用 new SingleTon ()語句,這樣第二個線程也會建立一個 SingleTon實例,這樣也仍是違背了單例模式的初衷的,因此這裏必需要使用雙重檢查鎖定。細心的朋友必定會發現,若是我去掉第一重 singleton == null ,程序仍是能夠在多線程下無缺的運行的,考慮在沒有第一重 singleton == null 的狀況下,當有兩個線程同時到達,此時,因爲 lock 機制的存在,第一個線程會進入 lock 語句塊,而且能夠順利執行 new SingleTon(),當第一個線程退出 lock 語句塊時, singleTon 這個靜態變量已不爲 null 了,因此當第二個線程進入 lock 時,仍是會被第二重 singleton == null 擋在外面,而沒法執行 new Singleton(),因此在沒有第一重 singleton == null 的狀況下,也是能夠實現單例模式的?那麼爲何須要第一重 singleton == null 呢?這裏就涉及一個性能問題了,由於對於單例模式的話,new SingleTon()只須要執行一次就 OK 了,而若是沒有第一重 singleTon == null 的話,每一次有線程進入 getInstance()時,均會執行鎖定操做來實現線程同步,這是很是耗費性能的,而若是我加上第一重 singleTon == null 的話,那麼就只有在第一次,也就是 singleTton ==null 成立時的狀況下執行一次鎖定以實現線程同步,而之後的話,便只要直接返回 Singleton 實例就 OK 了而根本無需再進入 lock 語句塊了,這樣就能夠解決由線程同步帶來的性能問題了。若是將方法使用synchronize進行修飾,雖然也能夠解決問題,可是會致使性能的降低。
public class SingleTon { private static SingleTon singleTon = null; public SingleTon() { // TODO Auto-generated constructor stub } public static synchronized SingleTon getInstance(){ if (singleTon == null) { singleTon = new SingleTon(); } return singleTon; } }
Class類是爲了保存JAVA虛擬機運行時(RTTI)對全部對象進行類型識別的信息而設立的。固然Class也是繼承自Object類的,每一個類都有Class對象,想獲得一個類的Class對象共有三種方法.
//調用getClass() Employee emp; Class cls=emp.getClass(); //靜態方法forName(String clsName) String className="Employee"; Class cls=Class.forName(className); //class成員變量法 Class cls=Employee.class;
.myeclipse目錄整體是安裝了myeclipse插件的目錄,並且這個大的myeclipse插件實際是由不少小的插件組成的,好比tomacat插件,spring插件等等。
.classpath文件是用來描述程序模塊編譯的類路徑的。 .myhibernatedata文件裏寫了一些資源文件的信息。 .myhibernatedata中是hibernate依賴目錄描述。 .mystrutsdata描述struts的數據信息。 .project存儲項目的一些基本配置信息的。 .springBeans是存儲Spring工具的配置信息的,路徑不對,工具備可能不能用的。
新建WebRoot文件夾,而後在項目工程目錄下找到.mymetadata文件,裏面的
<attributes> <attribute name="<SPAN class=hilite1>webrootdir</SPAN>" value="WebRoot" /> </attributes>
這句話應該是來設置項目的根目錄的
異常信息:
created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@12c74b9]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@1a34544]) but failed to remove it.
緣由大概是說tomcat 6.025以後引入了一種內存泄露的檢查機制,會把不能垃圾收集的對像作日誌。第一種解決辦法:使用低於6版本的tomcat。第二種解決辦法:在tomcat的server.xml文件(在tomcat的安裝路徑下的conf文件夾裏)中把監聽關掉:就是把下面三句話括起來就能夠啦。
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
最新版本的chrome(45.0.2454.85 m)在訪問證書時,會報「服務器的瞬時 Diffie-Hellman 公共密鑰過弱」。最開始覺得是證書製做的問題,百度時看到一個解決方法是經過設置tomcat的機密級別:在
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
但在本機測試能夠,線上環境卻會報:"unsupported cipher suite XXX"。通過測試發現,JDK1.6和JDK1.7支持的加密算法是不同的,測試升級JDK,問題解決。
補充:tomcat最好也換也tomcat7