Servlet 新手村引入-編寫一個簡單的servlet項目
文章目錄
- Servlet 新手村引入-編寫一個簡單的servlet項目
- 一、編寫一個 Hello world 項目
- 1.創建項目
- 2.引入依賴
- 3.手動創建一些必要的目錄/文件
- 4.編寫代碼
- 5.打包程序
- 6.部署
- 7.驗證程序
- 二、更方便的處理方案(插件引入)
- 1.引入插件
- 2.配置插件
- 3.問題分析
上篇博客講到, Tomcat 提供了一些列的 api 接口,這些 api 背后已經把一些基礎工作做好了。Tomcat 把這組 api 起了個名字,稱為 Servlet。
Java 程序員,只需要調用上述 api,通過少量的代碼,就可以完成基本的 http服務器的核心功能。
相比于上篇 Tomcat 中講到的 靜態頁面,Servlet 主要的解決的問題,就是為了實現 動態頁面。
下面我們就通過 Java 來編寫一個最簡單的 servlet 的 Hello World 程序。
一、編寫一個 Hello world 項目
1.創建項目
創建一個 Maven 項目。Maven 是 java 中一個常用的“構建工具”,一個程序在編寫過程中,往往需要涉及到一些第三方庫的依賴,另外還需要針對這個寫好的程序進行打包部署。
Maven 存在的意義,就是為了能夠方便的進行依賴管理和打包。
觀察創建好項目。
2.引入依賴
當前代碼要使用 Servlet 開發,而 Servlet 并不是 Java 標準庫自帶的。就需要讓 Maven 能夠把 Servlet 的依賴給獲取過來。需要先找到 maven 中央倉庫。在中央倉庫中找到 Java Servlt API.
Maven 中央倉庫地址(點擊跳轉)
Java Servlet API 有很多個版本,具體要選擇哪個版本是和 Tomcat 的版本,有對應關系的。Tomcat 使用 8,Servlet 就是3.1 如果不匹配,就可能出現問題。
這段代碼就是 Maven 倉庫中版本為 3.1.0 的坐標
把依賴引入
首次使用,是最慢的。后面就快了(首次使用需要加載不少的依賴),下載的過程是需要時間的。
3.手動創建一些必要的目錄/文件
Tomcat 對于 Servlet項目,是有一些額外的要求的。Maven 是一個通用的工具,可以管理的不僅僅是Servlet項目,還可以管理其他的項目。在這個基礎上,再按照Servlet項目的要求,創建出一些特定的目錄和文件。
web.xml 里,還需要寫一些內容,不能是空著的。這里的內容是固定的內容,不需要咱們去背下來,只需要從別的項目中復制粘貼過來即可。下列代碼就可以直接放到 web.xml 中。
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name>
</web-app>(第三行代碼可能是標紅的,對于 idea 來說,只能保證針對java程序的提示是準確的。其他的文件,提示,僅供參考!!! 如果實在覺得難受可以 alt+enter ,把這個問題處理一下,fetch 忽略掉 ignore)
4.編寫代碼
在 java 目錄中創建一個類 HelloServlet,代碼如下:
//這個注解,就把當前這個Servlet類,和一個請求的路徑關聯起來了(配置路由)
@WebServlet("/hello")
//繼承是為了重寫這個父類中的方法。
public class HelloServlet extends HttpServlet {@Override//調用父類doGet,這個方法不需要手動調用,doGet本質上也是一個“回調函數”,方法寫好后,就會交給Tomcatprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//下列代碼一定要刪掉,否則就會出現問題。//super.doGet(req,resp);//是在服務器日志中產生的 (tomcat)System.out.println("Hello World");//想要把hello world 返回給客戶端,還需要進一步的使用下列代碼。//resp是未初始化過的響應對象,doGet的目的就是把這個對象給設置好。通過getwriter得到resp里面內置的輸出流對象(Writer字符流),最后使用 write方法,就可以把一個字符串寫入到resp對象中。把數據寫入到了 HTTP 響應的body中。resp.getWriter().write("hello world");}
}
總之,doGet 做的事,就是根據請求計算響應。
前面寫 echo server 的時候,一個服務器,典型的工作流程,就是三步:
- 讀取請求并解析
- 根據請求計算響應
- 把響應寫回到客戶端
這個過程體現了服務器的業務邏輯,1 3都是相對固定的操作。而在 Servlet 這塊,1 3 都是Tomcat 幫我們完成的。咱們寫代碼只需要關注 2。也就是doGet要完成的工作。
5.打包程序
因為咱們的程序是放到 Tomcat 上運行,就需要對于程序進行打包。達成一個 Tomcat 能識別的包的格式,此時代碼才會被 Tomcat 給加載起來。
打包也是借助 maven 來完成的。打開 maven 窗口(一般在 IDEA 右側就可以看到 Maven 窗口,如果看不到的話,可以通過 菜單-View-Tool Window-Maven 打開),然后展開Lifecycle,雙擊 package 即可進行打包。
如果看到 BUILD SUCCESS 字樣,說明打包成功了。
這就是通過 maven 打包生成的內容。在 maven 中,默認打包生成的是jar包。(常用的 java 的打包方式,jar 里面就是一些 .class文件)但是Tomcat需要的并非是 jar 包,而是 war 包。
war包本質上和 jar 包差不多,這里會包含一些前端的代碼(html,css,js),以及一些 tomcat 的配置(web.xml)
此處需要修改 pom.xml,在這里添加一個 標簽。(的子標簽,層次結構不要搞錯)
這個東西描述了打的包的名字是啥。(不是必須的,同樣是的子標簽)
此時再次進行打包,文件中就會生成如下war文件。
6.部署
啟動 tomcat ,將寫好的 war 包,放到 tomcat 上。具體來說,就是把這個 war 包拷貝到 tomcat 的 webapps 目錄中。
發現新的war包,對war包進行部署操作。
7.驗證程序
通過瀏覽器發起 http get 請求,觸發剛才 servlet 的代碼。
127.0.0.1:8080/java_hello/hello
- 通過 第一級 路徑,確定一個 webapp
- 通過 第二級 路徑,確定哪個 servlet
- 通過 方法,確定執行 servlet 中的哪個方法
問題1:在你檢查了所有代碼都是正確的,但是最后利用瀏覽器發起請求的時候,出現加載不出來的情況。
之所以出現這個情況,是 cmd 在搞鬼!!比如你選中了 cmd 中的某個內容,cmd 就會進入“復制”模式,此時按下 enter 就是完成復制。
進入復制模式的過程中,cmd 就會把正在運行的進程給阻塞掉。
問題2:針對上述 7 步操作,能否簡化一下?
也是有辦法的!后續學習的 Spring 就是做出了簡化后的效果。
二、更方便的處理方案(插件引入)
1.引入插件
手動拷貝 war 包到 Tomcat 的過程比較麻煩。我們還有更方便的方法。
此處我們使用 IDEA 中的 Smart Tomcat
插件完成這個工作。
理解“插件”
插件會提升我們軟件的可修改性、可維護性、可移植性。
插件就是對程序的一些特定場景,做出一些特定的功能的擴展
同學們可能會出現 插件市場 加載不出來的情況,也可以去官網下載,手動安裝。下載之后,會得到一個 jar 包,把這個 jar 包拖到 idea 的界面上,就能安裝插件。
2.配置插件
一個項目中,第一次使用 smart tomcat 需要簡單配置一下。配置一次之后,后續就不需要配置了。
出現問題:當我們配置完插件后啟動程序,會發現端口號已被占用,這是因為咱們之前啟動了 Tomcat,之前的 Tomcat 已經占用了 8080。一個端口號只能被一個進程綁定,解決方法就是把之前的 tomcat 關閉,再啟動此程序。
3.問題分析
-
404 瀏覽器要訪問的資源,在服務器上不存在。
-
檢查你的請求路徑,和你服務器這邊的配置,是否一致。
-
確認你的 webapp 是否被正確加載。
smart tomcat 由于只是加載你這一個 webapp。如果加載失敗,就會直接啟動失敗!!我們要學會觀察日志,觀察是否有“部署成功”。
-
-
405
- 寫的 doXX 方法,和請求發起的方法,不匹配。瀏覽器發 Get 請求,服務器代碼寫的是 doPost。
- 發的是 Get 請求,服務器寫的也是Get請求,但是沒有把 super.doPost 給刪了。
-
505 服務器內部錯誤,代碼中拋出異常了。出現 500 后一定要仔細觀察異常調用棧
-
出現空白頁
往往就是沒有執行 getWriter().write 方法
-
無法訪問此網站
這種情況,要么是 tomcat 服務器,沒有正確運行。要么就是 ip 或者 端口號 編寫的不對!!
感謝觀看,下期繼續分享 servlet 相關知識!!