Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 天天曰夜夜操,亚洲男人天堂网址,91成人免费观看

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JSP的前生今世

          礎知識,servlet是什么?

          官方解釋:Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層

          簡單來說,servlet是運行在web服務器如tomcat,jetty這樣應用服務器上的一段程序,他可以響應http協(xié)議的請求,并且實現用戶自己的邏輯,最終將結果返回到用戶的客戶端(瀏覽器)

          Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共網關接口)實現的程序可以達到異曲同工的效果。但是相比于 CGI,Servlet 有以下幾點優(yōu)勢:

          1、性能明顯更好。

          2、Servlet 在 Web 服務器的地址空間內執(zhí)行。這樣它就沒有必要再創(chuàng)建一個單獨的進程來處理每個客戶端請求。

          3、Servlet 是獨立于平臺的,因為它們是用 Java 編寫的。

          4、服務器上的 Java 安全管理器執(zhí)行了一系列限制,以保護服務器計算機上的資源。因此,Servlet 是可信的。

          5、Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機制與 applets、數據庫或其他軟件進行交互。

          Servlet的生命周期

          Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個過程。以下是 Servlet 遵循的過程:

          1、Servlet 通過調用 init () 方法進行初始化。

          2、Servlet 調用 service() 方法來處理客戶端的請求。

          3、Servlet 通過調用 destroy() 方法終止(結束)。

          4、最后,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的

          init() 方法

          init 方法被設計成只調用一次。它在第一次創(chuàng)建 Servlet 時被調用,在后續(xù)每次用戶請求時不再調用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一樣。

          Servlet 創(chuàng)建于用戶第一次調用對應于該 Servlet 的 URL 時,但是您也可以指定 Servlet 在服務器第一次啟動時被加載。

          service() 方法

          service() 方法是執(zhí)行實際任務的主要方法。Servlet 容器(即 Web 服務器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,并把格式化的響應寫回給客戶端。

          每次服務器接收到一個 Servlet 請求時,服務器會產生一個新的線程并調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),并在適當的時候調用 doGet、doPost、doPut,doDelete 等方法。

          destroy() 方法

          destroy() 方法只會被調用一次,在 Servlet 生命周期結束時被調用。destroy() 方法可以讓您的 Servlet 關閉數據庫連接、停止后臺線程、把 Cookie 列表或點擊計數器寫入到磁盤,并執(zhí)行其他類似的清理活動。

          在調用 destroy() 方法之后,servlet 對象被標記為垃圾回收。

          JSP是什么?

          JSP全稱Java Server Pages,是一種動態(tài)網頁開發(fā)技術。它使用JSP標簽在HTML網頁中插入Java代碼。標簽通常以<%開頭以%>結束。

          JSP是一種Java servlet,主要用于實現Java web應用程序的用戶界面部分。網頁開發(fā)者們通過結合HTML代碼、XHTML代碼、XML元素以及嵌入JSP操作和命令來編寫JSP。

          JSP通過網頁表單獲取用戶輸入數據、訪問數據庫及其他數據源,然后動態(tài)地創(chuàng)建網頁。

          JSP標簽有多種功能,比如訪問數據庫、記錄用戶選擇信息、訪問JavaBeans組件等,還可以在不同的網頁中傳遞控制信息和共享信息。


          servlet和jsp的區(qū)別

          1、Servlet在Java代碼中可以通過HttpServletResponse對象動態(tài)輸出HTML內容。

          2、JSP是在靜態(tài)HTML內容中嵌入Java代碼,然后Java代碼在被動態(tài)執(zhí)行后生成HTML內容。

          servlet和jsp各自的特點

          1、Servlet雖然能夠很好地組織業(yè)務邏輯代碼,但是在Java源文件中,因為是通過字符串拼接的方式生成動態(tài)HTML內容,這樣就容易導致代碼維護困難、可讀性差。

          2、JSP雖然規(guī)避了Servlet在生成HTML內容方面的劣勢,但是在HTML中混入大量、復雜的業(yè)務邏輯。

          MVC的誕生

          JSP和Servlet都有自身的適用環(huán)境,那么有沒有什么辦法能夠讓它們發(fā)揮各自的優(yōu)勢呢?答案是肯有的,MVC模式就能夠完美解決這一問題。

          MVC模式,是Model-View-Controller的簡稱,是軟件工程中的一種軟件架構模式,分為三個基本部分,分別是:模型(Model)、視圖(View)和控制器(Controller):

          Controller——負責轉發(fā)請求,對請求進行處理

          View——負責界面顯示

          Model——業(yè)務功能編寫(例如算法實現)、數據庫設計以及數據存取操作實現

          在JSP/Servlet開發(fā)的軟件系統(tǒng)中,這三個部分的描述如下所示:


          MVC模型

          1、Web瀏覽器發(fā)送HTTP請求到服務端,然后被Controller(Servlet)獲取并進行處理(例如參數解析、請求轉發(fā))

          2、Controller(Servlet)調用核心業(yè)務邏輯——Model部分,獲得結果

          3、Controller(Servlet)將邏輯處理結果交給View(JSP),動態(tài)輸出HTML內容

          4、動態(tài)生成的HTML內容返回到瀏覽器顯示

          MVC模式在Web開發(fā)中有很大的優(yōu)勢,它完美規(guī)避了JSP與Servlet各自的缺點,讓Servlet只負責業(yè)務邏輯部分,而不會生成HTML代碼;同時JSP中也不會充斥著大量的業(yè)務代碼,這樣大大提高了代碼的可讀性和可維護性。


          相關面試題



          如何讀取Servlet的初始化參數?

          ServletConfig中定義了如下的方法用來讀取初始化參數的信息:

          public String getInitParameter(String name)

          參數:初始化參數的名稱。
          返回:初始化參數的值,如果沒有配置,返回null。

          init(ServletConfig)方法執(zhí)行次數

          在Servlet的生命周期中,該方法執(zhí)行一次。

          service()方法的職責

          service()方法為Servlet的核心方法,客戶端的業(yè)務邏輯應該在該方法內執(zhí)行,典型的服務方法的開發(fā)流程為:

          解析客戶端請求-〉執(zhí)行業(yè)務邏輯-〉輸出響應頁面到客戶端

          get方式和post方式有何區(qū)別

          數據攜帶上:

          GET方式:在URL地址后附帶的參數是有限制的,其數據容量通常不能超過1K。

          POST方式:可以在請求的實體內容中向服務器發(fā)送數據,傳送的數據量無限制。

          請求參數的位置上:

          GET方式:請求參數放在URL地址后面,以?的方式來進行拼接

          POST方式:請求參數放在HTTP請求包中

          用途上:

          GET方式一般用來獲取數據

          POST方式一般用來提交數據

          原因:

          首先是因為GET方式攜帶的數據量比較小,無法帶過去很大的數量

          POST方式提交的參數后臺更加容易解析(使用POST方式提交的中文數據,后臺也更加容易解決)

          GET方式比POST方式要快

          Servlet相關 API

          HttpServletRequest:封裝了與請求相關的信息

          HttpServletResponse:封裝了與響應相關的信息


          獲取頁面的元素的值有幾種方式,分別說一下

          request.getParameter() 返回客戶端的請求參數的值

          request.getParameterNames() 返回所有可用屬性名的枚舉

          request.getParameterValues() 返回包含參數的所有值的數組

          request.getAttribute()和request.getParameter()區(qū)別

          用途上:

          request.getAttribute(), 一般用于獲取request域對象的數據(在跳轉之前把數據使用setAttribute來放到request對象上)

          request.getParameter(), 一般用于獲取客戶端提交的參數

          存儲數據上:

          request.getAttribute()可以獲取Objcet對象

          request.getParameter()只能獲取字符串(這也是為什么它一般用于獲取客戶端提交的參數)


          forward和redirect的區(qū)別

          實際發(fā)生位置不同,地址欄不同

          轉發(fā)是發(fā)生在服務器的

          轉發(fā)是由服務器進行跳轉的,細心的朋友會發(fā)現,在轉發(fā)的時候,瀏覽器的地址欄是沒有發(fā)生變化的,在我訪問Servlet111的時候,即使跳轉到了Servlet222的頁面,瀏覽器的地址還是Servlet111的。也就是說瀏覽器是不知道該跳轉的動作,轉發(fā)是對瀏覽器透明的。通過上面的轉發(fā)時序圖我們也可以發(fā)現,實現轉發(fā)只是一次的http請求,一次轉發(fā)中request和response對象都是同一個。這也解釋了,為什么可以使用request作為域對象進行Servlet之間的通訊。

          重定向是發(fā)生在瀏覽器的

          重定向是由瀏覽器進行跳轉的,進行重定向跳轉的時候,瀏覽器的地址會發(fā)生變化的。曾經介紹過:實現重定向的原理是由response的狀態(tài)碼和Location頭組合而實現的。這是由瀏覽器進行的頁面跳轉實現重定向會發(fā)出兩個http請求,**request域對象是無效的,因為它不是同一個request對象

          用法不同:

          很多人都搞不清楚轉發(fā)和重定向的時候,資源地址究竟怎么寫。有的時候要把應用名寫上,有的時候不用把應用名寫上。很容易把人搞暈。記住一個原則: 給服務器用的直接從資源名開始寫,給瀏覽器用的要把應用名寫上

          request.getRequestDispatcher("/資源名 URI").forward(request,response)

          轉發(fā)時"/"代表的是本應用程序的根目錄【zhongfucheng】

          response.send("/web應用/資源名 URI");

          重定向時"/"代表的是webapps目錄


          能夠去往的URL的范圍不一樣:

          轉發(fā)是服務器跳轉只能去往當前web應用的資源

          重定向是服務器跳轉,可以去往任何的資源


          傳遞數據的類型不同

          轉發(fā)的request對象可以傳遞各種類型的數據,包括對象

          重定向只能傳遞字符串


          跳轉的時間不同

          轉發(fā)時:執(zhí)行到跳轉語句時就會立刻跳轉

          重定向:整個頁面執(zhí)行完之后才執(zhí)行跳轉


          典型的應用場景:

          轉發(fā): 訪問 Servlet 處理業(yè)務邏輯,然后 forward 到 jsp 顯示處理結果,瀏覽器里 URL 不變

          重定向: 提交表單,處理成功后 redirect 到另一個 jsp,防止表單重復提交,瀏覽器里 URL 變了

          SP

          JSP的基礎語法

          簡介

          JSP:Java Server Page SUN 公司提供的動態(tài)網頁編程技術,是 Java Web 服務器端的動態(tài)資源。

          它相比 html 而言,html 只能為用戶提供靜態(tài)數據,而 Jsp 技術允許在頁面中嵌套 java 代碼,為用戶提供動態(tài)數據。

          相比 servlet 而言,servlet 很難對數據進行排版,而 jsp 除了可以用 java 代碼產生動態(tài)數據的同時,也很容易對數據進行排版。

          不管是 JSP 還是 Servlet,雖然都可以用于開發(fā)動態(tài) web 資源。但由于這 2 門技術各自的特點,在長期的軟件實踐中,人們逐漸把 servlet 作為 web 應用中的控制器組件來使用, 而把 JSP 技術作為數據顯示模板來使用。

          其實 Jsp 就是一個 Servlet,當我們第一次訪問 Jsp 的時候,Jsp 引擎都會將這個 Jsp 翻譯 成一個 Servlet,這個文件存放在tomcat(源碼目錄) 中的 work 目錄中。



          準備工作

          配置IDEA

          這一步不是必須的,當然由于 編輯器中有些默認的配置項我們覺得不是很完美,比如"編碼格式"、頁面模板等。我們可以在新建 JSP 頁面之前就先修改為我們需要的。

          1.選擇"File" —> "Settings..."



          2.設置編碼格式。搜索"encode",選擇"File Encoding"

          [

          3.設置頁面模板。搜索"template",選擇"File and Code Templates",選擇右側的"Other",選擇下方的"Jsp File"



          新建JSP頁面



          注釋

          在 JSP 中支持兩種注釋的語法操作:

          一種是顯示注釋,這種注釋是允許客戶端看見的; 另一種是隱式注釋,此種注釋是客戶端無法看見的

          ① 顯示注釋語法:從 HTML 風格繼承而來

          ② 隱式注釋語法:從 JAVA 風格繼承;JSP 自己的注釋


          JSP 的三種注釋方式:

          1) // 注釋,單行注釋  /* 多行注釋*/ 
          ?
          2)<!--  HTML風格的注釋 -->
          ?
          3)<%--   JSP注釋  --%>


          Scriptlet

          在 JSP 中最重要的部分就是 Scriptlet(腳本小程序),所有嵌入在 HTML 代碼中的 Java 程序

          在 JSP 中一共有三種 Scriptlet 代碼:都必須使用 Scriptlet 標記出來

          第一種:<%    %>: java 腳本段,可以定義局部變量、編寫語句
          ?
          第二種:<%!   %>:聲明,可以定義全局(成員)變量、方法、類
          ?
          第三種:<%=  %>:表達式,數據一個變量或具體內容

          通過觀察解析為 java 文件的 jsp 代碼理解三種小腳本

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <!DOCTYPE >
          <html>
              <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                  <title>Scriptlet</title>
              </head>
              <body>
                  <%
                      String str = "Hello JSP";
                      System.out.println(str);
                      response.getWriter().write(str);
                  %>
                  <%!
                      String memberStr = "a member String";
                  %>
                  <%=memberStr%>
                  <h1>This is a JSP page!!</h1>
              </body>
          </html>


          JSP的指令標簽

          使用包含操作,可以將一些重復的代碼包含進來繼續(xù)使用,從正常的頁面組成來看,有時可能分為幾個區(qū)域。而其中的一些區(qū)域可能是一直不需要改變的,改變的就其中的一個具體內容區(qū)域。現在有兩種方法可以實現上述功能。

          方法一:在每個 JSP 頁面(HTML)都包含工具欄、頭部信息、尾部信息、具體內容

          方法二:將工具欄、頭部信息、尾部信息都分成各個獨立的文件,使用的時候直接導入

          很明顯,第二種方法比第一種更好,第一種會存在很多重復的代碼,并且修改很不方便,在 JSP 中如果要想實現包含的操作,有兩種做法:靜態(tài)包含動態(tài)包含,靜態(tài)包含使用 include 指令即可,動態(tài)包含則需要使用 include 動作標簽。


          include 靜態(tài)包含

          <%@ include file="要包含的文件路徑" %>  <!-- 相對路徑 -->

          例如:

          <%@include file="include.jsp" %>
          或
          <%@include file="include.html" %>

          靜態(tài)包含就是將內容進行了直接的替換,就好比程序中定義的變量一樣,是在 servlet 引擎轉譯時,就把此文件內容包含了進去(兩個文件的源代碼整合到一起, 全部放到_jspService 方法中),所以只生成了一個 servlet,所以兩個頁面不能有同名的變量。 運行效率高一點點。耦合性較高,不夠靈活。


          include 動態(tài)包含

          動態(tài)包含在代碼的編譯階段,包含和被包含部分是兩個獨立的部分,只有當運行時,才會動態(tài)包含進來,好比方法的調用。

          <jsp:include page="include.jsp"></jsp:include>

          注意:動態(tài)包含,中間不要加任何內容,包括空格,除非確認要使用參數,否則報錯!

          <jsp:include page="include.html"></jsp:include>
          <%
              String a = "hello.jsp";
          %>
          <jsp:include page="<%=a %>"></jsp:include>

          使用動態(tài)包含還可以通過在頁面之間傳參。

          接收參數通過 request.getParameter(name);

          <jsp:include page="hello.jsp" flush="true">
              <jsp:param name="uname" value="zhangsan"/>
          </jsp:include>

          hello.jsp

          <!-- 接收參數 -->
          <%=request.getParameter("uname")%>


          JSP的四大域對象

          四種屬性范圍

          在JSP中提供了四種屬性的保存范圍,所謂的屬性保存范圍,指的就是一個設置的對象,可以再多少個頁面中保存并可以繼續(xù)使用

          1. page范圍 pageContext : 只在一個頁面中保存屬性,跳轉之后無效
          2. request范圍 request : 只在一次請求中保存,服務器跳轉后依然有效
          3. session范圍 session : 在一次會話范圍中,無論何種跳轉都可以使用
          4. application范圍 application : 在整個服務器上保存

          方法類型描述public void setAttribute(String name, Object o)普通設置屬性的名稱及內容public Object getAttribute(String name)普通根據屬性名稱取屬性public void removeAttribute(String name)普通刪除指定的屬性


          驗證屬性范圍的特點

          1. page

          本頁面取得,服務器端跳轉(<jsp :forward>)后無效


          1. request 服務器跳轉有效,客戶端跳轉無效如果是客戶端跳轉,則相當于發(fā)出了兩次請求,那么第一次的請求將不存在了;如果希望不管是客戶端還是服務器跳轉,都能保存的話,就需要繼續(xù)擴大范圍。


          1. session無論客戶端還是服務器端都可以取得,但是現在重新開啟一個新的瀏覽器,則無法取得之前設置的session了,因為每一個session只保存在當前的瀏覽器當中,并在相關的頁面取得。對于服務器而言,每一個連接到它的客戶端都是一個session如果想要讓屬性設置一次之后,不管是否是新的瀏覽器打開都能取得則可以使用application


          1. application所有的application屬性直接保存在服務器上,所有的用戶(每一個session)都可以直接訪問取得 只要是通過application設置的屬性,則所有的session都可以取得,表示公共的內容,但是如果此時服務器重啟了,則無法取得了,因為關閉服務器后,所有的屬性都消失了,所以需要重新設置。


          問:使用哪個范圍呢?

          答:在合理范圍盡可能小


          EL表達式的使用

          EL表達式的語法

          EL(Expression Language) 是為了使 JSP 寫起來更加簡單。表達式語言的靈感來自于 ECMAScript 和 XPath 表達式語言,它提供了在 JSP 中簡化表達式的方法,讓 Jsp 的代碼更加簡化。

          語法結構非常簡單: ${expression}

          EL 表達式一般操作的都是域對象中的數據,操作不了局部變量。

          域對象的概念在 JSP 中一共有四個:pageContext, request, session, application;范圍依次是,本頁面一次請求一次會話整個應用程序

          當需要指定從某個特定的域對象中查找數據時可以使用四個域對象對應的空間對象,分別是:pageScope, requestScope, sessionScope, applicationScope。

          而 EL 默認的查找方式為從小到大查找,找到即可。當域對象全找完了還未找到則返回空字符串""。


          EL表達式的使用

          獲取數據

          設置域對象中的數據

          <%
              pageContext.setAttribute("uname","zhangsan"); // page作用域
              request.setAttribute("uname","lisi"); // request作用域
              session.setAttribute("uname","wangwu"); // session作用域
              application.setAttribute("uname","zaholiu"); // application
          %>

          獲取域對象的值

          <%-- 獲取域對象中的數據:默認查找方式為從小到大,找到即止。若四個范圍都未找到,則返回空字符串。--%>
          ${uname} <!-- 輸出結果為:zhangsan -->

          獲取指定域對象的值

          ${pageScope.uname}          <!-- page作用域 -->
          ${requestScope.uname}       <!-- request作用域 -->
          ${sessionScope.uname}       <!-- session作用域 -->
          ${applicationScope.uname}   <!-- application作用域 -->

          獲取List

          <%
              List<String> list = new ArrayList<String>();
              list.add("aaa");
              list.add("bbb");
              list.add("ccc");
              request.setAttribute("list", list);
          %>
          <%--
              獲取List中指定下標的數據
                  ${list[下標] }
              獲取集合的長度
                  ${list.size()}
              注:
                 list代表的是存在域對象中的變量名(限域變量名)
          --%>
          ${list[1] }  

          獲取Map

          <%
              Map map = new HashMap();
              map.put("aaa", "111");
              map.put("bbb", 2222);
              map.put("ccc-a", 333);
              request.setAttribute("map", map);
          %>
          <%--
              獲取Map中指定值
                 ${map["key"] } 或 ${map.key }
              注:
                  map代表的是存在域對象中的變量名(限域變量名)
          --%>
          ${map.aaa }
          ${map["bbb"]}

          獲取JavaBean對象

          User.java

          public class User {
          ?
              private Integer userId;
              private String uname;
              private String upwd;
          ?
              public Integer getUserId() {
                  return userId;
              }
          ?
              public void setUserId(Integer userId) {
                  this.userId = userId;
              }
          ?
              public String getUname() {
                  return uname;
              }
          ?
              public void setUname(String uname) {
                  this.uname = uname;
              }
          ?
              public String getUpwd() {
                  return upwd;
              }
          ?
              public void setUpwd(String upwd) {
                  this.upwd = upwd;
              }
          }
          <%
              User user = new User();
              user.setUserId(1);
              user.setUname("zhangsan");
              user.setUpwd("123456");
              request.setAttribute("user",user);
          %>
          <%-- JavBean中的屬性字段需要提供get方法 --%>
          ${user} <%-- 獲取對象 --%>
          ${user.uname} <%--獲取對象中的屬性--%>
          empty
          <%--
              empty
                  判斷域對象是否為空。為空,返回true;不為空返回false;
                      ${empty 限域變量名 }
                  判斷對象是否不為空。
                      ${!empty 限域變量名 }
          --%>
          ${empty uname}
          ${empty list}
          ${empty map}
          ${empty user}


          EL運算
          <%
              request.setAttribute("a", 10);
              request.setAttribute("b", 2);
              request.setAttribute("c", "aa");
              request.setAttribute("d", "bb");
          %>

          等值判斷

          <%--
              比較兩個值是否相等,返回true或false
                  ==  或  eq
          --%>
          ${a == b }
          ${c == d }
          ${c eq d }
          ${a == 5 }
          ${c == 'aa' }

          算術運算

          <%--
              加法: +
              減法: -
              乘法: *
              除法: / 或 div
          --%>
          ${a + b }
          ${a / b } 或 ${a div b }

          大小比較

          SP常見面試題

          jsp靜態(tài)包含和動態(tài)包含的區(qū)別

          jsp靜態(tài)包含和動態(tài)包含的區(qū)別
          • 在講解request對象的時候,我們曾經使用過request.getRequestDispatcher(String url).include(request,response)來對頁頭和頁尾面進行包含
          • inclue指令也是做這樣的事情,我們來試驗一下吧!
          • 這是頁頭

          • 這是頁尾

          • 在1.jsp中把頁頭和頁尾包含進來

          • 訪問1.jsp

          • include指令是靜態(tài)包含。靜態(tài)包含的意思就是:把文件的代碼內容都包含進來,再編譯!,看一下jsp的源代碼就知道了!

          • 上面已經提及到了,include指令是靜態(tài)包含,include行為是動態(tài)包含其實include行為就是封裝了request.getRequestDispatcher(String url).include(request,response)
          • include行為語法是這個樣子的
          <jsp:include page=""/>
          
          • 我們先來使用一下把,在1.jsp頁面中也將頁頭和頁尾包含進來

          • 訪問1.jsp頁面看一下效果:

          • 使用jsp行為來包含文件,jsp源文件是這樣子的:

          • jsp行為包含文件就是先編譯被包含的頁面,再將頁面的結果寫入到包含的頁面中(1.jsp)
          • 當然了,現在有靜態(tài)包含和動態(tài)包含,使用哪一個更好呢?答案是:動態(tài)包含
          • 動態(tài)包含可以向包含的頁面?zhèn)鬟f參數(用處不大),并且是分別處理兩個頁面的(將被包含頁面編譯后得出的結果再寫進包含頁面)【如果有相同名稱的參數,使用靜態(tài)包含就會報錯!】
          • 模擬一下場景吧,現在我的頭頁面有個名為s的字符串變量

          • 我的頁尾也有個名為s的字符串變量

          • 現在我使用靜態(tài)包含看看會發(fā)生什么,出現異常了。

          • 出現異常的原因很簡單,就是同一個文件中有兩個相同的變量s

          • 使用動態(tài)包含就可以避免這種情況

          總結

          1. <%@include file="xxx.jsp"%>為jsp中的編譯指令,其文件的包含是發(fā)生在jsp向servlet轉換的時期,而<jsp:include page="xxx.jsp">是jsp中的動作指令,其文件的包含是發(fā)生在編譯時期,也就是將java文件編譯為class文件的時期
          2. 使用靜態(tài)包含只會產生一個class文件,而使用動態(tài)包含會產生多個class文件
          3. 使用靜態(tài)包含,包含頁面和被包含頁面的request對象為同一對象,因為靜態(tài)包含只是將被包含的頁面的內容復制到包含的頁面中去;而動態(tài)包含包含頁面和被包含頁面不是同一個頁面,被包含的頁面的request對象可以取到的參數范圍要相對大些,不僅可以取到傳遞到包含頁面的參數,同樣也能取得在包含頁面向下傳遞的參數

          jsp有哪些內置對象?作用分別是什么?

          jsp有哪些內置對象?作用分別是什么?

          九個內置對象:

          • pageContext
          • page
          • config
          • request
          • response
          • session
          • application
          • exception
          • out

          其中,request、response、session、application、config這五個對象和Servlet的API是一樣的。這5個對象我就不解釋了。

          在JSP中,尤其重要的是pageContext對象。

          pageContext是內置對象中最重要的一個對象,它代表著JSP頁面編譯后的內容(也就是JSP頁面的運行環(huán)境)!

          pageContext對象
          • 既然它代表了JSP頁面編譯后的內容,理所當然的:它封裝了對其他8大內置對象的引用!,也就是說,通過pageContext可以獲取到其他的8個內置對象!

          • 看下效果:

          pageContext作為域對象
          • 類似于request,session,ServletContext作為域對象而言都有以下三個方法
          • setAttribute(String name,Objcet o)
          • getAttribute(String name)
          • removeAttribute(String name)
          • 當然了,pageContext也不例外,pageContext也有這三個方法
          • pageContext本質上代表的是當前JSP頁面編譯后的內容,作為域對象而言,它就代表著當前JSP頁面(也就是page)!也就是說:pageContext域對象只在page范圍內有效,超出了page范圍就無效了
          • 首先來看看在page范圍內能不能使用

          • 效果如下:

          • 我們現在來試驗一下是不是超出了page范圍就無效了!
          • 在2.jsp中request域對象設置屬性

          • 企圖在1.jsp中pageContext取出request存進去的屬性

          • 效果如下:



          • pageContext本質上代表著編譯后JSP的內容,pageContext還可以封裝了訪問其他域的方法
          • 上面的pageContext默認是page范圍的但pageContext對象重載了set、get、removeAttribute這三個方法
          • getAttribute(String name,int scope)
          • setAttribute(String name,Object value,int scope)
          • removeAttribute(String name,int scope)
          • 多了一個設置域范圍的一個參數,如果不指定默認就是page。當然了,pageContext把request、session、application、page這幾個域對象封裝著了靜態(tài)變量供我們使用
          • PageContext.APPLICATION_SCOPE
          • PageContext.SESSION_SCOPE
          • PageContext.REQUEST_SCOPE
          • PageContext.PAGE_SCOPE
          • 剛才我們沒有使用重載方法的時候,使用pageContext是無法獲取到request域對象設置的屬性的。現在我們使用重載后的方法看一下能不能獲取得到

          • 效果:



          • pageContexst還有這么一個方法:
          • findAttribute(String name)

          • 該方法會查找各個域的屬性,從小到大開始尋找!也就是page—>request->session->application。
          • 我們用此方法看能不能查找出request域對象的屬性吧!

          • 效果如下:

          out對象:
          • out對象用于向瀏覽器輸出數據,與之對應的是Servlet的PrintWriter對象。然而這個out對象的類型并不是PrintWriter,是JspWriter

          • 我們可以簡單理解為:JspWriter就是帶緩存的PrintWrieter
          • out對象的原理如下:

          • 只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象才去調用ServletResponse.getWriter方法,并通過該方法返回的PrintWriter對象將out對象的緩沖區(qū)中的內容真正寫入到Servlet引擎提供的緩沖區(qū)中
          • 設置page指令的buffer屬性關閉了out對象的緩存功能
          • out對象的緩沖區(qū)已滿
          • 整個JSP頁面結束
          • 一般我們在JSP頁面輸出都是用表達式(<%=%>),所以out對象用得并不是很多
          page對象

          內置對象page是HttpJasPage對象,其實page對象代表的就是當前JSP頁面,是當前JSP編譯后的Servlet類的對象。也就是說:page對象相當于普通java類的this

          exception對象
          • 內置對象exception是java.lang.Exception類的對象,exception封裝了JSP頁面拋出的異常信息。exception經常被用來處理錯誤頁面
          • 前面我們已經講過了怎么設置錯誤頁面了,下面我們就來簡單使用一下exception對象吧
          • 1.jsp頁面

          • error.jsp頁面

          • 效果:

          總結:

          1. request 用戶端請求,此請求會包含來自GET/POST請求的參數
          2. response 網頁傳回用戶端的回應
          3. pageContext 網頁的屬性是在這里管理,代表的編譯后JSP內容
          4. session 與請求有關的會話期
          5. application servlet 正在執(zhí)行的內容
          6. out 用來傳送回應的輸出
          7. config servlet的構架部件
          8. page JSP網頁本身
          9. exception 針對錯誤網頁,未捕捉的例外

          jsp和servlet的區(qū)別、共同點、各自應用的范圍?

          jsp和servlet的區(qū)別、共同點、各自應用的范圍?
          1. JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式。JSP編譯后是“類servlet”。
          2. Servlet和JSP最主要的不同點在于:Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。
          3. JSP側重于視圖,Servlet主要用于控制邏輯。


          屬性作用域范圍

          屬性作用域范圍
          1. page【只在一個頁面中保存屬性,跳轉頁面無效】
          2. requet【只在一次請求中保存屬性,服務器跳轉有效,瀏覽器跳轉無效】
          3. session【在一個會話范圍中保存屬性,無論何種跳轉均有效,關閉瀏覽器后無效】
          4. application【在整個服務器中保存,所有用戶都可以使用】

          應用場景:

          1. request:如果客戶向服務器發(fā)請求,產生的數據,用戶看完就沒用了,像這樣的數據就存在request域,像新聞數據,屬于用戶看完就沒用的
          2. session:如果客戶向服務器發(fā)請求,產生的數據,用戶用完了等一會兒還有用,像這樣的數據就存在session域中,像購物數據,用戶需要看到自己購物信息,并且等一會兒,還要用這個購物數據結帳
          3. servletContext:如果客戶向服務器發(fā)請求,產生的數據,用戶用完了,還要給其它用戶用,像這樣的數據就存在servletContext域中,像聊天數據


          寫出5種JSTL常用標簽

          寫出5種JSTL常用標簽
          <c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>
          


          寫一個自定義標簽要繼承什么類

          寫一個自定義標簽要繼承什么類

          我們可以有兩種方式來實現自定義標簽:

          • 傳統(tǒng)方式,實現Tag接口(老方法)
          • 簡單方式,繼承SimpleTagSupport類


          SimpleTagSupport類的執(zhí)行順序(原理):

          • ①WEB容器調用標簽處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標簽處理器對象
          • ②WEB容器調用標簽處理器對象的setParent方法,將父標簽處理器對象傳遞給這個標簽處理器對象。【注意,只有在標簽存在父標簽的情況下,WEB容器才會調用這個方法】
          • ③如果調用標簽時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標簽處理器對象。如果標簽的屬性值是EL表達式或腳本表達式,則WEB容器首先計算表達式的值,然后把值傳遞給標簽處理器對象。
          • ④如果簡單標簽有標簽體,容器將調用setJspBody方法把代表標簽體的JspFragment對象傳遞進來
          • ⑤執(zhí)行標簽時:容器調用標簽處理器的doTag()方法,開發(fā)人員在方法體內通過操作JspFragment對象,就可以實現是否執(zhí)行、迭代、修改標簽體的目的。

          總結

          SimpleTagSupport,一般調用doTag方法或者實現SimpleTag接口

          JSP是如何被執(zhí)行的?執(zhí)行效率比SERVLET低嗎?

          JSP是如何被執(zhí)行的?執(zhí)行效率比SERVLET低嗎?
          • 當客戶端向一個jsp頁面發(fā)送請求時,Web Container將jsp轉化成servlet的源代碼(只在第一次請求時),然后編譯轉化后的servlet并加載到內存中執(zhí)行,執(zhí)行的結果response到客戶端
          • jsp只在第一次執(zhí)行的時候會轉化成servlet,以后每次執(zhí)行,web容器都是直接執(zhí)行編譯后的servlet,所以jsp和servlet只是在第一次執(zhí)行的時候不一樣,jsp慢一點,以后的執(zhí)行都是相同的


          如何避免jsp頁面自動生成session對象?為什么要這么做?

          如何避免jsp頁面自動生成session對象?為什么要這么做?

          可以使用頁面指令顯式關掉,代碼如下:

          <%@ page session="false" %>

          jsp的缺點?

          jsp的缺點?
          • 1)不好調試
          • 2)與其他腳本語言的交互(可讀性差)


          說出Servlet和CGI的區(qū)別?

          說出Servlet和CGI的區(qū)別?
          • Servlet處于服務器進程中,只會有一個servlet實例,每個請求都會產生一個新的線程,而且servlet實例一般不會銷毀
          • CGI:來一個請求就創(chuàng)建一個進程,用完就銷毀,效率低于servlet


          簡述JSP的設計模式。

          簡述JSP的設計模式。

          在Web開發(fā)模式中,有兩個主要的開發(fā)結構,稱為模式一(Mode I)和模式二(Mode II)

          首先我們來理清一些概念吧:

          • DAO(Data Access Object):主要對數據的操作,增加、修改、刪除等原子性操作。
          • Web層:界面+控制器,也就是說JSP【界面】+Servlet【控制器】
          • Service業(yè)務層:將多個原子性的DAO操作進行組合,組合成一個完整的業(yè)務邏輯
          • 控制層:主要使用Servlet進行控制
          • 數據訪問層:使用DAO、Hibernate、JDBC技術實現對數據的增刪改查
          • JavaBean用于封裝數據,處理部分核心邏輯,每一層中都用到!

          模式一指的就是在開發(fā)中將顯示層、控制層、數據層的操作統(tǒng)一交給JSP或者JavaBean來進行處理

          模式一有兩種情況:

          完全使用JSP做開發(fā):

          • 優(yōu)點:
          • 開發(fā)速度賊快,只要寫JSP就行了,JavaBean和Servlet都不用設計!
          • 小幅度修改代碼方便,直接修改JSP頁面交給WEB容器就行了,不像Servlet還要編譯成.class文件再交給服務器!【當然了,在ide下開發(fā)這個也不算是事】

          • 缺點:
          • 程序的可讀性差、復用性低、代碼復雜!什么jsp代碼、html代碼都往上面寫,這肯定很難閱讀,很難重用!

          使用JSP+JavaBean做開發(fā):

          • 優(yōu)點:
          • 程序的可讀性較高,大部分的代碼都寫在JavaBean上,不會和HTML代碼混合在一起,可讀性還行的
          • 可重復利用高,核心的代碼都由JavaBean開發(fā)了,JavaBean的設計就是用來重用、封裝,大大減少編寫重復代碼的工作!

          • 缺點:
          • 沒有流程控制,程序中的JSP頁面都需要檢查請求的參數是否正確,異常發(fā)生時的處理。顯示操作和業(yè)務邏輯代碼工作會緊密耦合在一起的!日后維護會困難

          Mode II 中所有的開發(fā)都是以Servlet為主體展開的,由Servlet接收所有的客戶端請求,然后根據請求調用相對應的JavaBean,并所有的顯示結果交給JSP完成!,也就是俗稱的MVC設計模式!

          MVC設計模式:

          • 顯示層(View):主要負責接受Servlet傳遞的內容,調用JavaBean,將內容顯示給用戶
          • 控制層(Controller):主要負責所有用戶的請求參數,判斷請求參數是否合法,根據請求的類型調用JavaBean,將最終的處理結果交給顯示層顯示!
          • 模型層(Mode):模型層包括了業(yè)務層,DAO層。

          總結

          • (1)ModelI,JSP+JavaBean設計模式。
          • (2)ModelII,MVC設計模式。


          原文地址:https://dwz.cn/NhBjgHRk作者:Java3y

          主站蜘蛛池模板: 91一区二区三区四区五区| 国产在线一区视频| 国产AV午夜精品一区二区三| 国产精品一区二区久久精品| 亲子乱AV视频一区二区| 日本在线视频一区| 亚洲av综合av一区二区三区| 在线观看国产区亚洲一区成人 | 亚洲愉拍一区二区三区| 99精品国产高清一区二区三区 | 毛片无码一区二区三区a片视频| 日本大香伊一区二区三区| V一区无码内射国产| 波霸影院一区二区| 精品天海翼一区二区| 国产精品一区二区三区高清在线 | 精品国产日产一区二区三区 | 少妇无码一区二区二三区| 国产福利一区二区在线视频| 风间由美在线亚洲一区| 无码少妇一区二区浪潮免费| 2021国产精品视频一区| 中文字幕AV一区二区三区人妻少妇| 麻豆天美国产一区在线播放| 久久亚洲一区二区| 日韩电影一区二区| 亚洲电影一区二区| 少妇激情一区二区三区视频| 一区二区免费视频| 亚洲香蕉久久一区二区| 精品无码人妻一区二区三区18 | 一级特黄性色生活片一区二区| 在线观看国产一区二区三区| 老鸭窝毛片一区二区三区| 中文字幕一区精品| 青青青国产精品一区二区| 亚洲AV无码一区二区三区性色| 国产精品久久久久久一区二区三区| 亚洲av综合av一区二区三区| 琪琪see色原网一区二区| 高清国产AV一区二区三区|