Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议
創(chuàng)建項目
新建項目
Java Enterprise
JDK1.8
Web Application
Tomcat
JAVA
默認(rèn)
過程需要聯(lián)網(wǎng)
Maven的配置
IDEA內(nèi)置Maven
修改本地倉庫位置,因為以后會越來越大
替換配置文件:
阿里云鏡像下載
Servlet基礎(chǔ)
1.動態(tài)Web資源開發(fā)
2.Servlet是使用Java語言編寫的運行在服務(wù)器端的程序,Servlet由Servlet容器提供,所謂的Servlet容器是指提供了Servlet 功能的服務(wù)器(本書中指Tomcat),Servlet容器將Servlet動態(tài)的加載到服務(wù)器上。
3.Servlet是指任何實現(xiàn)了這個Servlet接口的類,Servlet主要用于處理客戶端傳來的HTTP請求,并返回一個響應(yīng),它能夠處理的請求有doGet()和doPost()等方法。
請求靜態(tài)資源(圖片,文檔等):讀出來后直接返回響應(yīng)
請求Servlet:
Servlet的請求首先會被HTTP服務(wù)器接收,HTTP服務(wù)器只負(fù)責(zé)靜態(tài)HTML頁面的解析,對于Servlet的請求轉(zhuǎn)交給Servlet容器,Servlet容器會根據(jù)web.xml文件中的映射關(guān)系,調(diào)用相應(yīng)的Servlet,Servlet將處理的結(jié)果返回給Servlet容器,并通過HTTP服務(wù)器將響應(yīng)傳輸給客戶端。
Servlet容器:一段內(nèi)存空間
Servlet技術(shù)特點
Servlet技術(shù)具有如下特點:
1.方便:Servlet提供了大量的實用工具例程,如處理很難完成的HTML表單數(shù)據(jù)、讀取和設(shè)置HTTP頭,以及處理Cookie和跟蹤會話等。
2.跨平臺:Servlet用Java類編寫,可以在不同操作系統(tǒng)平臺和不同應(yīng)用服務(wù)器平臺下運行。
3.靈活性和可擴展性:采用Servlet開發(fā)的Web應(yīng)用程序,由于Java類的繼承性及構(gòu)造函數(shù)等特點,使得應(yīng)用靈活,可隨意擴展。
4.除了上述幾點外,Servlet還具有功能強大、能夠在各個程序之間共享數(shù)據(jù)、安全性強等特點。
抽象類與接口
抽象類與接口:抽象類只能單繼承,接口可以多繼承。
相同點
(1)都不能被實例化
(2)接口的實現(xiàn)類或抽象類的子類都只有實現(xiàn)了接口或抽象類中的方法后才能實例化。
不同點
(1)接口只有定義,不能有方法的實現(xiàn),java 1.8中可以定義default方法體,而抽象類可以有定義與實現(xiàn),方法可在抽象類中實現(xiàn)。
(2)實現(xiàn)接口的關(guān)鍵字為implements,繼承抽象類的關(guān)鍵字為extends。一個類可以實現(xiàn)多個接口,但一個類只能繼承一個抽象類。所以,使用接口可以間接地實現(xiàn)多重繼承。
(3)接口強調(diào)特定功能的實現(xiàn),而抽象類強調(diào)所屬關(guān)系。
(4)接口成員變量默認(rèn)為public static final,必須賦初值,不能被修改;其所有的成員方法都是public、abstract的。抽象類中成員變量默認(rèn)default,可在子類中被重新定義,也可被重新賦值;抽象方法被abstract修飾,不能被private、static、synchronized和native等修飾,必須以分號結(jié)尾,不帶花括號。
Servlet抽象方法
SUN公司提供了一系列接口和類,其中最重要的接口是javax.servlet.Servlet。在Servlet接口中定義了5個抽象方法
1.servlet生命周期:由servlet容器自動調(diào)用,所以返回值為void
init(),service(),destory()
2.servletCofig():一個servlet類對應(yīng)一個servlet實例,有一個servletCofig(),所以每個servletCofig()都不同
3.void service():servletRequest請求對象,serveltResponse()請求響應(yīng)
其中init()、service()和destroy()這三個方法可以表現(xiàn)Servlet的生命周期,它們會在某個特定的時刻被調(diào)用。另外,getServletInfo()方法用于返回Servlet的相關(guān)信息。getServletConfig()方法用于返回ServletConfig對象,該對象包含Servlet的初始化信息。需要注意的是,表中提及的Servlet容器指的是Web服務(wù)器。
service()被具體化為其他不同需要的調(diào)用方法,如GenericServlet(),HttpServlet()
servlet接口實現(xiàn)類
針對Servlet的接口,SUN公司提供了兩個默認(rèn)的接口實現(xiàn)類:GenericServlet和HttpServlet。
GenericServlet是一個抽象類,該類為Servlet接口提供了部分實現(xiàn),它并沒有實現(xiàn)HTTP請求處理。
HttpServlet是GenericServlet的子類,它繼承了GenericServlet的所有方法,并且為HTTP請求中的POST、GET等類型【總共8種,常用兩種】提供了具體的操作方法。【編程直接使用!! !】
HttpServlet的常用方法及其說明如下表所示:
HttpServlet示例:
IDEA中創(chuàng)建Servlet
1.新建servlet:
new-servlet
2.
虛擬地址映射,java servlet–》URL
1)基于注解的方式
2)使用webapp-WEB-INF-web.xml中配置,[xml文件方式]
注意:使用新建servlet的方式,會在web.xml中創(chuàng)建servlet
3.寫好之后,啟動Tomcat
http://localhost:端口號/當(dāng)前工程根路徑/
http://localhost:8082/WebServletProject_war_exploded/
要訪問的具體servlet:
http://localhost:8082/WebServletProject_war_exploded/servlet_1
http://localhost:端口號/當(dāng)前工程根路徑/value的值
修改樣式后要重啟Tomcat
報錯:servlet不能映射為一個url模式
Caused by: java.lang.IllegalArgumentException: 名為 [servlet_2]和 [Servlet_1] 的servlet不能映射為一個url模式(url-pattern) [/servle]
注意:注解配置的value和web.xml中的配置
啟動程序時自動加載Servlet程序
適用于數(shù)據(jù)庫servlet加載
web.xml代碼:
servlet請求的分發(fā)處理-get()和post()
get_post.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <!--get方法--> <form action="http://localhost:8082/WebServletProject_war_exploded/servlet_2" method="get"><input type="submit"> </form> <!--post方法--> <form action="http://localhost:8082/WebServletProject_war_exploded/servlet_2" method="post"><input type="submit"> </form> </body> </html>Servlet_2.java:
@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("3.訪問");//類型轉(zhuǎn)換,使用ServletRequest 子類 HttpServletRequest的getMethod()方法HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;//獲取請求的方式:GET POSTString method = httpServletRequest.getMethod();//打印System.out.println(method);if (method.equals("GET")) {System.out.println("get方式");} else if (method.equals("POST")) {System.out.println("post方式");}}使用:
通過繼承HttpServlet實現(xiàn)Servlet程序
案例:
package nsu.edu.cn.WebServletProject;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException;// value = "/servlet_1"[類名,首字母小寫]--URL路徑 // name不重要,可以省略value【默認(rèn)】,如:@WebServlet("/servlet_1") @WebServlet(name = "Servlet_1", value = "/servlet_1") //響應(yīng)實體內(nèi)容-展示在客戶端,所有的響應(yīng)使用HttpServletResponse response //獲取用戶請求--HttpServletRequest request public class Servlet_1 extends HttpServlet {//用戶敲回車--是get方式@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//輸出一個字符串//response.getWriter().write("hello world!");// html5標(biāo)簽response.getWriter().write("<h2>hello world!!!!!!!</h2>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//調(diào)用dogGet,在post時也輸出字符串doGet(request, response);} } //虛擬地址映射,java servlet--》URL //1.基于注解的方式 //2.使用webapp-WEB-INF-web.xml中配置Servlet常見錯誤
Servlet-url定位servlet程序訪問
servlet生命周期
將Servlet的生命周期分為三個階段,分別是初始化階段、運行階段和銷毀階段。
第一次訪問,才會創(chuàng)建實例和初始化【3,4】
如果不是第一次訪問,則沒有3,4步驟
ServletConfig使用1:
在Tomcat運行時,可以把工程移除;但服務(wù)器沒關(guān)閉,工程一直在容器中
1.初始化階段
當(dāng)客戶端向Servlet容器發(fā)出HTTP請求要求訪問Servlet時,Servlet容器首先會解析請求,檢查內(nèi)存中是否已經(jīng)有了該Servlet對象,如果有直接使用該Servlet對象,如果沒有就創(chuàng)建Servlet實例對象,然后通過調(diào)用init()方法實現(xiàn)Servlet的初始化工作。需要注意的是,在Servlet的整個生命周期內(nèi),它的init()方法只被調(diào)用一次。
2.運行階段
這是Servlet生命周期中最重要的階段,在這個階段,Servlet容器會為這個請求創(chuàng)建代表HTTP請求的ServletRequest對象和代表HTTP響應(yīng)的ServletResponse對象,然后將它們作為參數(shù)傳遞給Servlet的service()方法。service()方法從ServletRequest對象中獲得客戶請求信息并處理該請求,通過ServletResponse對象生成響應(yīng)結(jié)果。在Servlet的整個生命周期內(nèi),對于Servlet的每一次訪問請求,Servlet容器都會調(diào)用一次Servlet的service()方法,并且創(chuàng)建新的ServletRequest和ServletResponse對象,也就是說,service()方法在Servlet的整個生命周期中會被調(diào)用多次。
3.銷毀階段
當(dāng)服務(wù)器關(guān)閉或web應(yīng)用被移除出容器時,Servlet隨著web應(yīng)用的銷毀而銷毀。在銷毀Servlet之前,Servlet容器會調(diào)用Servlet的destroy()方法,以便讓Servlet對象釋放它所占用的資源。在Servlet的整個生命周期中,destroy()方法也只被調(diào)用一次。需要注意的是,Servlet對象一旦創(chuàng)建就會駐留在內(nèi)存中等待客戶端的訪問,直到服務(wù)器關(guān)閉,或web應(yīng)用被移除出容器時Servlet對象才會銷毀。
Servlet類的繼承體系
ServletConfig類的使用
在Servlet運行期間,經(jīng)常需要一些輔助信息,例如,文件使用的編碼、使用Servlet程序的共享等,這些信息可以在web.xml文件中使用一個或多個<init-param>元素進(jìn)行配置。
當(dāng)Tomcat初始化一個Servlet時,會將該Servlet的配置信息封裝到一個ServletConfig對象中,通過調(diào)用init(ServletConfig config)方法將ServletConfig對象傳遞給Servlet。
ServletConfig類的方法:
web.xml代碼:
java代碼:
@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("2.初始化");//1.獲取servlet程序的別名servlet-name的值: <servlet-name>servlet_1</servlet-name>System.out.println("別名:"+servletConfig.getServletName()); //2.獲取初始化參數(shù)init-param <init-param>中的參數(shù)名和參數(shù)值System.out.println("參數(shù):"+servletConfig.getInitParameter("username"));System.out.println("參數(shù):"+servletConfig.getInitParameter("userport"));System.out.println("參數(shù):"+servletConfig.getInitParameterNames());//3.獲取servletContext對象System.out.println("對象:"+servletConfig.getServletContext());}ServletConfig使用2:
重寫了init()方法,一定要調(diào)用super.init(config),調(diào)用父類的init()方法
ServletContext類的使用
介紹:
當(dāng)Servlet容器啟動時,會為每個Web應(yīng)用創(chuàng)建一個唯一的ServletContext對象代表當(dāng)前Web應(yīng)用,該對象不僅封裝了當(dāng)前Web應(yīng)用的所有信息,而且實現(xiàn)了多個Servlet之間數(shù)據(jù)的共享。
操作范圍:整個web工程
作用:
存取數(shù)據(jù):先存入,否則為null;
1.獲取Web應(yīng)用程序的初始化參數(shù)
在web.xml文件中,不僅可以配置Servlet的初始化信息,還可以配置整個Web應(yīng)用的初始化信息。
<context-param>元素位于根元素中,它的子元素<param-name>和<param-value>分別用來指定參數(shù)的名字和參數(shù)值。
要想獲取這些參數(shù)信息,可以使用ServletContext接口,該接口中定義的getInitParameterNames()getInitParameter(String name)方法分別用來獲取參數(shù)名和參數(shù)值。
2.實現(xiàn)多個Servlet對象共享數(shù)據(jù)
由于一個Web應(yīng)用中的所有Servlet共享同一個ServletContext對象,因此ServletContext對象的域?qū)傩钥梢员辉揥eb應(yīng)用中的所有Servlet訪問。
在ServletContext接口中定義了分別用于增加、刪除、設(shè)置ServletContext域?qū)傩缘乃膫€方法
3.讀取Web應(yīng)用下的資源文件
在實際開發(fā)中,有時候可能會需要讀取Web應(yīng)用中的一些資源文件,比如配置文件,圖片等。
為此,在ServletContext接口中定義了一些讀取Web資源的方法,這些方法是依靠Servlet容器來實現(xiàn)的。
Servlet容器根據(jù)資源文件相對于Web應(yīng)用的路徑,返回關(guān)聯(lián)資源文件的IO流、資源文件在文件系統(tǒng)的絕對路徑等。
示例:
web.xml:
Servlet_3.java
public class Servlet_3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.獲取web.xml中配置的上下文參數(shù)//獲取上下文對象//寫法2: getServletConfig().getServletContext();ServletContext servletContext = getServletContext();//獲取上下文參數(shù)String name = servletContext.getInitParameter("name");String age = servletContext.getInitParameter("age");System.out.println("context:name=" + name + " age=" + age);//2.獲取當(dāng)前的工程名路徑:/工程路徑System.out.println("當(dāng)前工程路徑:"+servletContext.getContextPath());//3.獲取工程部署后在服務(wù)器硬盤上的絕對路徑/*/被服務(wù)器解析地址為:http://ip:port/工程名/映射到IDEA代碼的web目錄* */System.out.println("工程部署的路徑:"+servletContext.getRealPath("/"));System.out.println("工程下css目錄的絕對路徑:"+servletContext.getRealPath("/css"));System.out.println("工程下jsp1目錄的絕對路徑:"+servletContext.getRealPath("/jsp/jsp1.js"));// context:name=dq age=20 // 當(dāng)前工程路徑:/WebServletProject_war_exploded // 工程部署的路徑:D:\CodeProject\JavaWeb_DQ\WebServletProject\target\WebServletProject-1.0-SNAPSHOT\ // 工程下css目錄的絕對路徑:D:\CodeProject\JavaWeb_DQ\WebServletProject\target\WebServletProject-1.0-SNAPSHOT\css // 工程下jsp1目錄的絕對路徑:D:\CodeProject\JavaWeb_DQ\WebServletProject\target\WebServletProject-1.0-SNAPSHOT\jsp\jsp1.js//4.像Map一樣存取數(shù)據(jù)servletContext.setAttribute("key1","v1");servletContext.setAttribute("key2","u");//唯一的上下文對象System.out.println(servletContext);System.out.println("v1="+servletContext.getAttribute("key1"));System.out.println("v2="+servletContext.getAttribute("key2"));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} }Servlet_4.java
public class Servlet_4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//所有工程類都可以獲取Context的存取數(shù)據(jù)ServletContext context=getServletContext();//唯一的上下文對象System.out.println(context);System.out.println("v1="+context.getAttribute("key1"));System.out.println("v2="+context.getAttribute("key2"));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} }ServletContext讀取配置文件類中信息properties
新建my.properties
寫入內(nèi)容:
ReadProperties .java代碼:
使用的地址
String RealPath = context.getRealPath("/WEB-INF/classes/my.properties");瀏覽器中:
HTTP協(xié)議
介紹
請求的HTTP協(xié)議格式:
1)GET請求:
【】表示可選
GET請求的HTTP協(xié)議內(nèi)容:
2)POST請求
POST請求的HTTP協(xié)議內(nèi)容:
HTTP常用請求頭說明
HTTP的GET與POST請求
響應(yīng)的HTTP協(xié)議格式
常見的響應(yīng)碼:
MIME類型說明
RTF:文本
瀏覽器中查看HTTP協(xié)議
谷歌:
檢查-網(wǎng)絡(luò)-Headers
MricoSoft Edge瀏覽器:
檢查-網(wǎng)絡(luò)-全部-標(biāo)頭
IE瀏覽器:
在IE瀏覽器-查看源-網(wǎng)絡(luò)
總結(jié)
以上是生活随笔為你收集整理的Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国国债收益率一览 美国国债收益率的含义
- 下一篇: Java JUC工具类--Semapho