JSP:Servlet

?Servlet處理請求過程

B/S請求響應模型

?Servlet介紹

JSP是Servlet的一個成功應用,其子集。

JSP頁面負責前臺用戶界面,JavaBean負責后臺數據處理,一般的Web應用采用JSP+JavaBean就可以設計得很好了。

JSP+Servlet+JavaBean是MVC

Servlet的核心思想:在服務器端創建能響應用戶請求的對象,即Servlet對象。

Servlet類:屬于javax.servlet.http包中的HttpServlet類的子類。

Servlet 與 JSP 內置對象

獲得內置對象的方法

獲得 out 對象

JSP 中的 out 對象,一般可以使用 doXXX 方法中的 response 參數獲得

默認情況下,out 對象是無法打印中文

解決方法:response.setContentType("text/html;charset=gb2312");

獲得 request 和 response 對象

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//將 request 參數當成 request 對象使用

//將 response 參數當成 response 對象使用

}?

獲得 application 對象

?? ServletContext application = this.get ServletContext();

//將 application 當成 application 對象來使用

配置環境

使用servlet的步驟:

1.配置 servlet-api.jar

2.編碼 *.java

3.編譯生成字節碼文件 *.class

4.部署

5.調用

JDK 內置包中不包含編譯servlet源文件需要HttpServlet、HttpServletRequest等類,因此,需要在環境變量中包含 servlet.jar,這個 jar 文件在 TOMCAT 安裝目錄的 common\lib 文件下,如果沒有可以網上下載。

編輯 classpath,加入%CATALINA_HOME%\lib\servlet-api.jar

將servlet.jar文件拷貝到jdk安裝目錄的jdk\jre\lib\ext中

部署Servlet

Hello.java

package china.dalian;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class Hello extends HttpServlet

