【S2第二學期-使用JSP/Servlet技術開發新聞釋出系統】全書知識點總結
使用JSP/Servlet技術開發新聞釋出系統
第一章 動態網頁開發基礎
1. 動態網頁的優勢:
a) 互動性– 響應客戶端的請求並回發
b) 自動更新– 自動生成的HTML程式碼而無須依次手動編寫
c) 隨機性– 不同客戶訪問同一網站時會產生不同的效果
2. 動態網頁與靜態網頁不能相互替代;
3. 兩種架構模式的應用程式:
a) C/S架構:
Client/Server(客戶端/伺服器)應用程式,本地安裝的軟體通過Internet進行通訊,應用系統在客戶機上;
安全性:安全性較高,適用於對於安全性較高的場合。
b) B/S架構:
(Browser/Server)應用程式,系統介面由瀏覽器展示,應用系統在應用伺服器上;
安全性:較C/S架構的應用程式較低,適用於對於安全性不高的場合。
4. B/S架構的工作原理:
5. URL全稱為“統一資源定位符”。
6. URL的組成:URL由協議、伺服器域名或IP地址、埠號、路徑組成。
7. 壓縮版的Tomcat修改埠號的方法:
在Tomcat安裝目錄/conf目錄下的server.xml下,修改<Connector>節點的port屬性值即可。(預設:8080);
8. Tomcat的目錄結構:
當執行Tomcat時,總是先載入執行classes資料夾內的檔案在去載入lib目錄下的類。
9. 配置某個專案的起始頁的方法:專案目錄/WEB-INF的web.xml檔案中修改/增加<welcome-file>標籤的內容即可。內容即某個JSP頁面的完全名稱;
10. 何為JSP?
JSP就是在HTML中嵌入Java指令碼語言;
11. JSP的執行過程:
執行過程詳解:
當用戶點選操作了JSP頁面時,等於向伺服器發出了請求,這時Web容器接收到請求後,首先對JSP頁面進行轉換,轉換為Java程式碼;
之後對Java原始碼進行編譯,編譯成.class位元組碼檔案;
這時,容器會執行已經翻譯好的class檔案,在內部執行,並將結果轉換為HTML程式碼返回到客戶端予以顯示。
12. JSP頁面的組成:
靜態內容、指令、表示式、小指令碼、宣告、標準動作和註釋等。
JSP的註釋在客戶機檢視原始碼時無法看到,而普通的HTML註釋依舊可以看到;
Page指令用於匯入java包,且多個屬性之間使用逗號隔開;
小指令碼指在HTML頁面中嵌入的<% %>間的程式碼片段;
表示式指對資料的表示,語法為:<%=Java表示式 %>
13. Tomcat部署、執行專案的注意事項:
a) 專案名絕對不能含有中文;
b) 若專案在系統盤,則需要給此專案的所有關聯資料夾都設定許可權為EveryOne或當前登入的系統賬戶;
第二章 JSP資料互動(一)
1. JSP的內建物件對照表
JSP內建物件的常用方法及其說明 |
||
內建物件 |
方法名稱 |
方法說明 |
request |
String getParameter(String name) |
根據表單名稱獲取資料 |
String[] getParameterValues(String name) |
獲取一組相同名稱的控制元件資料 |
|
void setCharacterEncoding(String CharSet) |
設定請求的編碼方式 |
|
RequestDispatcher getRequestDispatcher(String path) |
可以使用forward轉發請求 |
|
response |
void AddCookie(Cookie cookie) |
在客戶端新增Cookie |
void setContentType(String type) |
設定HTTP的內容型別 |
|
void setCharacterEncoding(String CharSet) |
設定響應的編碼方式 |
|
void sendRedirect(String location) |
重定向URL路徑 |
|
session |
void setAttribute(String Key,Object Value) |
以K-V的形式儲存到session中 |
Object getAttribute(String Key) |
通過Key獲取session儲存的物件 |
|
void removeAttribute(String Key) |
從session刪除制定Key的session物件 |
|
void invalidate() |
手動設定session失效 |
|
String getId() |
獲取session Id |
|
application |
void setAttribute(String Key,Object Value) |
以K-V的形式儲存到application中 |
Object getAttribute(String Key) |
通過Key獲取application儲存的物件 |
|
String RealPath(String path) |
返回相對路徑的真實路徑 |
|
out |
String print()/println() |
向HTML頁面輸出文字資訊 |
2. Request物件用於處理客戶端請求的資料
例:String[] channels = request.getParameterValues("channel");//提交頁面有共同name為“channel”的元素radiobutton
//取值時使用增強型for迴圈便利陣列集合即可取出
if(channels != null) {
for (String channel : channels) {
out.print(channel+" ");
}
}
3. 兩種設定中文字符集編碼的方式:
a) 方式一:在專案Java程式碼中設定:【推薦使用】
request.setCharacterEncoding("UTF-8");
b) 方式二:設定Tomcat安裝目錄/conf/下的server.xml檔案的<Connector>節點的屬性。
增加URIEncoding屬性,值為“UTF-8”。
4. Response物件用於響應客戶的請求並向客戶端輸出資訊。
工作原理:
5. 轉發與重定向的區別:
轉發與重定向 |
|||||
名稱 |
JSP對應物件 |
方法 |
功能 |
過程 |
作用場合 |
轉發 |
request |
getRequestDispatcher.().forward(request,response) |
頁面跳轉,並轉發兩個物件(客戶端URL不變) |
等同於同一個請求,物件資訊保留 |
伺服器端 |
重定向 |
response |
sendRedirect() |
單純的頁面跳轉(客戶端URL改變) |
等於兩次請求,物件資訊丟失 |
客戶端 |
6. Session用於儲存使用者來訪時的每一次會話,作用域在伺服器端。
當用戶開啟瀏覽器訪問網站時,session即建立,當關閉瀏覽器即結束會話。
若Internet Explorer瀏覽器正在訪問session,但此時又開了一個InternetExplorer瀏覽器,則此時兩個瀏覽器間的session id則是一樣的;
若Internet Explorer瀏覽器正在訪問session,但此時又開了一個GoogleChrome瀏覽器,則此時兩個瀏覽器間的session id則是不同的;
若360瀏覽器正在訪問session,但此時將核心由Chrome核心切換到IE核心,則此時兩個瀏覽器間的sessionid則是一樣的;
最後總結:session的每次會話過程是基於瀏覽器種類的。
7. Session的失效有三種情況:
情況一:瀏覽操作結束,瀏覽器關閉後session物件自動銷燬;
情況二:手動呼叫方法實現session失效(常用於網站使用者的“登出”功能)。
手動設定失效即呼叫session的setMaxInactiveInterval([生效秒數,超過此秒數後session物件失效])手動設定失效時間;另一種方法是在專案的WEB-INF/web.xml中加入以下標籤:
<session-config>
<session-timeout>[設定生效分鐘數,超過此分鐘數後session物件失效]</session-timeout>
</session-config>
第二章 JSP資料互動(二)
1. Application物件相當於系統的“全域性變數”,且在一個伺服器上的一個Web應用只有一個application物件,這樣可以使所有使用者的資料共享。
此前的session可看作是“私有變數”,而application則可看作是“公有變數”。
使用application物件統計網站的訪問人數:
<%
Integer count = (Integer)application.getAttribute("count");
if (count != null) {
count += 1;
} else {
count = 1;
}
application.setAttribute("count",count);
%>
<%
Integer i = (Integer)application.getAttribute("count");
out.print("統計訪問量:目前有"+ i + "個人訪問過本網站。");
%>
2. 物件的作用域
分為四種作用域:
Page作用域、request作用域、session作用域和application作用域。
Page作用域僅對當前頁面有效,轉發或重定向到其他頁面時page物件失效;
Request作用域在頁面間轉發時有效;
session作用域在一次會話期間有效;
application作用域面向整個Web應用程式,只要伺服器不關閉則一直生效,當伺服器重啟或關閉時application物件銷燬。
3. Cookie
Cookie就是在客戶端以字串儲存的檔案。
4. Cookie的操作
a) 寫入Cookie:
Response.addCookie(new Cookie);
例:
response.addCookie(new Cookie("username","Jack"));
response.addCookie(newCookie("password", "123456"));
b) 讀取Cookie:
讀取時返回的是Cookie的物件陣列,是以K-V的形式儲存的。
例:
Cookie[]cookies = request.getCookies();
String user = "";
String pwd = "";
if (cookies != null) {
for (int i = 0; i< cookies.length; i++) {
if(cookies[i].getName().equals("username")) {
user= cookies[i].getValue();
} else if(cookies[i].getName().equals("password")) {
pwd= cookies[i].getValue();
}
}
}
5. Cookie的有效期:
呼叫Cookie物件的setMaxAge([設定有效時間,單位為秒])。
6. Cookie與session的對比:
Cookie與session的比較 |
||
Cookie |
session |
|
作用位置 |
客戶端 |
伺服器端 |
值的型別 |
String |
Object |
永續性 |
長期儲存 |
會話結束即銷燬 |
適於儲存的資訊 |
非重要資訊 |
較重要資訊 |
7. JDBC訪問資料庫的步驟:
載入JDBC驅動;
與資料庫建立連線;
傳送SQL語句;
處理返回結果;
關閉各種連線,釋放所用的資源。
注意:Object…params表示params這個引數的陣列長度是可變的,稱為“可變長引數”。此形參的位置可以穿入若干個實參。
三元運算子:
語法:
[布林型別的表示式]?[結果為true時的值]:[結果為false時的值]
8. JavaBean
何為JavaBean?
JavaBean其實就是一種程式設計思想,本質是一個Java類,並不是一個元件。目的就是封裝資料和封裝業務,可跨平臺重用,提高安全性,提高編碼效率。
特點:
屬性私有;
訪問屬性的getter和setter方法公有。
9. 補充:
a) Application內建物件的getRealpath()方法返回相對路徑的真實物理路徑。
第五章 使用分層實現業務處理
1. JNDI
Java Naming and Directory Interface(Java命名與目錄介面),用於查詢、訪問各種資源的介面。
2. JNDI的配置
修改位於Tomcat安裝目錄/conf/context.xml檔案,在<Context>節點下增加如下資訊:
<Environment name=”tjndi” value=”hello JNDI”type=”java.lang.String” />
引數解釋:
Name表示環境名稱,對應於java:comp/env/的名稱;
Value表示要返回的引數值;
3. JNDI的使用:
Contextctx = new InitialContext(); //使用上下文介面例項化一個初始化上下文物件
//呼叫上下文物件的lookup()方法按照指定的名稱檢索物件,並將其轉換為String型別的資料進行輸出
String testjndi = (String)ctx.lookup("java:comp/env/tjndi");
out.print("JNDI:" +testjndi);
注意:物件名必須以“java:comp/env/”開頭,後面跟在context.xml檔案中配置的環境名稱。
4. JNDI與application物件的對比:
JNDI與application的對比 |
||
JNDI |
application內建物件 |
|
可見性 |
伺服器上的所有Web應用 |
伺服器上的某一個Web應用 |
5. 資料庫連線池
作用是分配、管理和釋放資料庫連線。
工作原理:
初始化階段:
建立一定數量的資料庫連線並放入連線池的空閒池中,且無論是否在用或不在用,數量都會建立為這麼多;
使用階段:
使用時,系統進入空閒池中檢查還有沒有空閒連線,有則分配後進入使用;否則再去檢查是否達到了最大連線數,沒有達到則會建立一個數據庫連線以供使用,若達到了最大連線數就需等待了,如果超時則返回null值。當達到資料庫連線池所能提供的最大連線數量時,若在向連線池請求連線,則將加入等待。
6. 使用資料庫連線池與JNDI獲得資料庫連線,訪問資料庫:
a) 資料來源的配置:
首先配置Tomcat安裝目錄/conf/context.xml的<Environment>標籤;
之後配置Tomcat安裝目錄/conf/context.xml的< Resource>標籤,內容如下:
<Resource name="Actor"auth="Container" type="javax.sql.DataSource"maxActive="100" maxIdle="30" maxWait="10000"username="MSFT" password="123"driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DatabaseName=Chapter03_Demo11"/>
含義解釋:
Name表示Resource的名字;
Auth表示由誰來管理Resource(Container表示由容器建立和管理;Application表示由Web應用建立和管理);
Type表示Resource所用到的類名;
maxActive表示在使用的最大資料庫活動連線數;
maxIdle表示連線池處於空閒的最大資料庫連線數量(0表示數量隨意,不受限);
maxWait表示連線池處於空閒的最長時間(單位:毫秒;1表示一直在等待)
username表示資料庫的有效使用者名稱
password表示資料庫的有效登入密碼
driverClassName表示要用到的Java驅動類
url表示資料庫的連線字串
b) 專案中web.xml的配置:
在<web-app>標籤中新增如下標籤屬性:
<resource-ref>
// description標籤表示對此資料來源的描述
<description>newsDataSource</description>
// res-ref-name標籤表示引用Resource的名字,對應於context.xml中<Resource>標籤的name屬性值
<res-ref-name>jdbc/news</res-ref-name>
// res-type表示引用Resource的類名
<res-type>javax.sql.DataSource</res-type>
// res-auth表示由誰來建立和管理Resource,對應於context.xml中<Resource>標籤的auth屬性值
<res-auth>Container</res-auth>
</resource-ref>
7. 三層架構
a) 層層間的關係:
表示層依賴業務邏輯層,業務邏輯層依賴資料訪問層;
上一層依賴下一層,且不跨層呼叫;
下一層不依賴上一層。
8. 三層架構開發的優勢:
a) 職責劃分清晰;
b) 無損替換;
c) 複用程式碼;
d) 高內聚,低耦合。
9. 補充:
a) Application物件僅用於一個Web應用中訪問,因為畢竟application物件是儲存在記憶體中的,想要在一個專案中跨專案訪問另一個專案的application物件是訪問不到的,因為各個專案之間是相互獨立的;
b) JNDI通過名稱將資源與服務進行關聯,類似於Map集合的K-V儲存形式;
c) JNDI與ASP.NET中的Web.config的<connectionString>的作用類似,將資料庫連線字串使用外部配置檔案儲存起來,在更改資料庫連線之後無需再次編譯就可正常執行;
d) 資料來源(DataSource)負責建立和管理資料庫連線,而Tomcat則會從上下文(Context)中取出某一個連線放入連線池中以供應用程式所使用;
e) 資料庫連線是由Tomcat容器管理的;
f) 獲取DataSource(資料來源)物件的過程:
第六章 JSP開發業務應用
1. 分頁
a) 原理:
每次翻頁時只從資料庫中檢索出本頁要顯示的資料而不是全部查詢出來。
b) 實現:
i. 確定每頁要顯示幾條資料;
ii. 計算出總共要顯示多少頁;
iii. 編寫SQL語句
packagecom.Entity;
importjava.util.List;
/**
* 分頁類
*
* @author Cortana for ThinkPad
*
*/
public classSplitPage {
/**
* 總共要顯示多少頁
*/
private int totalPageCount = 1;
/**
* 每頁顯示多少條資料
*/
private int pageSize = 0;
/**
* 全部的資料數量
*/
private int totalCount = 0;
/**
* 當前為第幾頁
*/
private int currPageNo = 1;
List<News> newsList;
public int getTotalCount() {
return totalCount;
}
//設定全部的資料條數
public void setTotalCount(inttotalCount) {
if (totalCount > 0) {
this.totalCount =totalCount;
//總頁數的計算方法:
若總記錄數除以每頁顯示的固定資料量可以除盡,則要顯示的全部頁數就是它倆的商,因為能除盡代表每頁顯示固定的資料條數正好可以在當前顯示的總頁數內容得下;
若總記錄數除以每頁顯示的固定資料量除不盡,則要顯示的全部頁數就是它倆的商+1,因為能除不盡代表每頁顯示固定的資料條數不足以在當前顯示的總頁數內全部顯示,還需要再額外加1頁才能全部顯示完
totalPageCount =this.totalCount % pageSize == 0 ? (this.totalCount / pageSize)
:this.totalCount / pageSize + 1;
}
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(inttotalPageCount) {
this.totalPageCount =totalPageCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
if (pageSize > 0) {
this.pageSize =pageSize;
}
}
public int getCurrPageNo() {
if (totalPageCount == 0) {
return 0;
}
return currPageNo;
}
public void setCurrPageNo(intcurrPageNo) {
if (this.currPageNo > 0) {
this.currPageNo =currPageNo;
}
}
public List<News> getNewsList() {
return newsList;
}
public voidsetNewsList(List<News> newsList) {
this.newsList = newsList;
}
}
c) 理解分頁SQL語句:
select top 3 * from NewsList where ArticleId not in
(select top ((1-1)*3) ArticleId from NewsList)
解釋:
外層查詢:在NewsList表中查詢所有結果的前三列;
內層子查詢:在NewsList表中查詢出前0個文章編號的資料;
那麼此時,按照當前語句來講,子查詢應無返回結果,外層查詢查詢到了前三條資料,那麼not in中又沒有資料,所以第一次等於子查詢沒有實際用處,即正常顯示前三條資料,結果如下:
分段查詢:
合併查詢:
第二次查詢:
那麼此時,按照當前語句來講,子查詢應無返回結果,外層查詢查詢到了前三條資料,那麼not in中又沒有資料,所以第一次等於子查詢沒有實際用處,即正常顯示前三條資料,結果如下:
分段查詢:
可能會問為什麼第二次查詢的時候,分開查詢怎麼新聞的序號都是1、2、3而第一條SQL語句的查詢結果不是6條呢?不應該是查詢出前6條然後1、2、3條除外才對嗎?就像下圖:
此時要注意了,因為語句中使用not in進行條件約束,當首先執行子查詢select top ((2-1)*3) ArticleId from NewsList時,查詢出的結果為1、2、3,再執行外層的查詢時,就會將1、2、3這三條資料過濾掉,從而就會查詢出後三條資料來,一定要理解SQL語句的執行順序,線執行子查詢,根據子查詢的條件在執行外層查詢時就會根據關鍵字進行過濾。
分頁SQL語句示意:
2. 使用Commons-FileUpload元件實現檔案上傳
a) 元件:
commons-fileupload-1.2.1.jar – 用於客戶端向伺服器傳送檔案資料
commons-io-1.3.2.jar – 用於伺服器寫入客戶端上傳過來的檔案資料
b) 表單的屬性設定:
設定<form>標籤的encType屬性值為二進位制資料型別(multipart/form-data),且提交方式(method)必須設為“post”而不是“get”方式。
c) 使用file控制元件選擇檔案:
<input type=”file” />
這樣,就是一個“開啟檔案”的對話方塊了。
d) 上傳檔案需要用到的commons-fileupload元件的API:
使用commons-fileupload元件上傳檔案需要用到的API |
|||
ServletUpload類 |
FileItem介面 |
FileItemFactory介面 |
|
用途 |
檔案上傳 |
封裝單個表單欄位 |
將獲得的FileItem物件儲存至伺服器硬碟 |
實現類 |
無 |
DiskFileItem類 |
DiskFileItemFactory類 |
e) 上傳檔案並控制檔案型別和大小的程式碼:
request.setCharacterEncoding("UTF-8");
//上傳的檔名
String uploadFileName ="";
//表單欄位元素的name屬性值
String fieldName ="";
//請求資訊中的內容是否是MultiPart型別
boolean isMultipart =ServletFileUpload.isMultipartContent(request);
String uploadFilePath =request.getSession().getServletContext()
.getRealPath("upload/");
//建立臨時檔案目錄路徑
File tempPatchFile = newFile("e:\\temp\\buffer\\");
//判斷臨時目錄是否存在
//不存在,則呼叫mkdirs()方法建立目錄
if (!tempPatchFile.exists()){
tempPatchFile.mkdirs();
}
if (isMultipart) {
DiskFileItemFactoryfactory = new DiskFileItemFactory();
//設定緩衝區大小(單位:KB)
factory.setSizeThreshold(4096);
//設定上傳檔案用到的臨時檔案存放路徑
factory.setRepository(tempPatchFile);
ServletFileUploadupload = new ServletFileUpload(factory);
//設定單個檔案的最大限制
upload.setFileSizeMax(1024* 30);
try {
//解析form表單中所有的檔案
List<FileItem>items = upload.parseRequest(request);
Iterator<FileItem>iter = items.iterator();
while(iter.hasNext()) {
FileItemitem = (FileItem) iter.next();
if(item.isFormField()) {
fieldName= item.getFieldName();
if(fieldName.equals("user")) {
out.print(item.getString("UTF-8")
+"上傳了檔案。<br />");
}
}else {
StringfileName = item.getName();
List<String>fileType = Arrays.asList("gif", "bmp",
"jpg");
Stringext = fileName.substring(fileName
.lastIndexOf(".")+ 1);
if(!fileType.contains(ext)) {
out.print("上傳失敗,檔案型別只能是gif、bmp、jpg");
}else {
if(fileName != null && !fileName.equals("")) {
FilefullFile = new File(item.getName());
FilesaveFile = new File(uploadFilePath,
fullFile.getName());
item.write(saveFile);
uploadFileName= fullFile.getName();
out.print("上傳成功後的檔名是:"+ uploadFileName
+",檔案大小是:" + item.getSize()
+"Bytes!");
}
}
}
}
} catch(FileUploadBase.FileSizeLimitExceededException ex) {
out.print("上傳失敗,檔案太大,單個檔案的最大限制是:" + upload.getFileSizeMax()
+"Bytes!");
} catch (Exceptione) {
e.printStackTrace();
}
}
3. 補充:
a) Select count(*) from [表名]
Select count(1) from [表名]
兩者的執行效率,後者比前者效率高;
b) Commons-FileUpload元件其實是通過二進位制位元組流的方式傳輸檔案的。
第7章 Servlet基礎
1. 在JSP未出現之前,都使用Servlet編寫Java Web應用程式。
2. JSP與Servlet的執行過程:
a) JSP的執行過程:
此時,JSP作為向客戶展示的頁面;
b) Servlet的執行過程:
此時,Servlet生成的HTML程式碼作為向客戶展示的頁面。
3. Servlet繼承於HttpServlet,共有以下幾種方法需要實現:
a) 建構函式;
b) Init()方法;
c) doGet()方法;
d) doPost()方法;
e) destroy()方法;
當初次執行Servlet時,init()方法被執行,若再次請求,則不再執行init()方法,因為初始化方法僅執行一次;
之後根據上以頁面的提交方式選擇執行doGet()方法還是doPost()方法;
當停止Tomcat服務或重啟、關閉伺服器時,執行destroy()方法進行回收。
注意:destroy()方法只是指明哪些資源可以回收,而不是由destroy()方法直接進行回收。
4. Servlet常用API:
Servlet常用API介面 |
|||
API名稱 |
作用 |
方法 |
方法說明 |
Servlet介面 |
void init(ServletConfig config) |
初始化Servlet |
|
void service(ServletRequest req,ServletResponse res) |
處理客戶端請求 |
||
void destroy() |
釋放Servlet所用資源 |
||
GenericServlet抽象類 |
String getInitParameter(String name) |
返回名為name的初始化引數值 |
|
HttpServlet抽象類 |
void service(ServletRequest req,ServletResponse res) |
處理客戶端請求(呼叫GenericServlet中的service()方法) |
|
void doXXX(HttpServletRequest req,HttpServletResponse res) |
根據提交方式呼叫不同的請求方法 |
||
ServletContext物件 |
操作一個Web應用的上下文 |
String getInitParameter(String name) |
獲取名為name的初始化引數值(初始化引數在web.xml的<context-param>節點內設定) |
void setAttribute(String name,Object object) |
設定名為name的屬性 |
||
Object getAttribute(String name) |
獲取名為name的屬性 |
||
String getRealPath(String path) |
返回引數所代表的目錄的物理路徑 |
||
ServletConfig介面 |
讀取Servlet配置 |
省略…… |
省略…… |
ServletRequest與HttpServletRequest介面 |
獲取客戶端的請求 |
void setAttribute(String name,Object object) |
在請求中設定名為name的屬性值 |
Object getAttribute(String name) |
獲取名為name的屬性 |
||
void removeAttribute(String name) |
清除請求中名為name的屬性 |
||
ServletResponse與HttpServletResponse介面 |
向客戶端傳送響應資料 |
PrintWriter getWriter() |
向客戶端傳送文字 |
String getCharacterEncoding() |
返回響應的字元編碼 |
||
void setCharacterEncoding() |
設定傳送的字元編碼 |
ServletRequest與HttpServletRequest介面具有在JSP中request物件相同的方法,前兩者是後者的擴充套件;
ServletResponse與HttpServletResponse介面具有在JSP中response物件相同的方法,前兩者是後者的擴充套件。
5. Servlet的對映
在專案的web.xml檔案中寫入如下標籤:
<servlet>
//此Servlet的描述【非必須】
<description>HelloServlet</description>
<display-name>HelloServlet</display-name>
//此Servlet的名字
<servlet-name>HelloServlet</servlet-name>
//Servlet的完全限定名(Servlet對應於專案的位置,有包名則需要寫包名)
<servlet-class>HelloServlet</servlet-class>
</servlet>
//Servlet的對映
<servlet-mapping>
//Servlet對映到的名字(對應於上方設定的Servlet的名字)
<servlet-name>HelloServlet</servlet-name>
//Servlet的對映路徑(可通過瀏覽器位址列輸入進行訪問)
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
6. Servlet的初始化引數:
在專案的web.xml檔案中寫入如下標籤:
<servlet>
<init-param>
//初始化引數的名字
<param-name>initParam</param-name>
//初始化引數對應的值
<param-value>HelloServlet</param-value>
</init-param>
</servlet>
此時在Servlet檔案的doGet()方法中獲取:
StringinitParam = getInitParameter("initParam");
System.out.println(initParam);
7. Servlet的上下文引數:
在專案的web.xml檔案中寫入如下標籤:
<web-app>
<context-param>
<param-name>contextParam</param-name>
<param-value>HelloServlet</param-value>
</context-param>
</web-app>
此時在Servlet檔案的doGet()方法中獲取:
StringcontextParam = this.getServletContext().getInitParameter(
"contextParam");
System.out.println("系統初始化引數:"+ contextParam);
8. 補充:
a) Servlet擅長於流程控制和業務處理;JSP擅長於資料的展示。可以在實際開發中將JSP的Control頁面都換成Servlet類進行業務處理。
b) Servlet的體系結構:
c) Servlet的生命週期:
d) 在Servlet中獲取上一頁提交的表單元素的值與JSP的方法相同;
e) 若要以普通超連結的方式轉到Servlet檔案上,則超連結的href屬性則應寫web.xml檔案中配置Servlet的url-pattern節點的屬性路徑;
f) 使用超連結時,Servlet預設呼叫doGet()方法,點選提交按鈕時,若method的方式為“post”,則Servlet呼叫doPost()方法。