成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JSP面試題都在這里

gaosboy / 2033人閱讀

摘要:下面是我整理下來的知識點圖上的知識點都可以在我其他的文章內(nèi)找到相應內(nèi)容。在中,尤其重要的是對象。

下面是我整理下來的JSP知識點:

圖上的知識點都可以在我其他的文章內(nèi)找到相應內(nèi)容。

JSP常見面試題 jsp靜態(tài)包含和動態(tài)包含的區(qū)別
jsp靜態(tài)包含和動態(tài)包含的區(qū)別

在講解request對象的時候,我們曾經(jīng)使用過request.getRequestDispatcher(String url).include(request,response)來對頁頭和頁尾面進行包含

inclue指令也是做這樣的事情,我們來試驗一下吧!

這是頁頭

    <%@ page contentType="text/html;charset=UTF-8" language="java"   %>
    
        
            頁頭
        
        
        我是頁頭
        


這是頁尾

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        頁尾
    
    
    
    我是頁尾
    
    
    

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


    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        包含頁頭和頁尾進來
    
    
    
    
    <%@include file="head.jsp" %>
    <%@include file="foot.jsp" %>
    
    

訪問1.jsp

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

上面已經(jīng)提及到了,include指令是靜態(tài)包含,include行為是動態(tài)包含。其實include行為就是封裝了request.getRequestDispatcher(String url).include(request,response)

include行為語法是這個樣子的

    

我們先來使用一下把,在1.jsp頁面中也將頁頭和頁尾包含進來。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        包含頁頭和頁尾進來
    
    
        
        
    
    

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

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

jsp行為包含文件就是先編譯被包含的頁面,再將頁面的結果寫入到包含的頁面中(1.jsp)

當然了,現(xiàn)在有靜態(tài)包含和動態(tài)包含,使用哪一個更好呢?答案是:動態(tài)包含。

動態(tài)包含可以向被包含的頁面?zhèn)鬟f參數(shù)(用處不大),并且是分別處理被包含頁面的(將被包含頁面編譯后得出的結果再寫進包含頁面)【如果有相同名稱的參數(shù),使用靜態(tài)包含就會報錯!】!

模擬一下場景吧,現(xiàn)在我的頭頁面有個名為s的字符串變量

    <%@ page contentType="text/html;charset=UTF-8" language="java"   %>
    
        
            頁頭
        
        
        
        <%
            String s = "zhongfucheng";
        %>
        我是頁頭呀
        


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

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        頁尾
    
    
    <%
        String s = "zhongfucheng";
    %>
    
    我是頁尾呀
    
    
    

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

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

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

總結

<%@include file="xxx.jsp"%>為jsp中的編譯指令,其文件的包含是發(fā)生在jsp向servlet轉(zhuǎn)換的時期,而是jsp中的動作指令,其文件的包含是發(fā)生在編譯時期,也就是將java文件編譯為class文件的時期

使用靜態(tài)包含只會產(chǎn)生一個class文件,而使用動態(tài)包含會產(chǎn)生多個class文件

使用靜態(tài)包含,包含頁面和被包含頁面的request對象為同一對象,因為靜態(tài)包含只是將被包含的頁面的內(nèi)容復制到包含的頁面中去;而動態(tài)包含包含頁面和被包含頁面不是同一個頁面,被包含的頁面的request對象可以取到的參數(shù)范圍要相對大些,不僅可以取到傳遞到包含頁面的參數(shù),同樣也能取得在包含頁面向下傳遞的參數(shù)

jsp有哪些內(nèi)置對象?作用分別是什么?
jsp有哪些內(nèi)置對象?作用分別是什么?

九個內(nèi)置對象:

pageContext

page

config

request

response

session

application

exception

out

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

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

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

pageContext對象

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

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        獲取八大內(nèi)置對象
    
    
    <%
    
        System.out.println(pageContext.getSession());
        System.out.println(pageContext.getRequest());
        System.out.println(pageContext.getResponse());
    
        System.out.println(pageContext.getException());
    
        System.out.println(pageContext.getPage());
        System.out.println(pageContext.getServletConfig());
        System.out.println(pageContext.getServletContext());
        System.out.println(pageContext.getOut());
    
    %>
    
    
    

看下效果:

pageContext作為域?qū)ο?/pre>

類似于request,session,ServletContext作為域?qū)ο蠖?strong>都有以下三個方法:

setAttribute(String name,Objcet o)

