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 表名)
翻頁的鏈接可以用下拉框或輸入文本