1. 程式人生 > >Java for Web學習筆記(一):Java EE的介紹

Java for Web學習筆記(一):Java EE的介紹

  最近有個專案,當中涉及到Java Servlet,專案已經進行了一段日子,最近因為有重大需求調整,需要對架構重新進行梳理,一看,基本上哭笑不得,有不少地方真是黑色幽默,怎麼會這樣呢。

  當在這過程中,也引發了我興趣,畢竟之前沒有系統地瞭解過。在網上找到了一本書professional Java for Web Applications,是2014年的,算蠻新的。所以開始了這一系列。但是這本書也相當地厚,正文有938頁,希望能夠完成。

  Java SE或者J2SE,Java EE或者J2EE都是同一樣東西不同的叫法,只是我們更常用的J2EE其實已經被新的Java EE替代(不知道為什麼,但J2EE只需敲4個字母,更短

)。Java SE 8等同與J2SE 1.8。Java EE的內容有時會融入到Java SE中,例如處理XML的JAXP原來在Java EE中,後來作為不可缺放入到SE中。

  今年釋出了兩個新的J2SE版本,7和8。進入了新一些變化。

Java SE 7的一些變化

  1、簡化物件定義的型別描述:

   //原書寫
    Map<String, Map<String, Map<Integer, List<MyBean>>>> map = new Hashtable<String, Map<String, Map<Integer, List<MyBean>>>>(); 
   // Java SE 7可以書寫為:
    Map<String, Map<String, Map<Integer, List<MyBean>>>> map = new Hashtable<>(); 

  2、引入自動關閉介面,如果類實現了java.lang.AutoCloseable,通過try(xxxx){}catch(yyy){},對於xxxx中的物件,隱含了finally{ x.close()}的處理。這樣在書寫上方便了很多,例如讀寫,下面是資料庫查詢的例子,在1.7之前,我們需為了確保close需要這麼寫:

Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try{
    connection = dataSource.getConnection();
    statement = connection.prepareStatement(...);
    // set up statement
    resultSet = statement.executeQuery();
    // do something with result set
}catch(SQLException e){
    // do something with exception
}finally{
    if(resultSet != null) {
        try {
            resultSet.close();
        } catch(SQLException ignore) { }
    }
    if(statement != null) {
        try {
            statement.close();
        } catch(SQLException ignore) { }
    }
    if(connection != null && !connection.isClosed()) {
        try {
            connection.close();
        } catch(SQLException ignore) { }
    }
}

  在Java SE 7的版本就可以寫為下面的方式,處理程式碼上簡潔外,也避免我們忘卻close()的問題。

try(Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(...)){
    // set up statement
    try(ResultSet resultSet = statement.executeQuery()) {
        // do something with result set
    }
}catch(SQLException e){
    // do something with exception
}

  3、在cathe中支援同時捕獲多個異常,例如:

try{
    // do something
}catch(MyException | YourException e){ //當然這兩個異常不能是繼承關係
    // handle these exceptions the same way
}

  4、更便捷的位操作,下面幾個數字是等同的

  1928,0b11110001000,1_928,0b111_1000_1000

  5、可以在switch中使用使用String了。

Java SE8的變化

  在時間方面增加了JSR310。

  支援lambda表示式,長用於匿名實現中。

  常規方式如下:

public String doSomethingInThread(String someArgument){
    ...
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run(){
            // do something
        }
    });
    ...
}

  lambda表達方式:

public String doSomethingInThread(String someArgument){
    ...
    Thread thread = new Thread(() -> {
        // do something
    });
    ...
}

  方法參考方式(method reference)

public String doSomethingInThread(String someArgument){
    ...
    Thread thread = new Thread(this::doSomething);
    ...
}
public void doSomething(){
    // do something
}

目錄結構

  在Java EE標準中支援WAR(Web Application Archive)和EAR(Enterprise Archive)兩種結果,當然還有不帶包的方式。這兩種結構的目錄如下圖所示:

  在WAR中,WEB-INF/tags和WEB-INF/tld目錄用來存放JSP tag檔案和tag lib描述符。i18n不是Java EE標準,但是作為管理用於存放國際(i18n)和本地(L10n)檔案。

其它

  接下來還介紹了ClassLoader,但在實際中我們很少會去改動它,略過。