getAttribute(String name)

removeAttribute(String name)

當然了,pageContext也不例外,pageContext也有這三個方法

pageContext本質(zhì)上代表的是當前JSP頁面編譯后的內(nèi)容,作為域?qū)ο蠖?,它就代表著當前JSP頁面(也就是page)!也就是說:pageContext域?qū)ο笾辉趐age范圍內(nèi)有效,超出了page范圍就無效了

首先來看看在page范圍內(nèi)能不能使用

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        使用page域?qū)ο?/title>
    </head>
    <body>
    <%
        pageContext.setAttribute("name", "zhongfucheng");
    %>
    <%
        String value = (String) pageContext.getAttribute("name");
        System.out.println(value);
    %>
    
    </body>
    </html>

</pre>
<p>效果如下:</p>
<p><script type="text/javascript">showImg("https://segmentfault.com/img/remote/1460000013228736?w=839&h=563");</script></p>

<p>我們現(xiàn)在來試驗一下<strong>是不是超出了page范圍就無效了!</strong>
</p>
<p><strong>在2.jsp中request域?qū)ο笤O置屬性</strong></p>

<pre>
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>request域?qū)ο笤O置屬性
    
    
    <%
        //這是request域?qū)ο蟊4娴膬?nèi)容
        request.setAttribute("name","zhongfucheng");
    %>

    <%--跳轉(zhuǎn)到1.jsp中--%>

    
    
    
    

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

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        在page域?qū)ο螳@取屬性
    
    
    
    <%
        //企圖獲取request域?qū)ο蟠孢M的屬性
        String value = (String) pageContext.getAttribute("name");
        System.out.println(value);
    %>
    
    
    

效果如下:

pageContext本質(zhì)上代表著編譯后JSP的內(nèi)容,pageContext還可以封裝了訪問其他域的方法!

上面的pageContext默認是page范圍的,但pageContext對象重載了set、get、removeAttribute這三個方法

getAttribute(String name,int scope)

setAttribute(String name,Object value,int scope)

removeAttribute(String name,int scope)

多了一個設置域范圍的一個參數(shù),如果不指定默認就是page。當然了,pageContext把request、session、application、page這幾個域?qū)ο蠓庋b著了靜態(tài)變量供我們使用

PageContext.APPLICATION_SCOPE

PageContext.SESSION_SCOPE

PageContext.REQUEST_SCOPE

PageContext.PAGE_SCOPE

剛才我們沒有使用重載方法的時候,使用pageContext是無法獲取到request域?qū)ο笤O置的屬性的。現(xiàn)在我們使用重載后的方法看一下能不能獲取得到!

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        在page域?qū)ο螳@取request域?qū)ο蟮膶傩?/title>
    </head>
    <body>
    
    <%
        //使用重載的方法獲取request域?qū)ο蟮膶傩?        String value = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE);
        System.out.println(value);
    %>
    
    </body>
    </html>
</pre>
<p>效果:</p>
<p><script type="text/javascript">showImg("https://segmentfault.com/img/remote/1460000013228738?w=1368&h=549");</script></p>


<p>
<p>pageContexst還有這么一個方法:</p>
<p><strong>findAttribute(String name)</strong></p>
</p>
<p><strong>該方法會查找各個域的屬性,從小到大開始尋找!也就是page—>request->session->application。</strong></p>
<p>我們用此方法看能不能查找出request域?qū)ο蟮膶傩园桑?/p>

<pre>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>使用findAttribute
    
    
    
    <%
    
        //使用findAttribute查找2.jsp中request域?qū)ο蟮膶傩?        String value = (String) pageContext.findAttribute("name");
        System.out.println(value);
    %>
    
    
    

效果如下:

out對象:

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

我們可以簡單理解為:JspWriter就是帶緩存的PrintWrieter。

out對象的原理如下:

只有向out對象中寫入了內(nèi)容,且滿足如下任何一個條件時,out對象才去調(diào)用ServletResponse.getWriter方法,并通過該方法返回的PrintWriter對象將out對象的緩沖區(qū)中的內(nèi)容真正寫入到Servlet引擎提供的緩沖區(qū)中

設置page指令的buffer屬性關閉了out對象的緩存功能

out對象的緩沖區(qū)已滿

整個JSP頁面結束

一般我們在JSP頁面輸出都是用表達式(<%=%>),所以out對象用得并不是很多!

page對象

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

exception對象

