【Servlet】HTTP 协议之请求方式、Servlet介绍、Servlet 的生命周期
HTTP 協(xié)議之請求格式
HTTP協(xié)議官網(wǎng):其中有http協(xié)議原文https://www.w3.org/Protocols/
請求格式的結(jié)構(gòu):
請求頭:請求方式、請求的地址和HTTP 協(xié)議版本
請求行:消息報(bào)頭,一般用來說明客戶端要使用的一些附加信息
空行: 位于請求行和請求數(shù)據(jù)之間,空行是必須的。
請求數(shù)據(jù):非必須。
HTTP 協(xié)議之請求方式
根據(jù)HTTP 標(biāo)準(zhǔn),HTTP 請求可以使用多種請求方法。
HTTP1.0 定義了三種請求方法: GET, POST 和HEAD 方法。
HTTP1.1 新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
常見狀態(tài)碼:
目錄結(jié)構(gòu)
Servlet 技術(shù)
狹義的Servlet 是指Java 語言實(shí)現(xiàn)的一個(gè)接口,廣義的Servlet 是指任何實(shí)現(xiàn)了這個(gè)Servlet 接口的類,一般情況下,人們將Servlet 理解為后者。Servlet 運(yùn)行于支持Java 的應(yīng)用服務(wù)器中。從原理上講,Servlet 可以響應(yīng)任何類型的請求,但絕大多數(shù)情況下Servlet 只用來擴(kuò)展基于HTTP 協(xié)議的Web 服務(wù)器
Servlet運(yùn)行在支持java 的應(yīng)用服務(wù)器上。
Servlet 的實(shí)現(xiàn)遵循了服務(wù)器能夠識別的規(guī)則,也就是服務(wù)器會(huì)自動(dòng)的根據(jù)請求調(diào)用對應(yīng)的servlet 進(jìn)行請求處理。
URL組成:
http://localhost:8080/project/my2
服務(wù)器地址:端口號/虛擬項(xiàng)目名/servlet 的別名
URI:虛擬項(xiàng)目名/servlet 的別名
瀏覽器發(fā)送請求到服務(wù)器,服務(wù)器根據(jù)請求URL 地址中的URI 信息在webapps 目錄下找到對應(yīng)的項(xiàng)目文件夾,然后在web.xml 中檢索對應(yīng)的servlet,找到后調(diào)用并執(zhí)行Servlet。
Servlet 的生命周期
從第一次調(diào)用,到服務(wù)器關(guān)閉。如果在web.xml 中配置了load-on-startup 則是從服務(wù)器開啟到服務(wù)器關(guān)閉。
package com.bjsxt.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** Servlet的生命周期:* 1、從第一次調(diào)用到服務(wù)器關(guān)閉。* 2、如果Servlet在web.xml中配置了load-on-startup,生命周期為從服務(wù)器啟動(dòng)到服務(wù)器關(guān)閉* 注意:* init方法是對Servlet進(jìn)行初始化的一個(gè)方法,會(huì)在Servlet第一次加載進(jìn)行存儲(chǔ)時(shí)執(zhí)行* destory方法是在servlet被銷毀時(shí)執(zhí)行,也就服務(wù)器關(guān)閉時(shí)。* @author MyPC**/ public class ServletLife extends HttpServlet {//初始化方法,在servlet第一次加載內(nèi)容的時(shí)候被調(diào)用@Overridepublic void init() throws ServletException {System.out.println("servlet初始化完成");}//service方法,真正處理請求的方法@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.getWriter().write("servlet life");System.out.println("servlet life");}@Overridepublic void destroy() {System.out.println("我被銷毀了...");} }Web.xml 配置
取別名的方式:在url-pattern中配置,例如:”<url-pattern>/yourname</url-pattern>,注意不要忘記斜杠!
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><servlet><servlet-name>my</servlet-name><servlet-class>cn.hanquan.servlet.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>my</servlet-name><url-pattern>/my</url-pattern></servlet-mapping><servlet><servlet-name>my2</servlet-name><servlet-class>cn.hanquan.servlet.MyServlet2</servlet-class></servlet><servlet-mapping><servlet-name>my2</servlet-name><url-pattern>/my2</url-pattern></servlet-mapping><servlet><description></description><display-name>ServletLife</display-name><servlet-name>ServletLife</servlet-name><servlet-class>cn.hanquan.servlet.ServletLife</servlet-class></servlet><servlet-mapping><servlet-name>ServletLife</servlet-name><url-pattern>/ServletLife</url-pattern></servlet-mapping><servlet><description></description><display-name>ServletMethod</display-name><servlet-name>ServletMethod</servlet-name><servlet-class>cn.hanquan.servlet.ServletMethod</servlet-class></servlet><servlet-mapping><servlet-name>ServletMethod</servlet-name><url-pattern>/ServletMethod</url-pattern></servlet-mapping> </web-app>Service 和doGet 和doPost 方法的區(qū)別
Service 方法:
不管是get 方式還是post 方式的請求,如果Servlet 類中有service 方法,則優(yōu)先調(diào)用Service 方法。
doGet 方法:
在沒有service 方法的情況下如果是get 方式的請求所調(diào)用的處理請求的方法
doPost 方法:
在沒有service 方法的情況下如果是post 方式的請求所調(diào)用的處理請求的方法
Servlet 的常見錯(cuò)誤總結(jié)
* Service方法和doGet方法和doPost方法的區(qū)別* * Service方法:* 可以處理get/post方式的請求,如果servlet中有Service方法,會(huì)優(yōu)先調(diào)用service方法對請求進(jìn)行處理。* doGet方法:* 處理get方式的請求* doPost方法:* 處理post方式的請求* 注意:* 如果在覆寫的service方法中調(diào)用了父類的service方法(super.service(arg0, arg1)),* 則service方法處理完后,會(huì)再次根據(jù)請求方式響應(yīng)的doGet和doPost方法執(zhí)行。所以,一般情況下* 我們是不在覆寫的service中調(diào)用父類的service方法的,避免出現(xiàn)405錯(cuò)誤。* * * Servlet的常見錯(cuò)誤:* * 404錯(cuò)誤:資源未找到* 原因一:在請求地址中的servlet的別名書寫錯(cuò)誤。* 原因二:虛擬項(xiàng)目名稱拼寫錯(cuò)誤* * 500錯(cuò)誤:內(nèi)部服務(wù)器錯(cuò)誤* 錯(cuò)誤一:* java.lang.ClassNotFoundException: com.bjsxt.servlet.ServletMothod* 解決:* 在web.xml中校驗(yàn)servlet類的全限定路徑是否拼寫錯(cuò)誤。* 錯(cuò)誤二:* 因?yàn)閟ervice方法體的代碼執(zhí)行錯(cuò)誤導(dǎo)致* 解決:* 根據(jù)錯(cuò)誤提示對service方法體中的代碼進(jìn)行錯(cuò)誤更改。* * 405錯(cuò)誤:請求方式不支持* 原因:* 請求方式和servlet中的方法不匹配所造成的。* 解決:* 盡量使用service方法進(jìn)行請求處理,并且不要再service方法中調(diào)用父類的service。JSP頁面
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body><form action="ServletMethod" method="post">用戶名:<input type="text" name="uname" value=""><br>密碼: <input type="text" name="pwd" value=""><br><input type="submit" value="登錄" ></form> </body> </html>總結(jié)
以上是生活随笔為你收集整理的【Servlet】HTTP 协议之请求方式、Servlet介绍、Servlet 的生命周期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MySQL数据库】一天学完MySQL笔
- 下一篇: 【Servlet】request对象获取