2018.5.02
web應用目錄結構
|--webroot web項目/應用的根目錄(這個名字沒有中文)
|- 靜態資源 (HTML css javascript img veido audio)
|- WEB-INF: [固定寫法]
|-classes:存放二進制字節碼文件的目錄 放入.class文件【固定寫法,可選】
|-lib:存放當前 WEB項目運行需要的JAR包【固定寫法,可選】
|-web.xml 非常重要【現在非常重要】
注意事項:
1.WEB-INF目錄下的內容不能通過瀏覽器目錄方式訪問。
2.如果需要訪問WEB-INF裏面的資源內容,需要配置web.xml
1.Servlt入門
暫時不要研究源代碼 手動創建一個servlet
1.1什麼是Servlet?
前提 靜態資源和動態資源的區別(源代碼有無變化)
靜態資源:
用戶在多次訪問的情況下,但是每一次頁面的源代碼沒有發生任何的改變。
動態資源:
用戶在每一次訪問申請到的頁面源代碼都是不一樣的
Servlt是java語言實現動態資源的開發技術
要求:
1.Servlet程序只能在Tomcat服務器上運行。【記住】
2.Servlet其實是一個非常普通的類,只不過集成了HttpServlet,覆蓋了doGet和doPost方法。
1.2 手動書寫一個Servlet程序
1.定義一個類,要求繼承HttpServlet
HttpServlet並不存在當前使用的JDK1.8中,Servlet程序要交給Tomcat運行的,所以
Tomcat是支持HttpServlet,那麼在 Tomcat下必須有HttpServlet當前整個代碼
在Tomcat安裝路徑/lib/servlet-api.jar
把servlet-api.jar 複製到當前的項目目錄下,添加到工作路徑中add path
2.書寫Servlet程序
HttpServletRequest servlet請求
HttpServletResponse servlet響應
使用響應給瀏覽器發送數據
設置響應在瀏覽器上展示的方式和編碼集 使用HTML展示,字符集爲utf-8
resp.setContentType("text/html;charset=utf-8");
PrintWrite resp.getWriter(); 專門用來給瀏覽器寫入數據的對象。 基於IO流的
3.執行Servlet程序
這裏servlet程序不能再交給Eclipse執行了,而是要在Tomcat服務器上執行Servlet程序
在Tomcat服務器軟件根目錄下webApps中創建一個web項目文件夾,要按照Web項目要求創建。
找到當前Servelet程序的class文件,要把這個文件放入到class文件中
【注意】
要求放入的class文件要帶有完整的包名
在WEB-INF文件
|--day39
|- WEB-INF: [固定寫法]
|-classes: 存放二進制字節碼文件的目錄 放入.class文件【固定寫法,可選】
|-web.xml 按照Servlet程序的規範書寫XML文件
4.web.xml文件中的內容
<?xml version = "1.0" encoding = "utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<!-- servlet的內部名稱 這個名字可以自定義-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet的class文件,這裏要求是完整的類名 包名.類名-->
<servlet-class>包名+類名</servlet-class>
</servlet>
<servlet-mapping>
<!-- servlet的名字 要求和上面的名字一模一樣-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet的訪問名稱:http://localhost:8080/mywebs/訪問名-->
<url-pattern>/hello</url-pattern>//專門用來匹配瀏覽器中輸入的內容
</servlet-mapping>
</web-app>
servlet映射路徑
Tomcat服務器啓動之後
http://localhost:8080/day40/TestHttp
web.xml的配置文件
<servlet>
<!-- 自定義的名字-->
<servlet-name>TestHttp</servlet-name>
<!-- Servlet程序的完整的包名.類名-->
<servlet-class>com.bitware.http.TestHttp</servlet-class>
</servlet>
<servlet-mapping>
<!--要求和上面name一致-->
<servlet-name>TestHttp</servlet-name>
<!--映射路徑-->
<url-pattern>/TestHttp</url-pattern>
</servlet-mapping>
瀏覽器訪問服務器的URL分析
1.瀏覽器根據輸入的URL來訪問Tomcat服務器 http://localhost:8080
2./day40 訪問在Tomcat服務器下webapps裏面的day40項目文件夾
3./TestHttp 用來匹配在[WEB-INF]下的web.xml文件裏面的url-pattern
/TestHttp稱之爲 映射路徑
映射的流程:
1.在[WEB-INF]下的web.xml文件中匹配url-pattern
2.匹配到就可以獲取<servlet-mapping>,可以找到<servlet-name>標籤內容,獲取servlet-name
3.通過匹配<servlet-name>找到<servlet>,也就可以獲取到<servlet-class>標籤內容
在這個標籤中寶包含了servlet程序運行需要執行的.class文件
4.通過這個包名.類名就可以加載這個.class(字節碼文件),運行servlet程序,這裏
用到的就是[反射]的思想。
url-patter 匹配形式:
精確匹配:
url-pattern規定的是寫什麼樣的匹配,就在URL中些什麼
例如:
/TestHttp 在瀏覽器中只能輸入:
http://localhost:8080/day40/TestHttp
/TestHttp/hi 在瀏覽器中只能輸入:
http://localhost:8080/day40/TestHttp/hi
一個字符都不能差,負責404.
模糊匹配:
/* http://localhost:8080/day40/任意內容 都可以訪問當前servlet程序
*.do http://localhost:8080/day40/任意內容.do結尾都可以訪問當前servlet程序
*.html(僞靜態) http://localhost:8080/day40/任意內容.html
*.action
*.jsp
注意事項:
1.模糊匹配不能同時使用\和* 不允許
2.如果同時存在模糊匹配和精確匹配,精確匹配的優先級更高
3.使用後綴名的迷糊匹配優先級最低。
4.要求所有的Servlet的url-pattern都不能爲/,不允許和Tomcat默認servlet衝突
Tomcat默認的servlet程序【缺省】 ----defaultServlet 最終的保障機制
在URL中輸入
Http://localhost:8080/day40/
流程:
1.在day40的項目目錄下的【WEB-INF】裏面的web.xml中匹配url-pattern爲 / 的標籤 【精確匹配】
2.如果沒有匹配到這個 / 映射路徑,這個時候tomcat會把這個映射路徑交給 在Tomcat中默認的servlet程序中
,DefaultServlet
3.DefaultServlet會首先在day40的項目目錄下找有沒有對應的index.**文件
這裏可以支持 index.html index.jsp
4.如果有,將對應的index.html發送給瀏覽器
如果沒有,報狀態碼404,跳轉到默認的404頁面