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

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

這篇具有很好參考價(jià)值的文章主要介紹了Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一.servlet的基本概念:

什么是servlet ?

Servlet 是一種實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù) .換句話說(shuō),servlet是 java為實(shí)現(xiàn)web開(kāi)發(fā)提供的一些規(guī)范,而想要去參與web開(kāi)發(fā)的一些軟件,就要滿足servlet的規(guī)范,而 這些滿足servlet規(guī)范的軟件我們稱其為web開(kāi)發(fā)的中間件(tomcat是一個(gè)常用的servlet容器),tomcat就是其中比較出色的一個(gè),tomcat一般提供的服務(wù)如下: 在基于HTTP協(xié)議的基礎(chǔ)上對(duì)外提供HTTP服務(wù)器,并開(kāi)辟了一個(gè)端口號(hào)(8080),接收用戶的請(qǐng)求并對(duì)其進(jìn)行解析,之后將請(qǐng)求發(fā)送給servlet,在servlet給出響應(yīng)之后,同樣也是通過(guò)tomcat將請(qǐng)求返回給用戶端。
動(dòng)態(tài)頁(yè)面 vs 靜態(tài)頁(yè)
靜態(tài)頁(yè)面也就是內(nèi)容始終固定的頁(yè)面 . 即使 用戶不同 / 時(shí)間不同 / 輸入的參數(shù)不同 , 頁(yè)面內(nèi)容也不會(huì)發(fā)生 變化. ( 除非網(wǎng)站的開(kāi)發(fā)人員修改源代碼 , 否則頁(yè)面內(nèi)容始終不變 ). 對(duì)應(yīng)的, 動(dòng)態(tài)頁(yè)面指的就是 用戶不同 / 時(shí)間不同 / 輸入的參數(shù)不同 , 頁(yè)面內(nèi)容會(huì)發(fā)生變化 .
我們依然以tomcat進(jìn)行舉例說(shuō)明:tomcat的頁(yè)面是一個(gè)靜態(tài)頁(yè)面:
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?抖音是一個(gè)動(dòng)態(tài)頁(yè)面:https://www.douyin.com/

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?我們?cè)诩虞d靜態(tài)頁(yè)面時(shí):一般在第一次加載完靜態(tài)頁(yè)面之后后面再次加載部分資源都走緩存,所以當(dāng)我們?cè)趯懬岸隧?xiàng)目對(duì)部分資源進(jìn)行修改時(shí),我們一定要記得清除瀏覽器中的緩存。

二.創(chuàng)建第一個(gè)servlet程序

1.創(chuàng)建項(xiàng)目

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

生成目錄結(jié)構(gòu)

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

2.設(shè)置編碼格式

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

3.引入依賴:我們一般需要什么依賴時(shí),直接在maven倉(cāng)庫(kù)中直接引入:https://mvnrepository.com/對(duì)于servlet程序而言,第一步要先引入servlet依賴。

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟


?

4.完善目錄結(jié)構(gòu):在main包下創(chuàng)建webapp的包,同時(shí)創(chuàng)建子包WEB-INF,傳入web.xml的配置文件,這樣一來(lái),基本的結(jié)構(gòu)就比較完整了

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

5.編寫代碼

?Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

6.修改打包方式并進(jìn)行打包

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

我們?cè)趍aven中進(jìn)行打包, 打包結(jié)果如下:

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

當(dāng)提示打包成功后我們查看其相關(guān)的包:我們發(fā)現(xiàn)打包的結(jié)果是一個(gè)jar包,但是在tomcat環(huán)境下運(yùn)行需要將其打成war包,因此,我們需要修改一下打包方式:

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?修改方式如下:Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

這時(shí)候的打包結(jié)果如下:

?Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?除打包之外,我們也應(yīng)該了解一下有關(guān)項(xiàng)目聲明周期的其他指令:url如下:

Maven – Introduction to the Build Lifecycle

7.將打包的程序部署到tomcat:把生成的war包部署到tomcat中的webapps的文件夾中
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

