1.Servlet技術
2.Servlet類的繼承體系
3.ServletConfig類
4.ServletContext類
1.Servlet技術
a) 什麼是Servlet
Servlet是javaWeb的三大元件。Servlet程式,Listener監聽器。Filter過濾器。
Servlet程式主要是運作在Tomcat伺服器上。
Servlet程式的作用:接收用戶端的請求。響應給用戶端資料。
b) 手動實作Servlet程式
1、編寫一個類去實作Servlet接口
2、實作Servlet程式中的service方法(處理業務的方法)
3、到web.xml中去配置Servlet程式的通路位址
Servlet程式的源代碼:
public class HelloServlet implements Servlet {
/**
* Servlet程式接收用戶端的請求,并且響應資料<br/>
* service在每請求進來 的時候,負責 處理業務
*/
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("HelloServlet 程式被通路了~");
}
}
web.xml中的配置:
<!-- servlet标簽用來配置一個Servlet程式 -->
<servlet>
<!-- 給你要配置的Servlet程式起一個名稱,一般放的是類名(可以任意自定義) -->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class标簽是配置Servlet程式的全類名 -->
<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet-mapping是配置Servlet程式的通路位址 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!--
url-paatern是配置通路位址。
/hello 表示http://ip:port/工程名/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
a) Servlet的生命周期
1、先執行Servlet的構造方法
2、執行Servlet程式的init初始化方法
構造方法和init初始化方法,隻是第一次通路的時候由Tomcat伺服器來調用,隻調用一次
3、執行Service方法 (每次通路都會被調用)
4、執行destroy方法(伺服器停止,停止web工程 )
b) 模拟GET請求和POST請求的分發
請求分為GET請求和POST請求。(一般GET請求和POST請求有可能會做不同的業務操作)
伺服器如何區分 GET請求和POST請求。
/**
* Servlet程式接收用戶端的請求,并且響應資料<br/>
* service在每請求進來 的時候,負責 處理業務
*/
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// System.out.println("HelloServlet 程式被通路了~");
HttpServletRequest httpRequest = (HttpServletRequest) request;
// getMethod傳回是GET或POST,傳回請求的方式
String method = httpRequest.getMethod();
System.out.println(method);
if ("GET".equals(method)) {
// 如果是GET請求,執行get業務
doGet();
} else if ("POST".equals(method)) {
//執行post請求的業務操作
doPost();
}
}
/**
* 這是GET請求需要做的工作
*/
public void doGet() {
System.out.println("doGet 這是GET請求");
}
/**
* 這是POST請求需要做的工作
*/
public void doPost() {
System.out.println("doPost 這是POST請求");
}
a) 通過繼承HttpServlet實作Servlet程式
在實作的開發中,我們都是使用HttpServlet抽取類去實作Servlet程式。
1、編寫一個類去繼承HttpServlet類
2、重寫doGet方法和doPost方法
3、到web.xml中去配置Servlet程式的通路位址
HelloServlet2類
public class HelloServlet2 extends HttpServlet {
/**
* doGet方法,是GET請求的時候,會自動的調用
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("這是GET請求,調用了doGet方法");
}
/**
* doPost方法,是POST請求的時候,會自動的調用
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("這是POST請求,調用了doPost方法");
}
}
web.xml中的配置:
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<!-- url-pattern 中 /ccc 表示http://ip:port/工程名/ccc
<br/>
url-pattern以斜線打頭,配置的位址跟在工程名的後面
web.xml中有了修改之後一定要重新開機Tomcat伺服器才能生效
在浏覽器位址欄中輸入位址,然後敲 回車是GET請求
-->
<url-pattern>/ccc</url-pattern>
</servlet-mappi
2.Servlet類的繼承體系
我們在重寫doGet方法或doPost方法的時候,方法體内,一定不能調用super.doGet或super.doPost代碼。否則會報405錯誤
3.ServletConfig類
我們所有的類都是由tomcat伺服器進行建立。我們負責使用。
ServletConfig類它封裝了Servlet程式的配置資訊。
a) ServletConfig類的三大作用
1、擷取Servlet程式在web.xml中配置的名稱
2、擷取在web.xml中配置的初始化參數
3、擷取ServletContext對象
public class ConfigServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
// 1、擷取Servlet程式在web.xml中配置的名稱
System.out.println("在web.xml中配置的servlet-name名稱:" + config.getServletName());
// 2、擷取在web.xml中配置的初始化參數
System.out.println("username初始化參數值:" + config.getInitParameter("username"));
System.out.println("url初始化參數值:" + config.getInitParameter("url"));
// 3、擷取ServletContext對象
System.out.println( config.getServletContext() );
}
}
web.xml中的配置:
<servlet>
<servlet-name>ConfigServlet</servlet-name>
<servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class>
<!-- init-param 是給Servlet程式配置一個初始化鍵值對參數 -->
<init-param>
<!-- param-name是參數名 -->
<param-name>username</param-name>
<!-- param-value是參數值 -->
<param-value>root</param-value>
</init-param>
<!-- init-param 是給Servlet程式配置一個初始化鍵值對參數 -->
<init-param>
<!-- param-name是參數名 -->
<param-name>url</param-name>
<!-- param-value是參數值 -->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ConfigServlet</servlet-name>
<url-pattern>/configServlet</url-pattern>
</servlet-mapping>
注意:ServletConfig是在GenericServlet類中持有的引用。當我們需要在自己自定義的Servlet程式中重寫init(ServletConfig)初始化方法的時候。
一定要調用super.init(config); 否則父類中的ServletConfig就不能得到初始化
4.ServletContext類
a) 什麼是ServletContext?
1、ServletContext對象是一個接口。
2、ServletContext在一個web工程中隻有一個對象執行個體(也是由Tomcat伺服器建立)。
3、ServletContext是一個域對象。
什麼是域對象?
域對象指的是可以像map一樣存取資料的對象。
put setAttribute 儲存資料
get getAttribute 擷取資料
域指的儲存和擷取資料的範圍。ServletContext對象它的資料操作範圍是整個web工程。
ServletContext對象在web工程啟動的時候建立。在web工程停止的時候銷毀。
b) ServletContext類的四個作用
1、它可以擷取在web.xml中配置的上下文參數<context-param>
2、它可以擷取到目前web工程的工程名(工程路徑)
3、它可以擷取web工程釋出到伺服器上之後。檔案或目錄在伺服器磁盤上的絕對路徑。
4、它可以像map一樣存取資料。
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// b)ServletContext類的四個作用
ServletContext ctx = getServletContext();
// 1、它可以擷取在web.xml中配置的上下文參數<context-param>
System.out.println("上下文初始化參數password的值:"
+ ctx.getInitParameter("password"));
System.out.println("上下文初始化參數driverClass的值:"
+ ctx.getInitParameter("driverClass"));
// 2、它可以擷取到目前web工程的工程名(工程路徑)
// getContextPath()擷取目前工程名
System.out.println(ctx.getContextPath());
// 3、它可以擷取web工程釋出到伺服器上之後。檔案或目錄在伺服器磁盤上的絕對路徑。
// getRealPath是擷取指定的路徑的資源在伺服器上的絕對路徑。
// / 斜線,表示 根,
// / 斜線 在web工程中 表示到http://ip:port/工程名/ 映射到 代碼的WebContent目錄
System.out.println(ctx.getRealPath("/"));
System.out.println("WebContent/css的絕對路徑是:" + ctx.getRealPath("/css"));
System.out.println("WebContent/imgs/ludashi.jpg的絕對路徑是:" + ctx.getRealPath("/imgs/ludashi.jpg"));
}
在web.xml中的配置:
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>driverClass</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>