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