1. 程式人生 > >j2EE課程總結(Java課程學習總結)

j2EE課程總結(Java課程學習總結)

摘要:Java課程學習總結

java

是程式語言,執行環境,開發平臺

硬體-》作業系統-》虛擬機器-》位元組碼程式

java-》位元組碼-》類載入器-》位元組碼校驗器-》直譯器、優化器、JIT-》硬體

靜態變數為類所有,靜態方法也只能訪問靜態變數

繼承

單一繼承

特點:具有層次結構,繼承父類的屬性方法

優點:程式碼可重用性,父類屬性和方法可用於子類,設計應用程式更加簡單,輕鬆自定義子類

先呼叫父類建構函式(super(引數列表)),再呼叫子類建構函式

多型:使用不同的例項而執行不同的操作,包括方法重寫 (相同名稱相同型別)和方法過載

訪問修飾符:public該類和非該類均可訪問;private:只有該類可以訪問;protected:該類和子類成員可以訪問,同一個包中的類可以訪問;預設:相同資料包中的類可以訪問

方法修飾符:static,final,abstract;static靜態方法,可以呼叫其他靜態方法,必須訪問靜阿提資料,不能使用super或this關鍵字

final:不能修改的變數,子類不能重寫方法

abstract:抽象方法,必須宣告在抽象類中 abstract class{  abstract type method_name(paramter_list);   }

介面:介面中的方法只能被宣告不能是具體的實現。一個類可以實現多個介面,可以實現多型

容器類

Array隨機訪問高效率,容量無法修改,元素的型別識別,可持有primitives

vector具有類似陣列的資料結構,而且是動態的,可以存放一定數量的元素,容量可以遞增

collection框架:將多個元素組成一個單元的物件,用於儲存檢索和操縱資料

ArrayList物件是長度可變的物件引用陣列,繼承AbstractList並實現List介面

LinkedList建立連結串列資料結構,繼承AbstractSequentialList並實現List介面

HashMap實現了Map介面,用來儲存鍵值對映關係

Iterator for(Iterator it=c.iterator;it.hasNext();){}

web應用程式:表示層,業務層,資料層

http協議:請求資訊:方法、請求資源名稱、請求資源型別、瀏覽器資訊、版本

               響應資訊:資源名稱、伺服器資訊、狀態碼、資源型別、資源大小、說明、修改日期

servlet:基於java的web元件,用來擴充套件以請求/響應為模型的伺服器的能力提供動態內容

servlet容器:web伺服器的一部分,管理和維護整個servlet的生命週期,支援http協議負責處理客戶請求、把請求轉發給適當的servlet並把結果返回給客戶

servlet優勢:servlet是標準的java程式,可以訪問大量java api;servlet具有平臺無關性;servelt使用標準api,被更多的伺服器支援;servlet速度比cgi速度更快

servlet工作原理:客戶端向伺服器發出請求,伺服器建立執行緒,對執行緒進行處理,與資料庫進行互動,最後生成響應給客戶端,每個請求由一個輕量級的java執行緒進行處理,不用為每一個請求啟動一個系統執行緒,一個servlet在請求期間會駐留在記憶體中。,響應所有的併發只需要一個例項。

servlet程式設計介面:

在實現servlet時必須實現它的五個方法

 public void init(ServletConfig config)throws ServletException容器例項化後就呼叫此方法,從ServletConfig物件中讀取與容器相關的配置資料並儲存起來供以後使用。對任何servlet例項此方法只能被呼叫一次

public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException 成功初始化後此方法用來被處理使用者請求

public void destory()容器可以在任何時候終止servlet服務,容器在呼叫此方法前必須給service()執行緒足夠時間來結束執行,service正在執行時destory不能被執行

public ServletConfig getServletConfig()servlet 初始化時容器傳遞進來一個ServletConfig物件並儲存在Servlet例項中

public string getServletInfo(){}返回一個string物件,包括建立者資訊,日期,描述資訊等。

HTTPservlet類:service()方法作為http請求的分發器,任何時候都不能被過載,當請求到來時service方法決定請求的型別get,post,head,options,delete,put,trace並把請求分發給響應的處理方法

doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace()為了響應特定的http請求必須過載形影的do方法。

servlet執行過程:載入和例項化(例項化該類的一個例項)、初始化(傳遞唯一一個ServletConfig物件完成這個過程,目的是讀取永久配置資訊,昂貴資源及僅需執行一次的任務)、處理請求(HttpServletRequest和HttpServletResponse)、服務結束

servlet部署:

<servlet>  
     <servlet-name>login</servlet-name>  
     <servlet-class>com.test.login</servlet-class>  
     <init-param>  
          <param-name>visitno</param-name>  
          <param-value>50</param-value>  
      </init-param>  
</servlet>  
<servlet-mapping>  
     <servlet-name>login</servlet-name>  
     <url-pattern>/userlogin</url-pattern>  
</servlet-mapping>

servlet context

java.servlet.ServletContext介面定義了一系列的方法用於與相應的servlet容器通訊,每個jvm中的每一個web-app只能有一個ServletContext,servlet例項中的getServletContext方法用來得到該servlet執行其中的這個環境物件。獲取初始化引數ServletContext.getInitParameter(String name);把物件通過名稱繫結到環境中,context.setAttribute(String name, Object object); 其他servlet通過context.getAttribute(String name)得到一個環境中的物件,通過context.removeAttribute(String name)在環境中移除一個物件;訪問資源getResoucePaths() and getResource()可訪問資源,getResourcePaths(java.lang.String path )返回一個儲存web-app所以資源路徑的集合

會話:伺服器支援http協議,無狀態,採用散列表結構儲存,伺服器端維護

工作方式:收到一個請求,檢測請求中是否包含session_id,如果是的話檢索session_id獲取會話物件然後傳送攜帶session_id的響應

會話追蹤機制:cookies,SSL Sessions,URL重寫,表單隱藏

cookie:引擎把使用者會話儲存在cookie中,傳送cookie到客戶端,客戶端以後在每次請求中把cookie返回給伺服器

jsp與javabean

jsp-》轉譯(從jsp元素中提取資料)-》編譯(為jsp生成一個servlet)-》servlet

jsp優點:內容與表示分離;強調可重用元件;

註釋的兩種風格:<!–  –>在原始碼中可以檢視到    <%–  –>隱藏註釋

宣告:<%! int a,b,c; %>

表示式:<%=表示式%>在頁面上輸出資訊或進行賦值操作

page指令:<%@page language=”java” import=”java.util.*,java.lang.*”  autoFlush=”true”  errorPage=”error.jsp”  %> 不能包含動態的檔名

taglib: <%@taglib prefix=”" uri=”" %> 用於引入定製標籤庫

<jsp:forward>標籤<jsp:forward page=”forwadTo.jsp”><jsp:param name=”username” value=”wangweiwei” /></jsp:forward> 其中page和value的值可以是表示式

<jsp:include>標籤<jsp:include  page=”header.jsp” flush=”true” ><jsp:param name=”username” value=”wangweiwei”/></jsp:include> 其中page和value的值可以是表達 , 在包含的頁面運用request.getParameter(“username”)取得原始頁面的jspparam中定義的值

<jsp:useBean>標籤,建立一個bean的例項並指明它的名字和範圍 <jsp:useBean id=”beanInstanceName” scope=”page|request|session|application”  class=”package.class”/>

page:包含此標籤的jsp頁面和此檔案中的所有靜態包含檔案,直到頁面執行完畢向客戶端發出響應或跳轉到另外一個檔案為止

request:執行相同請求的jsp檔案中使用這個bean,能夠使用request物件訪問這個bean

session:使用相同session的jsp檔案中使用這個bean

application:存在整個application生命週期內

<jsp:getProperty>標籤,<jsp:getproperty name=”beanInstanceName” property=”propertyName” /> name是bean的名字,由<jsp:usebean>中的id指定;property是所指定的bean的屬性名。

<jsp:setProperty>標籤<jsp:setproperty name=”beanInstanceName” property=”propertyName” value=“” />

