index加载显示servlet数据_[WEB篇]-JavaWeb基础与应用-02-Servlet开发
JavaWeb基礎與應用
2.Servlet開發
- Servlet是sun公司提供的一門用于開發動態web資源的技術。
- Sun公司在其API中提供了一個servlet接口,用戶若想用發一個動態web資源(即開發一個Java程序向瀏覽器輸出數據),需要完成以下2個步驟:
- 編寫一個Java類,實現servlet接口。
- 把開發好的Java類部署到web服務器中。
- 快速入門,用servlet向瀏覽器輸出“hello servlet”。
- 閱讀Servlet API,解決兩個問題:
- 輸出hello servlet的java代碼應該寫在servlet的哪個方法內?
- 如何向IE瀏覽器輸出數據?
Web的目錄結構
Servlet入門基礎
方式1:使用配置文件的方式配置servlet
編寫一個類繼承HttpServlet:重寫一個方法service方法
在web.xml配置這個Servlet :配置 <servlet></servlet>、<servlet-mapping></servletmapping>
web.xml中配置:
/**方式2:使用注解的方式配置servlet
/**Servlet的運行流程
@WebServletServlet的生命周期
筆面試題:請描述servlet的生命周期
Servlet的生命周期和工作原理
Servlet的的聲明周期分為三個階段:1.初始化階段 2.響應客戶階段 3.終止階段
這三個階段分別對應init方法 service方法 和destory方法,這三個方法分別在不同的階段進行調用。
1)Servlet的初始化階段
在以下時刻servlet進行初始化 servlet初始化包含以下三種情況,這三種情況都會執行init方法
a.servlet容器啟動后,自動加載某些配置信息。需要配置<load-on-startup></load-on-startup>
b.在servlet容器啟動后,客戶端第一次向servlet發起請求
c.servlet的文件被更改后 重新加載servlet
注意: init方法只會在第一次初始化servlet的時候執行。
2)servlet響應客戶端階段
Servlet當接受到客戶端請求后,servlet會根據這個請求創建兩個對象HttpServletRequest對象和HttpServletResponse對象,這個對象分別代表接受請求和響應請求,然后servlet調用service方法。Service方法會根據HttpRequest對象從請求中獲取相關的數據,然后處理請求,最后通過HttpResponse對象把數據寫出到客戶端。
3)servlet終止階段
- 當web應用被終止,或者servlet容器終止運行
- 或servlet容器被重新加載
- 當前終止的時候回調用destroy方法進行終止。
Servlet相關的對象
說明:為了美化測試界面,下述測試案例大部分使用BootStrap框架,需要導入相關的css、js、font文件
<1>ServletConfig對象
- 在Servlet的配置文件中,可以使用一個或多個<init-param>標簽為servlet配置一些初始化參數。
- 當servlet配置了初始化參數后,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,并在調用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以得到當前servlet的初始化參數信息。
- 閱讀ServletConfig API,并舉例說明該對象的作用:
- 獲得字符集編碼
- 獲得數據庫連接信息
- 獲得配置文件,查看struts案例的web.xml文件
web.xml配置的參數:可以通過ServletConfig對象獲取
/**<2>ServletContext
- WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。
- ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
- 由于一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之為context域對象。
- 查看ServletContext API文檔,了解ServletContext對象的功能。
案例1:多個servlet共享數據
/**運行結果:先執行ServletContextDemo1再執行ServletContextDemo2方能獲取數據
案例2:獲取全局的web初始化參數
web.xml中配置:
/**案例3:實現servlet之間的轉發
/**結果分析:執行ServletContextDemo4發現頁面執行ServletContextDemo5的頁面內容,但地址欄不發生變化
案例4:讀取資源文件
/**Request對象和Response對象
- Web服務器收到客戶端的http請求,會針對每一次請求,分別創建一個用于代表請求的request對象、和代表響應的response對象。
- request和response對象即然代表請求和響應,那我們要獲取客戶機提交過來的數據,只需要找request對象就行了。要向客戶機輸出數據,只需要找response對象就行了。
<1>HttpServletResponse對象
response細節問題:
- getOutputStream和getWriter方法分別用于得到輸出二進制數據、輸出文本數據的ServletOuputStream、Printwriter對象。
- getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法后,就不能再調用另一方法。
- Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎從response里面獲取,Servlet引擎將這些數據當作響應消息的正文,然后再與響應狀態行和各響應頭組合后輸出到客戶端。
- Serlvet的service方法結束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,如果沒有,Servlet引擎將調用close方法關閉該輸出流對象。
案例1:通過response對象輸出中文到客戶端
代碼分析:
/**結果展示:
http://localhost:8080/JavaWeb/ResponseDemo1
案例2:通過response對象輸完成文件的下載
代碼分析:
/**結果展示:
案例3:通過response對象生成隨機圖片(驗證碼)
代碼分析:
ResponseDemo3.java:
/**identify.html:測試頁面
<!DOCTYPE html>結果展示:
http://localhost:8080/JavaWeb/ResponseDemo3
http://localhost:8080/JavaWeb/html/identify.html
<2>HttpServletRequest對象
案例1:通過request對象常用的方法
代碼展示:
/**結果展示:
http://localhost:8080/JavaWeb/RequestDemo1
:
案例2:獲取表單的各項輸入的數據
代碼展示:
RequestDemo2.java:
/**userRegister.html:用戶注冊測試界面
<!DOCTYPE html>userRegister.js:初始化年月日下拉列表
function結果展示:
http://localhost:8080/JavaWeb/RequestDemo2
如果是直接訪問RequestDemo2則沒有獲取表單提交的數據,顯示為null,如果是通過指定的html提交指定的表單數據則正常回顯信息
http://localhost:8080/JavaWeb/html/userRegister.html
案例3:通過request請求參數中文亂碼問題
代碼分析:
RequestDemo3.java
/**code.html:測試界面
<!DOCTYPE html>結果顯示:
http://localhost:8080/JavaWeb/html/code.html
筆面試題:平時如何解決項目中亂碼
1、如果是提交方式是post 如果不想亂碼,只需要設置request.setCharacterEncoding("UTF-8"); 和頁面的編碼集一致 <meta charset="UTF-8">
2、如果提交表單的方式是get,設置request是無效的,如果想獲取的參數顯示不是亂碼,需要重新封裝獲取的數據再進行輸出,參考示例如下:
String username=request.getParameter("username");
username=new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(username);
3、get方式亂碼,還可以通過設置服務器的配置實現,可以在tomcat安裝目錄下更改conf/server.xml
<3>請求轉發和重定向
- 一個web資源接收到客戶端請求后,通知瀏覽器去調用另外一個web資源進行處理,稱之為請求轉發
- 一個web資源接收到客戶端請求后,通知瀏覽器去訪問另外一個web資源,稱之請求重定向
代碼展示:
/**結果展示:
a.重定向測試:地址欄發生變化,頁面跳轉到指定的頁面資源
http://localhost:8080/JavaWeb/RequestDemo4
http://localhost:8080/JavaWeb/html/userRegister.html
b.請求轉發測試:
地址欄不會發生變化,頁面顯示指定的頁面資源,此處顯示css樣式失效是由于在指定的html測試文件中的路徑設置參考的是當前地址,因此無法準確定位到相應的bootstrap提供的樣式,可以明確用${pageContext.request.contextPath}表示當前工程目錄即可
http://localhost:8080/JavaWeb/RequestDemo4
筆面試題:請求轉發和重定向有什么區別?
- RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。 (范圍的不同)
- 如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對于整個WEB站點的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對于當前WEB應用程序的根目錄。 (“/”的含義)
- 調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward 方法的請求轉發過程結束后,瀏覽器地址欄保持初始的URL地址不變。(URL地址是否變化)
- HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求并得到了響應結果,并不知道在服務器程序內部發生了轉發行為。 (請求次數和響應次數)
- RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。
總結
以上是生活随笔為你收集整理的index加载显示servlet数据_[WEB篇]-JavaWeb基础与应用-02-Servlet开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据增长率怎么算_20年老股民告诉你5个
- 下一篇: element ui后台html_Git