們先來看一下web服務(wù)器在整個B/S架構(gòu)中的位置:
我們發(fā)現(xiàn)web服務(wù)器有種承上啟下的作用,它是游覽器和java程序建立連接的一個橋梁;
我們先去下載web服務(wù)器Tomcat
https://www.apache.org/:Tomcat屬于apache組織下的一個開源的項(xiàng)目,
圖上面的每一個單詞都代表一個項(xiàng)目,tomcat只是apache組織里面的冰山一角;apache里面還包含了很多我們常用的一些框架:struts,大數(shù)據(jù)相關(guān)的HBase,Hadoop等待太多了;
我們點(diǎn)擊Tomcat進(jìn)入:https://tomcat.apache.org/
目前tomcat的最新版本是10,我們下載并安裝;tomcat是綠色版,下載后直接解壓就可以了;
tomcat目錄結(jié)構(gòu)
啟動命令:C:\apache-tomcat-8.5.73\bin\startup.bat
tomcat服務(wù)器是純java語言寫的,所以要運(yùn)行tomcat一定要有java運(yùn)行環(huán)境,所以第一步先配置JAVA_HOME:C:\Program Files\Java\jdk1.8.0_101;
配置了以上步驟就可以運(yùn)行tomcat了,但是如果現(xiàn)在cmd命令窗口里面直接運(yùn)行tomcat好需要配置兩個地方:
1、配置啟動命令的path;
path:C:\apache-tomcat-8.5.73\bin
2、配置CATALINA_HOME(tomcat的家)
CATALINA_HOME:C:\apache-tomcat-8.5.73
配置以上兩步驟就可以在任何地方啟動tomcat了,CATALINA是tomcat的作者;
文鏈接:https://juejin.cn/post/7107099957219295262
1、Servlet名字
Servlet=Server + applet
Server:服務(wù)器 applet:小程序 Servlet:服務(wù)器端的小程序
2、Servlet在Web應(yīng)用中的作用
①生活中的例子
②對應(yīng)Web應(yīng)用
③具體細(xì)節(jié)
④Servlet扮演角色 在整個Web應(yīng)用中,Servlet主要負(fù)責(zé)處理請求、協(xié)調(diào)調(diào)度功能。我們可以把Servlet稱為Web應(yīng)用中的『控制器』
1、HelloWorld分析
①目標(biāo) 在頁面上點(diǎn)擊超鏈接,由Servlet處理這個請求,并返回一個響應(yīng)字符串:Hello,I am Servlet! 。
②思路
2、具體操作
①創(chuàng)建動態(tài)Web Module 《踩坑+排雷新版IDEA2021.1創(chuàng)建配置Javaweb項(xiàng)目并部署在Tomcat容器》
②創(chuàng)建前端頁面超鏈接 begin.html 的代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="hello">請點(diǎn)擊我</a>
</body>
</html>
復(fù)制代碼
③創(chuàng)建HelloServlet的Java類
package com.yeman.Servlets;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author: Yeman
* @Date: 2022-02-11-18:15
* @Description:
*/
public class Hello extends HttpServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("執(zhí)行了Hello這個Servlet!");
// 返回響應(yīng)字符串
// 1、獲取能夠返回響應(yīng)數(shù)據(jù)的字符流對象
PrintWriter writer=res.getWriter();
// 2、向字符流對象寫入數(shù)據(jù)
writer.write("Hello,I am Servlet!");
}
}
復(fù)制代碼
④配置Hello Servlet 配置文件位置:WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置Servlet本身 -->
<servlet>
<!-- 給Servlet設(shè)置一個簡短名稱 -->
<servlet-name>Hello</servlet-name>
<!-- 配置Servlet的全類名 -->
<servlet-class>com.yeman.Servlets.Hello</servlet-class>
</servlet>
<!-- 將Servlet和訪問地址關(guān)聯(lián)起來 -->
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
復(fù)制代碼
⑤測試
⑥小結(jié) 需求:在瀏覽器上點(diǎn)超鏈接能夠訪問Java程序。
3、梳理概念
①原生Tomcat
②IDEA中的Tomcat實(shí)例
③IDEA中的Web工程
④根據(jù)Web工程生成的war包
⑤Web工程中的資源 [1]靜態(tài)資源
[2]動態(tài)資源
⑥訪問資源的地址 [1]靜態(tài)資源
/Web應(yīng)用名稱/靜態(tài)資源本身的路徑
[2]動態(tài)資源
/Web應(yīng)用名稱/虛擬路徑
⑦Web應(yīng)用名稱
⑧總體的邏輯結(jié)構(gòu)
1、繼承關(guān)系
javax.servlet.Servlet接口----->javax.servlet.GenericServlet抽象類 ----->javax.servlet.http.HttpServlet抽象子類
2、相關(guān)方法
①javax.servlet.Servlet接口:
②javax.servlet.GenericServlet抽象類:
③javax.servlet.http.HttpServlet 抽象子類:
String method=req.getMethod(); 獲取請求的方式 各種if判斷,根據(jù)請求方式不同,決定去調(diào)用不同的do方法:
if (method.equals("GET")) {
this.doGet(req,resp);
} else if (method.equals("HEAD")) {
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
......
復(fù)制代碼
在HttpServlet這個抽象類中,do方法都差不多:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol=req.getProtocol();
String msg=lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
復(fù)制代碼
3、小結(jié)
①繼承關(guān)系: HttpServlet -> GenericServlet -> Servlet
②Servlet中的核心方法:init(),service(),destroy()
③服務(wù)方法: 當(dāng)有請求過來時,service方法會自動響應(yīng)(其實(shí)是tomcat容器調(diào)用的)。
④在HttpServlet中會分析請求的方式:到底是get、post、head還是delete等,然后再決定調(diào)用的是哪個do開頭的方法。
⑤在HttpServlet中的do方法默認(rèn)都是405的實(shí)現(xiàn)風(fēng)格,需要子類去實(shí)現(xiàn)對應(yīng)的方法,否則默認(rèn)會報(bào)405錯誤。因此,我們在新建Servlet時,需要考慮請求方法,從而決定重寫哪個do方法。
1、生命周期
從出生到死亡的過程就是生命周期。對應(yīng)Servlet中的三個方法init(),service(),destroy()。
默認(rèn)情況下:第一次接收請求時,這個Servlet會進(jìn)行實(shí)例化(調(diào)用構(gòu)造方法)、初始化(調(diào)用init())、然后服務(wù)(調(diào)用service())。從第二次請求開始,每一次都是服務(wù)。當(dāng)容器關(guān)閉時,其中的所有的servlet實(shí)例會被銷毀,調(diào)用銷毀方法。
Servlet實(shí)例Tomcat只會創(chuàng)建一個,所有的請求都是這個實(shí)例去響應(yīng)。默認(rèn)情況下,第一次請求時,Tomcat才會去實(shí)例化,初始化,然后再服務(wù)。這樣的好處是什么是可以提高系統(tǒng)的啟動速度,這樣的缺點(diǎn)是什么是第一次請求耗時較長。因此得出結(jié)論: 如果需要提高系統(tǒng)的啟動速度,當(dāng)前默認(rèn)情況即可,如果需要提高響應(yīng)速度,就應(yīng)該設(shè)置Servlet的初始化時機(jī)。
2、初始化時機(jī)
我們可以通過<load-on-startup>來設(shè)置servlet啟動的先后順序,數(shù)字越小,啟動越靠前,最小值0。可以讓其在系統(tǒng)啟動時便實(shí)例化初始化,提高后期響應(yīng)速度。
修改web.xml中Servlet的配置:
<!-- 配置Servlet本身 -->
<servlet>
<!-- 全類名太長,給Servlet設(shè)置一個簡短名稱 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 配置Servlet的全類名 -->
<servlet-class>com.yeman.servlet.HelloServlet</servlet-class>
<!-- 配置Servlet啟動順序 -->
<load-on-startup>1</load-on-startup>
</servlet>
復(fù)制代碼
3、Servlet 容器
①容器 在開發(fā)使用的各種技術(shù)中,經(jīng)常會有很多對象會放在容器中。
②容器提供的功能 容器會管理內(nèi)部對象的整個生命周期。對象在容器中才能夠正常的工作,得到來自容器的全方位的支持。
③容器本身也是對象 特點(diǎn)1:往往是非常大的對象 特點(diǎn)2:通常的單例的
④典型Servlet容器產(chǎn)品舉例 Tomcat、jetty、jboss、Weblogic、WebSphere、glassfish
⑤Servlet在容器中是:單例的、線程不安全的。
單例:所有的請求都是同一個實(shí)例去響應(yīng) 線程不安全:一個線程需要根據(jù)這個實(shí)例中的某個成員變量值去做邏輯判斷,但是在中間某個時機(jī),另一個線程改變了這個成員變量的值,從而導(dǎo)致第一個線程的執(zhí)行路徑發(fā)生了變化。
注意:盡量的不要在servlet中定義成員變量,如果不得不定義成員變量,那么不要去:①修改成員變量的值 ②根據(jù)成員變量的值做一些邏輯判斷。
4、小結(jié)
1、ServletConfig 接口
①接口概覽
②接口方法
③初始化參數(shù)舉例
<!-- 配置Servlet本身 -->
<servlet>
<!-- 全類名太長,給Servlet設(shè)置一個簡短名稱 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 配置Servlet的全類名 -->
<servlet-class>com.yeman.servlet.HelloServlet</servlet-class>
<!-- 配置初始化參數(shù) -->
<init-param>
<param-name>goodMan</param-name>
<param-value>me</param-value>
</init-param>
<!-- 配置Servlet啟動順序 -->
<load-on-startup>1</load-on-startup>
</servlet>
復(fù)制代碼
④體驗(yàn)
public class HelloServlet implements Servlet {
// 聲明一個成員變量,用來接收init()方法傳入的servletConfig對象
private ServletConfig servletConfig;
public HelloServlet(){
System.out.println("HelloServlet對象創(chuàng)建!");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("HelloServlet對象初始化");
// 將Tomcat調(diào)用init()方法時傳入的servletConfig對象賦值給成員變量
this.servletConfig=servletConfig;
}
@Override
public ServletConfig getServletConfig() {
// 返回成員變量servletConfig,方便使用
return this.servletConfig;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// 控制臺打印,證明這個方法被調(diào)用了
System.out.println("我是HelloServlet,我執(zhí)行了!");
// 返回響應(yīng)字符串
// 1、獲取能夠返回響應(yīng)數(shù)據(jù)的字符流對象
PrintWriter writer=servletResponse.getWriter();
// 2、向字符流對象寫入數(shù)據(jù)
writer.write("Hello,I am Servlet!");
//=============分割線===============// 測試ServletConfig對象的使用
// 1.獲取ServletConfig對象:在init()方法中完成
System.out.println("servletConfig=" + servletConfig.getClass().getName());
// 2.通過servletConfig對象獲取ServletContext對象
ServletContext servletContext=this.servletConfig.getServletContext();
System.out.println("servletContext=" + servletContext.getClass().getName());
// 3.通過servletConfig對象獲取初始化參數(shù)
Enumeration<String> enumeration=this.servletConfig.getInitParameterNames();
while (enumeration.hasMoreElements()) {
String name=enumeration.nextElement();
System.out.println("name=" + name);
String value=this.servletConfig.getInitParameter(name);
System.out.println("value=" + value);
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("HelloServlet對象即將銷毀,現(xiàn)在執(zhí)行清理操作");
}
}
復(fù)制代碼
⑤Servlet標(biāo)準(zhǔn)和JDBC標(biāo)準(zhǔn)對比: 廣義Servlet:javax.servlet包下的一系列接口定義的一組Web開發(fā)標(biāo)準(zhǔn)。遵循這一套標(biāo)準(zhǔn),不同的Servlet容器提供了不同的實(shí)現(xiàn)。 狹義Servlet:javax.servlet.Servlet接口和它的實(shí)現(xiàn)類,也就是實(shí)際開發(fā)時使用的具體的Servlet。
同樣都體現(xiàn)了面向接口編程的思想,同時也體現(xiàn)了解耦的思想:只要接口不變,下層方法有任何變化,都不會影響上層方法。
2、ServletContext 接口
①簡介
代表整個Web應(yīng)用,是單例。
典型的功能:
存入數(shù)據(jù):setAttribute() 取出數(shù)據(jù):getAttribute(
②體驗(yàn) [1]配置Web應(yīng)用級別的初始化參數(shù)
<!-- 配置Web應(yīng)用的初始化參數(shù) -->
<context-param>
<param-name>handsomeMan</param-name>
<param-value>alsoMe</param-value>
</context-param>
復(fù)制代碼
[2]獲取參數(shù)
String handsomeMan=servletContext.getInitParameter("handsomeMan");
System.out.println("handsomeMan=" + handsomeMan);
復(fù)制代碼
1、接力
發(fā)一個請求給Servlet,接力棒就傳遞到了Servlet手中。而絕大部分情況下,Servlet不能獨(dú)自完成一切,需要把接力棒繼續(xù)傳遞下去,此時我們就需要請求的『轉(zhuǎn)發(fā)』或『重定向』。
2、轉(zhuǎn)發(fā)
①本質(zhì):轉(zhuǎn)交
②完整定義:在請求的處理過程中,Servlet完成了自己的任務(wù),需要把請求轉(zhuǎn)交給下一個Servlet繼續(xù)處理。
③代碼
request.getRequestDispatcher("/fruit/apple/red/big.html").forward(request, response);
復(fù)制代碼
④類比
關(guān)鍵:由于轉(zhuǎn)發(fā)操作的核心部分是在服務(wù)器端完成的,所以瀏覽器感知不到,整個過程中瀏覽器只發(fā)送一次請求。
3、重定向
①本質(zhì):一種特殊的響應(yīng)
②完整定義:在請求的處理過程中,Servlet完成了自己的任務(wù),然后以一個響應(yīng)的方式告訴瀏覽器:要完成這個任務(wù)還需要你另外再訪問下一個資源”。
③代碼
response.sendRedirect("/app/fruit/apple/red/big.html");
復(fù)制代碼
關(guān)鍵:由于重定向操作的核心部分是在瀏覽器端完成的,所以整個過程中瀏覽器共發(fā)送兩次請求。
4、對比
5、應(yīng)用場景
可以簡單的判斷:能用轉(zhuǎn)發(fā)的先用轉(zhuǎn)發(fā),如果轉(zhuǎn)發(fā)不行,再使用重定向。
需要通過同一個request對象把數(shù)據(jù)攜帶到目標(biāo)資源:只能用轉(zhuǎn)發(fā)。
如果希望前往下一個資源之后,瀏覽器刷新訪問的是第二個資源:只能用重定向。
1、請求參數(shù)的概念
瀏覽器在給服務(wù)器發(fā)送請求的同時,攜帶的參數(shù)數(shù)據(jù)。
2、瀏覽器發(fā)送請求參數(shù)的基本形式
/orange/CharacterServlet?username=Tom
3、服務(wù)器對請求參數(shù)的封裝
總體上來說,服務(wù)器端將請求參數(shù)封裝為Map<String, String[]>。
鍵:請求參數(shù)的名字 值:請求參數(shù)的值組成的數(shù)組
4、獲取請求參數(shù)的方法
5、測試
①HTML代碼
<!-- 測試請求參數(shù)的表單 -->
<form action="/orange/ParamServlet" method="post">
<!-- 單行文本框 -->
<!-- input標(biāo)簽配合type="text"屬性生成單行文本框 -->
<!-- name屬性定義的是請求參數(shù)的名字 -->
<!-- 如果設(shè)置了value屬性,那么這個值就是單行文本框的默認(rèn)值 -->
個性簽名:<input type="text" name="signal" value="單行文本框的默認(rèn)值" /><br/>
<!-- 密碼框 -->
<!-- input標(biāo)簽配合type="password"屬性生成密碼框 -->
<!-- 用戶在密碼框中填寫的內(nèi)容不會被一明文形式顯示 -->
密碼:<input type="password" name="secret" /><br/>
<!-- 單選框 -->
<!-- input標(biāo)簽配合type="radio"屬性生成單選框 -->
<!-- name屬性一致的radio會被瀏覽器識別為同一組單選框,同一組內(nèi)只能選擇一個 -->
<!-- 提交表單后,真正發(fā)送給服務(wù)器的是name屬性和value屬性的值 -->
<!-- 使用checked="checked"屬性設(shè)置默認(rèn)被選中 -->
請選擇你最喜歡的季節(jié):
<input type="radio" name="season" value="spring" />春天
<input type="radio" name="season" value="summer" checked="checked" />夏天
<input type="radio" name="season" value="autumn" />秋天
<input type="radio" name="season" value="winter" />冬天
<br/><br/>
你最喜歡的動物是:
<input type="radio" name="animal" value="tiger" />路虎
<input type="radio" name="animal" value="horse" checked="checked" />寶馬
<input type="radio" name="animal" value="cheetah" />捷豹
<br/>
<!-- 多選框 -->
<!-- input標(biāo)簽和type="checkbox"配合生成多選框 -->
<!-- 多選框被用戶選擇多個并提交表單后會產(chǎn)生『一個名字?jǐn)y帶多個值』的情況 -->
你最喜歡的球隊(duì)是:
<input type="checkbox" name="team" value="Brazil"/>巴西
<input type="checkbox" name="team" value="German" checked="checked"/>德國
<input type="checkbox" name="team" value="France"/>法國
<input type="checkbox" name="team" value="China" checked="checked"/>中國
<input type="checkbox" name="team" value="Italian"/>意大利
<br/>
<!-- 下拉列表 -->
<!-- 使用select標(biāo)簽定義下拉列表整體,在select標(biāo)簽內(nèi)設(shè)置name屬性 -->
你最喜歡的運(yùn)動是:
<select name="sport">
<!-- 使用option屬性定義下拉列表的列表項(xiàng) -->
<!-- 使用option標(biāo)簽的value屬性設(shè)置提交給服務(wù)器的值,在option標(biāo)簽的標(biāo)簽體中設(shè)置給用戶看的值 -->
<option value="swimming">游泳</option>
<option value="running">跑步</option>
<!-- 使用option標(biāo)簽的selected="selected"屬性設(shè)置這個列表項(xiàng)默認(rèn)被選中 -->
<option value="shooting" selected="selected">射擊</option>
<option value="skating">溜冰</option>
</select>
<br/>
<br/><br/>
<!-- 表單隱藏域 -->
<!-- input標(biāo)簽和type="hidden"配合生成表單隱藏域 -->
<!-- 表單隱藏域在頁面上不會有任何顯示,用來保存要提交到服務(wù)器但是又不想讓用戶看到的數(shù)據(jù) -->
<input type="hidden" name="userId" value="234654745" />
<!-- 多行文本框 -->
自我介紹:<textarea name="desc">多行文本框的默認(rèn)值</textarea>
<br/>
<!-- 普通按鈕 -->
<button type="button">普通按鈕</button>
<!-- 重置按鈕 -->
<button type="reset">重置按鈕</button>
<!-- 表單提交按鈕 -->
<button type="submit">提交按鈕</button>
</form>
復(fù)制代碼
②Java代碼
servlet=server + applet:運(yùn)行在服務(wù)器端的java程序
Servlet是一個接口,一個類想通過瀏覽器被訪問到,那么這個類就必須直接或間接的實(shí)現(xiàn)Servlet接口
servlet創(chuàng)建對象時,調(diào)用此方法完成初始化操作
用戶訪問servlet時,調(diào)用此方法完成業(yè)務(wù)邏輯的處理
servlet對象銷毀,調(diào)用此方法完成銷毀操作
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設(shè)置解碼為UTF-8,解決post中文亂碼問題, 需放在首行
req.setCharacterEncoding("UTF-8");
doGet(req, resp);
}
服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式
一個作用范圍的對象,可以在范圍共享數(shù)據(jù)
request域: 代表一次請求的范圍,一般用于一次請求中轉(zhuǎn)發(fā)的多個資源中共享數(shù)據(jù)
response對象表示web服務(wù)器給瀏覽器返回的響應(yīng)信息。
作用:返回給瀏覽器的響應(yīng)信息。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("訪問到了CServlet,接下來重定向DServlet");
// 方式一:設(shè)置重定向
resp.setStatus(302);
// resp.setHeader("Location", "/項(xiàng)目名/DServlet");
// 方式二:設(shè)置重定向
resp.sendRedirect("/項(xiàng)目名/DServlet");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 第一種方式:設(shè)置編碼,一定要設(shè)置首行
// resp.setCharacterEncoding("GBK");
// 第二種方式:統(tǒng)一瀏覽器和服務(wù)器編碼
resp.setContentType("text/html;charset=UTF-8");
// 頁面輸出中文
PrintWriter writer=resp.getWriter();
writer.write("中文");
}
web容器在啟動時,會為每個web項(xiàng)目創(chuàng)建一個對應(yīng)的ServletContext對象。
ServletContext: 代表當(dāng)前web項(xiàng)目
當(dāng)前項(xiàng)目范圍內(nèi),共享數(shù)據(jù)(多個Servlet都可以獲取)。
互聯(lián)網(wǎng)通信過程中定義的一種文件數(shù)據(jù)類型格式。
Cookie:客戶端會話技術(shù)。
作用:在一次會話的多次請求之間共享數(shù)據(jù),將數(shù)據(jù)保存到客戶端(瀏覽器)。
服務(wù)器可以發(fā)送多個Cookie。
默認(rèn)情況下,瀏覽器關(guān)閉(會話結(jié)束),cookie銷毀(內(nèi)存)。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 編碼
String encodevalue=URLEncoder.encode("杰克 ", "UTF-8");
Cookie cookie=new Cookie("name", encodevalue);
resp.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies=req.getCookies();
for (Cookie cookie : cookies) {
// 獲取cookie的name
String name=cookie.getName();
// 獲取cookie的value
String value=cookie.getValue();
// 解碼
String decodeValue=URLDecoder.decode(value, "UTF-8");
System.out.println(name + ":" + decodeValue);
}
Session:會話技術(shù);基于cookie來實(shí)現(xiàn)的。
作用:在一次會話的多次請求之間共享數(shù)據(jù),將數(shù)據(jù)保存到服務(wù)端。
HttpSession:域?qū)ο蟆?/p>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 將共享數(shù)據(jù)存到session
// 獲取session對象
HttpSession session=req.getSession();
// 將session對象進(jìn)行數(shù)據(jù)存入
session.setAttribute("name", "jack");
System.out.println("已將數(shù)據(jù)存到共享數(shù)據(jù)中。。。");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 將session中的共享數(shù)據(jù)取出來
// 獲取session對象
HttpSession session=req.getSession();
// 獲取共享數(shù)據(jù)
String name=(String) session.getAttribute("name");
System.out.println(name);
}
Request、Session、ServletContext
web的三大組件:
servlet(控制器)
filter(過濾器)
listener(監(jiān)聽器)
<listener>
<listener-class>com.demo.listener.ServletContextListenerDemo</listener-class>
</listener>
package com.demo.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContextListenerDemo implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("監(jiān)聽到servletContext對象創(chuàng)建了。。。");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("監(jiān)聽到servletContext對象銷毀了...");
}
}
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。