內(nèi)置對象exception是java.lang.Exception類的對象,exception封裝了JSP頁面拋出的異常信息。exception經(jīng)常被用來處理錯誤頁面

前面我們已經(jīng)講過了怎么設置錯誤頁面了,下面我們就來簡單使用一下exception對象吧

1.jsp頁面

    <%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
    
    
    
        
    
    
    
    <%--模擬空指針異常的錯誤--%>
    <%
    
        String sss = null;
        sss.length();
    %>
    
    
    

error.jsp頁面


    <%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
    
    
    
        錯誤頁面
    
    
    
    <%
        out.println("程序拋出了異常:" + exception);
    %>
    
    
    

效果:

總結

request 用戶端請求,此請求會包含來自GET/POST請求的參數(shù)

response 網(wǎng)頁傳回用戶端的回應

pageContext 網(wǎng)頁的屬性是在這里管理,代表的編譯后JSP內(nèi)容

session 與請求有關的會話期

application servlet 正在執(zhí)行的內(nèi)容

out 用來傳送回應的輸出

config servlet的構架部件

page JSP網(wǎng)頁本身

exception 針對錯誤網(wǎng)頁,未捕捉的例外

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

JSP是Servlet技術的擴展,本質(zhì)上就是Servlet的簡易方式。JSP編譯后是“類servlet”。

Servlet和JSP最主要的不同點在于:Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。

JSP側重于視圖,Servlet主要用于控制邏輯。

屬性作用域范圍
屬性作用域范圍

page【只在一個頁面中保存屬性,跳轉(zhuǎn)頁面無效】

requet【只在一次請求中保存屬性,服務器跳轉(zhuǎn)有效,瀏覽器跳轉(zhuǎn)無效】

session【在一個會話范圍中保存屬性,無論何種跳轉(zhuǎn)均有效,關閉瀏覽器后無效】

application【在整個服務器中保存,所有用戶都可以使用】

應用場景:

request:如果客戶向服務器發(fā)請求,產(chǎn)生的數(shù)據(jù),用戶看完就沒用了,像這樣的數(shù)據(jù)就存在request域,像新聞數(shù)據(jù),屬于用戶看完就沒用的

session:如果客戶向服務器發(fā)請求,產(chǎn)生的數(shù)據(jù),用戶用完了等一會兒還有用,像這樣的數(shù)據(jù)就存在session域中,像購物數(shù)據(jù),用戶需要看到自己購物信息,并且等一會兒,還要用這個購物數(shù)據(jù)結帳

servletContext:如果客戶向服務器發(fā)請求,產(chǎn)生的數(shù)據(jù),用戶用完了,還要給其它用戶用,像這樣的數(shù)據(jù)就存在servletContext域中,像聊天數(shù)據(jù)

寫出5種JSTL常用標簽
寫出5種JSTL常用標簽
,,,,
寫一個自定義標簽要繼承什么類
寫一個自定義標簽要繼承什么類

我們可以有兩種方式來實現(xiàn)自定義標簽:

傳統(tǒng)方式,實現(xiàn)Tag接口(老方法)

簡單方式,繼承SimpleTagSupport類

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

①WEB容器調(diào)用標簽處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標簽處理器對象

②WEB容器調(diào)用標簽處理器對象的setParent方法,將父標簽處理器對象傳遞給這個標簽處理器對象?!咀⒁猓挥性跇撕灤嬖诟笜撕灥那闆r下,WEB容器才會調(diào)用這個方法】

③如果調(diào)用標簽時設置了屬性,容器將調(diào)用每個屬性對應的setter方法把屬性值傳遞給標簽處理器對象。如果標簽的屬性值是EL表達式或腳本表達式,則WEB容器首先計算表達式的值,然后把值傳遞給標簽處理器對象。

④如果簡單標簽有標簽體,容器將調(diào)用setJspBody方法把代表標簽體的JspFragment對象傳遞進來

⑤執(zhí)行標簽時:容器調(diào)用標簽處理器的doTag()方法,開發(fā)人員在方法體內(nèi)通過操作JspFragment對象,就可以實現(xiàn)是否執(zhí)行、迭代、修改標簽體的目的。

總結

SimpleTagSupport,一般調(diào)用doTag方法或者實現(xiàn)SimpleTag接口

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

當客戶端向一個jsp頁面發(fā)送請求時,Web Container將jsp轉(zhuǎn)化成servlet的源代碼(只在第一次請求時),然后編譯轉(zhuǎn)化后的servlet并加載到內(nèi)存中執(zhí)行,執(zhí)行的結果response到客戶端

