国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例

這篇具有很好參考價值的文章主要介紹了(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前面說過,Servlet就是Tomcat這個HTTP服務(wù)器提供給Java的一組API,來完成構(gòu)建動態(tài)頁面等任務(wù)。Servlet中涉及的API非常多,這里我們只關(guān)注以下三個即可,其余的可在工作中獲得遇到具體場景再學(xué)習(xí)使用

  • HttpServlet
  • HttpServletRequest
  • HttpServletResponse

一:HttpServlet

HttpServlet:它提供了處理基于HTTP協(xié)議的請求和響應(yīng)的功能,為開發(fā)人員提供了一組用于處理HTTP請求的方法,其中最常用的是doGet()doPost()方法。這些方法可以被子類重寫以實(shí)現(xiàn)具體的業(yè)務(wù)邏輯。HttpServlet功能包括

  • 解析HTTP請求:HttpServlet類負(fù)責(zé)解析來自客戶端的HTTP請求,并提供了與請求相關(guān)的方法,如獲取請求方法、獲取請求參數(shù)、獲取請求頭等
  • 處理HTTP請求:HttpServlet類定義了doGet()、doPost()等方法,用于處理GET和POST請求。開發(fā)人員可以根據(jù)業(yè)務(wù)需求重寫這些方法,并在其中實(shí)現(xiàn)相應(yīng)的業(yè)務(wù)邏輯
  • 生成HTTP響應(yīng):HttpServlet類提供了一組用于生成HTTP響應(yīng)的方法,如設(shè)置響應(yīng)狀態(tài)碼、設(shè)置響應(yīng)頭、寫入響應(yīng)內(nèi)容等
  • 會話管理:HttpServlet類支持會話管理,可以通過getSession()方法獲取會話對象,進(jìn)行會話跟蹤和管理
  • 錯誤處理:HttpServlet類提供了對HTTP錯誤的處理機(jī)制,可以重寫相應(yīng)的方法來自定義錯誤頁面或錯誤處理邏輯

其核心方法如下,常用方法是后三個,前三個經(jīng)常在相關(guān)面試中出現(xiàn)

方法名稱 調(diào)用時機(jī)
init HttpServlet實(shí)例化后被調(diào)用一次
destory HttpServlet不再使用后被調(diào)用一次(正常關(guān)閉Tomcat
service 收到HTTP請求時候調(diào)用
doGet 收到GET請求的時候調(diào)用(由service方法調(diào)用)
doPost 收到POST請求的時候調(diào)用(由service方法調(diào)用)
doPut/doDelete/doOptions/... 收到其他請求的時候調(diào)用((由service方法調(diào)用))

這些方法的調(diào)用時機(jī)就稱為“Servlet的生命周期”

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

二:HttpServletRequest

(1)介紹

HttpServletRequest:繼承自ServletRequest接口,并提供了訪問HTTP請求的方法和屬性。HttpServletRequest對象包含了客戶端發(fā)送到服務(wù)器的HTTP請求的信息,開發(fā)人員可以使用該對象獲取請求的參數(shù)、請求頭、請求方法等信息

其核心方法如下(都是get系列)

方法名稱 調(diào)用時機(jī)
String getProrocol() 返回請求協(xié)議的名稱和版本
String getMehtod() 返回請求方法名稱
String getRequestURI() 從協(xié)議名稱直到HTTP請求的第一行查詢字符串中,返回該請求的URL的一部分
String getContexPath() 返回指示請求上下文的URI部分
Eunmeration getParameterNames() 返回一個String對象的美劇,包含在該請求中包含的參數(shù)的名稱
String getParameter(String name) 以字符串形式返回請求參數(shù)的值,如果參數(shù)不存在則返回null
String[] getParameterValues(String name) 返回一個字符串對象的數(shù)組,包含所有給定的請求參數(shù)的值,如果參數(shù)不存在返回null
Enumeration getHeaderNames() 返回一個枚舉,包含在該請求中包含的所有的頭名
String getHeader(String name) 以字符串形式返回指定的請求頭的值
String getCharacterEncoding() 返回請求主體中使用的字符編碼名稱
String getHeader(String name) 以字符串形式返回指定的請求頭的值
String getContentType() 返回請求主體的MIME類型,如果不知道類型則返回null
int getContentLength 以字節(jié)為單位返回請求主體的長度,并提供輸入流,如果長度未知則返回-1
InputStream getInputStream() 用于讀取去請求的body內(nèi)容,返回一個InputStream對象

(2)示例1:打印請求信息

import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.util.Enumeration;  
  
@WebServlet("/showRequest")  
public class ShowRequestServlet extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        //把API執(zhí)行的結(jié)果,放到stringBuilder中  
        StringBuilder stringBuilder=new StringBuilder();  

		// 聲明響應(yīng)boyd是html結(jié)構(gòu)數(shù)據(jù)  
		resp.setContentType("text/html");
  
        stringBuilder.append("<h3>首行部分</h3>");  
        stringBuilder.append(req.getProtocol());  
        stringBuilder.append("<br>");  
        stringBuilder.append(req.getMethod());  
        stringBuilder.append("<br>");  
        stringBuilder.append(req.getRequestURI());  
        stringBuilder.append("<br>");  
        stringBuilder.append(req.getContextPath());  
        stringBuilder.append("<br>");  
        stringBuilder.append(req.getQueryString());  
        stringBuilder.append("<br>");  
        stringBuilder.append("<h3>header部分</h3>");  
        Enumeration<String> headerNames=req.getHeaderNames();  
        while (headerNames.hasMoreElements()) {  
            String headerName= headerNames.nextElement();  
            String headerValue=req.getHeader(headerName);  
            stringBuilder.append(headerName+":"+headerValue+"<br>");  
        }  
        resp.setContentType("text/html;charset=utf8");  
        resp.getWriter().write(stringBuilder.toString());  
  
    }  
}

