天天看點

Servlet基礎知識與新手常遇到的錯及解決方法(01)

什麼是伺服器

伺服器就是一台高性能的電腦

電腦上安裝什麼樣的伺服器軟體,就可以稱為xxx伺服器

舉例:

安裝了資料庫軟體(mysql/Oracle…),就是資料庫伺服器

安裝了ftp服務軟體,就是ftp伺服器

安裝了郵件伺服器軟體,就是郵件伺服器

安裝了web服務軟體,就是web伺服器

web服務軟體做了那些事兒?

負責建立底層的網絡連接配接

負責将用戶端請求的檔案傳回給用戶端

web服務軟體又稱為web容器,web容器用來裝元件(Servlet), web服務軟體根據用戶端發出的請求路徑,找到對應的Servlet做出響應

什麼是Servlet

Servlet是用于擴充web服務軟體業務功能得元件,每一種業務請求都需要對應一個單獨的Servlet

如何在eclipse中關聯Tomcat

從doc.canglaoshi.org中下載下傳 Tomcat 7.0.96 解壓到一個指定目錄

打開eclipse中window->preferences->Server->Runtime->add->找到對應的版本 Create a new Local servet打鈎->下一步->選擇下載下傳的檔案夾 finish

确認eclipse為JavaEE視圖模式,并且工程目錄為Project Explorer

找到servers頁籤,在裡面的Tomcat上輕按兩下 把裡面的單選選擇中間的一個 儲存

在servers裡面Tomcat上面右鍵 start

打開谷歌浏覽器在位址欄中輸入 http://localhost:8080 在頁面中顯示出貓 說明安裝完成!

建立web工程

建立maven工程 02servlet_1_1 把jar改war

改錯: 在最長的檔案名上面右鍵點選最長的(在src/main/webapp下面生成了web.xml配置檔案)

讓工程和Tomcat建立關系:工程上右鍵properties->Targeted Runtimes->打鈎後關閉

在JavaResources裡面的src/main/java上面右鍵建立Servlet 添加包名cn.tedu 類名HelloServlet

在HelloServlet裡面删除注釋和類裡面所有代碼,重寫service方法,删除方法裡面的内容添加一個輸出,代碼如下:

public class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("恭喜你,接收到請求了!");
    }
  }      

在工程上右鍵Run As-> Run on Server 打鈎 完成

在彈出的浏覽器中 或自己的谷歌浏覽器中 寫以下位址

http://localhost:8080/02servlet_1_1/HelloServlet 回車通路

如果頁面顯示空白,并且在eclipse控制台中輸出 恭喜你… ,說明一切成功!

Servlet響應流程

請求由浏覽器發出到web伺服器,由web伺服器的web服務軟體(Tomcat)攔截,Tomcat攔截到請求後,擷取出請求的字位址(/HelloServlet),通過該字位址去web.xml找到處理該請求的Servlet的完整類名,得到完整類名後Tomcat通過反射技術将該對象執行個體化,然後調用對象的service方法,進而導緻程式員寫在Servlet裡面的代碼執行

如果隻是修改了代碼沒有建立新的Servlet是不需要重新運作工程的

浏覽器送出請求的幾種方式

在浏覽器的位址欄中寫請求路徑 回車後送出請求 get

在頁面中通過超連結送出請求 get

在頁面中通過form表單送出請求 預設get/post

請求方式get和post

get: 請求參數放在請求位址的後面,請求參數大小受限 隻能傳遞幾k的資料, 由于參數使用者可見 不能傳遞敏感資訊(密碼)

post: 請求參數放在請求體裡面,沒有大小限制通常上傳檔案時使用,參數内容使用者不可見 敏感資料通過post請求

擷取傳遞到伺服器的參數

String info = request.getParameter(“info”);

請求參數中包含中文

post請求中有中文解決方案:

在擷取參數之前執行以下代碼

request.setCharacterEncoding(“UTF-8”);

get請求中有中文如果是tomcat8.0以上版本不存在亂碼問題,如果8.0以下版本找到Servers工程中的server.xml 找到65行 添加URIEncoding=“UTF-8” 改完後儲存并重新運作工程 ,隻需要改一次 以後所有Servlet都搞定

<Connector URIEncoding=“UTF-8” connectionTimeout=“20000”

sayhello練習

在webapp下建立sayhello.html頁面在頁面中準備form表單 送出位址為SayHelloServlet,表單中有一個文本框文本框的name值為info和一個送出按鈕

sayhello.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="SayHelloServlet">
  <input type="text" name="info">
  <input type="submit">
    </form>
</body>
</html>      

建立SayHelloServlet,留下doGet方法其它删除,在doGet方法中擷取傳遞過來的info,将得到的info後面拼接上“你好”兩個字傳回給浏覽器

SayHelloServlet.java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SayHelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //擷取參數
  String info = request.getParameter("info");
  //設定響應類型
  response.setContentType("text/html;charset=utf-8");
  //擷取輸出對象
  PrintWriter pw=response.getWriter();
  //輸出資料
  pw.print(info+"你好!");
  //關閉資源
  pw.close();
    }   
}      

常見錯誤:

端口号被占用錯誤 關鍵字8005,8080,8009

解決:找到Tomcat安裝包的位置 D:\java\apache-tomcat-7.0.96\bin 裡面的shutdown.bat 輕按兩下運作 重複啟動Tomcat即可.

如果運作工程通路指定路徑時控制台提示ClassNotFoundException這樣的錯誤,Clean一下工程,作用是讓工程把編譯好的内容删掉重新編譯即可解決.

如何clean:在eclipse菜單欄中Project->clean

404狀态碼,代表找不到資源(資源代表檔案資源或Servlet),檢查路徑是否書寫正确,檢查資源檔案位置是否正确

如果運作工程直接報錯,并且是以彈窗形式報錯,裡面全是英文,并且沒有端口資訊

clean工程:

(1). 在eclipse菜單欄中Project->clean

(2). 在servers面闆中的Tomcat上面右鍵Clean

1

2

如果上面沒有解決繼續往下:

把servers面闆中的Tomcat删除(Tomcat上面右鍵Delete)重新添加(點選servers面闆中出現的超連結 選擇對應的版本添加,添加之後輕按兩下Tomcat 把單選改成中間的儲存),重新添加完Tomcat伺服器後将工程重新運作.

把eclipse關聯的Tomcat删除重新添加

如何删除:window->Preferences->Server->RunTime->找到裡面已經存在的Tomcat從右側Remove,把之前解壓的Tomcat安裝封包件夾删除重新解壓一份.

如何添加:參考前面 如何在eclipse中關聯Tomcat