Java EE概述:
Java EE是一個開放的平台,它包括的技術很多,主要包括十三種核心技術(java EE就是十三種技術的總稱)。建立一個整全的概念。
J2ee的十三種技術(規範)
1. java資料庫連接(JDBC)。——JDBC定義了4種不同的驅動:1.JDBC-ODBC橋,2.JDBC-native驅動橋3,JDBC-network橋4.純java驅動。
2. Java命名和目錄介面(JNDI)【它是為了對進階網路應用開發中的使用的目錄基礎結構的訪問】。
3. 企業Java Beans【Enterprise Java Beans,EJB)(它提供了一個架構來開發和配置到用戶端的分布式商業邏輯,因此可以明顯減少開發擴充性、高度複雜公司專屬應用程式的難度。】。
4. JavaServer Pages【JSPs】。
5. Java servlets【servlets提供的功能大部分與JSP相同,JSP中大部分是HTML代碼,其中只有少量的Java代碼,而servlets則相反,它完全使用Java編寫,並且產生HTML代碼】。
6. Java IDL/CORBA【用得不多】。
7. Java 事務體系(JTA)/Java事務服務(JTS)【用得不多】。
8. JavaMail和JavaBenas啟用架構(JavaBeans ActivationFramework,JAF)。【JavaMail是一個用來訪問郵件服務的API】。
9. Java信差服務(Java MessagingService,JMS)【JMS是一個用來和面向資訊的中層通訊的API】。
10. 擴充標記語言【Extensible Markup Language,XML】。
11. 12. 13當前流行的及格架構 struts+hibernate+spring【ssh】。
------------------------------------------------------------------------------
在java ee的開發中有幾個重要的開發模式:
1.Model1模式 2.model2模式(model2x模式(用得少)) 3.mvc模式
一、Model1模式
Model1的基礎是jsp檔案,它由一些相互獨立的jsp檔案,和其它一些java class組成(不是必須的)。這些jsp從HTTPRequest中獲得所需要的資料,處理商務邏輯,然後將結果通過Response返回前端瀏覽器。
從上面分析我們可以看到model1模式可以分為兩類:
1. Model1(純jsp技術,不帶任何java class)。
2. Model1(jsp+java class)。
Model1模式的缺點:
1. 表現層和業務層混合在一起(亂!)。
2. 在開發過程中,不利於多人協同開發。
3. 不利於後期維護。
Model1模式的優點:
1. 簡單,開發速度較快。
2. 比較適合開發小的項目。
二、model1(結合java class)開發模式,有些書上稱:mv模式,即:màmodel模型(java class,商務邏輯層),vàview視圖(jsp,介面層)。
1.一個資料庫應一個類:ConnDB.java(得到串連)。
2.資料庫中的每一張表對應兩個類:(1)UserBean.java(表示users表)類。(2)UserBeanCl.java(商務邏輯,即對users表的操作)類。
如:
login.jsp輸入資料,logincl.jsp通過調用java class(模型)處理資料,wel.jsp顯示資料。這是一種多麼完美的開發模式。
不足之處:
1. Jsp技術主要做介面,但是logincl.jsp這裡調用了java class(模型),完成對使用者驗證,顯得有點怪怪的。
2. Wel.jsp是用於顯示使用者資訊(顯示資料),但,wel.jsp除了顯示資料,還調用了java class(模型),代碼的優雅就蕩然無存了,也不得於將來的分工。
3. Servlet技術處理頁面的跳轉是最快捷和方便的,難道我們就此不用了嗎?
三、mvc開發模式:M(model模型),V(view視圖),C(controller控制器)。
MVC是一個設計模式,它強制性的使應程式的輸入、處理、和輸出分開。使用MVC應用程式分成三個核心組件:模型、視圖、控制器。它們各自處理自己的任務。
M主要由java class來做,也可以是java bean、eib等
V由jsp來做
C由servlet來做
對上的例子進行改進:
1. 增加控制器(servlet):將logincl.jsp用servlet來替代,發揮servlet充當控制中轉的優勢。
2. 在控制器(servlet)中去調用模型(model)去完成使用者驗證,並準備要顯示的使用者資訊資料。
MVC開發模式的總結:
處理過程:首先控制器接收使用者的請求,並決定應該調用哪個模型來進行處理,然後調用模型來處理使用者的請求並返回資料,最後控制器用相應的視圖顯示模型返回的資料,並通過瀏覽器呈現給使用者。
Mvc模式存在的缺點:
1. 工作量增加了。
由於開發人員將一個應用程式分成了三個組件,所以使用MVC同時也意味著你將要管理比以前更多的檔案,這一點是顯而意見的。這樣好像我們的工作量增加了,但是請記住這比起它所能帶給我們的好處是不值一提。
2. 不適用小型項目,否則就是機關槍打蚊子。
3. 調試應用程式難度加大。
Mvc提倡模型和視圖分離,這樣也給調試應用程式帶來了一定的困難。每個構件在使用之前都需要經過徹底的測試。一旦你的構件經過了測試,你就可以毫不顧忌的重用它們了。
------------------------------------------------------------------------------
資料庫中使用者名稱是中文,中文亂碼問題(一般是要查詢資料時,有中文字元才需要轉碼):
當提交表單時,表單中有中文,也會產生亂碼。
解決中文亂碼問題,有三種方法:
1. 重新轉碼,如,有String u=”是中文”; u=newString(u.getBytes(“iso-8859-1”),”gb2312”);
2. 使用過濾器來解決[詳解]
3. 通過修改Tomcat配置servlet.xml檔案[不太穩定.],具體操作如下:
<Connectorport="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" />改為:
<Connectorport="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443"URIEncoding=”gbk”/>
在<Connector>元素中增加屬性URIEncoding,其值為”gbk,表示用戶端請求傳送來的值均以gb2312的標準來編碼,這樣在業務處理中就不需要在對其編碼進行轉換,大在簡化了程式,提高了執行效率。
當request得到的是亂碼時,可以這樣解決(一定要這樣寫):
name=new String(request.getParameter(“username”).getBytes(“ISO-8859-1”),”gb2312”);
------------------------------------------------------------------------------
3. 繼承HttpServlet類(該類有doGet,doPost方法)
Servlet的生命週期
1. init()函數,用於初始化該servlet(類似於類的建構函式,該函數只會被調用一次(當使用者第一次訪問該頁面的servlet時被調用。)。)。
2. 商務邏輯函數(如:service,doGet,doPost等方法)(當使用者每訪問該servlet時,都會被調用,它有兩個參數:ServletRequest—用於擷取用戶端的資訊,ServletResponse—用於向用戶端返回資訊)。
3. destroy()函數,用於銷毀servlet執行個體(釋放記憶體),只有如下三種情況才會周用(1.reload該servlet(webApps),2.關閉tomcat,3.關機)值行了這個函數後,這個網站內的所有的session和conTest都被釋放,為空白。
------------------------------------------------------------------------------
表單提交資料get請求和post請求的區別
1. 從安全方面看get<post,因為get提交的資料會在瀏覽器地址欄顯示
2. 從提交的內容大小來看get<post, get提交的資料不能大於2K,面post提交的資料理論上不受限制,但是實際編程中建議不要大於64K。
3. 從請求響應速度上看get>post,get要求伺服器立即響應請求,而post請求可能形成一個隊列請求。
從以上幾點看,表單提交方式(method)建議用post
在sevlet中列印的html語句,可以不加引號
同一使用者的不同頁面共用資料的四種方法
1. Cookie(小甜餅,在javax.servlet.http.*;這個包裡面)(伺服器在用戶端儲存使用者的資訊,比如登入名稱,密碼…就是cookie,資料量並不大,伺服器端在需要的時候可以從用戶端讀取。)。
Cookie的使用方法:①Cookie有點像一張表,分兩列一個是名字,一個是值,資料類型都是String。②建立Cookie(在伺服器端建立):Cookie
c=newCookie(String name,String val);③將Cookie添加到用戶端:response.addCookie(c); ④讀取Cookie(從用戶端讀到伺服器):Cookie[]allCookie=request.getCookies();c.getName();c.getValue();方法讀取⑤修改Cookie存在時間:c.setMaxAge(30);單位秒,為負則該cookie不會儲存,為0則刪除該cookie,如果不設定存在時間,那第該Cookie將不會儲存。
2. sendRedirect(地址跳轉,注意中文處理)
3. Session(會話技術)(當使用者開啟瀏覽器,訪問某個網站時,伺服器就會在伺服器記憶體為該瀏覽器分配一個空間,該空間被這個瀏覽器獨佔,這個空間就是session空間,其中的資料預設存在時間為30min,可以修改(在conf—web.xml中修改))。
Session的使用方法:①得到session:HttpSessionhs=request.getSession(true);
②向session添加屬性:hs.setAttribut(Stringname,Object val);③從session得到某個屬性:Stringname=hs.getAttribute(String
name);④從session刪除掉某個性性:hs.removeAttribute(String name);⑤修改session的存在的時間:hs.setMaxInactiveInterval(20);單位秒,為負則永遠不逾時,為0則馬上逾時。
因為session的各個屬性要佔用伺服器的記憶體,因此軟體公司都是在迫不得已的情況下才使用。
注意:以檔案—建立—視窗,的方式開啟視窗,session的ID是不變的,也就是同一個session空間
4. 隱藏表單提交(form)(input type=hiddenname=““ value=““),在提交該表單時,能一併提交過去。(擷取方式:req.getParameter(Stringname);)。
------------------------------------------------------------------------------
Cookie VS session
1. 存在的位置:cookie儲存在用戶端,session儲存在伺服器端。
2. 安全性:比較而言,cookie的安全性比session要弱。
3. 網路傳輸量:cookie通過網路在用戶端與伺服器端傳輸,而session儲存在伺服器端,不需要傳輸。
4. 生命週期(20分鐘為例)①cookie的生命週期是累計的,從建立時,就開始計時,20分鐘後cookie生命週期結束,cookie就無效。②session的生命週期是間隔的,從建立時開始時計時,如在20分鐘,沒有訪問過session,那麼session資訊無效,如果在20分鐘內,比如第19分鐘時,訪問過session,那麼它的生命週期將重新開始計算。③另外,關機會造成session生命週期結束,但是對session沒有任何影響。
使用ServletContext(和session一樣,但是它所有的客戶都可以訪問)。
1. 得到ServletContext執行個體:this.getServletContext();
2. 你可以把它想像成一張表,這個和Session非常相似:每一行就是一個屬性。添加屬性:setAttribute(String name,Object ob);
得到值:getAttribute(Stringname);返回Object。
刪除屬性:removeAttribute(Stringname);
3. 生命週期:ServletContext中的屬性的生命週期從建立開始,到伺服器關閉而結束。
4. 使用ServletContext:的注意事項:因為存在ServletContext中的資料會長時間的儲存在伺服器,會佔用記憶體,因此我們建議不要向ServletContext中添加過大的資料…….
切記
------------------------------------------------------------------------------
分頁技術(方法)
我們先講講分頁的演算法:
我們需要定義四個量,它們有各自的用處,如下:
int pageSize:每頁顯示多少條記錄
int pageNow:希望顯示第幾頁
int pageCount:一共有多少頁
int rowCount:一共有多少條記錄
說明:
pageSize是指定的(常量)。
pageNow是使用者選擇的(變數)。
rowCount是從表中查詢得到的(是個變數)。
pageCount是計算出來的,該計算式為:
if(rowCount%pageSize==0)
{
pageCount=rowCount/pageSize;
}
else
{
pageCount=rowCount/pageSize+1;
}
然後查詢資料庫,我們可能很自然的想到,用
select 欄位列表 from 表名 where id between ? and ?
但是如果表的某個id被刪除了,那麼某頁可能就會少一條記錄。
因此最終解決方案是如下語句:
select toppageSize 欄位名列表 from
表名 where id not in
(select top pageSize *(pageNow-1) id from
表名)
翻頁的連結可以用下拉框或輸入文本