引入課程和Maven 1.Maven maven中央倉庫:Maven Repository: Search/Browse/Explore (mvnrepository.com) maven倉庫是國外的一個網站,由於網路問題,我們也常使用maven倉庫的鏡像 maven的原理和java程式操作資料庫, ...
引入課程和Maven
1.Maven
maven中央倉庫:Maven Repository: Search/Browse/Explore (mvnrepository.com)
maven倉庫是國外的一個網站,由於網路問題,我們也常使用maven倉庫的鏡像
maven的原理和java程式操作資料庫,然後資料庫返回相關數據類似。
1.1創建maven-web項目
-
先創建一個Maven的Web項目
選擇file-new-project
-
在彈出的視窗中選擇Maven,點擊選擇右邊的create from archetype
-
在下麵選擇maven-archetype-webapp,然後點擊next
-
輸入相關數據,點擊next
-
指定項目使用的maven程式(第一次使用可以先不指定2和3,稍後再指定),點擊finish
-
預設創建的項目結構如下:
-
點擊項目左上角的file-setting,在彈出的視窗中點擊build,execution,deployment,再選擇maven
-
在右邊的maven home path框中,選擇預設的或者你自己下載的maven程式(我這裡選擇預設)
-
在資源管理器中打開該上面的目錄,將conf下的setting.xml文件複製到c盤用戶目錄的m2.目錄下
-
打開複製後的setting.xml文件,找到mirror標簽,註釋掉原來的mirror鏡像
添加新鏡像如下:
<mirror> <id>alimaven</id> <name>aliyun</name> <url>https://maven.aliyun.com/nexus/content/groups/public</url> <mirrorOf>central</mirrorOf> </mirror>
-
返回idea的視窗中,選擇剛纔配置的xml文件和要存儲下載的jar包的目錄,點擊override,點擊ok
這樣就完成了maven的鏡像配置
-
在項目的pom.xml文件中添加配置
在dependency元素中添加配置如下:
<!--引入Servlet.jar--> <!--1.為了開發servlet,需要引入其jar包 2.dependency 表示引入一個包 3.groupId 表示包的開發公司/組織/個人 的信息 javax.servlet 4.artifactId 表示包的項目名稱 javax.servlet-api 補充:groupId+artifactId是以目錄形式體現 5.version 表示該包當前的版本 6.scope 表示引入的包的作用範圍 7.provided 表示 這裡你引入的jar包,在編譯,測試有效,但是在打包發佈的時候,不要帶上這個jar包 (因為Tomcat本身有jar包) 8.下載的包在你指定的目錄中 9.可以去修改我們要下載的目錄位置 10.可以去指定maven倉庫,即配置maven鏡像 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
-
點擊右邊的Maven,點擊迴圈按鈕,開始下載依賴
-
下載完畢後,可以在配置的下載目錄中看到該依賴:
下一次如果要使用依賴,就會先到下載目錄下去找該依賴。
2.測試小案例
編寫如下的測試案例
創建java目錄,存放源文件
創建Servlet(如果選項中沒有Servlet,點擊右邊的maven,重新導一下包)
在web.xml文件中配置Servlet(使用註解也可以)
<servlet>
<servlet-name>CalServlet</servlet-name>
<servlet-class>com.li.servlet.CalServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CalServlet</servlet-name>
<url-pattern>/calServlet</url-pattern>
</servlet-mapping>
編寫程式
WebUtils:
package com.li.utils;
public class WebUtils {
/**
* 將一個字元串數字轉成int,如果轉換失敗,就返回傳入的defaultVal
*
* @param strNum
* @param defaultVal
* @return
*/
public static int parseInt(String strNum, int defaultVal) {
try {
return Integer.parseInt(strNum);
} catch (NumberFormatException e) {
System.out.println(strNum + "輸入的格式錯誤");
}
return defaultVal;
}
}
CalServlet:
package com.li.servlet;
import com.li.utils.WebUtils;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class CalServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收提交的數據進行計算
String strNum1 = request.getParameter("num1");
String strNum2 = request.getParameter("num2");
//把strNum1和strNum2轉成int類型
int num1 = WebUtils.parseInt(strNum1, 0);
int num2 = WebUtils.parseInt(strNum2, 0);
int result = num1 + num2;
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("<h1>" + num1 + "+" + num2 + "=" + result + "</h1>");
writer.flush();
writer.close();
}
}
cal.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>計算器</title>
</head>
<body>
<h1>計算器</h1>
<!--這裡的路徑是瀏覽器要解析的,因此如果寫成/calServlet的話,就會解析成http://主機名/calServlet
想要這樣配置的話,tomcat的路徑就不要寫項目名了-->
<form action="/calServlet" method="post">
num1:<input type="text" name="num1"/><br/>
num2:<input type="text" name="num2"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
配置Tomcat(註意application context的配置)
點擊運行tomcat,在瀏覽器地址欄中輸入:http://localhost:8080/cal.html
,顯示頁面如下:
輸入數據,點擊提交:
2.Tomcat整體項目架構分析
我們創建web項目,都要依賴於Tomcat等web服務以及實現繼承Servlet介面。
可以看出對Tomcat的底層機制和調用到Servlet的流程的理解是十分重要的。
現在我們來模擬Tomcat底層實現,並能調用我們自己設計的Servlet,完成相同的功能。
說明:Tomcat有三種運行模式(BIO,NIO,APR),因為核心講解的是Tomcat如何接受客戶端請求,解析請求,調用Servlet,並返回結果的流程機制,因此採用BIO線程模型來模擬。
整個流程如下:
- 瀏覽器在地址欄輸入請求的URL,發送http請求
- http請求到達Tomcat後,底層的socket網路編程會接收這個請求,創建一個線程(每一個請求對應一個線程)
- 被創建的線程就會去解析這個URL是什麼請求,如果是請求Servlet資源,就去調用Servlet(底層會用反射實例化);如果調用的是靜態資源,就直接返回