Servlet (request+response)
阿新 • • 發佈:2020-11-13
一、什麼是Servlet 1、什麼是Servlet Servlet 是由SUN公司提供的一門動態Web資源開發技術 靜態Web資源: 不同的人去訪問看到的效果都是相同的 HTML/css/js等 動態Web資源: 在不同的條件下看到的是不同的效果 Servlet/JSP/.NET/PHP等 Servlet是本質上是一個Java程式,但和我們之前接觸的Java程式不同的是, Servlet無法獨立執行(Servlet中沒有main函式) 需要將Servlet程式放在伺服器中,由伺服器呼叫才可以執行! 執行在伺服器中的Servlet程式作用是: 對伺服器接收的請求進行處理(處理請求) 2、整合tomcat和Eclipse 參考:《第二階段講義02.unit04-xx.1.9.tomcat整合eclipse》 視訊連結:https://www.bilibili.com/video/BV1wz411z73V 3、在Eclipse中建立Web專案 參考講義 二、開發Servlet程式1、開發Servlet程式的步驟 1)寫一個類,需要實現一個Servlet介面或者繼承Servlet介面的子類 Servlet |-- GenericServlet 實現了Servlet介面,並實現了其中的方法 |-- HttpServlet 繼承了GenericServlet,也實現了其中的方法 在開發時,我們只需要繼承HttpServlet,並繼承其中的方法即可! 2)在web.xml檔案中配置Servlet對外訪問的路徑,再將Web應用釋出到伺服器中執行即可! 2、如何通過Eclipse建立一個Web應用 具體步驟參考講義! 注意事項: 1)Dynamic Web Version:選擇2.5版本,因為2.5版本之後是通過註解配置Servlet, 註解配置Servlet是變簡單了,但是不好理解,因此我們選擇2.5版本, 使用xml配置Servlet(xml配置Servlet的資訊不用我們手寫,會自動生成!) 2)Web專案推薦使用 Package Explorer 開啟, 不要使用 Project Explorer!! 3)Web專案在Eclipse中的目錄結構 CGB-Servlet-01(We專案) |-- src: 其中用於存放java原始檔(xx.java),也可以放配置檔案(xml/properties) |-- build/classes: src原始碼目錄中的東西經過編譯後,會輸出到classes目錄下 |-- WebContent: 是Web應用的根目錄,其中可以存放靜態Web資原始檔(html/css/js等)、編譯後的class檔案、Web應用所依賴的jar包、web.xml檔案等 |-- WEB-INF |-- lib: Web應用所依賴的jar包 |-- web.xml: web應用的核心配置檔案(配置Servlet等) 2、如何通過Eclipse建立一個Servlet程式? 具體步驟參考講義! /* 當瀏覽器發請求訪問HelloWorld這個Servlet時,伺服器就會呼叫這個Servlet * 如果請求方式為GET提交,就會呼叫doGet方法來處理請求。 */ protected void doGet(HttpServletRequest request, HttpServletResponse response){ //暫時不寫中文(因為中文會亂碼) response.getWriter().write("Hello World..."+ new Date()); } /* * 如果請求方式為POST提交,就會呼叫doPost方法來處理請求。 * 當POST提交和GET提交處理方式一樣時,可以在doPost方法中直接呼叫doGet, * 在doGet中處理請求即可 */ protected void doPost(HttpServletRequest request, HttpServletResponse response){ doGet(request, response); } 3、執行Servlet程式 第01種執行方式: 1)自己手動將專案釋出到伺服器 在tomcat伺服器上右鍵,選擇“add and remove”, 在左側雙擊專案,將專案釋出到伺服器中,點選完成即可! 2)在tomcat伺服器上右鍵,選擇”start”、“Restart”,啟動伺服器 3)開啟瀏覽器輸入地址進行訪問! http://localhost:8080/CGB-Servlet-01/HelloWorld Class clz = Class.forName("com.tedu.HelloWorld"); HelloWorld hw = (HelloWorld)clz.newInstance(); hw.xx() hw.doGet(); 第02種執行方式: 直接在要執行的檔案(html/jsp/servlet等)上-->右鍵-->Run as-->Run On Server, eclipse會幫我們做如下幾件事兒: 1)將Servlet所在的Web專案釋出到伺服器中 2)再啟動tomcat伺服器 3)最後開啟瀏覽器,在位址列輸入路徑去訪問這個Servlet Eclipse預設用內建瀏覽器去訪問Servlet,但是這個內建瀏覽器有bug,最好是使用本地的瀏覽器去測試! 4、Servlet在web.xml檔案中的配置 全限定類名(全類名): 包名.類名 或者 包名.介面名 ---------------------------------------------------------- <servlet> <!-- 1.這裡的servlet-name要和下方的servlet-name內容保持一致 --> <servlet-name>HelloWorld</servlet-name> <!-- 2.按住ctrl鍵,滑鼠移到包名+類名上,有下劃線說明路徑是對的 伺服器會通過 反射+全限定名稱 建立該類的例項,再呼叫其中的方法 --> <servlet-class>com.tedu.HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <!-- 這裡怎麼配置,就用什麼路徑訪問Servlet --> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> ---------------------------------------------------------- 1)每建立一個Servlet,eclipse會幫我們生成至少8行配置資訊 這8行配置資訊由一個Servlet標籤和一個servlet-mapping標籤組成 這兩個標籤中的<servlet-name>標籤中的內容一致,決定了它倆是一組配置 2)<servlet-class>標籤中配置的是當前Servlet類的全類名(包名.類名) 將來伺服器根據訪問路徑找到這個全類名,再利用反射+全類名可以獲取當前Servlet類的例項 3)<url-pattern>標籤中配置了外界該通過什麼路徑來訪問當前Servlet。 也就是說,這裡配置什麼路徑,外界就得通過什麼路徑來訪問這個Servlet! 注意事項1: Servlet在Web.xml檔案中的配置資訊是在建立Servlet時,Eclipse幫我們生成的 如果Servlet不是通過Eclipse建立(比如是複製過來的),Eclipse不會生成Servlet 配置資訊, Servlet沒有配置資訊是無法訪問的(使用註解開發除外)! 注意事項2: 如果不知道什麼原因,tomcat伺服器啟動失敗了,可以將Eclipse建立的Server刪除, 再重新建立一份(刪除Server同時,也將左側的Servers專案從工作空間中刪除!) 注意事項3: 在將tomcat和Eclipse整合之後,tomcat預設開啟了熱部署功能: 在修改了程式碼後,不用重新發布,也不需要重啟伺服器,就可以執行最新的效果! (如果是建立了新的Servlet類,或者修改了web.xml檔案,則需要重啟伺服器,才會生效!) 5、Servlet呼叫過程 將建立好的Servlet釋出到伺服器中執行,通過瀏覽器訪問這個Servlet。 那麼這個Servlet是如何被呼叫?又是如何執行的? 參考《Servlet呼叫過程圖》 ------------------------------------------- GET /CGB-Servlet-01/HelloWorld HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 ... ... ------------------------------------------- Eclipse將Web專案釋出到了哪個位置? 工作空間:在eclipse中的某一個專案上,右鍵選擇“Show In”--> “System Explorer”,就可以開啟工作空間目錄 在[工作空間目錄]/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ 6、Eclipse是怎麼將一個Web專案釋出到伺服器中的? 參考講義! 7、建立Servlet 3.0及之後版本的web專案 建立Servlet3.0及之後版本的Web專案,不會生成web.xml檔案,那如何配置Servlet類的全類名和訪問路徑 <servlet-class>com.tedu.HelloWorld</servlet-class> <url-pattern>/HelloWorld</url-pattern> ------------------------------------------------------ @WebServlet("/HiServlet") public class HiServlet extends HttpServlet { ... } 在Servlet3.0版本的專案中,tomcat伺服器會掃描所有的Servlet類,如果類上面有@WebServlet主機,就會建立該類的例項 另外,在 @WebServlet("/HiServlet") 註解內部配置的“/HiServlet”就是url-pattern中配置的訪問路徑,這個註解內部配什麼,我們就通過什麼來訪問這個servlet。 8、新增Servlet模板 具體步驟參考講義! response.setContentType("text/html;charset=utf-8"); 通知伺服器在向瀏覽器傳送資料時使用utf-8編碼; 並通知瀏覽器在接收伺服器傳送過來的資料時,也是用utf-8進行接收 這行程式碼就可以解決伺服器在響應資料時,所出現的中文亂碼問題!
Request總結----------------------------------- 一、Request和Response介紹 當瀏覽器向伺服器發請求,伺服器在呼叫Servlet的service方法處理請求之前,會建立代表請求的Request物件,和代表響應的Response物件。 將這兩個物件傳遞給service方法,在service方法處理請求的過程中,如果要獲取請求資訊,可以通過request提供的方法進行獲取;如果要向瀏覽器響應資料,可以將資料先寫入到response緩衝區,等service方法執行結束,伺服器會自動到response物件中獲取到要傳送給瀏覽器的資料,按照Http協議的格式將資料傳送給瀏覽器。 二、Request常用功能 1、獲取請求引數 1.1.什麼是請求引數? 所謂的請求引數就是瀏覽器在傳送請求時,帶給伺服器的資料。 例如:在位址列URL地址的後面可以通過問號拼接引數,將資料帶給伺服器 http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu 也可以通過表單,將資料寫入表單項中,通過提交表單將資料帶給伺服器 無論通過哪種方式帶引數給伺服器,引數都可以有多個,多個引數之間用&分隔,每一個引數都包含引數名和引數值 1.2.如何獲取請求引數? http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu&like=zuqiu 1)request.getParameter(String paramName) -- 返回String字串 -- 通過請求引數的名字,獲取對應的引數值。比如傳入"user",返回"zhangsan" -- 如果獲取的引數有多個值,該方法只會返回第一個值,比如傳入"like",只返回一個"lanqiu" -- 如果獲取的引數是不存在的,該方法會返回null,比如傳入"uesr",此時會返回null值 2)request.getParameterValues(String paramName) -- 返回String[]陣列 -- 通過請求引數的名字,獲取對應的所有引數值組成的陣列。比如傳入"like",返回 {"lanqiu", "zuqiu"} -- 如果獲取的引數值只有一個,該方法仍然返回一個數組,比如傳入"user",返回 {"zhangsan"} -- 如果獲取的引數是不存在的,該方法會返回null,比如傳入"uesr",此時會返回null值 開發例項:實現一個註冊功能 1)瀏覽器訪問伺服器中的註冊頁面(regist.html),使用者在註冊頁面中填寫註冊資訊 2)提交表單,將填寫的註冊資訊提交給伺服器中的RegistServlet 3)在RegistServlet中獲取使用者提交過來的註冊資料(使用者名稱、密碼、性別、愛好、城市、自我描述) 4)將註冊資料儲存到資料庫中(mysql、JDBC) 1.3.如何處理在獲取請求引數時出現的中文亂碼問題? GET提交引數是通過URL地址後面拼接引數,將引數提交給伺服器 POST提交引數是通過請求實體將引數提交給伺服器 伺服器在接收GET提交的引數時,預設使用UTF-8來進行接收(瀏覽器提交引數用的也是utf-8),因此獲取GET提交的引數沒有問題。 但伺服器在接收POST提交的引數時,預設使用iso8859-1來進行接收,而這個編碼中沒有中文字元,因此在接收中文資料時,會出現亂碼問題。 解決方法是:通知伺服器接收POST提交的引數時,也通過utf-8來進行接收 request.setCharacterEncoding("utf-8"); 注意:這行程式碼要放在獲取引數的程式碼之前執行! 這行程式碼只對POST提交生效,GET比較不受任何影響! 2、實現請求轉發 轉發(forward)和重定向(redirect)都伺服器中的一種跳轉方式 所謂的請求轉發是伺服器內部資源之間的跳轉方式(從一個資源跳轉到另外一個資源) 請求轉發(forward)的特點: 1)轉發是一次請求一次響應 2)轉發前後位址列地址不會發生變化 3)轉發只能在同一個Web應用內部兩個資源之間進行跳轉 4)在轉發的兩個資源之間可以利用request域(map)傳遞資料 請求轉發的實現程式碼: request.getRequestDispatcher("資源路徑").forward(request,response); 3、作為域物件使用(需要配合轉發) 在請求轉發時,會將request物件傳遞給所轉發的資源(A--轉發-->B,會將A中的request傳遞給B) 可以在轉發之前,往request的map中存入資料,再轉發,由於轉發時會將request帶到所轉發的資源 在轉發的資源中,可以通過request將map中攜帶的資料再取出來! 在ServletA中,往request的map中存入資料: request.setAttribute(String name, Object value); //將請求轉發到ServletB request.getRequestDispatcher("ServletB的路徑").forward(req,res); 在ServletB中,可以通過request將map中的資料取出來: request.getAttribute(String name); Response總結----------------------------------- 1、實現請求重定向 請求重定向(Redirect)的特點: 1)重定向是兩次請求兩次響應 2)重定向前後位址列地址會發生變化 3)進行重定向的兩個資源沒有限制,可以是同一個Web應用,也可以是不同的Web應用甚至可以是不同的伺服器 4)在重定向的過程中不可以通過request的map集合帶資料到目的地 實習請求重定向: response.sendRedirect("所重定向到資源的地址");