在Windows的打開(kāi)tomcat的文件是以bat結(jié)尾的文件,因此使用startup.bat運(yùn)行tomcat,以.sh結(jié)尾的文件是在Linux系統(tǒng)下運(yùn)行的,而使用關(guān)閉tomcat連接的方式是:Ctrl+v或者雙擊shutdown.bat?

我們發(fā)現(xiàn)運(yùn)行時(shí)出現(xiàn)的提示信息均為亂碼,這是因?yàn)榫幋a集的差別,Windows環(huán)境下默認(rèn)的編碼方式是GBK,而我們?cè)趖omcat 中的設(shè)置的編碼集是utf-8,所以在解碼時(shí)出現(xiàn)亂碼,如果想要恢復(fù)正常,則可以修改其logging.properties這個(gè)文件的部分內(nèi)容:
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

8.測(cè)試驗(yàn)證程序:我們發(fā)現(xiàn)我們能打開(kāi)tomcat的主頁(yè),這時(shí)說(shuō)明tomcat啟動(dòng)成功了。

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

我們?cè)谶\(yùn)行tomcat之后會(huì)生成一個(gè)與war包名稱一致的文件夾,我們以這個(gè)文件夾作為

?Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

但是如果以后都使用這種方式運(yùn)行servlet,我們每次對(duì)源碼進(jìn)行更新都要重新打包然后部署到tomcat,操作起來(lái)非常麻煩,但是如果將tomcat導(dǎo)入到ideal中,直接在ideal中使用tomcat運(yùn)行程序,會(huì)簡(jiǎn)單很多,所以我們直接使用tomcat server將tomcat導(dǎo)入到ideal中,但是很多小伙伴對(duì)這個(gè)過(guò)程比較陌生,推薦大家去看我的另一篇博客:聽(tīng)說(shuō)你也在為配置tomcat server而煩惱,看我這一篇,讓你醍醐灌頂!_努力努力再努力mlx的博客-CSDN博客

三.在運(yùn)行程序時(shí)訪問(wèn)出現(xiàn)的常見(jiàn)錯(cuò)誤

1.404

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

如果能夠保證服務(wù)器能夠正常運(yùn)行,一般而言,出現(xiàn)的404錯(cuò)誤都是由于訪問(wèn)路徑出錯(cuò)了,我們可以嘗試從以下這幾方面進(jìn)行考慮:
①?zèng)]有寫 contextpath

②沒(méi)有寫servletpath

③ servletpath 路徑錯(cuò)誤

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

我們拿這個(gè)路徑進(jìn)行說(shuō)明:servlet_ljl_war_exploded是context path,index.jsp是servlet path,如果我們的程序中出現(xiàn)404錯(cuò)誤,我們可以從這兩個(gè)方面進(jìn)行考慮。??

2 .405 方法錯(cuò)誤

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

方法錯(cuò)誤是后端提供的方法和我們?cè)L問(wèn)的方法不一致,即后端是通過(guò)get方法進(jìn)行請(qǐng)求,但是我們卻使用post方法進(jìn)行請(qǐng)求,這時(shí)則會(huì)出現(xiàn)405錯(cuò)誤:方法不允許,其實(shí)出現(xiàn)這個(gè)錯(cuò)誤進(jìn)行異常檢驗(yàn)也相對(duì)簡(jiǎn)單,直接對(duì)接前后端接口的方法類型即可。

3.500異常

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?出現(xiàn)這個(gè)問(wèn)題的原因主要是因?yàn)?span style="color:#0d0016;">服務(wù)器內(nèi)部出現(xiàn)錯(cuò)誤,這時(shí)候我們需要從服務(wù)器內(nèi)部進(jìn)行調(diào)錯(cuò)。

4.出現(xiàn)“空白頁(yè)面”

一般而言,如果頁(yè)面沒(méi)有給出響應(yīng),也沒(méi)有報(bào)出任何錯(cuò)誤,其實(shí)這時(shí)候大多數(shù)情況下是因?yàn)槲覀冊(cè)诤蠖瞬](méi)有給出任何響應(yīng)。

5.無(wú)法訪問(wèn)網(wǎng)頁(yè)