在瀏覽器中輸入http://localhost:8080/HelloServlet/showRequest?a=10&b=20&c=30,效果如下

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

(3)示例2:獲取Get請求參數(shù)

import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
@WebServlet("/getparameter")  
public class GetParameter extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 獲取 query string 中的鍵值對  
        String studentId = req.getParameter("studentId");  
        String studentName = req.getParameter("studentName");  
        System.out.println(studentId);  
        System.out.println(studentName);  
  
        // 告訴瀏覽器類型和編碼,讓瀏覽器正常顯示  
        resp.setContentType("text/html; charset=utf-8");  
        resp.getWriter().write("studentId: " + studentId + ", " + "studentName: " + studentName);  
    }  
}

在瀏覽器中輸入http://localhost:8080/GetParameter/getparameter?studentId=22123213&studentName=張三,效果如下

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

(3)實(shí)例3:獲取Post請求參數(shù)

A:情況一

此時請求的bodyx-www-form-urlencoded,也即form表單

import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
@WebServlet("/postparameter")  
public class PostParameter extends HttpServlet {  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 通過發(fā)送post請求,獲取 body 中的參數(shù)  
        // 讓Servlet知道如何解析  
        req.setCharacterEncoding("utf-8");  
        String studentId = req.getParameter("studentId");  
        String studentName = req.getParameter("studentName");  
        System.out.println(studentId);  
        System.out.println(studentName);  
  
        // 告訴瀏覽器類型和編碼,讓瀏覽器正常顯示  
        resp.setContentType("text/html; charset=utf-8");  
        resp.getWriter().write("studentId: " + studentId + ", " + "studentName: " + studentName);  
    }  
}

此時并不能在瀏覽器中直接輸入?yún)?shù),因?yàn)槟鞘?code>Get請求,構(gòu)造Post請求可以有以下兩種方法

  • 方法一:利用Html通過form表單發(fā)送
  • 方法二:使用軟件postman

先說方法一:需要注意該Html文件必須位于webapp目錄之下。復(fù)習(xí)一下,在HTML中,form標(biāo)簽用于創(chuàng)建一個表單,其中action屬性義了表單提交時要發(fā)送數(shù)據(jù)的目標(biāo)URL或服務(wù)器端腳本,當(dāng)用戶提交表單時,瀏覽器會將表單中的數(shù)據(jù)發(fā)送到action屬性指定的URL。有以下兩種常見的寫法

  • 相對路徑(此時基準(zhǔn)目錄就是Html文件所在目錄,也即/PostParameter:例如postparameter
  • 絕對路徑:例如/PostParameter.postparameter

運(yùn)行PostParameter后,然后在地址欄中輸入http://localhost:8080/PostParameter/student.html,即可正確訪問到該文件

  • 再次重復(fù):在Java Web應(yīng)用程序中,通常將靜態(tài)資源(例如HtmlCSS等)放置在webapp目錄下,該目錄是Web應(yīng)用程序的根目錄。鏈接中PostParameter是Servlet類的名稱,并不是文件夾或路徑

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

接著向表單輸入內(nèi)容,然后提交

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言


再說方法二:postman使用方法非常簡單

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

另外,postman十分方便的一點(diǎn)是可以轉(zhuǎn)換為代碼

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

B:情況二

這種情況下請求的body是json格式,步驟如下

  • 首先需要讀取body中的內(nèi)容,這里需要借助getInputStream,以此獲取到要解析的字符串
  • Servlet并沒有內(nèi)置json解釋器,所以需要我們手動實(shí)現(xiàn)或者是借助第三方庫,這里借助jackson這個庫(因?yàn)樗荢pringBoot御用的)。然后就會得到一組鍵值對
  • 根據(jù)類對象(在Java反射中講到過)創(chuàng)建一個實(shí)例
  • 遍歷類對象中的屬性的名字,以此作為Key查詢對應(yīng)的Value
  • 返回構(gòu)造好的對象