內建物件:request,session,application,構建的基礎是http協議,由特定的java類生成,在伺服器執行中自動生成

request.setParameter(“name”,value);

request.getParameter(“name”);

session.putValue(“name”,value);

session.getValue(“name”);

application.setAttribute(“name”,value);

application.getAttribute(“name”);

jsp漢字問題的原理:客戶端與服務端用gb2312,http傳輸編碼用ISO8859_1.

jsp<%@ page contentType=”text/html;charset=gb2312″%>

server:name=new string(name.getBytes(“ISO8859_1″),”gb2312″);

Fileter,在request到達servlet之前處理request,在離開servlet時處理response,可以解決編碼和控制權限

public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){   
     try{   
     request.setCharacterEncoding(“GBK”);   
     response.setContentType(“text/html,charset=gb2312″);   
     response.setCharacterEncoding(“GBK”);   
     chain.doFilter(request,response);   
}catech(Exception e){   
     e.printStackTrace();   
}   
}

web.xml  filter setting
<filter>  
     <filter-name>M</filter-name>  
     <filter-class>util.setresponseEncodingFilter</filter-class>  
</filter>  
<filter-mapping>  
     <filter-name>M</filter-name>  
     <url-pattern>/*</url-pattern>  
</filter-mapping>

JDBC

jdbc訪問資料庫的步驟:匯入java.sql包,載入並註冊驅動程式,建立一個Connection物件,建立一個Statement物件,執行語句,使用ResultSet物件,關閉ResultSet物件,關閉Statement物件,關閉連線,結束

public void test(){   
     try{   
            Class.forName(“com.mysql.jdbc.Driver”);   
     }catch(ClassNotFoundException e){   
     sysout(e);   
}   
try{   
     Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,“username”,“password”);   
     Statement s=conn.createStatement();   
     ResultSet rs=s.executeQuery(“select * from user”);   
//插入操作   
 //    int rowcount=s.executeUpdate(“insert into user()values()”);   
  
     while(rs.next()){   
     sysout(rs.getString(1));   
     sysout(rs.getInt(2));   
}   
rs.close();   
s.close();   
conn.close();   
  
}catch(SQLException e){   
}   
}   
  
  
public void test(){   
     try{   
            Class.forName(“com.mysql.jdbc.Driver”);   
     }catch(ClassNotFoundException e){   
     sysout(e);   
}   
try{   
     Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,“username”,“password”);   
     PreparedStatement pstmt=conn.prepareStatement(“update user set username=? where id=?”);   
     pstmt.setString(1,“wangweiwei”);   
     pstmt.setInt(2,10);   
     ResultSet rs=pstmt.executeUpdate();   
  
}   
rs.close();   
pstmt.close();   
conn.close();   
  
}catch(SQLException e){   
}   
}

struts2

基於j2ee的mvc框架,採用servlet和jsp來實現,把servlet,jsp,自定義標籤和資訊資源整合到一個統一的框架中

j2ee反模式

不妥的實踐和做法,避免常犯的錯誤,找到修復錯誤的方法

1不友好的出錯介面:定義一個或多個錯誤頁面,顯示友好的錯誤資訊。

2濫用程式碼,jsp中包含大量的指令碼java程式碼,尋找錯誤比較困難,維護成本大,不利於重用,新成員的學習成本高:bean化,引入委託控制器,引入業務流警察

3嵌入跳轉控制:連結無效,jsp頁面硬編碼導航資訊,引入邏輯控制,修改時設計頁面數量多,工作量大,常常出現未找到頁面的錯誤,很難修改應用流程;引入業務流警察

4複製貼上jsp:程式碼需要改變時修改量大,維護困難,維護不及時會影響使用者體驗;引入模板

5session中資料量太大:多個數據可能對應同一個key,併發數過高時伺服器效能下降,維護困難;bean化,引入委託控制器,引入業務流警察

6每個servlet包含公共部分:除了實現自己的業務外還要處理許可權認證,編碼格式,惡意程式碼檢測等功能,造成了維護問題和不一致的使用者體驗。重構方案就是引入過濾器

7字串用於內容生成:在doGet中和doPost中用列印語句,把大量html程式碼直接在servlet中列印,無法除錯,維護困難,html易出現結構錯誤。重構方案就是使用jsp和JDom,將靜態的和動態的進行分離便於維護。

8誤解資料需求:大資料,不好的資料,重構方案:劃分資料和工作,為將來擴充套件做出規劃,選擇適當的資料體系結構

9誤解頻寬需求:網路減速,低事務速率,實際傳送訊息比測試要大得多,併發數也比測試大很多,規劃實際的網路需求,為將來擴充套件做出規劃,選擇適當的資料結構

10挖掘機:深度查詢,採用會話外觀或DTOFactory外觀的形式,建立複雜的實體bean例項體系來支援應用,且物件層次很深。資源耗盡,效能下降,硬體花銷增加,使用者失去信心。重構方案是採用輕量級查詢方案,值列表處理器,值物件組裝器。

11輾壓:失去時效的主控,時而發生的資料丟失,無法在程式碼層保證邏輯事務的原子性、一致性、獨立性和永續性。重構方案:版本

12窒息:瓶頸,資料庫效能差,使用者不滿意,解決方法:資料庫連線池,批更新,深夜批處理更新,重構方案:打包處理

重構方案

1bean化:建立一個javabean儲存jsp資料,設定要讀取和寫入的屬性並建立愛你getter和setter方法,在jsp中使用<jsp:usebean>設定適當的會話範圍

2引入業務流警察:不要把導航資訊放在jsp中,維護比較困難,將網站對映放在一箇中心控制點維護會容易的多;步驟a建立一個頁面跳轉關係圖b建立一個servlet充當業務流警察c給每個頁面之間的跳轉起一個別名d在servlet中使用別名控制跳轉e將jsp中的導航資訊刪除f配置servlet匹配規則

3引入委託控制器:業務流警察過多的跳轉控制業務邏輯會導致該servlet很難維護,將一些跳轉業務邏輯分離出去在單獨的servlet中實現就會簡化a建立跳轉關係圖b建立一個servlet充當業務流警察c給每個頁面之間的跳轉起個別名d將跳轉規則分組,給每個組取個名字e對應每個組編寫一個servlet根據別名跳轉f在servlet中使用組名將控制傳遞給前面編寫的servletf將jsp中的導航資訊刪除g在web.xml中配置servlet的匹配規則

4引入模板:相同頁面部分力求一致

5引入錯誤頁面:建立一個jsp作為錯誤的顯示頁面,在每個jsp頁面中確保有一個錯誤頁面的指令

6劃分資料和工作:在大的專案中一個處理器或資料庫負責太多的資料,可用負載均衡解決這個問題,找出超負荷的應用,確定是否可以直接擴充套件應用,選擇合適的屬性或軸據此進行劃分,分析隱含的問題,檢視現有的資料,提前規劃。例如可以按照分廠建立相關資料,或將歷史資料進行備份後匯出僅僅保留最近的資料。

7使用特俗化網路:無法通過省級現有網路解決頻寬問題就可以把網路劃分為多部分。找出網路瓶頸,尋找協同工作的機器叢集,分析安全需求,與網路管理員交流。例如web伺服器設定內外兩塊網絡卡,將資料庫伺服器分析至內網,將應用元件\servlet\ejb以及資料庫之間的資料業務流和使用者與網站之間的互動業務流相分離。

8輕量級查詢:應用程式有時候僅需要查詢表中的一個欄位,一個淺查詢即可滿足目的,jdbc2.x以後遊標支援以及可滾動的結果集可以更輕量的查詢。在使用者介面中找出那些地方使用了深度查詢,找出負責深度查詢的邏輯,引入修改會話外觀或dtofactory,引入或修改定製DTO,採用淺層資料查詢,部署和測試。例項賬戶資訊只有一個深度查詢:建立一個sessionBean,建立一個定製的DTO,實現一個輕量級的查詢,查詢結果封裝到定製的DTO中,使用DTO物件進行賬戶資訊查詢。

9版本:應用程式必須允許多個使用者更新同一個資料而且必須包括使用者思考時間,但要防止已做的更新不被過時的資料覆蓋掉。步驟:確定哪些bean必須支援樂觀枷鎖策略,在實體層引入版本機制,在DTO層引入版本機制,在服務層保證版本檢查,部署和測試。例項:金融系統AccountBean被併發訪問版本不一致,解決方法:在資料庫表Account中增加一個欄位,ersion,型別為整數;AccountBean增加一個屬性,version,型別為int;每次使用AccountBean讀取資料時,將資料庫中對應記錄的version的加1,並在AccountBean物件中將version值置為加1後的version欄位的值;每次寫入Account表前,檢查AccountBean物件中version值是否與資料庫中version欄位的值一致。如果一致,寫入是安全的,可以更新資料庫;如果不一致,說明有別的使用者正在操作該資料,則提示使用者不能更新。

10打包整理:資料庫處理耗時耗資源,建立資料庫連線池複用連線以提高效能和節約資源,執行大量sql語句耗時間和資源,可以利用批處理提高效率,減少sql語句單獨傳送耗費的時間。

步驟:使用資料來源代替driverManager獲取連線,用批處理方式處理sql語句,部署和測試

常用的包

1. java.lang.String

String類無可爭議的獲得冠軍,應該沒有人會否認這一點。這是一個最終類,用於建立/操作不可變的字串文字。它從JDK 1.0開始就有了。

2. java.lang.System

System類的使用取決於你工作的專案型別。你可能沒有在專案中使用過它,但它仍然是受歡迎的Java類之一。這是一個不能被例項化的工具類。這個類的主要用途是訪問標準輸入、輸出、環境變數等等。它自JDK 1.0開始可用。

3. java.lang.Exception

Throwable是所有錯誤和異常的超類。所有異常情況的處理都屬於Exception類。NullPointerException在所有的異常中是最受歡迎的。而Exception異常是在所有異常層次結構的頂部。它自JDK 1.0開始可用。

4. java.util.ArrayList

一個實現陣列的資料結構的類。這個類實現了List介面,是最受歡迎的Java集合類的成員。ArrayList和Vector之間的差異是初學者常見的問題之一,它也經常在java面試中被問到。它自JDK 1.2開始引入。

5. java.util.HashMap

一個實現鍵值對資料結構的類。這個類實現了Map介面。類似比較ArrayList與Vector,HashMap與Hashtable也是經常拿來比較的。它也是一個受歡迎的集合類,作為一個屬性-值的容器,經常用在應用程式多個層之間的資料傳遞。它自JDK 1.2開始引入。

6. java.lang.Object

所有Java類的根類。每一個Java類都是Object類的一個子類。經常使用在平臺/框架上。它包含了一些重要方法,比如:equals, hashcode, clone, toString等等。它自從Java誕生的第一天開始可用(JDK 1.0)

7. java.lang.Thread

執行緒是一個單一執行的序列,多個執行緒可以共同存在,共享資源。我們可以擴充套件Thread類,並建立自己的執行緒。當然,使用Runnable也是另一種選擇。是否使用這個類取決於你的應用程式的需要。一個普通的應用程式是完全沒有必要使用執行緒的。它自JDK 1.0開始引入。

8. java.lang.Class

Class類是一個直接繼承Object類的子類。這個類沒有建構函式,它們的物件是被Java虛擬機器通過類載入器載入的。我們大多數人可能沒有直接使用過它,但我認為它是一個重要的做反射的類。它自JDK 1.0開始引入。

9. java.util.Date

這是用來處理日期的類。有時候,我們覺得這個類應該加入更多的實用方法。就像每個企業級應用程式都會建立一個日期的實用工具單元。它自JDK 1.0開始引入,後來在JDK1.1中發生巨大變化,棄用了一大堆的方法。

10. java.util.Iterator

這是一個介面。它很受歡迎,用來替換列舉。這是一個簡單易用的單元,它用Iterable同步工作。它自JDK 1.2開始引入。