一般是 Tomcat 啟動(dòng)就失敗了
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

四.servlet中的常見(jiàn)類的API: 4.1HttpServelt

HttpServlet 的主要作用之一是轉(zhuǎn)發(fā)請(qǐng)求

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

4.2servlet的生命周期

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?1、加載并實(shí)例化
? ? ? ? ?Servlet容器負(fù)責(zé)加載和實(shí)例化Servelt。當(dāng)Servlet容器啟動(dòng)時(shí),或者在容器檢測(cè)到需要這個(gè)Servlet來(lái)響應(yīng)第一個(gè)請(qǐng)求時(shí),創(chuàng)建Servlet實(shí)例。當(dāng)Servlet容器啟動(dòng)后,Servlet通過(guò)類加載器來(lái)加載Servlet類,加載完成后再new一個(gè)Servlet對(duì)象來(lái)完成實(shí)例化。

? ? 2、初始化
? ? ? ? 在Servlet實(shí)例化之后,容器將調(diào)用init()方法,并傳遞實(shí)現(xiàn)ServletConfig接口的對(duì)象。在init()方法中,Servlet可以部署描述符中讀取配置參數(shù),或者執(zhí)行任何其他一次性活動(dòng)。在Servlet的整個(gè)生命周期類,init()方法只被調(diào)用一次。?

? ? 3、服務(wù)
? ? ? ? 當(dāng)Servlet初始化后,容器就可以準(zhǔn)備處理客戶機(jī)請(qǐng)求了。當(dāng)容器收到對(duì)這一Servlet的請(qǐng)求,就調(diào)用Servlet的service()方法,并把請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)傳遞。當(dāng)并行的請(qǐng)求到來(lái)時(shí),多個(gè)service()方法能夠同時(shí)運(yùn)行在獨(dú)立的線程中。servlet會(huì)在適當(dāng)?shù)臅r(shí)候調(diào)用 doGet()、doPost()、doPut(),doDelete() 等方法。?

? ? 4、銷毀?
? ? ? ? 當(dāng)Tomcat容器關(guān)閉時(shí)或由于其他原因?qū)е耂ervlet需要關(guān)閉或卸載時(shí),容器會(huì)調(diào)用該對(duì)象的destroy()方法,以便讓Servlet對(duì)象可以釋放它所使用的資源,該方法同樣只會(huì)執(zhí)行一次。在容器調(diào)用destroy()方法前,如果還有其他的線程正在service()方法中執(zhí)行,容器會(huì)等待這些線程執(zhí)行完畢或者等待服務(wù)器設(shè)定的超時(shí)值到達(dá)。一旦Servlet對(duì)象的destroy()方法被調(diào)用,容器會(huì)釋放這個(gè)Servlet對(duì)象,在隨后的時(shí)間內(nèi),該對(duì)象會(huì)被java的垃圾收集器所回收。這四個(gè)階段共同組成了Servlet的生命周期。

?

4.3HttpServletRequest方法

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?4.3.1測(cè)試HttpservletRequest方法

package exer;

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;

/**
 * @author tongchen
 * @create 2023-04-01 15:36
 * 測(cè)試請(qǐng)求中的各種方法
 */
