這個世界上是先有雞還是蛋呢?這個問題永遠摸不清。。。。但是JSP和Servlet的關系卻很明確,是先有的Servlet,在有的JSP!此篇是鞏固一下框架前的基礎,SPRing和SpringMVC都是和Servlet有關系的,復習一下基礎會加深對框架的理解
一、Servlet 既然先有的Servlet,那就讓我們先來聊聊Servlet。 1.什么是Servlet? 下面引用百度的一段定義:
Servlet(Server Applet),全稱java Servlet,暫無中文譯文。是用Java編寫的服務器端程序。其主要功能在于交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解為后者。
Servlet創建后需要繼承HttpServlet,而其中初始化的doGet,doPost方法便是我們最常用到的,而自身的service方法包含了doGet和doPost方法。 我接下來要說的是Servlet中的加載流程(這個加載流程涉及到SpringMVC框架配置文件加載的基礎),而對于它的概念再次不在多說,比較抽象,你可以把它想象為一個盒子,而這個盒子的外層包裹著一個比它大的盒子名為tomcat,而在它里面的盒子就是我們所寫的一個個的web項目。
2.Servlet的加載流程:(接下來我用一個例子來說明)
?、俦热缥覀僇SP中有個超鏈接做的get請求如下:
<a href="servlet/HelloServlet">Go</href>?、趧摻ㄒ粋€Servlet,該Servlet需要繼承HttpServlet這個抽象類,而HttpServlet類是繼承了GenericServlet(也是抽象類)。
//此類是在web工程的src目錄下直接創建的public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //控制臺輸出Get請求 System.out.println("處理Get請求。。。。"); //輸出在網頁上Hello Servlet! PrintWriter out = resp.getWriter(); resp.setContentType("text/html;charset = utf-8"); out.println("<strong>Hello Servlet!</strong><br>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doPost(req, resp); }}?、劢酉聛砦覀僿eb.xml中的配置
<servlet> <servlet-name>HelloServlet</servlet-name> //此處的類名要全拼,包括包名,而此處其實就對應了web框架的配置,比如SpringMVC中的DispatchServlet <servlet-class>servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>接下來說的是Servlet的加載流程:(各位客官看好!~) Get方式請求Servlet→Go 順序是這樣的:
前端頁面的Get請求,通過點擊Go來尋取到href這個鏈接 ↓web.xml中你配置的servlet-mapping中的url-pattern會攔截你的請求,此處是/攔截所有請求 ↓通過url-pattern來找到你的servlet-mapping中的servlet-name ↓此刻servlet-mapping中的servlet-name找到serlvet中對應servlet-name ↓serlvet中對應servlet-name找到對應的servlet-class 也就是我們所編寫的java類 ↓找到我們所寫的doGet方法就上面的加載流程而言,有沒有覺得其實是和SpringMVC的加載流程是相似的,因為SpringMVC的Servlet類就是DispatchServlet,所以加載映射的流程也是和這個類似的
3.servlet與jsp九大內置對象的關系對應:
jsp對象 | servlet獲得 |
---|---|
out | resp.getWriter |
request | service方法中的req參數 |
response | service方法中的resp參數 |
session | req.getSession() |
application | getServletContext() |
exception | Throwable |
page | this |
pageContext | PageContext |
Config | getServletConfig() |
4.Servlet的路徑
//下面的寫法表示根目錄的路徑Servlet的路徑跳轉問題:絕對路徑的前綴String base = request.getContextPath();二、JSP
JSP是Servlet
JSP內置對象(不用new可以在JSP中直接使用) 一共分為九個: 常用的有:out,request,respone,session,application 還有幾個不常用的:Page,pageContext,exception,config
out:
//我們在JSP打印輸出最長用的內置對象就是out,例如out.print("");request和response: 這里這兩個一起說
//用戶發送請求request//在request對象中,我們最長用到的方法如下:通過這個方法我們可以獲取html中的文本框內容,與之相應的是namerequest.getParamter("文本框的name");//關于跳轉頁面request.getRequestDispatcher("xx.jsp").forward(req,resp);//用上面的做頁面的跳轉,url不變,此行為是服務端行為,名為請求轉發//服務器給用戶響應response//在response方法也很多,我們可以通過reponse去添加cookie,給服務端response.addCookie();//關于跳轉頁面response.sendRediect("xx.jsp");//用上面的做頁面的跳轉,url會發生變化而且其實是發生了2次請求,名為請求重定向session:
在服務器的內存中保存這不同用戶的sessionSession對象在第一個JSP頁面被裝載時自動創建,完成會話期管理Session對象是HttpSession類的實例//我們可以用一下方法來設置Session的最大存活時間session.setMaxInactiveInterval(10);//此處的括號里是以秒(/s)來作為單位注:創建新的會話,舊的會話SessionId扔存在服務器,除非會話自動超時。我們也可以通過在web.xml里配置session的超時時間<session-config> <session-timeout>10</session-timeout>//此處是min分鐘做單位</session-config>application對象(屬于服務器):
·application對象實現了用戶間數據的共享,可以存放全局變量·application開始于服務器的啟動,終止與服務器的關閉·在用戶的前后連接或不同用戶之間的連接中,可以對application對象的同一屬性進行操作·在任何地方對application對象屬性的操作,都將影響到其他用戶對此的訪問·服務器的啟動和關閉決定了application對象的生命·application對象是ServletContext類的實例page對象:
page對象就是指向當前JSP頁面本身,有點像類中的this指針,它是java.lang.Object類的實例pageContext對象:
·提供了對JSP頁面內所有的對象及名字空間的訪問·可以訪問本頁所在的session,也可以取本頁所在的application的某一屬性值·相當于頁面中所有功能的集大成者·本類也叫pageContextJSP狀態管理
①http協議的無狀態性: 這里可以舉個例子:就像一個故事:很久很久以前,有一個叫做“從前有座山”商店,店主是一個得了癡呆癥的老和尚(這里是指web服務器),每次放學 小明都在這里買東西(客戶端http發起請求),然而每次這個老和尚都記不住小明。所以有了以下的兩大機制
②保存用戶狀態的兩大機制 Session,和Cookie,Session是保存在服務端的,而Cookie是保存在客戶端的也就是瀏覽器上。
③Cookie的創建與使用
Cookie cookie = new Cookie(name,value) 我們的Cookie在平時的項目里用到的最多的地方就是購物車的Cookie和用戶登錄時的記住秘密。
三、二者的區別
1.jsp經編譯后就變成了Servlet.(JSP的本質就是Servlet,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)2.jsp更擅長表現于頁面顯示,servlet更擅長于邏輯控制.3.Servlet中沒有內置對象,Jsp中的內置對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象得到.Jsp是Servlet的一種簡化,使用Jsp只需要完成程序員需要輸出到客戶端的內容,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成。而Servlet則是個完整的Java類,這個類的Service方法用于生成對客戶端的響應。JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式。JSP編譯后是“類servlet”。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。
后面還有一片與框架非常貼近的webServlet監聽器(Listener)篇!
新聞熱點
疑難解答