1、 什么是servlet?
servlet是用來處理客戶端請求並產生動態網頁內容的java類
2、 Tomcat的缺省端口是多少,怎么修改?
a) 默認端口號是8080
b) 修改步驟:
i. 打開tomcat的安裝目錄,找到conf文件
ii. 找到其中的server.xml,打開后找到其中的
<connector connectionTimeout=”20000” port=”8080”
改變其中的8080就可以了
3、 Tomcat有哪幾種Connector運行模式(優化)?
a) BIO
i. 一個線程處理一個請求,缺點:並發量高的時候,線程數較多,浪費資源
Tomcat7或以下,在Linux系統中默認使用這種方式
b) NIO
i. 利用java的異步IO處理,可以通過少量的線程處理大量的請求
Tomcat8在Linux系統中默認使用這種方式。
Tomcat7必須修改Connector配置來啟動
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" redirectPort="8443"/>
c) APR
i. 即Apache Portable Runtime,從操作系統層面解決IO阻塞問題
Tomcat7或Tomcat8在Win7或以上的系統中啟動默認使用這種方式
Linux如果安裝了apr和native,Tomcat直接啟動就支持apr。
4、 Tomcat有幾種部署方式?
a) 第一種:直接將web項目文件拷貝到webapps目錄中
b) 第二種:修改sercer.xml文件。在conf下的server.xml文件里找到Host標簽,在里面添加如下代碼:
<Context path="/jfinal_demo" docBase="F:\work\jfinal_demo\WebRoot" reloadable ="true" debug="0" privileged="true"></Context>
c) 第三種:在conf\Catalina\localhost目錄下添加xml配置文件
新建名為jfinal_demo.xml文件,文件內容配置如下:
<Context path="/jfinal_demo" docBase="F:\work\jfinal_demo\WebRoot" reloadable ="true" debug="0" privileged="true"></Context>
5、 Servlet生命周期
a) 加載Servlet
web容器負責加載servlet,當web容器啟動時或者是在第一次使用這個servlet時,容器會負責創建servlet實例
b) 初始化
當一個servlet加載后,容器將調用init()方法初始化這個對象,初始化的目的是為了讓servlet在處理客戶端請求前完成一些初始化的工作
c) 請求處理
當有請求提交時,servlet將調用service()方法進行處理客戶端請求,並且會根據不同的請求調用不同的doGet()或doPost()方法
d) 銷毀
當web容器關閉或檢測到一個servlet實例要從服務器中被移除時,容器就會調用destroy()方法,以便讓該實例釋放掉所占用的資源
6、 Get()與post()的區別?
a) Get是向服務器發送、索取數據的一種請求,而post是向服務器提交數據的一種請求
b) Get方式傳遞數據安全性較低,post方式比較安全。但是post方式的執行效率比get方式要差一些
c) Get請求方式將請求信息放在URL后面,請求信息和URL之間以“?”隔開,這種請求方式直接將請求信息暴露在URL中;
post請求方式將請求信息放置在報文體中,想獲得請求信息必須解析報文
7、 doGet與doPost方法的兩個參數是什么?什么情況下調用
a) HttpServletRequest和HttpServletResponse
b) JSP頁面中的form標簽里的method屬性為get時調用doGet()為post時調用doPost();超鏈接跳轉頁面時調動的是doGet()
8、 獲取頁面的元素的值有幾種方式?分別說一下
a) 用<input>輸入域提交參數
b) request.setAttribute();在下個頁面直接request.getAttriute()得到
c) <jsp:forward=”你要跳轉的頁面”>
<jsp:param>你要傳遞的參數
d) 用session域對象
e) url?a=””&b=””
9、 request.getAttribute()和request.getParameter()區別
a) 都是HttpServletRequest中的方法,用來傳遞數據的
b) getParameter():響應的是web客戶端向web服務端通過點擊鏈接或提交按鈕傳遞數據,代表HTTP請求數據;獲取的是post/get傳遞的參數值
getAttribute():是獲取對象容器中的數據,獲取的是session的值
c) getParameter():只能得到String類型數據
getAttribute():可以接受String類型,也可以是對象
10、 forward(轉發)和redirect(重定向)的區別
a) forward:requset.getRequsetDispatcher(“/***.jsp”).forward(request,response)
redirect:response.sendRedirect(“/***.jsp”)
b) forward是服務器端發起的請求;redirect是客戶端發起的請求;
c) forward只有一次請求;redirect會產生2次請求。
d) forward數據會同時轉發過去;redirect數據不會同時傳遞過去。
11、 什么是cookie?什么是session?session和cookie的區別
a) Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,它的過期時間可以任意設置,如果不主動清除,很長一段時間都能保留
b) Session是在無狀態的HTTP協議下,服務端記錄用戶狀態時用於標識具體用戶的機制,它是在服務端保存的用來跟蹤用戶的狀態的數據結構,可以保存在文件、數據庫、或者集群中。
c) 他們都是一種會話技術,區別如下
i. Session:
數據存放在服務端,安全(只存放和狀態相關的)
session不僅僅是存放字符串,還可以存放對象
session是域對象(session本身是不能跨域的,但可以通過相應技術來解決)
sessionID的傳輸默認是需要cookie支持的
ii. Cookie
數據存放在客戶端,不安全(存放的數據一定是和安全無關緊要的數據)
cookie只能存放字符串,不能存放對象
cookie不是域對象(Cookie是支持跨域的)
12、 Tomcat是如何創建servlet類實例?用到了什么原理
a) 當tomcat啟動時,會讀取在webapps目錄下所有的web應用中的web.xml文件。然后對xml文件進行解析,並讀取servlet注冊信息。然后將每個應用中注冊的servlet類都進行加載,並通過反射的方式實例化
13、 Servlet安全性問題
a) 因為servlet是單列模式創建的,只實例化一次,同一個servlet可以處理多個用戶請求,當同時有兩個用戶訪問時,則會啟動兩個負責處理請求的servlet線程,所以會出現線程安全問題
b) 解決方案:
i. 在servlet中定義變量時,盡量都定義局部變量。在servlet中負責保存上下文ServletContext和負責處理session對象的HttpSession是線程不安全的,而負責處理請求的servletRequest是線程安全的
ii. 加鎖:用synchronized進行保護,但是要盡量的縮小保護范圍
14、 JSP與servlet的區別
a) JSP本質上就是一個簡易的servlet,Web容器將JSP代碼編譯成JVM能識別的java類
b) Jsp更擅長表現於頁面顯示,servlet更擅長於邏輯控制
15、 JSP的內置對象有哪些,作用是什么
a) Request :本質上就是HttpServletRequest,包含用戶端請求的信息,就是請求對象
b) Response :本質上就是HttpServletResponse,包含服務器傳回客戶端的響應信息,就是響應對象
c) Session : 是HttpSession,是一個會話對象,主要用於保存狀態
d) Application : 是servletContext,指的的整個web應用
e) Page : 指整個jsp頁面,類似this偽對象
f) PageContext : 主要用於管理整個jsp頁面
g) Exception : 異常對象,jsp頁面上的異常都會封裝在這里面
h) Config : 本質上就是servletConfig對象
i) Out :主要用於輸出數據
16、 JavaWeb中四大域對象及作用范圍
a) PageContext : 作用范圍在整個頁面(一個頁面)
b) HttpRequest : 作用范圍在一次請求
c) HttpSession : 這是JavaWeb的一種會話機制,作用在整個會話中
d) ServletContext :作用范圍在整個web應用
17、 JSP和HTML之間的關系
a) JSP是簡單的servlet,是在服務端執行的,通常返回客戶端的是一個HTML文本
18、 JSP靜態包含和動態包含的區別
a) 靜態包含:<%@ include file=”被包含的頁面” %>
動態包含:<jsp:include page=”被包含的頁面” flush=“true” >
b) 靜態包含在翻譯的時候,將多個JSP翻譯成一個servlet
動態包含在翻譯的時候,將多個JSP翻譯成多個servlet,在程序運行加載到JVM中的時候,動態合並,動態包含可以傳遞數據
c) 靜態包含,編輯器引入,先包含在運行
動態包含,運行期引入,先運行,把結果引入
19、 JSP是如何被執行的?執行效率會比servlet低嘛?
a) JSP本質上是一個簡單的servlet,在執行JSP的時候,會被轉譯成一個*_jsp.java的java文件,然后再跟尋常的java文件一樣被解析成一個class文件,最后被jre執行
b) 與servlet相比,第一次執行效率比較低,因為第一次會被轉化為servlet,之后執行效率都相同
20、 JSP和servlet的區別、共同點、各自應用的范圍?
a) JSP在本質上就是servlet,但兩者的創建方式不一樣,servlet完全是java程序代碼構成擅長於流程控制和事務處理而通過的servlet類生成動態網頁;JSP由HTML代碼和JSP標簽構成,可以方便的編寫動態網頁
b) 采用Servlet來控制業務流程;用JSP來生成動態網頁
21、 如何避免JSP頁面自動生成Session對象?為什么要這么做?
a) <%@ page session=”false”>
b) 在默認情況下,在對一個JSP頁面發出請求時,如果session還沒建立,JSP頁面會自動為請求建立一個Session對象,但是session是比較消耗資源的,如果沒有必要保持和使用session,就不應該創建session
22、 自定義標簽要繼承哪個類
a) 可以繼承TagSupport或者BodyTagSuppot,兩者的差別是前者適用於沒有主題的標簽,而后者適用於有主題的標簽
b) 若選擇TagSupport,可以實現doStartTag和doEndTag這兩個方法實現Tag的功能;如果選擇繼承BodyTagSupport,可以實現doAfterBody這個方法