//設(shè)置注解,使瀏覽器可以訪問(wèn)
    @WebServlet("/showRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //在涉及前后端交互的過(guò)程中,最先要確定的就是在數(shù)據(jù)傳輸過(guò)程中的編碼格式問(wèn)題
        //確定傳輸過(guò)來(lái)數(shù)據(jù)的編碼格式
        req.setCharacterEncoding("utf-8");
        //確定返回響應(yīng)的編碼格式
        resp.setContentType("text/html;charset=utf-8");
        //創(chuàng)建StringBuilder
        StringBuilder stringBuilder = new StringBuilder();
        //獲取請(qǐng)求方法
        String method = req.getMethod();
        stringBuilder.append(method);
        //換行
        stringBuilder.append("<br>");
        //獲取URL
        String requestURI = req.getRequestURI();
        stringBuilder.append(requestURI);
        stringBuilder.append("<br>");
        //獲取協(xié)議和版本號(hào)
        String protocol = req.getProtocol();
        stringBuilder.append(protocol);
        stringBuilder.append("<br>");
        //獲取跟路徑
        String contextPath = req.getContextPath();
        stringBuilder.append(contextPath);
        stringBuilder.append("<br>");
        //獲取queryString
        String queryString = req.getQueryString();
        stringBuilder.append(queryString);
        stringBuilder.append("<br>");
        stringBuilder.append("++++++++++++++++++++");
        //獲取請(qǐng)求報(bào)頭信息
        Enumeration<String> headerNames = req.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String elementKey = headerNames.nextElement();
            String elementValue = req.getHeader(elementKey);
            stringBuilder.append(elementKey+" "+ elementValue);
            stringBuilder.append("<br>");


        }
        //將全部信息寫回瀏覽器
        resp.getWriter().write(stringBuilder.toString());

    }
}

?結(jié)果顯示:

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?4.4關(guān)于前后端傳輸過(guò)程中的亂碼問(wèn)題:

通常我們?cè)跀?shù)據(jù)傳輸?shù)胶蠖嘶蛘咔岸说臅r(shí)候,出現(xiàn)最多的問(wèn)題中文數(shù)據(jù)在傳輸?shù)胶蠖嘶蛘咔岸藭r(shí)出現(xiàn)了亂碼:但其實(shí)亂碼問(wèn)題只是前后端交互過(guò)程中的一個(gè)小問(wèn)題,我們千萬(wàn)不要感覺(jué)慌張,把大問(wèn)題分解為小問(wèn)題,有條不紊,一步一步地將問(wèn)題解決。

我們可以將數(shù)據(jù)傳輸過(guò)程中出現(xiàn)的亂碼問(wèn)題分為這三個(gè)階段進(jìn)行校驗(yàn)和處理:①瀏覽器將數(shù)據(jù)發(fā)送給服務(wù)器過(guò)程中出現(xiàn)亂碼②服務(wù)器在處理數(shù)據(jù)過(guò)程中出現(xiàn)亂碼③服務(wù)器將響應(yīng)數(shù)據(jù)返回給瀏覽器時(shí)出現(xiàn)亂碼:我們對(duì)此進(jìn)行逐層分析即可。

我們使用以下的例子對(duì)此進(jìn)行說(shuō)明:

package exer;

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.text.MessageFormat;

/**
 * @author tongchen
 * @create 2023-04-01 16:29
 */
@WebServlet("/parameter")
public class GetParameter extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設(shè)置接收格式
     req.setCharacterEncoding("utf-8");
        String studentId = req.getParameter("studentId");
        String studentName = req.getParameter("studentName");
        String format = MessageFormat.format("studentId={0},studentName={1}", studentId, studentName);
        //在控制臺(tái)打印
        System.out.println(format);
        //設(shè)置返回格式
       // resp.setContentType("text/html;charset=utf-8");
        //返回?cái)?shù)據(jù)
        resp.getWriter().write(format);

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}


Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

我們?cè)诜?wù)器響應(yīng)給瀏覽器的數(shù)據(jù)中發(fā)現(xiàn)studentName這一屬性成了亂碼,我們按照以上的三個(gè)方面對(duì)此進(jìn)行分析:
?

?Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

從控制臺(tái)中打印的代碼來(lái)看的話,前端往后端傳來(lái)的數(shù)據(jù)并沒(méi)有出現(xiàn)亂碼,這說(shuō)明從前端往服務(wù)器傳輸數(shù)據(jù)沒(méi)有出現(xiàn)亂碼,而我們只是將數(shù)據(jù)進(jìn)行了簡(jiǎn)單的輸出,數(shù)據(jù)處理過(guò)程也不會(huì)出現(xiàn)亂碼,所以我們將問(wèn)題鎖定在從服務(wù)器往前端的數(shù)據(jù)傳輸過(guò)程中出現(xiàn)了亂碼,我們對(duì)此來(lái)進(jìn)行分析:我們并沒(méi)有對(duì)服務(wù)器到前端傳輸數(shù)據(jù)時(shí)規(guī)定好數(shù)據(jù)格式,因此存在由于前后端編碼解碼方式不一致所導(dǎo)致的亂碼問(wèn)題,因此我們需要規(guī)定好數(shù)據(jù)從后端傳往前端的數(shù)據(jù)格式問(wèn)題。