進(jìn)入Java中央倉庫,搜索jackson,選擇Jackson Databind

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

隨便選擇一個版本后,拷貝Maven至pom.xml中的<dependencies></dependencies>標(biāo)簽內(nèi)

<dependencies>  
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->  
    <dependency>  
        <groupId>javax.servlet</groupId>  
        <artifactId>javax.servlet-api</artifactId>  
        <version>3.1.0</version>  
        <scope>provided</scope>  
    </dependency>  
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->  
    <dependency>  
        <groupId>com.fasterxml.jackson.core</groupId>  
        <artifactId>jackson-databind</artifactId>  
        <version>2.13.4.1</version>  
    </dependency>  
  
</dependencies>

jackson會提供一個核心類叫ObjectMapper,其中有兩個常用方法:

  • readValue:用于將json數(shù)據(jù)轉(zhuǎn)換為Java對象
    • 第一個參數(shù):可以是字符串,也可以是輸入流
    • 第二個參數(shù):是一個類對象,也就是要解析出來的結(jié)果的對象的類
  • writeValueAsString:用于將Java對象轉(zhuǎn)換為json數(shù)據(jù)

代碼如下

import com.fasterxml.jackson.databind.ObjectMapper;  
  
import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
/*  
一個Java對象,要想正確解析,必須滿足以下條件  
    這個類的屬性務(wù)必是public或者帶有public的getter/setter,否則jackson無法訪問到這個對象的屬性  
    這個類務(wù)必要有無參版本的構(gòu)造方法(如果不寫編譯器自動生成無參構(gòu)造)  
 */class Student {  
    public int studentId;  
    public String studentName;  
}  
  
@WebServlet("/json")  
public class JacksonServlet extends HttpServlet {  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 假設(shè)請求的body格式如下  
        // {studentId: 10, studentName: "張三"}  
  
        // 創(chuàng)建Jackson核心類  
        ObjectMapper objectMapper = new ObjectMapper();  
        // 解析json  
        Student s = objectMapper.readValue(req.getInputStream(), Student.class);  
        System.out.println(s.studentId);  
        System.out.println(s.studentName);  
  
        resp.setContentType("text/html; charset=utf-8");  
        resp.getWriter().write("studentId: " + s.studentId + ", " + "studentName: " + s.studentName);  
    }  
}

利用postman發(fā)送請求(注意設(shè)置正確),可以看到回應(yīng)

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

當(dāng)然我們也可以返回json

import com.fasterxml.jackson.databind.ObjectMapper;  
  
import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
/*  
一個Java對象,要想正確解析,必須滿足以下條件  
    這個類的屬性務(wù)必是public或者帶有public的getter/setter,否則jackson無法訪問到這個對象的屬性  
    這個類務(wù)必要有無參版本的構(gòu)造方法(如果不寫編譯器自動生成無參構(gòu)造)  
 */class Student {  
    public int studentId;  
    public String studentName;  
}  
  
@WebServlet("/json")  
public class JacksonServlet extends HttpServlet {  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 假設(shè)請求的body格式如下  
        // {studentId: 10, studentName: "張三"}  
  
        // 創(chuàng)建Jackson核心類  
        ObjectMapper objectMapper = new ObjectMapper();  
        // 解析json  
        Student s = objectMapper.readValue(req.getInputStream(), Student.class);  
        System.out.println(s.studentId);  
        System.out.println(s.studentName);  
  