jsp只在第一次執(zhí)行的時候會轉(zhuǎn)化成servlet,以后每次執(zhí)行,web容器都是直接執(zhí)行編譯后的servlet,所以jsp和servlet只是在第一次執(zhí)行的時候不一樣,jsp慢一點,以后的執(zhí)行都是相同的

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

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

<%@ page session="false" %>

jsp的缺點?
jsp的缺點?

1)不好調(diào)試

2)與其他腳本語言的交互(可讀性差)

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

Servlet處于服務器進程中,只會有一個servlet實例,每個請求都會產(chǎn)生一個新的線程,而且servlet實例一般不會銷毀

CGI:來一個請求就創(chuàng)建一個進程,用完就銷毀,效率低于servlet

簡述JSP的設計模式。
簡述JSP的設計模式。

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

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

DAO(Data Access Object):主要對數(shù)據(jù)的操作,增加、修改、刪除等原子性操作。

Web層:界面+控制器,也就是說JSP【界面】+Servlet【控制器】

Service業(yè)務層:將多個原子性的DAO操作進行組合,組合成一個完整的業(yè)務邏輯

控制層:主要使用Servlet進行控制

數(shù)據(jù)訪問層:使用DAO、Hibernate、JDBC技術實現(xiàn)對數(shù)據(jù)的增刪改查

JavaBean用于封裝數(shù)據(jù),處理部分核心邏輯,每一層中都用到!

模式一指的就是在開發(fā)中將顯示層、控制層、數(shù)據(jù)層的操作統(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頁面都需要檢查請求的參數(shù)是否正確,異常發(fā)生時的處理。顯示操作和業(yè)務邏輯代碼工作會緊密耦合在一起的!日后維護會困難

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

MVC設計模式:

顯示層(View):主要負責接受Servlet傳遞的內(nèi)容,調(diào)用JavaBean,將內(nèi)容顯示給用戶

控制層(Controller):主要負責所有用戶的請求參數(shù),判斷請求參數(shù)是否合法,根據(jù)請求的類型調(diào)用JavaBean,將最終的處理結果交給顯示層顯示!

模型層(Mode):模型層包括了業(yè)務層,DAO層。

總結

(1)ModelI,JSP+JavaBean設計模式。

(2)ModelII,MVC設計模式。

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68476.html

相關文章

  • Java3y文章目錄導航

    摘要:前言由于寫的文章已經(jīng)是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經(jīng)是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創(chuàng)的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數(shù)據(jù)庫連接池...

    KevinYan 評論0 收藏0
  • Java面試前需要了解的東西

    摘要:我在面試前針對基礎也花了不少的時間,期間也將自己寫過的博文粗略地刷了一遍,同時也在網(wǎng)上找了不少比較好的資料部分是沒看完的。看面試題也是校驗自己是否真正理解了這個知識點,也很有可能會有新的收獲。 一、前言 只有光頭才能變強 回顧前面: 廣州三本找Java實習經(jīng)歷 上一篇寫了自己面試的經(jīng)歷和一些在面試的時候遇到的題目(筆試題和面試題)。 我在面試前針對Java基礎也花了不少的時間,期間也將...

    renweihub 評論0 收藏0
  • 過濾器監(jiān)聽器面試都在這里

    摘要:中的異步處理指的是什么中的異步處理指的是什么答在中引入了一項新的技術可以讓異步處理請求。開啟異步處理代碼開啟異步支持啟動異步處理的上下文在此處添加異步處理的代碼如果文章有錯的地方歡迎指正,大家互相交流。 以下我是歸納的過濾器監(jiān)聽器知識點圖: showImg(https://segmentfault.com/img/remote/1460000013263166?w=3974&h=187...

    crelaber 評論0 收藏0
  • HTTP面試都在這里

    摘要:一般由三部組成協(xié)議或稱為服務方式存有該資源的主機地址有時也包括端口號主機資源的具體地址。上面的和都是的示例。服務器應答客戶機向服務器發(fā)出請求后,服務器會客戶機回送應答,,應答的第一部分是協(xié)議的版本號和應答狀態(tài)碼。 HTTP常見面試題 Http與Https的區(qū)別: Http與Https的區(qū)別: HTTP 的URL 以http:// 開頭,而HTTPS 的URL 以https:// 開頭...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

gaosboy

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<