加入這樣一條語(yǔ)句即可:

resp.setContentType("text/html;charset=utf-8");

我們發(fā)現(xiàn)了上面語(yǔ)句中出現(xiàn)了我們不了解的陌生知識(shí)點(diǎn),關(guān)于text/html,這是個(gè)什么東東呢?這是規(guī)定了后端往前端傳輸數(shù)據(jù)的格式。

4.4.1關(guān)于前后端傳輸過(guò)程的數(shù)據(jù)格式問(wèn)題:

關(guān)于前后端數(shù)據(jù)傳輸?shù)母袷?,通常有以下幾種:常見(jiàn)的type有,如text,如果是*號(hào)代表所有;

  • Text:用于標(biāo)準(zhǔn)化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的;
  • Multipart:用于連接消息體的多個(gè)部分構(gòu)成一個(gè)消息,這些部分可以是不同類型的數(shù)據(jù);流的形式,常用于上傳大型文件
  • Application:用于傳輸應(yīng)用程序數(shù)據(jù)或者二進(jìn)制數(shù)據(jù);日常前后端傳輸數(shù)據(jù)常用。
  • Message:用于包裝一個(gè)E-mail消息;
  • Image:用于傳輸靜態(tài)圖片數(shù)據(jù);
  • Audio:用于傳輸音頻或者音聲數(shù)據(jù);
  • Video:用于傳輸動(dòng)態(tài)影像數(shù)據(jù),可以是與音頻編輯在一起的視頻數(shù)據(jù)格式。

常見(jiàn)的subtype有,如果是*號(hào)代表所有,用“/”與主類型type隔開(kāi);

  • text/html(以html的方式傳輸數(shù)據(jù))
  • application/x-www-form-urlencoded(默認(rèn)的表單方式傳輸數(shù)據(jù))
  • application/json(以json的方式傳輸數(shù)據(jù))
  • multipart/form-data(以文件的形式傳輸數(shù)據(jù))
  • application/xml
  • text/plain
  • text/css
  • text/javascript

4.5以get請(qǐng)求和post請(qǐng)求獲取參數(shù)

4.5.1以get請(qǐng)求獲取參數(shù)

以get請(qǐng)求獲取參數(shù),通常是使用getParameter()這個(gè)方法來(lái)獲取參數(shù),而get請(qǐng)求沒(méi)有請(qǐng)求的請(qǐng)求體,所以是在其的queryString中根據(jù)參數(shù)的名稱來(lái)獲取相應(yīng)的值。

tring studentId = req.getParameter("studentId");
        String studentName = req.getParameter("studentName");
        String format = MessageFormat.format("studentId={0},studentName={1}", studentId, studentName);

HTTP協(xié)議:當(dāng)下最主流的應(yīng)用層協(xié)議之一,你確定不了解一下嗎?_html協(xié)議_努力努力再努力mlx的博客-CSDN博客

4.5.2以post請(qǐng)求獲取參數(shù)

①如果是通過(guò)form表單,即通過(guò)application/x-www-form-urlencoded這樣的數(shù)據(jù)格式來(lái)傳輸數(shù)據(jù),我們也可以使用getparameter()這個(gè)方法來(lái)獲取數(shù)據(jù),code如下:

前端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- servlet path 注意不要有斜杠 -->
    <form action="parameter" method="post">
        <input type="text" name="studentId" id="">
        <input type="text" name="studentName" id="">
        <input type="submit"  value="提交">
    </form>
</body>
</html>

后端:
?

package exer;

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.text.MessageFormat;

/**
 * @author tongchen
 * @create 2023-04-01 16:29
 */