        // 修改  
        s.studentId=20;  
        s.studentName="李四";  
        // 返回json  
        resp.setContentType("application/json; charset=utf-8");  
        resp.getWriter().write(objectMapper.writeValueAsString(s));  
    }  
}

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

三:HttpServletResponse

(1)介紹

HttpServletResponse:用于處理來自客戶端的請求并生成響應(yīng),其中的方法可以設(shè)置和操作HTTP響應(yīng)的各種屬性,包括響應(yīng)頭、狀態(tài)碼、字符編碼等等

其核心方法如下(都是set系列)

方法 描述
void setStatus(int sc) 為該響應(yīng)設(shè)置狀態(tài)碼
void setHeader(String name, String value) 設(shè)置一個帶有給定的名稱和值的header(如果name存在則覆蓋)
void addHeader(String name, Strin value) 添加一個帶有給定的名稱和值的header(如果name存在則并列添加新鍵值對)
void setContentType(String type) 設(shè)置被發(fā)送到客戶端的響應(yīng)的內(nèi)容類型
void setCharacterEncoding(String charset) 設(shè)置被發(fā)送到客戶端的響應(yīng)的字符編碼(MIME字符集),例如utf-8
void sendRedirect(String location) 使用指定的重定向位置URL發(fā)送臨時重定向響應(yīng)到客戶端
PrintWriter getWriter() 用于向body中寫入文本格式數(shù)據(jù)
OutputStream getOutputStream() 用于向body中寫入二進(jìn)制格式數(shù)據(jù)

(2)示例1:設(shè)置狀態(tài)碼

import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
  
@WebServlet("/status")  
public class StatusServlet extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 利用 queryString 設(shè)置狀態(tài)碼  
       String type = req.getParameter("type");  
  
       if (type.equals("1")) {  
           resp.setStatus(200);  
       } else if (type.equals("2")) {  
           resp.setStatus(404);  
       } else {  
           resp.setStatus(504);  
       }  
    }  
}

在瀏覽器地址里輸入http://localhost:8080/StatusServlet/status?type=2

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

(3)示例2:自動刷新

在HTTP響應(yīng)的頭部(Header)中,Refresh屬性用于在服務(wù)器返回的響應(yīng)中指示瀏覽器進(jìn)行自動刷新或重定向操作。語法如下

  • 延遲時間:表示延遲多少秒后進(jìn)行屬性,默認(rèn)為0s
  • URL=重定向URL:指定要重定向的URL
Refresh: [延遲時間]; URL=重定向URL

當(dāng)瀏覽器接收到帶有Refresh屬性的響應(yīng)時,它會根據(jù)指定的延遲時間進(jìn)行等待,并在延遲結(jié)束后執(zhí)行刷新或重定向。如果未指定延遲時間,默認(rèn)為立即刷新

import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
@WebServlet("/refresh")  
public class AutoRefreshServlet extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 每2s刷新一次  
        resp.setHeader("refresh", "2");  
        // 顯示當(dāng)前時間戳  
        resp.getWriter().write(System.currentTimeMillis() + "");  
    }  
}

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

(4)示例3:重定向

import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
@WebServlet("/redirect")  
public class RedirectServlet extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 瀏覽器收到請求后跳轉(zhuǎn)到百度首頁  
        resp.setStatus(302);  
        resp.setHeader("Location", "https://www.baidu.com");  
    }  
}

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

四:綜合案例之表白墻

前面介紹的表白墻案例非常簡單,它只是一個單純的HTML頁面,如果將瀏覽器關(guān)閉,那么輸入的內(nèi)容將不復(fù)存在。所以這里我們可以將其做成服務(wù)器版本,這樣即使頁面關(guān)閉,表白墻內(nèi)容也不會丟失

  • 注意:本案例雖然比較簡單,但是會結(jié)合到之前很多知識,所以相關(guān)內(nèi)容不再重復(fù),如有需求可以翻看前面的內(nèi)容

(1)效果展示

當(dāng)加載頁面時可以自動從服務(wù)器數(shù)據(jù)庫中獲取之前的提交內(nèi)容

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

點(diǎn)擊提交則可以將內(nèi)容保存到服務(wù)器數(shù)據(jù)庫中

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

(2)請求和響應(yīng)報文格式

發(fā)送數(shù)據(jù)給服務(wù)器

  • 請求報文
    • POST/message HTTP/1.1
    • Content-Type:application/json; charset=utf-8
    • {"who":"我", "whom":"你", "我啊你"}
  • 響應(yīng)報文
    • HTTP/1.1 200 OK