{? public void init(ServletConfig config) throws ServletException

???? {? super.init(config);?

???? }

?? public void service (HttpServletRequest request, HttpServletResponse response)? throws IOException

??? {? response.setContentType(“text/html;charset=gb2312”);

?????? PrintWriter out = reponse.getWriter();

?????? out.println(“<html><body>”);

?????? out.println(“<h2>歡迎學習servlet</h2>”);

?????? out.println(“</body></html>”);

??? }

將生成的字節碼文件如 Hello.class 保存在Tomcat服務器 WEB-INF\classes 目錄下對應包名文件中,包名為? pakage china.dalian 在具體的目錄為

WEB-INF\classes\china\dalian

在Web根目錄下編輯 web.xml 文件,對 Servlet 文件進行配置

servlet 節:如何生成該servlet

servlet-mapping節:如何調用該servlet

Servlet與JSP的區別

?????? Servlet是使用Java Servlet接口(API)運行在Web應用服務器上Java程序,其功能十分強大,它不但可以處理Http請求中的業務邏輯,而且還可以輸出HTML代碼來顯示指定頁面。

?????? JSP是一種在Servlet規范之上的動態網頁技術,在JSP頁面之中,同樣可以編寫業務邏輯處理Http請求,也可以通過HTML代碼來編輯頁面,在實現功能上,ServletJSP貌似相同,實質存在一定的區別,表現在以下方面:

1、角色不同

2、編程方法不同

3Servlet需要編譯后運行

4、速度不同

Servlet技術特點

?????? Servlet使用Java語言編寫,它不僅繼承了Java語言中的優點,而且Servlet還對Web的相關應用進行了封裝,同時Servlet容器還提供了對應用的相關擴展,無論是在功能、性能、安全等方面都十分優秀,其技術特點表現在以下方面。

1、功能強大

2、可移植

3、性能高效

4、安全性高

5、可擴展

Servlet代碼結構

?????? 在Java中,通常所說的Servlet是指HttpServlet對象,在聲明一個對象為Servlet時,需要繼承HttpServlet類。

??????? HttpServlet類是Servlet接口的一個實現類,繼承此類后,可以重寫HttpServlet類中的方法對HTTP請求進行處理。?Servlet 工作原理-生命周期?

Servlet 工作原理-對象模型? Servlet 工作原理

n init 方法

public void init ( ServletConfig config ) throws ServletException

n service 方法

public void service ( HttpServletRequest request HttpServletResponse response ) throw ServletException, IOException

n destroy 方法

public destroy ( )n

init方法

<web-app>

? …

? <servlet>?

??? ? <servlet-name>InitExample</servlet-name>

??? ? <servlet-class>ServletInit</servlet-class>

? <init-param>

????? ? <param-name>login</param-name>

????? ? <param-value>snoopy</param-value>

??? ? </init-param>

? ? </servlet>

??????????? …

</web-app>

????? 對于web.xml中定義的param變量,可以通getInitParameter()? 方法來獲得。具體格式為:

String str = getInitParameter(“xxx”);

n service方法
n destroy 方法
n

???? Servlet類可以直接繼承這個方法,一般不需要重寫。

?????????

??????????? public destroy()

?共享變量

??????? Servlet中聲明的某些成員變量,會被所有請求該servlet的用戶共享。

??servlet共享變量來計算pi的值。

???? PI/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 ……

? doGetdoPost方法

??????? 服務器接收到用戶請求后,調用service方法檢查http的請求類型(如getpost),并在service方法中根據用戶的請求方式,對應地調用doGetdoPost方法。

???????? 因此,不必重寫service方法,可直接繼承service方法,在servlet類中重寫doPostdoGet方法達到同樣的效果。

?重定向與轉發

?重定向

??????? HttpServletResponse類中通過方法

void sendRedirect(java.lang.String location) 可實現頁面的跳轉。

???? ?response.sendRedirect (“xxx.jsp”);

注意:該方法跳轉后的頁面,不能獲得之前頁面用戶提交的數據。

?轉發

??????? RequestDispatcher對象可以把用戶對當前的JSP頁面或servlet的請求轉發給另一個JSP頁面或servlet,并且將請求對象和相應對象傳遞給目標頁面。

第一步:得到RequestDispatcher對象:

RequestDispatcher? rd = request.getRequestDispatcher(“xxx.jsp”);

第二步:轉發:

?? ?rd.forward( request, response);

轉發 vs 重定向

m 默認情況下 , SendRedirect 不會保留請求對象中參數;需要保存請求的相關信息時要用 請求轉發
m SendRedirect 會在客戶端呈現跳轉后的 URL 地址 請求轉發 完全是在服務器上進行,瀏覽器地址欄中的地址保持不變
m 請求轉發 不能將請求發到其他的 web 應用上 SendRedirect 可以
使用session

??????? HttpServletRequest對象可以調用getSession方法獲取用戶的session對象。該session對象即第四章中的session對象。

格式:

HttpSession session = request.getSession(true);

?????? 可以在servlet中使用session對象及其方法,實現對同一用戶的確認。

Servlet API編程常用接口和類

Servlet接口

方????法?? ?說????明
public void init(ServletConfig config)?? ?Servlet實例化后,Servlet容器調用此方法來完成初始化工作
public void service(ServletRequest request,ServletResponse response)?? ?此方法用于處理客戶端的請求
public void destroy()?? ?當Servlet對象應該從Servlet容器中移除時,容器調用此方法,以便釋放資源
public ServletConfig getServletConfig()?? ?此方法用于獲取Servlet對象的配置信息,返回ServletConfig對象
public String getServletInfo()?? ?此方法返回有關Servlet的信息,它是純文本格式的字符串,如作者、版本等

m 創建一個 servlet ,實現向客戶端輸出一個字符串

ServletConfig接口

方????法?? ?說????明
public String getInitParameter(String name)?? ?此方法返回String類型名稱為name的初始化參數值
public Enumeration getInitParameterNames()?? ?獲取所有初始化參數名的枚舉集合
public ServletContext getServletContext()?? ?用于獲取Servlet上下文對象
public String getServletName()?? ?返回Servlet對象的實例名

HttpServletRequest接口

方????法?? ?說????明
public String getContextPath()?? ?返回請求的上下文路徑,此路徑以“/”開關
public Cookie[] getCookies()?? ?返回請求中發送的所有cookie對象,返回值為cookie數組
public String getMethod()?? ?返回請求所使用的HTTP類型,如get、post等
public String getQueryString()?? ?返回請求中參數的字符串形式,如請求MyServlet?username=mr,則返回username=mr
public String getRequestURI()?? ?返回主機名到請求參數之間部分的字符串形式
public StringBuffer getRequestURL()?? ?返回請求的URL,此URL中不包含請求的參數。注意此方法返回的數據類型為StringBuffer
public String getServletPath()?? ?返回請求URI中的Servlet路徑的字符串,不包含請求中的參數信息
public HttpSession getSession()?? ?返回與請求關聯的HttpSession對象

HttpServletResponse接口

方????法?? ?說????明
public void addCookie(Cookie cookie)?? ?向客戶端寫入cookie信息
public void sendError(int sc)?? ?發送一個錯誤狀態碼為sc的錯誤響應到客戶端
public void sendError(int sc, String msg)?? ?發送一個包含錯誤狀態碼及錯誤信息的響應到客戶端,參數sc為錯誤狀態碼,參數msg為錯誤信息
public void sendRedirect(String location)?? ?使用客戶端重定向到新的URL,參數location為新的地址

HttpServlet類

????? GenericServlet類實現了javax.servlet.Servlet接口,為程序的開發提供了方便;但在實際開發過程中,大多數的應用都是使用Servlet處理HTTP協議的請求,并對請求作出響應,所以通過繼承GenericServlet類仍然不是很方便。javax.servlet.http.HttpServlet類對GenericServlet類進行了擴展,為HTTP請求的處理提供了靈活的方法。

???? public abstract class HttpServlet

? extends GenericServlet implements Serializable

GenericServlet

?????? Servlet創建

????? 在編寫一個Servlet對象時,必須實現javax.servlet.Servlet接口,但在Servlet接口中包含5個方法,也就是說創建一個Servlet對象要實現這5個方法,這樣操作非常不方便。javax.servlet.GenericServlet類簡化了此操作,實現了Servlet接口。

???? ??public abstract class GenericServlet

? extends Object

? implements Servlet, ServletConfig,?? Serializable?? ?????

????? Servlet的創建十分簡單,主要有兩種創建方法。第一種方法為創建一個普通的Java類,使這個類繼承HttpServlet類,再通過手動配置web.xml文件注冊Servlet對象。此方法操作比較繁瑣,在快速開發中通常不被采納,而是使用第二種方法——直接通過IDE集成開發工具進行創建。

???? 使用集成開發工具創建Servlet非常方便,下面以Eclipse為例介紹Servlet的創建過程,其他開發工具大同小異。

Servlet配置

?????? 要使Servlet對象正常地運行,需要進行適當的配置,以告知Web容器哪一個請求調用哪一個Servlet對象處理,對Servlet起到一個注冊的作用。Servlet的配置包含在web.xml文件中,主要通過以下兩步進行設置。

??????????? (1)聲明Servlet對象

??????????? 2)映射Servlet

m ?? 創建名為 MyServlet 對象,繼承了 HTTPServlet 類,重寫 doGet()方法
總結概括 Servlet的生命周期
m 1 . 客戶端向服務器 發出請求 ,服務器根據客戶端的請求,找到相應的 Servlet
m 2. 判斷該 Servlet 是否在內存中加載?若未加載,創建該 Servlet 實例,調用 init() 方法完成 初始化操作 若已經加載,轉 3
m 3. 調用 service() 方法對客戶端進行 響應 。等待下一次請求 Servlet 生命周期中, service() 方法是其中的核心。每當客戶端向 Servlet 發出一個請求時,該方法就會被調用 , 對用戶的請求進行處理,并返回響應。
m 4. 結束,調用 destroy() 方法 當服務器端不再需要該 Servlet 的時候,服務器調用 destroy() 方法卸載 Servlet ,釋放 Servlet 運行時占用的資源。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164358.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【實驗筆記】C語言實驗——降價提醒機器人

降價提醒機器人 題目&#xff1a; 小 T 想買一個玩具很久了&#xff0c;但價格有些高&#xff0c;他打算等便宜些再買。但天天盯著購物網站很麻煩&#xff0c;請你幫小 T 寫一個降價提醒機器人&#xff0c;當玩具的當前價格比他設定的價格便宜時發出提醒。 輸入格式&#xf…

人工智能教程(一):基礎知識

目錄 前言 什么是人工智能&#xff1f; 教學環境搭建 向量和矩陣 前言 如果你是關注計算機領域最新趨勢的學生或從業者&#xff0c;你應該聽說過人工智能、數據科學、機器學習、深度學習等術語。作為人工智能系列文章的第一篇&#xff0c;本文將解釋這些術語&#xff0c;并搭…

k8s部署-kuboard安裝(工具kuboard-spary)

Kuboard-Spray Kuboard-Spray 是一款可以在圖形界面引導下完成 Kubernetes 高可用集群離線安裝的工具 配置要求 對于 Kubernetes 初學者&#xff0c;在搭建K8S集群時&#xff0c;推薦在阿里云或騰訊云采購如下配置&#xff1a;&#xff08;您也可以使用自己的虛擬機、私有云等…

HCIP --- HCIA(部分匯總)--- 點對點網絡

抽象語言 --- 電信號 抽象語言 --- 編碼 編碼 --- 二進制 二進制 --- 電信號 處理電信號 OSI/RM ---- 開放式系統互聯參考模型 --- 1979 --- ISO --- 國際標準化組織 核心思想 --- 分層 應用層 --- 提供各種應用程序&#xff0c;抽象語言轉換成編碼&#xff0c;人機交互…

Docker 命令詳解

1. 容器生命周期管理 命令說明文檔run創建一個新的容器并運行一個命令Docker run 命令start/stop/restart啟動、停止、重啟容器Docker start/stop/restart 命令kill殺掉一個運行中的容器Docker kill 命令rm刪除一個或多個容器Docker rm 命令pause/unpause暫停 恢復容器中所有的…

Arm64版本的centos編譯muduo庫遇到的問題的歸納

環境&#xff1a;Mac m2 pro下的VMware虛擬機中Arm64 centos ./build.sh 執行后提示如下 cmake -DCMAKE_BUILD_TYPErelease -DCMAKE_INSTALL_PREFIX…/release-install-cpp11 -DCMAKE_EXPORT_COMPILE_COMMANDSON /root/package/muduo-master – Boost version: 1.69.0 – Co…

[git] 忽略已經提交的文件或文件夾

文件已經被Git跟蹤 如果某個文件已經被Git跟蹤過&#xff08;即已經添加到版本控制中&#xff09;&#xff0c;.gitignore文件對該文件將不起作用。您需要使用以下命令將該文件從Git中移除&#xff1a; git rm --cached 支持文件夾 -r <文件夾>

Flink Table API 讀寫MySQL

Flink Table API 讀寫 MySQL import org.apache.flink.connector.jdbc.table.JdbcConnectorOptions; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.DataTypes; import org.apache.flink.table.api.Envi…

投資房產的理由與好處,投資買房的方法與技巧

一、教程描述 本套買房教程&#xff0c;大小2.15G&#xff0c;共有23個文件。 二、教程目錄 00.她23歲北漂月薪600&#xff0c;7年后50萬在京買了第一套房&#xff0c;如今身價上千萬.mpg 01.這個游戲&#xff0c;有些人輸了所有錢&#xff0c;一輩子也不明白這個道理.mpg …

CSGO搬磚項目全面講解 ,CSGO搬磚注意事項

steam/csgo搬磚第二課之如何選品 Steam/CSGO游戲搬磚全套操作流程之如何選品&#xff08;第二課&#xff09; 一個游戲只要能搬&#xff0c;只要體量不夠大&#xff0c;很快就會貨幣價格暴跌&#xff0c;直接涼涼。市面上的能穩定手動搬磚的游戲越來越少。所以對于兼職賺點外快…

【Spring】 IoCDI

回顧 企業命名規范 大駝峰:BookDao(首字母都大寫) 類名 小駝峰:bookDao(第一個字母小寫) 方法名 蛇形:book_dao(小寫下劃線_) 數據庫 串形:book-dao(小寫連字符-) 項目文件夾 各種注解 學習Spring MVC, 其實就是學習各種Web開發需要?的到注解 a. RequestMapping: 路由…

[Linux] shell腳本的函數和數組

一、函數 1.1 函數的定義 函數是腳本的別名 作用&#xff1a;函數可以避免代碼重復&#xff0c;可讀性強&#xff0c;可以簡化腳本。 格式&#xff1a;函數名&#xff08;&#xff09;{腳本} 1.2 如何使用函數 1.定義 2.調用 函數一定要先定義再使用 例子&#xff1a…

編譯原理Lab1-用FLEX構造C-Minus-f詞法分析器

HNU編譯原理lab1實驗–根據cminux-f的詞法補全lexical_analyer.l文件&#xff0c;完成詞法分析器。 本文沒有添加任何圖片&#xff0c;但是以復制輸出的形式展現出來了實驗結果。 實驗要求&#xff1a; 根據cminux-f的此法補全lexical_analyer.l文件&#xff0c;完成詞法分析…

國家超級計算濟南中心低代碼平臺應用實踐

摘要&#xff1a;文章主要介紹了濟南超算使用低代碼平臺明道云解決了一系列業務問題&#xff0c;包括資產管理、人員與機構管理、流程制度管理等。通過明道云平臺&#xff0c;濟南超算成功地將不同部門的業務信息進行整合&#xff0c;提高了工作效率和管理水平。文章還強調了明…

計算機端口

前言 計算機端口&#xff08;Port&#xff09;是一種用于在計算機網絡中標識特定服務或應用程序的機制。 端口是一個數字&#xff0c;范圍從0到65535&#xff0c;用于將網絡通信分配給不同的應用程序或服務。 在 Internet 協議套件&#xff08;TCP/IP&#xff09;中&#xff0…

MG-HSF

作者未提供代碼

Go語言中結構體的使用和示例

結構體&#xff08;簡稱struct&#xff09;用于創建不同數據類型的成員集合&#xff0c;放入一個單一的變量中。雖然數組用于將相同數據類型的多個值存儲在單一變量中&#xff0c;但結構體用于將不同數據類型的多個值存儲在單一變量中。結構體對于將數據組合在一起以創建記錄非…

openGL之紋理 :第二課

#include "glew.h" #include "glfw3.h" #include "SOIL2.h"//如何解析輸入的數據流 0&#xff0c;1,2 分三部分 GLchar * vertextSrc " #version 330 core \n \layout (location 0) in vec3 position; \layout (location 1) in vec3 col…

【精選】??通道熱點加持的LW-ResNet:小麥病害智能診斷與防治系統

1.研究背景與意義 小麥是世界上最重要的糧食作物之一&#xff0c;但由于病害的侵襲&#xff0c;小麥產量和質量受到了嚴重的威脅。因此&#xff0c;開發一種高效準確的小麥病害識別分類防治系統對于保障糧食安全和農業可持續發展具有重要意義。 傳統的小麥病害識別分類方法主…