@WebServlet("/parameter")
public class GetParameter extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設(shè)置接收格式
        //req.setCharacterEncoding("utf-8");
        String studentId = req.getParameter("studentId");
        String studentName = req.getParameter("studentName");
        String format = MessageFormat.format("studentId={0},studentName={1}", studentId, studentName);
        //在控制臺(tái)打印
        System.out.println(format);
        //設(shè)置返回格式
       // resp.setContentType("text/html;charset=utf-8");
        //返回?cái)?shù)據(jù)
        resp.getWriter().write(format);

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

測(cè)試結(jié)果:
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

點(diǎn)擊提交按鈕后:
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?②使用json的數(shù)據(jù)格式提交數(shù)據(jù),然后使用第三方的jackson庫(kù)來(lái)解析json字符串,其作用原理如下:在接收前端發(fā)來(lái)的請(qǐng)求時(shí)使用objectMapper類將json字符串轉(zhuǎn)化為Java對(duì)象,在給前端發(fā)送響應(yīng)時(shí)把java對(duì)象轉(zhuǎn)化為json字符串發(fā)揮數(shù)據(jù),具體code如下:

 ObjectMapper objectMapper = new ObjectMapper();
 Message message = objectMapper.readValue(req.getInputStream(), Message.class);
   String s = objectMapper.writeValueAsString(message);

?4.6HttpServletResponse類的常用api

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

4.6.1關(guān)于?HttpServletResponse類的常用api的幾個(gè)例子:

①根據(jù)不同的輸入獲取不同的響應(yīng):

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

code如下:

package exer;

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;

/**
 * @author tongchen
 * @create 2023-04-02 16:04
 */
@WebServlet("/status")
public class GetStatus extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //首先設(shè)置兩個(gè)數(shù)據(jù)格式
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //根據(jù)不同的type設(shè)置編碼格式
        String type = req.getParameter("type");
        System.out.println(type);
        if(type.equals("1")){
            resp.setStatus(200);
        }
        if(type.equals("2")){
            resp.setStatus(404);
            //跳轉(zhuǎn)到tomcat頁(yè)面
            resp.sendError(404);
        }
        if(type.equals("3")){
            resp.setStatus(403);

        }
        if(type.equals("4")){
            resp.setStatus(500);
            
        }
//寫回最終數(shù)據(jù)
        resp.getWriter().write(resp.getStatus()+" ");

    }
}


②刷新時(shí)間:

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟code如下:
?

package exer;

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;

/**
 * @author tongchen
 * @create 2023-04-02 16:37
 */
@WebServlet("/refresh")
public class Refresh extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設(shè)置請(qǐng)求數(shù)據(jù)的編碼集
        req.setCharacterEncoding("utf-8");
        //設(shè)置響應(yīng)數(shù)據(jù)的格式

        resp.setContentType("application/json;charset=utf-8");
        //設(shè)置編碼格式
        //測(cè)試refresh并通過(guò)結(jié)果顯示變化
        resp.setHeader("refresh", "1");
        resp.getWriter().write("當(dāng)前時(shí)間為"+System.currentTimeMillis());
    }
}

③重定向:
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

code如下:?

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 {
        // 設(shè)置跳轉(zhuǎn)的目標(biāo),
        resp.sendRedirect("https://www.baidu.com");
        // 跳轉(zhuǎn)之后的代碼依然會(huì)執(zhí)行
        System.out.println("hello");
        System.out.println("hello");
        System.out.println("hello");
        System.out.println("hello");
        System.out.println("hello");
    }
}

五.實(shí)現(xiàn)一個(gè)簡(jiǎn)單的前后端交互的留言墻:

具體實(shí)現(xiàn)請(qǐng)大家看我另一篇博客:

六.cookie和session: 6.1基本概念:

服務(wù)器同一時(shí)刻收到的請(qǐng)求是很多的. 服務(wù)器需要區(qū)分清楚每個(gè)請(qǐng)求是從屬于哪個(gè)用戶, 就需要在 服務(wù)器這邊記錄每個(gè)用戶令牌以及用戶的信息的對(duì)應(yīng)關(guān)系.其中這個(gè)令牌是創(chuàng)建session時(shí)生成的一個(gè)隨機(jī)的sessionId,這個(gè)用戶信息對(duì)應(yīng)保存到一個(gè)session對(duì)象中,session保存到服務(wù)器中,session本身是一個(gè)map,通過(guò)隨機(jī)生成的sessionId作為key,把新生成的session對(duì)象作為value,通過(guò)key-value的形式將session對(duì)象維護(hù)在服務(wù)器中

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