從服務(wù)器獲取數(shù)據(jù)

  • 請求報文
    • GET/message
  • 響應(yīng)報文
    • HTTP/1.1 200ok
    • Content-Type:application/json; charset=utf-8

(3)代碼梳理

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

(4)完整代碼

  • 代碼Github:點(diǎn)擊跳轉(zhuǎn)

整個項(xiàng)目概覽

(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例,Java基礎(chǔ)教程和高級教程,java,servlet,開發(fā)語言

Mysql相關(guān)語句


show databases;  
create database confession_wall;  
use confession_wall;  
create table message (who varchar(50), whom varchar(50), content varchar(1024));  

配置文件

pom.xml

<dependencies>  
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->  
    <dependency>  
        <groupId>javax.servlet</groupId>  
        <artifactId>javax.servlet-api</artifactId>  
        <version>3.1.0</version>  
        <scope>provided</scope>  
    </dependency>  
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->  
    <dependency>  
        <groupId>com.fasterxml.jackson.core</groupId>  
        <artifactId>jackson-databind</artifactId>  
        <version>2.13.4.1</version>  
    </dependency>  
  
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>5.1.49</version>  
    </dependency>  
</dependencies>

web.xml

<!DOCTYPE web-app PUBLIC  
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
        "http://java.sun.com/dtd/web-app_2_3.dtd" >  
<web-app>  
    <display-name>Archetype Created Web Application</display-name>  
</web-app>

相關(guān)類

Message.java:用于封裝消息內(nèi)容

public class Message {  
    public String who;  
    public String whom;  
    public String content;  
  
  
    public String getWho() {  
        return who;  
    }  
  
    public String getWhom() {  
        return whom;  
    }  
  
    public String getContent() {  
        return content;  
    }  
  
    public void setWho(String who) {  
        this.who = who;  
    }  
  
    public void setWhom(String whom) {  
        this.whom = whom;  
    }  
  
    public void setContent(String content) {  
        this.content = content;  
    }  
}

MessageServlet.java:Servlet服務(wù)器

import com.fasterxml.jackson.databind.ObjectMapper;  
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;  
  
import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.sql.DataSource;  
import java.io.IOException;  
import java.sql.Connection;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.util.ArrayList;  
import java.util.List;  
  

@WebServlet("/message")  
public class MessageServlet extends HttpServlet {  
    private ObjectMapper objectMapper = new ObjectMapper();  
    private List<Message> messageList = new ArrayList<>();  
  
    // 讓頁面獲取到數(shù)據(jù)  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 聲明當(dāng)前的響應(yīng)數(shù)據(jù)格式  
        resp.setContentType("application/json; charset=utf-8");  
        // 讀取數(shù)據(jù)庫內(nèi)容返回給頁面  
  
        try {  
            messageList = load();  
        } catch (SQLException e) {  
            throw new RuntimeException(e);  
        }  
        resp.getWriter().write(objectMapper.writeValueAsString(messageList));  
    }  
  
    // 瀏覽器向服務(wù)器提交數(shù)據(jù)  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        // 獲取到body中的數(shù)據(jù)并解析  
        Message message = objectMapper.readValue(req.getInputStream(), Message.class);  
        // 向數(shù)據(jù)庫提交內(nèi)容  
        try {  
            save(message);  
        } catch (SQLException e) {  
            throw new RuntimeException(e);  
        }  
        resp.setStatus(200);  
        System.out.println("成功提交數(shù)據(jù):"  
                + "【" + message.getWho() + "】" + "對【" + message.getWhom() + "】" + "說:" + message.getContent());  
  
    }  
  
    // 從數(shù)據(jù)庫查詢數(shù)據(jù)  
    private List<Message> load() throws SQLException {  
        // 先得有一個數(shù)據(jù)源  
        DataSource dataSource = DBUtil.getDataSource();  
        // 與服務(wù)器建立連接  
        Connection connection = dataSource.getConnection();  
  
  
        // 構(gòu)造SQL并預(yù)處理  
        String sql = "select * from message";  
        PreparedStatement statement = connection.prepareStatement(sql);  
  
  
        // 執(zhí)行SQL得到結(jié)果集合  
        ResultSet resultSet = statement.executeQuery();  
  
        //遍歷結(jié)果集合  
        // List<Message> messageList = new ArrayList<>();  
        while (resultSet.next()) {  
            Message message = new Message();  
            message.setWho(resultSet.getString("who"));  
            message.setWhom(resultSet.getString("whom"));  
            message.setContent(resultSet.getString("content"));  
            messageList.add(message);  
  
        }  
  
        // 關(guān)閉連接釋放資源  
        statement.close();  
        connection.close();  
  
        return messageList;  
    }  
  
    // 保存數(shù)據(jù)到數(shù)據(jù)庫  
    private void save(Message message) throws SQLException {  
        // 先得有一個數(shù)據(jù)源  
        DataSource dataSource = DBUtil.getDataSource();  
  
        // 與服務(wù)器建立連接  
        Connection connection = dataSource.getConnection();  
        System.out.println(connection);  
  
        // 構(gòu)造SQL并進(jìn)行預(yù)處理  
        String sql = "insert into message values(?, ?, ?)";  
        PreparedStatement statement = connection.prepareStatement(sql);  
        System.out.println(sql);  
        statement.setString(1, message.who);  
        statement.setString(2, message.whom);  
        statement.setString(3, message.content);  
  
        // 執(zhí)行SQL然后插入  
        try {  
            int res = statement.executeUpdate();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
  
        // 關(guān)閉連接釋放資源  
        statement.close();  
        connection.close();  
  
  
    }  
}

