日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Tomcat+Servlet面试题都在这里

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tomcat+Servlet面试题都在这里 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

下面是我整理下來(lái)的Servlet知識(shí)點(diǎn):


圖上的知識(shí)點(diǎn)都可以在我其他的文章內(nèi)找到相應(yīng)內(nèi)容。

Tomcat常見(jiàn)面試題

Tomcat的缺省端口是多少,怎么修改

Tomcat的缺省端口是多少,怎么修改

  • 找到Tomcat目錄下的conf文件夾
  • 進(jìn)入conf文件夾里面找到server.xml文件
  • 打開(kāi)server.xml文件
  • 在server.xml文件里面找到下列信息
  • <Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
  • 把port=”8080″改成port=”8888″,并且保存
  • 啟動(dòng)Tomcat,并且在IE瀏覽器里面的地址欄輸入http://127.0.0.1:8888/
  • 到tomcat主目錄下的conf/server.xml文件中修改,把8080端口改成是8088或者是其他的

    Tomcat 有哪幾種Connector 運(yùn)行模式(優(yōu)化)?

    tomcat 有哪幾種Connector 運(yùn)行模式(優(yōu)化)?

  • bio(blocking I/O)
  • nio(non-blocking I/O)
  • apr(Apache Portable Runtime/Apache可移植運(yùn)行庫(kù))
  • 相關(guān)解釋:

    • bio: 傳統(tǒng)的Java I/O操作,同步且阻塞IO。
    • nio: JDK1.4開(kāi)始支持,同步阻塞或同步非阻塞IO
    • aio(nio.2): JDK7開(kāi)始支持,異步非阻塞IO
    • apr: Tomcat將以JNI的形式調(diào)用Apache HTTP服務(wù)器的核心動(dòng)態(tài)鏈接庫(kù)來(lái)處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地 提高Tomcat對(duì)靜態(tài)文件的處理性能

    下面是配置Tomcat運(yùn)行模式改成是NIO模式,并配置連接池相關(guān)參數(shù)來(lái)進(jìn)行優(yōu)化:

    <!--<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />--><!-- protocol 啟用 nio模式,(tomcat8默認(rèn)使用的是nio)(apr模式利用系統(tǒng)級(jí)異步io) --><!-- minProcessors最小空閑連接線程數(shù)--><!-- maxProcessors最大連接線程數(shù)--><!-- acceptCount允許的最大連接數(shù),應(yīng)大于等于maxProcessors--><!-- enableLookups 如果為true,requst.getRemoteHost會(huì)執(zhí)行DNS查找,反向解析ip對(duì)應(yīng)域名或主機(jī)名--><Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443maxThreads=“500” minSpareThreads=“100” maxSpareThreads=“200”acceptCount="200"enableLookups="false" />

    apr模式啟動(dòng)起來(lái)是比較復(fù)雜的,詳情可參考:http://blog.csdn.net/wanglei_storage/article/details/50225779

    對(duì)于bio,nio,nio.2的理解可參考:http://blog.csdn.net/itismelzp/article/details/50886009

    Tomcat有幾種部署方式

  • 直接把Web項(xiàng)目放在webapps下,Tomcat會(huì)自動(dòng)將其部署
  • 在server.xml文件上配置<Context>節(jié)點(diǎn),設(shè)置相關(guān)的屬性即可
  • 通過(guò)Catalina來(lái)進(jìn)行配置:進(jìn)入到conf\Catalina\localhost文件下,創(chuàng)建一個(gè)xml文件,該文件的名字就是站點(diǎn)的名字。編寫(xiě)XML的方式來(lái)進(jìn)行設(shè)置。
  • 部署方式第二點(diǎn):

    • 在其他盤(pán)符下創(chuàng)建一個(gè)web站點(diǎn)目錄,并創(chuàng)建WEB-INF目錄和一個(gè)html文件。

    • 找到Tomcat目錄下/conf/server.xml文件

    • 在server.xml中的節(jié)點(diǎn)下添加如下代碼。path表示的是訪問(wèn)時(shí)輸入的web項(xiàng)目名,docBase表示的是站點(diǎn)目錄的絕對(duì)路徑
    <Context path="/web1" docBase="D:\web1"/>

    • 訪問(wèn)配置好的web站點(diǎn)


    部署方式第三點(diǎn):

    • 進(jìn)入到conf\Catalina\localhost文件下,創(chuàng)建一個(gè)xml文件,該文件的名字就是站點(diǎn)的名字。

    • xml文件的代碼如下,docBase是你web站點(diǎn)的絕對(duì)路徑

    <?xml version="1.0" encoding="UTF-8"?> <Context docBase="D:\web1" reloadable="true"> </Context>
    • 訪問(wèn)web站點(diǎn)下的html資源

    Servlet面試題

    Servlet生命周期

    Servlet生命周期?

    • 第一次訪問(wèn)**Servlet,我們發(fā)現(xiàn)**init()和service()都被調(diào)用了

    • 第二次訪問(wèn)**Servlet,**service()被調(diào)用了

    • 第三次訪問(wèn)Servlet,還是service()被調(diào)用了

    • 當(dāng)我們關(guān)閉Tomcat服務(wù)器的時(shí)候,destroy()被調(diào)用了!

    Servlet生命周期可分為5個(gè)步驟

  • 加載Servlet。當(dāng)Tomcat第一次訪問(wèn)Servlet的時(shí)候,Tomcat會(huì)負(fù)責(zé)創(chuàng)建Servlet的實(shí)例
  • 初始化。當(dāng)Servlet被實(shí)例化后,Tomcat會(huì)調(diào)用init()方法初始化這個(gè)對(duì)象
  • 處理服務(wù)。當(dāng)瀏覽器訪問(wèn)Servlet的時(shí)候,Servlet 會(huì)調(diào)用service()方法處理請(qǐng)求
  • 銷(xiāo)毀。當(dāng)Tomcat關(guān)閉時(shí)或者檢測(cè)到Servlet要從Tomcat刪除的時(shí)候會(huì)自動(dòng)調(diào)用destroy()方法,讓該實(shí)例釋放掉所占的資源。一個(gè)Servlet如果長(zhǎng)時(shí)間不被使用的話(huà),也會(huì)被Tomcat自動(dòng)銷(xiāo)毀
  • 卸載。當(dāng)Servlet調(diào)用完destroy()方法后,等待垃圾回收。如果有需要再次使用這個(gè)Servlet,會(huì)重新調(diào)用init()方法進(jìn)行初始化操作。

    • 簡(jiǎn)單總結(jié):只要訪問(wèn)Servlet,service()就會(huì)被調(diào)用。init()只有第一次訪問(wèn)Servlet的時(shí)候才會(huì)被調(diào)用。destroy()只有在Tomcat關(guān)閉的時(shí)候才會(huì)被調(diào)用。

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

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

    數(shù)據(jù)攜帶上:

    • GET方式:在URL地址后附帶的參數(shù)是有限制的,其數(shù)據(jù)容量通常不能超過(guò)1K。
    • POST方式:可以在請(qǐng)求的實(shí)體內(nèi)容中向服務(wù)器發(fā)送數(shù)據(jù),傳送的數(shù)據(jù)量無(wú)限制。

    請(qǐng)求參數(shù)的位置上:

    • GET方式:請(qǐng)求參數(shù)放在URL地址后面,以?的方式來(lái)進(jìn)行拼接
    • POST方式:請(qǐng)求參數(shù)放在HTTP請(qǐng)求包中

    用途上:

    • GET方式一般用來(lái)獲取數(shù)據(jù)
    • POST方式一般用來(lái)提交數(shù)據(jù)
      • 原因:
        • 首先是因?yàn)镚ET方式攜帶的數(shù)據(jù)量比較小,無(wú)法帶過(guò)去很大的數(shù)量
        • POST方式提交的參數(shù)后臺(tái)更加容易解析(使用POST方式提交的中文數(shù)據(jù),后臺(tái)也更加容易解決)
        • GET方式比POST方式要快
          GET方式比POST方式要快,詳情可看:https://www.cnblogs.com/strayling/p/3580048.html

    Servlet相關(guān) API

    doGet與doPost方法的兩個(gè)參數(shù)是什么

  • HttpServletRequest:封裝了與請(qǐng)求相關(guān)的信息
  • HttpServletResponse:封裝了與響應(yīng)相關(guān)的信息

  • 獲取頁(yè)面的元素的值有幾種方式,分別說(shuō)一下

  • request.getParameter() 返回客戶(hù)端的請(qǐng)求參數(shù)的值
  • request.getParameterNames() 返回所有可用屬性名的枚舉
  • request.getParameterValues() 返回包含參數(shù)的所有值的數(shù)組
  • request.getAttribute()和request.getParameter()區(qū)別

    用途上:

    • request.getAttribute(), 一般用于獲取request域?qū)ο蟮臄?shù)據(jù)(在跳轉(zhuǎn)之前把數(shù)據(jù)使用setAttribute來(lái)放到request對(duì)象上)
    • request.getParameter(), 一般用于獲取客戶(hù)端提交的參數(shù)

    存儲(chǔ)數(shù)據(jù)上:

    • request.getAttribute()可以獲取Objcet對(duì)象
    • request.getParameter()只能獲取字符串(這也是為什么它一般用于獲取客戶(hù)端提交的參數(shù))

    forward和redirect的區(qū)別

    forward和redirect的區(qū)別

    • 實(shí)際發(fā)生位置不同,地址欄不同
      • 轉(zhuǎn)發(fā)是發(fā)生在服務(wù)器的
        • 轉(zhuǎn)發(fā)是由服務(wù)器進(jìn)行跳轉(zhuǎn)的,細(xì)心的朋友會(huì)發(fā)現(xiàn),在轉(zhuǎn)發(fā)的時(shí)候,瀏覽器的地址欄是沒(méi)有發(fā)生變化的,在我訪問(wèn)Servlet111的時(shí)候,即使跳轉(zhuǎn)到了Servlet222的頁(yè)面,瀏覽器的地址還是Servlet111的。也就是說(shuō)瀏覽器是不知道該跳轉(zhuǎn)的動(dòng)作,轉(zhuǎn)發(fā)是對(duì)瀏覽器透明的。通過(guò)上面的轉(zhuǎn)發(fā)時(shí)序圖我們也可以發(fā)現(xiàn),實(shí)現(xiàn)轉(zhuǎn)發(fā)只是一次的http請(qǐng)求一次轉(zhuǎn)發(fā)中request和response對(duì)象都是同一個(gè)。這也解釋了,為什么可以使用request作為域?qū)ο筮M(jìn)行Servlet之間的通訊。
      • 重定向是發(fā)生在瀏覽器的
        • 重定向是由瀏覽器進(jìn)行跳轉(zhuǎn)的,進(jìn)行重定向跳轉(zhuǎn)的時(shí)候,瀏覽器的地址會(huì)發(fā)生變化的。曾經(jīng)介紹過(guò):實(shí)現(xiàn)重定向的原理是由response的狀態(tài)碼和Location頭組合而實(shí)現(xiàn)的。這是由瀏覽器進(jìn)行的頁(yè)面跳轉(zhuǎn)實(shí)現(xiàn)重定向會(huì)發(fā)出兩個(gè)http請(qǐng)求request域?qū)ο笫菬o(wú)效的,因?yàn)樗皇峭粋€(gè)request對(duì)象
    • 用法不同:
      • 很多人都搞不清楚轉(zhuǎn)發(fā)和重定向的時(shí)候,資源地址究竟怎么寫(xiě)。有的時(shí)候要把應(yīng)用名寫(xiě)上,有的時(shí)候不用把應(yīng)用名寫(xiě)上。很容易把人搞暈。記住一個(gè)原則: 給服務(wù)器用的直接從資源名開(kāi)始寫(xiě),給瀏覽器用的要把應(yīng)用名寫(xiě)上
      • request.getRequestDispatcher(“/資源名 URI”).forward(request,response)
        • 轉(zhuǎn)發(fā)時(shí)”/”代表的是本應(yīng)用程序的根目錄【zhongfucheng】
          • response.send(“/web應(yīng)用/資源名 URI”);
          • 重定向時(shí)”/”代表的是webapps目錄
    • 能夠去往的URL的范圍不一樣:
      • 轉(zhuǎn)發(fā)是服務(wù)器跳轉(zhuǎn)只能去往當(dāng)前web應(yīng)用的資源
      • 重定向是服務(wù)器跳轉(zhuǎn),可以去往任何的資源
    • 傳遞數(shù)據(jù)的類(lèi)型不同
      • 轉(zhuǎn)發(fā)的request對(duì)象可以傳遞各種類(lèi)型的數(shù)據(jù),包括對(duì)象
      • 重定向只能傳遞字符串
    • 跳轉(zhuǎn)的時(shí)間不同
      • 轉(zhuǎn)發(fā)時(shí):執(zhí)行到跳轉(zhuǎn)語(yǔ)句時(shí)就會(huì)立刻跳轉(zhuǎn)
      • 重定向:整個(gè)頁(yè)面執(zhí)行完之后才執(zhí)行跳轉(zhuǎn)

    那么轉(zhuǎn)發(fā)(forward)和重定向(redirect)使用哪一個(gè)?

    • 根據(jù)上面說(shuō)明了轉(zhuǎn)發(fā)和重定向的區(qū)別也可以很容易概括出來(lái)。轉(zhuǎn)發(fā)是帶著轉(zhuǎn)發(fā)前的請(qǐng)求的參數(shù)的。重定向是新的請(qǐng)求。

    典型的應(yīng)用場(chǎng)景:

  • 轉(zhuǎn)發(fā): 訪問(wèn) Servlet 處理業(yè)務(wù)邏輯,然后 forward 到 jsp 顯示處理結(jié)果,瀏覽器里 URL 不變
  • 重定向: 提交表單,處理成功后 redirect 到另一個(gè) jsp,防止表單重復(fù)提交,瀏覽器里 URL 變了
  • tomcat容器是如何創(chuàng)建servlet類(lèi)實(shí)例?用到了什么原理?

    tomcat容器是如何創(chuàng)建servlet類(lèi)實(shí)例?用到了什么原理

  • 當(dāng)容器啟動(dòng)時(shí),會(huì)讀取在webapps目錄下所有的web應(yīng)用中的web.xml文件,然后對(duì) xml文件進(jìn)行解析,并讀取servlet注冊(cè)信息。然后,將每個(gè)應(yīng)用中注冊(cè)的servlet類(lèi)都進(jìn)行加載,并通過(guò) 反射的方式實(shí)例化。(有時(shí)候也是在第一次請(qǐng)求時(shí)實(shí)例化)
  • 在servlet注冊(cè)時(shí)加上1如果為正數(shù),則在一開(kāi)始就實(shí)例化,如果不寫(xiě)或?yàn)樨?fù)數(shù),則第一次請(qǐng)求實(shí)例化。
  • 什么是cookie?Session和cookie有什么區(qū)別?

    什么是cookie?

    Cookie是由W3C組織提出,最早由netscape社區(qū)發(fā)展的一種機(jī)制

    • 網(wǎng)頁(yè)之間的交互是通過(guò)HTTP協(xié)議傳輸數(shù)據(jù)的,而Http協(xié)議是無(wú)狀態(tài)的協(xié)議。無(wú)狀態(tài)的協(xié)議是什么意思呢?一旦數(shù)據(jù)提交完后,瀏覽器和服務(wù)器的連接就會(huì)關(guān)閉,再次交互的時(shí)候需要重新建立新的連接
    • 服務(wù)器無(wú)法確認(rèn)用戶(hù)的信息,于是乎,W3C就提出了:給每一個(gè)用戶(hù)都發(fā)一個(gè)通行證,無(wú)論誰(shuí)訪問(wèn)的時(shí)候都需要攜帶通行證,這樣服務(wù)器就可以從通行證上確認(rèn)用戶(hù)的信息。通行證就是Cookie

    Session和cookie有什么區(qū)別?

    • 從存儲(chǔ)方式上比較

      • Cookie只能存儲(chǔ)字符串,如果要存儲(chǔ)非ASCII字符串還要對(duì)其編碼。
      • Session可以存儲(chǔ)任何類(lèi)型的數(shù)據(jù),可以把Session看成是一個(gè)容器
    • 從隱私安全上比較

      • Cookie存儲(chǔ)在瀏覽器中,對(duì)客戶(hù)端是可見(jiàn)的。信息容易泄露出去。如果使用Cookie,最好將Cookie加密
      • Session存儲(chǔ)在服務(wù)器上,對(duì)客戶(hù)端是透明的。不存在敏感信息泄露問(wèn)題。
    • 從有效期上比較

      • Cookie保存在硬盤(pán)中,只需要設(shè)置maxAge屬性為比較大的正整數(shù),即使關(guān)閉瀏覽器,Cookie還是存在的
      • Session的保存在服務(wù)器中,設(shè)置maxInactiveInterval屬性值來(lái)確定Session的有效期。并且Session依賴(lài)于名為JSESSIONID的Cookie,該Cookie默認(rèn)的maxAge屬性為-1。如果關(guān)閉了瀏覽器,該Session雖然沒(méi)有從服務(wù)器中消亡,但也就失效了。
    • 從對(duì)服務(wù)器的負(fù)擔(dān)比較

      • Session是保存在服務(wù)器的,每個(gè)用戶(hù)都會(huì)產(chǎn)生一個(gè)Session,如果是并發(fā)訪問(wèn)的用戶(hù)非常多,是不能使用Session的,Session會(huì)消耗大量的內(nèi)存。
      • Cookie是保存在客戶(hù)端的。不占用服務(wù)器的資源。像baidu、Sina這樣的大型網(wǎng)站,一般都是使用Cookie來(lái)進(jìn)行會(huì)話(huà)跟蹤。
    • 從瀏覽器的支持上比較

      • 如果瀏覽器禁用了Cookie,那么Cookie是無(wú)用的了!
      • 如果瀏覽器禁用了Cookie,Session可以通過(guò)URL地址重寫(xiě)來(lái)進(jìn)行會(huì)話(huà)跟蹤。
    • 從跨域名上比較

      • Cookie可以設(shè)置domain屬性來(lái)實(shí)現(xiàn)跨域名
      • Session只在當(dāng)前的域名內(nèi)有效,不可夸域名

    Servlet安全性問(wèn)題

    由于Servlet是單例的,當(dāng)多個(gè)用戶(hù)訪問(wèn)Servlet的時(shí)候,服務(wù)器會(huì)為每個(gè)用戶(hù)創(chuàng)建一個(gè)線程當(dāng)多個(gè)用戶(hù)并發(fā)訪問(wèn)Servlet共享資源的時(shí)候就會(huì)出現(xiàn)線程安全問(wèn)題。

    原則:

  • 如果一個(gè)變量需要多個(gè)用戶(hù)共享,則應(yīng)當(dāng)在訪問(wèn)該變量的時(shí)候,加同步機(jī)制synchronized (對(duì)象){}
  • 如果一個(gè)變量不需要共享,則直接在 doGet() 或者 doPost()定義.這樣不會(huì)存在線程安全問(wèn)題

  • 如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

    總結(jié)

    以上是生活随笔為你收集整理的Tomcat+Servlet面试题都在这里的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。