而cookie本身也是一個(gè)map,同屬于一個(gè)用戶的cookie通過(guò)其key-value儲(chǔ)存在?一個(gè)session對(duì)象中,一個(gè)session對(duì)象中可能存在多個(gè)cookie,前后端交互過(guò)程中主要是通過(guò)請(qǐng)求報(bào)文和響應(yīng)報(bào)文中的cookie和set-cookie進(jìn)行維護(hù)。

cookie和session的區(qū)別:

(1)cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上
(2)cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙,如果主要考慮到安全應(yīng)當(dāng)使用session
(3)session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能,如果主要考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE
(4)單個(gè)cookie在客戶端的限制是3K,就是說(shuō)一個(gè)站點(diǎn)在客戶端存放的COOKIE不能3K。
(5)所以:將登陸信息等重要信息存放為SESSION;其他信息如果需要保留,可以放在COOKIE中

?

6.2 關(guān)于session和cookie的常用API

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

6.3關(guān)于session和cookie的傳輸過(guò)程如下:

6.3.1簡(jiǎn)單的用戶登錄案例理解cookie和session

?Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

code如下:

前端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="login" method="post">
        <input type="text" name="user">
        <input type="text" name="password" id="">
        <input type="submit" name="submit" id="" value="提交">
    </form>
</body>
</html>

后端:

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.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author tongchen
 * @create 2023-04-05 16:27
 */
@WebServlet("/login")
public class Login extends HttpServlet {
    //使用dopost方法測(cè)試登錄
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=utf-8");
        //獲取兩個(gè)變量
        String user=req.getParameter("user");
        String password=req.getParameter("password");
        System.out.println("測(cè)試賬號(hào)密碼....." +
                user+password);
        //判斷賬號(hào)密碼的正確情況
        if("zhangsan".equals(user)&&"123456".equals(password)){
            //
            //登錄成功,設(shè)置cookie并直接跳轉(zhuǎn)
            HttpSession session = req.getSession(true);
            session.setAttribute("userInfo", user);
            //跳轉(zhuǎn)
            resp.sendRedirect("index");
        }else{
            //錯(cuò)誤直接將錯(cuò)誤寫回
            resp.getWriter().write("賬號(hào)密碼錯(cuò)誤");
        }
    }
}
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.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author tongchen
 * @create 2023-04-05 16:33
 */
@WebServlet("/index")
public class Index extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取session
        HttpSession session = req.getSession(false);
        String name =(String) session.getAttribute("userInfo");
        //將name寫回
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write(name+"歡迎回來(lái)");
    }
}

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

?七.上傳文件

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

前端代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="uploadFile" id="" >
        <input type="submit" name="" id="" value="提交">
    </form>
</body>
</html>

后端代碼:

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

/**
 * @author tongchen
 * @create 2023-04-05 17:31
 */
@WebServlet("/upload")
@MultipartConfig
public class Upload extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取上傳上來(lái)的文件:
        Part uploadFile = req.getPart("uploadFile");
        //測(cè)試方法
        System.out.println(uploadFile.getSubmittedFileName());
        System.out.println(uploadFile.getContentType());
        System.out.println(uploadFile.getSize());
        //存儲(chǔ)文件
        uploadFile.write("D:/360安全瀏覽器下載/"+uploadFile.getSubmittedFileName());
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("文件下載成功");

    }
}

?結(jié)果分析:

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟
Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟

八.博客系統(tǒng)?

這個(gè)我后續(xù)更新~~~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-462244.html

到了這里,關(guān)于Servlet:實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù),看我從頭到尾帶你穿過(guò)servlet基礎(chǔ)的海洋,使君有所獲,有所悟的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包