Servlet+Maven建立Javaweb專案,部署到Tomcat上
阿新 • • 發佈:2021-06-27
1. Servlet簡介
- Servlet是sun公司開發的動態web的一項技術
- Sun在API中提供一個介面叫做:Servlet,開發一個Servlet程式需要完成兩個小步驟:
- 編寫一個類,實現servlet介面;
- 把開發好的Java類部署到web伺服器上。
把實現了Servlet介面的Java程式叫做,Servlet
2. 編寫HelloServlet程式
Serlvet介面Sun公司有兩個預設的實現類:HttpServlet,GenericServlet
2.1 構建一個普通的Maven專案,刪掉裡面的src目錄,在這個專案裡面建立Moudel(模組),這個空的工程就是Maven主工程;
2.2 在Maven父子工程中,父專案的pom.xml中自動生成
<modules>
<module>servlet-01</module>
<module>servlet-02</module>
</modules>
//告訴編譯器,在讀取主pom時,去找兩個子pom
2.3 Maven環境優化
- 修改web.xml為最新(去tomca資料夾下的webapps下去取);
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> </web-app>
- 將maven結構搭建完整,,main下建java資料夾,resources資料夾
2.4 編寫一個Servlet程式
- 編寫一個普通類
- 實現Servlet介面,這裡我們直接繼承HttpServlet(HttpServlet實現了Servlet介面)
public class HelloServlet extends HttpServlet { //get post只是請求實現的不同方式,所有這裡兩個豐富可以相互呼叫,業務邏輯是相同的 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doget"); PrintWriter writer = resp.getWriter();//響應流 writer.print("hello,servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
2.5 編寫Servlet的對映
為什麼需要對映?
我們寫的是Java程式,但是需要通過瀏覽器訪問,而瀏覽器需要連線web伺服器,所以我們需要在web服務中註冊我們寫的Servlet(web.xml中註冊),還需要給它一個瀏覽器能夠訪問的路徑;
<!--註冊Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>cn.zafu.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的請求路徑-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.6 配置Tomcat
注意配置專案釋出路徑即可。
2.7 啟動專案
啟動後通過請求路徑訪問程式。
3. Servlet原理
Servlet是由Web伺服器呼叫的,web伺服器收到瀏覽器請求後:
4. Mapping問題
- 一個Servlet可以指定一個對映路徑
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 一個Servlet可以指定多個對映路徑
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello4</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello5</url-pattern>
</servlet-mapping>
- 一個Servlet可以指定通用對映路徑
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
- 預設請求路徑
<!--預設請求路徑-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
- 指定一些字尾或者字首等等….
<!--可以自定義字尾實現請求對映
注意點,*前面不能加專案對映的路徑
hello/sajdlkajda.qinjiang
-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.cxd</url-pattern>
</servlet-mapping>
- 優先順序問題
指定了固有的對映路徑優先順序最高,如果找不到就會走預設的處理請求;
<!--404-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>cn.zafu.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>