DBUtil.java:用于用于封裝DataSource的單例

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;   
import javax.sql.DataSource;  
  
// 用于封裝DataSource的單例(懶漢模式,注意線程安全)  
public class DBUtil {  
    private static volatile DataSource dataSource = null;  
  
    public static DataSource getDataSource() {  
        if (dataSource == null) {  
            synchronized (DBUtil.class) {  
                if(dataSource == null) {  
                    dataSource = new MysqlDataSource();  
                    ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/confession_wall?characterEncoding=utf8&useSSL=false&serverTimezone=UTC");  
                    ((MysqlDataSource)dataSource).setUser("root");  
                    ((MysqlDataSource)dataSource).setPassword("123456");  
                }  
            }  
        }  
  
        return dataSource;  
    }  
  
    // 防止直接new DBUtil  
    private DBUtil() {};  
  
}

webapp

onfessionalWall.html:網(wǎng)頁文章來源地址http://www.zghlxwxcb.cn/news/detail-708849.html

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>ConfessionalWall</title>  
</head>  
<body>  
  
<style>  
  .container {  
    width: 400px;  
    /*水平居中*/  
    margin: 0 auto;  
  }  
  
  h1 {  
    text-align: center;  
  }  
  
  p {  
    text-align: center;  
    color: #808080;  
  }  
  
  .row {  
    height: 40px;  
    display: flex;  
    /*  水平居中*/  
    justify-content: center;  
    /*  垂直居中*/  
    align-items: center;  
  }  
  
  .row span {  
    width: 100px;  
  }  
  
  .row input {  
    width: 200px;  
    height: 25px;  
  }  
  
  .row button {  
    width: 310px;  
    height: 40px;  
    color:white;  
    background-color: orange;  
    border: none;  
  
  }  
    
  .row button:active {  
    background-color: #666;  
  }  
  
  
</style>  
  
  
<div class="container">  
  <h1>表白墻</h1>  
  <p>(輸入后點(diǎn)擊下方按鈕提交)</p>  
  <div class="row">  
    <span>姓名:</span><input type="text">  
  </div>  
  
  <div class="row">  
    <span>對誰:</span><input type="text">  
  </div>  
  
  <div class="row">  
    <span>內(nèi)容:</span><input type="text">  
  </div>  
  
  <div class="row">  
    <button>提交</button>  
  </div>  
  
  
</div>  
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>  
<script>  
  var container = document.querySelector('.container');  
  var button = document.querySelector('button');  
  button.onclick = function () {  
    // 獲取內(nèi)容  
    var inputs = document.querySelectorAll('input');  
    var who = inputs[0].value;  
    var whom = inputs[1].value;  
    var content = inputs[2].value;  
    console.log(who);  
    console.log(who);  
    console.log(content);  
    if (who === '' || whom === '' || content === '') {  
      alert("有未填寫項(xiàng)");  
      return;  
    }  
  
    // 構(gòu)造出div生成發(fā)送內(nèi)容  
    let newDiv = document.createElement('div');  
    newDiv.className = 'row';  
    newDiv.innerHTML = "【" + who + "】" + "對【" + whom + "】" + "說:" + content;  
    container.appendChild(newDiv);  
  
    // 清空之前輸入  
    for (var i = 0; i < inputs.length; i++) {  
      inputs[i].value = '';  
    }  
  
    // 構(gòu)造對象  
    let data = {  
      who: who,  
      whom, whom,  
      content, content  
    };  
  
    // 利用ajax發(fā)送請求  
    $.ajax({  
      type: 'post',  
      url : 'message',  
  
      // 以下是body內(nèi)容  
      data: JSON.stringify(data),  
      contentType: "application/json; charset=utf-8",  
      success: function(body) {  
        console.log("成功提交數(shù)據(jù)")  
      }  
    });  
  }  
  
  // 在頁面加載時就獲取服務(wù)器數(shù)據(jù)  
  function getMessages() {  
    $.ajax({  
      type: 'get',  
      url: 'message',  
      success: function (body) {  
        // body就是響應(yīng)的body內(nèi)容,json數(shù)組  
        // JQuery可以很智能的我們將json數(shù)組解析為js對象數(shù)組(但注意設(shè)置Content-Type為application/json)  
        let contatiner = document.querySelector('.container')  
        for (let i = 0; i < body.length; i++) {  
          let message = body[i];  
          // 構(gòu)造元素  
          let newDiv = document.createElement('div');  
          newDiv.className = 'row';  
          newDiv.innerHTML = "【" + message.who + "】" + "對【" + message.whom + "】" + "說:" + message.content;  
          contatiner.appendChild(newDiv);  
        }  
      }  
    })  
  }  
  getMessages();  
  
  
</script>  
  
  
</body>  
</html>

