servlet: 用java語言開發網頁動態資源的技術。html
servlet特色:java
1)servlet就是一個普通的java類,繼承HttpServlet類web
2)一個普通的java類實現了Servlet接口,也叫Servlet程序。咱們一般繼承HttpServlet是爲了建立一個基於http協議的servlet程序。瀏覽器
3)servlet程序交給tomcat服務器運行!!!tomcat
1)編寫java類,繼承HttpServlet安全
2)servlet程序交給tomcat服務器運行服務器
A 把servlet的class字節碼拷貝到WEB-INF/classes目錄下session
B 在web.xml文件中配置多線程
前提: tomcat服務器啓動時,會加載%conf%/web.xml文件。而後再加載站點下的每一個web應用的web.xml文件。併發
瀏覽器輸入: http://localhost:8080/day8/first
http:// http協議
1)本地hosts文件查詢域名和ip的映射
2)找不到,聯網到運營商的DNS服務器找域名和ip的映射
8080 端口 tomcat:8080
/day8 站點下的web應用名稱
/first 資源名稱。截取到/first 字符串
1)在day8應用下的web.xml文件中查找是否存在匹配的url-pattern
2)使用servlet的內部名稱在web.xml文件中查找是否存在相同名稱的servlet配置
3)獲得對應的servlet-class內容。
經過反射構造FirstServlet對象,調用方法(doGet.......)
輸出內容到瀏覽器,看到效果!!!
url-pattern: 表示servlet的路徑映射,也叫servlet訪問名稱。
url-patttern 瀏覽器輸入URL
精確匹配
/demo1 http://localhost:8080/day8/demo1
/test/demo1 http://localhost:8080/day8/test/demo1
模糊匹配
/* http://localhost:8080/day8/任意路徑
/itcast/* http://localhost:8080/day8/test/任意路徑
*.後綴 http://localhost:8080/day8/任意路徑.後綴
(*.do *.action *.jsf *.html)
注意:
1)url-pattern要麼以/開頭,要麼以*開頭 例如: itcast/demo1錯誤寫法。
2)不能同時使用兩種模糊匹配。例如: /itcast/*.html 錯誤寫法
3)當多個url-pattern同時符合匹配規則,那麼
A 精確匹配的url-pattern會優先被執行。
B 後綴名結尾的模糊匹配的url-pattern優先級最低!!!
/ : 表示servlet的缺省路徑。
在tomcat服務器中配置了一個DefaultServlet,叫默認Servlet,該默認Servlet的url-pattern就是/ 。默認Servlet的做用,用於解析web應用下的靜態資源。
問題: 瀏覽器輸入一個資源名稱時,查找資源的順序是如何?
1)首先,在當前web應用下的web.xml文件中查找是否有匹配的url-pattern
2)若是匹配到,執行對應的servlet(動態資源)
3)若是沒有匹配到,就交給tomcat服務器的默認Servlet去處理
4)默認Servlet會到當前web應用下讀取對應名稱的靜態資源文件。
5)若是讀到對應的靜態資源文件,那麼就把內容返回給瀏覽器
6)若是讀不到對應的靜態資源文件,那麼就返回404的錯誤頁面。
結論: 先找動態資源,再找靜態資源!!!!
之前:之前的程序,java類,本身去new對象,本身去使用對象調用。
如今: sevlet程序。servlet的生命週期由tomcat服務器控制的。
servlet何時對象建立,什麼銷燬,何時調用什麼方法???
構造方法: 在建立servlet對象時調用。只調用1次。
證實servlet對象在tomcat服務器中是單實例的。
init方法:在建立完servlet對象後調用。只調用1次。
service方法: 在每次請求servlet時調用。調用n次。
destroy方法: servlet對象銷燬時調用。只調用1次。tomcat服務器中止或web應用從新部署時調用
默認狀況下,第一次訪問servlet時建立servlet對象。建立對象的過程當中會調用構造方法和inti方法。若是init方法的業務邏輯須要消耗比較長的時間,用戶的第一次訪問servlet時須要等待較長的時間。
改變servlet對象建立的時機: tomcat服務器啓動的時候建立servlet對象。
<!-- 正整數:數值越大,建立對象的優先級越低 -->
<load-on-startup>1</load-on-startup>
servlet對象特色: 在tomcat服務器中是單實例多線程的!!!
多個線程同時操做了Servlet的成員變量(共享數據)。
1)儘可能不要在servlet類中使用成員變量。
2)若是要使用成員變量,那麼就要給使用到成員變量的代碼塊加上代碼鎖,儘可能縮小同步鎖的範圍,以免由於同步產生代碼併發執行效率下降的問題。
在GenericServlet中,有兩個init方法。
有參數的init方法:該方法是servlet的四個生命週期方法中的一個。由tomcat服務器默認調用的初始化方法。在GenericServlet的實現中,該方法會調用無參數的init方法。
無參數的init方法:該方法的是Sun公司設計出來用於給開發者去覆蓋,用於實現初始化邏輯的方法。
結論: 若是要編寫servlet的初始化邏輯,只須要覆蓋無參數的init方法便可!!!!
Servlet中重要對象:
1)HttpServletRequest對象:封裝請求信息
2)HttpServletResponse對象:封裝響應信息
3)ServletConfig對象: 封裝一個servlet配置參數信息
4)ServletContext對象: 封裝web應用環境信息
ServletConfig對象是在建立完servlet對象以後,被建立出來。而後經過有參數的init方法傳遞到servlet中。
ServetConfig對象主要用於加載servlet配置參數信息。
getInitParameter(String name) --獲得參數
getInitParameterNames()
ServletContext getServletContext() 獲得servlet上下文對象
getServletName() 獲得servlet名稱
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class> ConfigDemo</servlet-class>
<!-- 配置servlet參數 -->
<init-param>
<param-name>path</param-name>
<param-value>e:/bbs.txt</param-value>
</init-param>
<init-param>
<param-name>BBB</param-name>
<param-value>BBB's value</param-value>
</init-param>
</servlet>
注意: servlet的配置參數只對當前servlet有效的!!對其餘servlet是無效的!!
ServletContext叫Servlet上下文對象,該對象表示當前的web應用環境信息。一個web應用只會建立一個ServletContext對象。
ServletContext對象是在tomcat服務器加載完當前web應用後建立出來。ServletContext對象是做爲ServletConfig對象成員變量傳入servlet中。經過ServletConfig的getServletContext()方法獲得ServletContext對象。
獲得web應用的上下文路徑
getContextPath()
獲得web應用的全局參數(全部servlet有效的!!)
getInitParameter(java.lang.String name)
getInitParameterNames()
域對象相關的方法(對比request域與context域)
setAttribute(String name, Object object)保存數據
getAttribute(String name) 獲得數據
removeAttribute(String name) 清除數據
Request轉發相關的
RequestDispatcher getRequestDispatcher(String path)
Response重定向
SendRedirect(string path)
web應用讀取資源文件
getRealPath(String path)
"/WEB-INF/classes/news.properties"
getResourceAsStream(String path)
getContextPath() 獲得web應用上下路徑。也就是部署到tomcat服務器上運行的web應用名稱。
getInitParameter(String name)
getInitParameterNames()
<!-- 配置web應用全局的參數 -->
<context-param>
<param-name>AAA</param-name>
<param-value>AAA's value</param-value>
</context-param>
<context-param>
<param-name>BBB</param-name>
<param-value>BBB's value</param-value>
</context-param>
注意:
全局參數對當前web應用下的全部servlet都有效的!!!
ServetContext對象是一個域對象!!!
域對象的做用: 主要用於保存數據和獲取數據,用於在web應用中不一樣資源之間共享數據。
Servlet1
response.sendRedirect(context.getContextPath+"/Servlet2?name=eric");
Servlet2
request.getParameter("name");
1)參數形式:只能傳遞字符串數據
2)使用域對象形式:
在Servlet1中保存數據
在Servlet2中獲取數據
域對象相關的方法:
setAttribute(String name, Object object) 保存數據
getAttribute(String name) 獲得數據
removeAttribute(String name) 清除數據
ServletContext域做用範圍:
在當前的web應用中有效!!!
Servlet中全部域對象:
HttpServletRequest對象: request域
ServletContext對象: context域
HttpSession對象: session域
Jsp中域對象:
PageContext對象: page域
getRequestDispatcher(String path)
在servlet中實現頁面跳轉
請求重定向: response.sendRedirect(路徑);
請求轉發: request.getRequestDispacher(路徑).forward(request,respone);
=======請求重定向 vs 請求轉發 區別====
請求重定向:
1)地址欄改變,改變爲重定向到地址
2)能夠重定向到當前web應用,其餘web應用,甚至是其餘站點資源。
3)處於兩次不一樣的請求。不可使用request域對象來共享數據。
請求轉發:
1)地址欄不會改變。
2)只能轉發到當前web應用內部資源。
3)處於同一次請求。可使用request域對象來共享數據不一樣類型資源:
1)web應用內部資源。在當前web應用中的資源
2)其餘web應用資源。在同一個站點下的其餘web應用的資源。
3)站點外的資源。其餘站點下的資源。
自定義servlet模板
https://www.cnblogs.com/ms-grf/p/7206196.html
package ${enclosing_package}; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = { "/${primary_type_name}" }) public class ${primary_type_name} extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); response.getWriter().append("Served at: "); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }