目錄
一,servlet介紹
1,什麼是servlet
2,Servlet API
3,第一個servlet程式
二,servlet詳解
1,工作原理
2,生命周期
3,補充
四,request常用方法
1,常用方法
1.1 String getParameter(String name)
1.2 String[ ] getParameterValues(String name)
1.3 RequestDispatcher getRequestDispatcher(String path)
1.4 存值 request.setAttribute("key",value); 取值 request.getAttribute("key");//取值後需要向下轉型
2,用戶端如何發送資料給伺服器
3,處理請求亂碼的問題
4,get和post的差別
五,response常用方法
六,轉發和重定向
1,簡介
2,對比
3,運作執行個體
3.1 轉發方式
3.2 重定向方式
3.3 畫圖總結
七,session會話
1,介紹
2,常用方法
3,代碼舉例
八,初始化參數擷取
1,局部初始化參數
2,全局初始化參數
3,代碼舉例
九,servlet3.0注解
1, @WebServlet常用屬性
2,代碼舉例
3,注
3.1 loadOnStartup屬性
3.2 name屬性
3.3 urlPatterns/value屬性
3.4 在使用注解方式時,需要注意:
一,servlet介紹
1,什麼是servlet
(1) Servlet(Server Applet),全稱Java Servlet。是⽤Java編寫的伺服器端程式,其主要功能在于互動式地浏覽和修改資料,生成動态Web内容。
- 狹義的Servlet是指Java語⾔實作的⼀個接⼝;
- ⼴義的Servlet是指任何實作了這個Servlet接⼝的類,⼀般情況下,⼈們将Servlet了解為後者。
(2) Servlet運⾏于⽀持Java的應⽤伺服器中。從實作上講,Servlet可以響應任何類型的請求,但絕⼤多數情況下Servlet隻⽤來擴充基于HTTP協定的Web伺服器。
(3) Servlet⼯作模式:
- ① 用戶端發送請求⾄伺服器
- ② 伺服器啟動并調⽤Servlet,Servlet根據用戶端請求⽣成響應内容并将其傳給伺服器
- ③ 伺服器将響應傳回用戶端
2,Servlet API

3,第一個servlet程式
1,在src檔案夾中建立web.testServlet類
2,在web檔案夾中建立lib檔案夾,引入定義Servlet和HttpServlet的jar包javaee-api-7.0.jar
3,将jar包引入程式中
4,在testServlet中重寫doGet、doPost方法
5,将前端頁面和servlet聯系在一起
6,運作
點選連結或按鈕後控制台會顯示對應的請求類型
注:如果運作項目後,可以跳轉到正常頁面,但一鍵入FirstHTML.html(自己編寫的頁面),就出現404,再通路localhost:8080也出現404時,可以參考這裡@虎皮熊【IDEA部署項目到tomcat運作成功但是頁面404的兩種原因】
原因是Tomcat啟動後的通路位址與定義的Application context不一緻
![]()
06-JavaWEB_Servlet 折騰了一上午,(╯‵□′)╯︵┻━┻![]()
06-JavaWEB_Servlet
二,servlet詳解
1,工作原理
(1) Servlet接⼝定義了Servlet與servlet容器之間的契約:
- Servlet容器将Servlet類載⼊記憶體,并産⽣Servlet執行個體和調⽤它具體的⽅法。
- 但是要注意的是,在⼀個應⽤程式中,每種Servlet類型隻能有⼀個執行個體。(單例模式)
(2)⽤戶請求緻使Servlet容器調⽤Servlet的Service()⽅法
- 傳⼊⼀個ServletRequest對象和⼀個ServletResponse對象ServletRequest對象和ServletResponse對象
- 都是由Servlet容器(例如TomCat)封裝好的,并不需要程式員去實作,程式員可以直接使⽤這兩個對象。
(3)ServletRequest中封裝了目前的Http請求
- 開發⼈員不必解析和操作原始的Http資料。
- ServletResponse表示目前⽤戶的Http響應,程式員隻需直接操作ServletResponse對象就能把響應輕松的發回給⽤戶。
(4)對于每⼀個應⽤程式,Servlet容器還會建立⼀個ServletContext對象。
- 這個對象中封裝了上下⽂(應⽤程式)的環境詳情。每個應⽤程式隻有⼀個ServletContext。
- 每個Servlet對象也都有⼀個封裝Servlet配置的ServletConfig對象。
2,生命周期
當用戶端⾸次發送第⼀次請求後,由容器(web伺服器(tomcat))去解析請求,根據請求找到對應的servlet,判斷該類的對象是否存在,不存在則建立servlet執行個體,調取init()⽅法 進⾏初始化操作,初始化完成後調取service()⽅法,由service()判斷用戶端的請求⽅式,如果是get,則執⾏doGet(),如果是post則執⾏doPost()。處理⽅法完成後,作出相應結果給用戶端,單次請求處理完畢。
當⽤戶發送第⼆次以後的請求時,會判斷對象是否存在,但是不再執⾏init(),⽽直接執⾏service⽅法,調取doGet()/doPost()⽅法。
當伺服器關閉時調取destroy()⽅法進⾏銷毀。
四個過程:
- (1)執行個體化 --先建立servlet執行個體
- (2)初始化 --init()
- (3)處理請求 ---service()
- (4)服務終⽌ --destory()
3,補充
感覺這裡寫的更加清晰易懂一點:@姠惢荇者【Servlet學習筆記-Servlet工作原理和過程】
Servlet
- Servlet是JavaEE規範的一種,主要是為了擴充Java作為Web服務的功能。
- 為了友善第三方準守這種規範,Sun公司(現在Oracle公司)提供了一系列相關的接口,即Servlet API。
Servlet應用
- 直接或間接實作了Servlet接口并且需要運作在Servlet容器中的Java程式,主要用來生成動态的Web頁面。
- Servlet應用不能獨立于運作,必須被部署到Servlet容器。
Servlet容器
- Servlet容器(Servlet引擎)是Web伺服器或應用程式伺服器的一部分,用于在發送的請求和響應之上提供網絡服務,解碼基于MIME的請求,格式化基于MIME的響應,即Servlet容器用來接收用戶端請求,處理協定、請求内容等,初始化Servlet執行個體(隻需要第一次初始化)并調用Servlet應用的對應方法,然後Servlet應用傳回處理結果,經Servlet容器再傳回到使用者用戶端。
Tomcat容器
- Tomcat容器,又叫應用伺服器,也有人稱之為Servlet容器。其實,本質上,Tomcat容器具有Servlet容器的功能,是Servlet容器的一種開源實作,但是它又不僅僅隻是Servlet容器。
四,request常用方法
HttpServletRequest表示Http環境中的Servlet請求。它擴充于javax.servlet.ServletRequest接⼝
無論前台傳遞什麼類型的資料,背景接受時都按照String處理
1,常用方法
1.1 String getParameter(String name)
根據表單元件名稱擷取送出資料,傳回值是String
注:伺服器在接收資料時使⽤字元串統⼀接收
1,編寫測試GET/POST傳參的HTML頁面
2,建立UsersServlet類
package com.xrh;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class UsersServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uage = req.getParameter("uage");
String upass = req.getParameter("upass");
System.out.println("[GET] uage: " + uage + ",upass: " + upass);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("[POST] username: " + username);
}
}
3,在web.xml中進行配置
4,運作結果
點選超連結,觸發GET請求。輸入内容後點選送出,觸發POST請求
5,處理POST請求亂碼
void setCharacterEncoding(String charset) 指定每個請求的編碼(針對post請求才起作⽤)
6,為何GET請求不會出現亂碼?
JDK8之後不需要自己手動設定編碼格式
1.2 String[ ] getParameterValues(String name)
擷取表單元件對應多個值時的請求資料
1,修改頁面,添加複選框(顯示的值和傳遞到後端的值不一定相同,比如選中籃球,傳遞的是lanqiu)
2,修改UsersServlet
3,運作
1.3 RequestDispatcher getRequestDispatcher(String path)
跳轉⻚⾯。傳回⼀個RequestDispatcher對象,該對象的forward( )⽅法⽤于轉發請求,示例:
request.getRequestDispatcher("../success.jsp").forward(request,response);
1,修改doPost
2,添加success頁面
3,運作
1.4 存值 request.setAttribute("key",value); 取值 request.getAttribute("key");//取值後需要向下轉型
2,用戶端如何發送資料給伺服器
方式一 通過表單 get/post送出
方式二 通過a标簽發送資料(get送出)
<a href="請求名?key=value&key=value&key=value...">示例:
<a href="/login?a=10&name=abc&pass=123">
這⾥的key值=表單元素的控件名,value值=表單中控件的value屬性值
注:第⼀個參數使⽤?拼接,之後的參數使⽤&拼接,擷取資料還是通過 String name=request.getParameter("name");
方式三 通過位址欄直接拼接-get請求
方式四 js送出資料-get請求
location.href="⽬标請求?key=value&key=value"
注:⽅式2/3都屬于get送出⽅式,表單送出可以使⽤get、post送出⽅式
3,處理請求亂碼的問題
⽅式1:setCharacterEncoding("UTF-8");//post送出時管⽤
⽅式2:String s=new String(變量名.getBytes("ISO-8859-1"),"UTF-8");//針對于get送出時中⽂亂碼。示例:
String s=new String(request.getParameter("key").getBytes("ISO-8859-1"),"GBK");
⽅式3:修改tomcat中配置⽂件://使⽤于get送出
在Tomcat⽬錄結構\conf\server.xml中設定字元集
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
注意:tomcat8.0以後不需要⼿動設定這個屬性了
4,get和post的差別
1、GET請求,請求的資料會附加在URL之後,以?分割URL和傳輸資料,多個參數⽤&連接配接。URL的編碼格式采⽤的是ASCII編碼,⽽不是uniclde,即是說所有的⾮ASCII字元都要編碼之後再傳輸。
POST請求,POST請求會把請求的資料放置在HTTP請求包的包體中。上⾯的item=bandsaw就是實際的傳輸資料。
是以,GET請求的資料會暴露在位址欄中,⽽POST請求則不會
2、傳輸資料的⼤⼩
在HTTP規範中,沒有對URL的⻓度和傳輸的資料⼤⼩進⾏限制。但是在實際開發過程中,對于GET,特定的浏覽器和伺服器對URL的⻓度有限制。是以,在使⽤GET請求時,傳輸資料會受到URL⻓度的限制。
對于POST,由于不是URL傳值,理論上是不會受限制的,但是實際上各個伺服器會規定對POST送出資料⼤⼩進⾏限制,Apache、IIS都有各⾃的配置。
3、安全性
POST的安全性⽐GET的⾼。這⾥的安全是指真正的安全,⽽不同于上⾯GET提到的安全⽅法中的安全,上⾯提到的安全僅僅是不修改伺服器的資料。⽐如,在進⾏登入操作,通過GET請求,⽤戶名和密碼都會暴露再URL上,因為登入⻚⾯有可能被浏覽器緩存以及其他⼈檢視浏覽器的曆史記錄的原因,此時的⽤戶名和密碼就很容易被他⼈拿到了。
除此之外,GET請求送出的資料還可能會造成Cross-site request frogery攻擊
五,response常用方法
在Service API中,定義了⼀個HttpServletResponse接⼝,它繼承⾃ServletResponse接⼝,專⻔⽤來封裝HTTP響應消息。
在HttpServletResponse接⼝中定義了向用戶端發送響應狀态碼,響應消息頭,響應消息體的⽅法。
常⽤⽅法:
- void addCookie(Cookie var1);//給這個響應添加⼀個cookie
- void sendRedirect(String var1) ;//發送⼀條響應碼,将浏覽器跳轉到指定的位置(重定向)
- PrintWriter getWriter() 獲得字元流,通過字元流的write(String s)⽅法可以将字元串設定到response 緩沖區中,随後Tomcat會将response緩沖區中的内容組裝成Http響應傳回給浏覽器端。
- setContentType() 設定響應内容的類型
六,轉發和重定向
比較詳細清晰的介紹可以參考這裡,<( ̄︶ ̄)↗[GO!]@Zzzer!【重定向與轉發的差別與應用】
1,簡介
目前跳轉頁面的方式有兩種,一種是通過request的轉發req.getRequestDispatcher,一種是通過response的重定向resp.sendRedirect。
重定向:response.sendRedirect()
轉發:request.getRequestDispatcher("../success.jsp").forward(request,response);
2,對比
相同點:不同點:
- 都⽤來跳轉⻚⾯
- a.重定向時位址欄會改變,request中存儲的資料會丢失。轉發時位址欄顯示的是請求⻚⾯的位址,request資料可以儲存。
- b.轉發屬于⼀次請求⼀次響應,重定向屬于兩次請求(位址欄修改了兩次)兩次響應。
- 補充:使⽤out對象往⻚⾯中輸出js或html,css。使⽤js跳轉⻚⾯,也會丢失request中的資料;
3,運作執行個體
3.1 轉發方式
1,修改UsersServlet
2,程式運作後,鍵入FirstHTML頁面
3,點選送出(位址欄不改變,隻是傳回了所需要的頁面内容)
3.2 重定向方式
1,修改UsersServlet
2,程式運作後,鍵入FirstHTML頁面
3,點選送出
3.3 畫圖總結
七,session會話
1,介紹
request存的值隻能在單次請求中儲存,儲存的資料不能跨⻚⾯,當重定向時,request存的值會丢失。
然而在浏覽大型網站時,比如某寶,不管跳轉到哪個頁面,賬戶資訊都是一直存在且不會丢失的。
這時就引入了會話對象:
- session的資料可以在多個⻚⾯中共享,即使重定向⻚⾯,資料不會丢失
- session中可以包含n個request。
會話的概念:從打開浏覽器到關閉浏覽器,期間通路伺服器就稱為⼀次會話,會話中可以包括n次request請求
2,常用方法
1,void setAttribute(String key,Object value)
以key/value的形式儲存對象值,将資料存儲在伺服器端
2,Object getAttribute(String key)
通過key擷取對象值
3,void invalidate()
設定session對象失效
4,String getId()
擷取sessionid,當第⼀次登入成功後,session會産⽣⼀個唯⼀的id,浏覽器之後通路時如果發現id值還是之前id,那麼說明 目前通路的屬于同⼀個會話
5,void setMaxInactiveInterval(int interval)
設定session的⾮活動時間
示例:
⽅式1: session.setMaxInactiveInterval(10*60);//設定有效時間為10分鐘
⽅式2:修改web.xml
<session-config> <session-timeout>10</session-timeout>//機關:分鐘
</session-config>
6,int getMaxInactiveInterval()
擷取session的有效⾮活動時間(以秒為機關),預設的有效時間:30分鐘
7,void removeAttribute(String key)
從session中删除指定名稱(key)所對應的對象
8,⼩結 :讓session失效的⽅式
- invalidate()
- removeAttribute("key")
- 直接關閉浏覽器。
3,代碼舉例
八,初始化參數擷取
request.setCharacterEncoding("utf-8");代碼的耦合度太⾼,不便于後期維護修改。可以通過初始化參數實作
1,局部初始化參數
1,web.xml中先定義初始化參數
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
2,servlet中獲得初始化參數,重寫init()⽅法
public void init(ServletConfig config) throws ServletException {
encoding= config.getInitParameter("encoding");
}
注意:這種⽅式的初始化參數僅限于目前servlet中使⽤。
2,全局初始化參數
1, 定義,context-param是和servlet标簽同級别
<context-param>
<param-name>bianma</param-name>
<param-value>utf-8</param-value>
</context-param>
2,獲得資料
@Override // 請求->init()->service()->doget/dopost->destory();
public void init(ServletConfig config) throws ServletException {
bianhao=config.getServletContext().getInitParameter("bianma");
}
3,代碼舉例
1,修改web.xml。添加UsersServlet局部初始化參數,和全局初始化參數
2,修改UsersServlet和TestServlet
public class UsersServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
//局部初始化參數
System.out.println("UsersServlet-init->myparam"+config.getInitParameter("myparam"));
//全局初始化參數
System.out.println("UsersServlet-init->allparam"+config.getServletContext().getInitParameter("encoding"));
}
}
public class TestServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
//局部初始化參數
System.out.println("TestServlet-init->myparam"+config.getInitParameter("myparam"));
//全局初始化參數
System.out.println("TestServlet-init->allparam"+config.getServletContext().getInitParameter("encoding"));
}
}
3,運作測試
九,servlet3.0注解
如果一直采用在web.xml中插入标簽的方法,該檔案會變得非常冗雜。是以引入了注解的方式:
- 注解(提供給程式讀取的資訊) -- 注釋(提供給程式員看的資訊)
- 注解的格式:@開頭的 如:@Override
- @WebServlet注解配置Servlet
從Servlet3.0開始,配置Servlet⽀持注解⽅式,但還是保留了配置web.xml⽅式,所有使⽤Servlet有兩種⽅式:
- Servlet類上使⽤@WebServlet注解進⾏配置
- web.xml⽂件中配置
1, @WebServlet常用屬性
2,代碼舉例
1,建立StudentServlet
package web;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//name 可有可無 urlPatterns={"","",""}表示比對多個模式
@WebServlet(urlPatterns = "/stu/test",
name = "myname",
initParams = {
@WebInitParam(name="init-stu",value = "myinitparam"),
@WebInitParam(name="pwd",value = "123456")
},
loadOnStartup = 1
)
public class StudentServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("StudentServlet-init"+config.getInitParameter("init-stu"));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do-get-StudentServlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
2,位址欄輸入位址
可以看出程式正确執行
3,注
3.1 loadOnStartup屬性
标記容器是否在啟動應⽤時就加載Servlet。
- 預設不配置或數值為負數時表示用戶端第⼀次請求Servlet時再加載;
- 0或正數表示啟動應⽤就加載,正數情況下,數值越⼩,加載該Servlet的優先級越⾼;
執行個體://斜杠必須
@WebServlet(value="/test1",loadOnStartup=1)
3.2 name屬性
可以指定也可以不指定,通過getServletName()可以擷取到,若不指定,則為Servlet的完整類名,如:cn.edu.njit.servlet.UserServlet
3.3 urlPatterns/value屬性
String[]類型,可以配置多個映射,如:urlPatterns={"/user/test","/user/example"}執行個體:
//斜杠必須
@WebServlet(loadOnStartup=1,urlPatterns= {"/test1","/test2"})
3.4 在使用注解方式時,需要注意:
根元素中不能配置屬性metadata-complete="true",否則⽆法加載Servlet。
- metadata-complete屬性表示通知Web容器是否尋找注解,預設不寫或者設定false,容器會掃描注解,為Web應⽤程式建構有效的中繼資料;
- metadata-complete="true",會在啟動時不掃描注解(annotation)。如果不掃描注解的話,⽤注解進⾏的配置就⽆法⽣效,例如:@WebServlet
(5).urlPatterns的常⽤規則:
- /*或者/:攔截所有
- *.do:攔截指定字尾
- /user/test:攔截路徑
- /user/.do、/.do、test*.do都是⾮法的,啟動時候會報錯
章節彙總在這裡(づ ̄3 ̄)づ╭❤~@&再見螢火蟲&【06-JavaWEB】