到了這里,關(guān)于(Java高級教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [計算機(jī)網(wǎng)絡(luò)]第三章——傳輸層

    [計算機(jī)網(wǎng)絡(luò)]第三章——傳輸層

    僅供交流,請勿轉(zhuǎn)載,侵權(quán)必刪,寫作業(yè)時請勿直接抄襲 傳輸層協(xié)議為運(yùn)行在不同主機(jī)上的 應(yīng)用進(jìn)程之間 提供了 邏輯通信( logic communication) 功能。從應(yīng)用程序的角度看,通過邏輯通信,運(yùn)行不同進(jìn)程的主機(jī)好像直接相連一樣;實(shí)際上,這些主機(jī)也許位于地球的兩側(cè),通過很多

    2023年04月08日
    瀏覽(28)
  • LINUX網(wǎng)絡(luò)第三章:DNS解析

    LINUX網(wǎng)絡(luò)第三章:DNS解析

    首先,我們要知道DNS是什么,DNS(Domain Name System)是域名系統(tǒng)的英文系統(tǒng),是一種組織成域?qū)哟谓Y(jié)構(gòu)和計算機(jī)和網(wǎng)絡(luò)服務(wù)命名系統(tǒng),用于TCP/IP網(wǎng)絡(luò)。、 DNS實(shí)際上是域名解析協(xié)議,將域名轉(zhuǎn)化為IP地址 在早期的域名解析的時候,是iana組織負(fù)責(zé)將域名和IP地址進(jìn)行對應(yīng),并對其進(jìn)

    2024年01月17日
    瀏覽(28)
  • 【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)

    【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)

    ?????????????????????????????????????????????????????????????????? ?? 【 R a b b i t M Q 教程】第三章—— R a b b i t M Q ? 發(fā)布確認(rèn) color{#FF1493}{【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)} 【 R abbi tMQ 教程】第三章 —— R abbi tMQ ? 發(fā)布確認(rèn)

    2024年02月08日
    瀏覽(29)
  • 計算機(jī)網(wǎng)絡(luò)第三章問答題

    答:(1)以太網(wǎng)交換機(jī)實(shí)質(zhì)上就是一個 多接口的網(wǎng)橋 。 每個接口都直接與一個單臺主機(jī)或另一個以太網(wǎng)交換機(jī)相連,并且一般都 工作在全雙工方式 。 以太網(wǎng)交換機(jī)具有 并行性 。 相互通信的主機(jī)都是獨(dú)占傳輸媒體,無碰撞地傳輸數(shù)據(jù) 以太網(wǎng)交換機(jī)的 接口有存儲器 ,能在

    2024年02月20日
    瀏覽(20)
  • 第三章 數(shù)據(jù)鏈路層【計算機(jī)網(wǎng)絡(luò)】

    第三章 數(shù)據(jù)鏈路層【計算機(jī)網(wǎng)絡(luò)】

    2023-7-7 16:29:11 以下內(nèi)容源自《【計算機(jī)網(wǎng)絡(luò)】》 僅供學(xué)習(xí)交流使用 第二章 物理層【計算機(jī)網(wǎng)絡(luò)】 計算機(jī)網(wǎng)絡(luò)(第8版) 謝希仁 編著 3.1.1 數(shù)據(jù)鏈路和幀 3.1.2 三個基本問題 數(shù)據(jù)鏈路層協(xié)議有許多種,但有A個基本問題是: 封裝成幀、透明傳輸和差錯檢測 。下面分別討論這三個

    2024年02月13日
    瀏覽(30)
  • 計算機(jī)網(wǎng)絡(luò)第三章——數(shù)據(jù)鏈路層(上)

    計算機(jī)網(wǎng)絡(luò)第三章——數(shù)據(jù)鏈路層(上)

    提示:節(jié)物風(fēng)光不相待。桑田碧海須臾改 這一章主要學(xué)習(xí)數(shù)據(jù)鏈路層的功能和應(yīng)用, 功能中最主要的也是最重要的就是封裝成幀和透明傳輸 ,封裝成幀就是幫我過濾一下物理層,這里就是將物理層的幾個bit封裝成幀, 幀就是數(shù)據(jù)鏈路層的傳輸單位或者說是傳輸單元 ,透明

    2024年02月08日
    瀏覽(19)
  • 計算機(jī)網(wǎng)絡(luò)第三章——數(shù)據(jù)鏈路層(下)

    計算機(jī)網(wǎng)絡(luò)第三章——數(shù)據(jù)鏈路層(下)

    提示:任何命運(yùn)無論多么復(fù)雜,都只是反映在一瞬間 局域網(wǎng)也有無線局域網(wǎng), 局域網(wǎng)的特性主要由三個要素決定:拓?fù)浣Y(jié)構(gòu)、傳輸介質(zhì),介質(zhì)訪問控制方式,最重要的是介質(zhì)訪問控制方式,它決定著局域網(wǎng)的技術(shù)特性 我們?nèi)粘I钪芯钟蚓W(wǎng)主要是使用總線型這種結(jié)構(gòu),若是中

    2024年02月09日
    瀏覽(36)
  • 計算機(jī)網(wǎng)絡(luò)-筆記-第三章-數(shù)據(jù)鏈路層

    計算機(jī)網(wǎng)絡(luò)-筆記-第三章-數(shù)據(jù)鏈路層

    一、第一章——計算機(jī)網(wǎng)絡(luò)概述 二、第二章——物理層 三、第三章——數(shù)據(jù)鏈路層 四、第四章——網(wǎng)絡(luò)層 五、第五章——運(yùn)輸層 六、第六章——應(yīng)用層 目錄 三、第三章——數(shù)據(jù)鏈路層 1、數(shù)據(jù)鏈路層概述(幀) (1)封裝成幀、差錯檢測、可靠傳輸(簡單介紹) (2)CS

    2024年02月10日
    瀏覽(102)
  • 計算機(jī)網(wǎng)絡(luò)第三章——數(shù)據(jù)鏈路層(中)

    計算機(jī)網(wǎng)絡(luò)第三章——數(shù)據(jù)鏈路層(中)

    數(shù)聲風(fēng)笛離亭晚,君向?yàn)t湘我向秦 主要任務(wù):為使用介質(zhì)的每個結(jié)點(diǎn)隔離來自同一信道上其他結(jié)點(diǎn)所傳送的信號,以協(xié)調(diào)活動結(jié)點(diǎn)的傳輸 介質(zhì)訪問控制(Medium Access Control,MAC)子層: 用來決定廣播信道中信道分配 總線型和星型都是廣播式通信,看一下目的地址是否是本主機(jī),若是

    2024年02月09日
    瀏覽(23)
  • JAVA學(xué)習(xí)筆記——第三章 變量

    JAVA學(xué)習(xí)筆記——第三章 變量

    ?? 博客主頁 :?A_SHOWY ?? 系列專欄 :力扣刷題總結(jié)錄?數(shù)據(jù)結(jié)構(gòu)??云計算??數(shù)字圖像處理??力扣每日一題_? 變量是程序的基本組成單位,是內(nèi)存中的一個數(shù)據(jù)存儲空間。變量有三個基本要素:類型+名稱+值。變量的使用,聲明后賦值后即可使用 變量使用注意事項(xiàng):同c+

    2024年01月18日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包