【转】Java学习---Java Web基础面试题整理
【原文】https://www.toutiao.com/i6592359948632457731/
1、什么是Servlet?
可以從兩個方面去看Servlet:
a、API:有一個接口servlet,它是servlet規范中定義的用來處理客戶端請求的程序需要實現的頂級接口。
b、組件:服務器端用來處理客戶端請求的組件,需要在web.xml文件中進行配置。
2、Servlet的生命周期,并說出Servlet和CGI的區別?
servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。
這個生存期由javax.servlet.servlet接口中的init、service、destroy方法表達。
web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現根據請求的不同調用不同的do**()方法。結束服務,web容器調用servlet的destroy()方法。
區別:
Servlet處于服務器進程中,它通過多線程運行service()方法,一個實例可以服務于多個請求,并且實例一般不會被銷毀;而CGI對每個請求都產生一個新的進程,服務完成后就銷毀,所有效率低于Servlet
3、Servlet接口中有哪些方法?
Servlet接口定義了5個方法:
4、get和post請求的區別?
a、get是用來從服務器上獲取數據,而post是用來向服務器傳遞數據;
b、get將表單中數據按照variable=value的形式,添加到action所指向的URL后面,并且兩者用"?"連接,變量之間用"&"連接;而post是將表單中的數據放在form的數據體中,按照變量與值對應的方式,傳遞到action所指定的URL。
c、get是不安全的,因為在傳輸過程中,數據是被放在請求的URL中;而post的所有操作對用戶來說都是不可見的。
d、get傳輸的數據量小,這主要應為受url長度限制;而post可以傳輸大量的數據,所有上傳文件只能用post提交。
e、get限制form表單的數據集必須為ASCII字符;而post支持整個IS01 0646字符集。
f、get是form表單的默認方法。
5、什么情況下調用doGet()和doPost()?
默認情況是調用doGet()方法,JSP頁面中的Form表單的method屬性設置為post的時候,調用的為doPost()方法;為get的時候,調用deGet()方法。
6、轉發(Forward)和重定向(Redirect)的區別?
轉發是服務器行為,重定向是客戶端行為。
轉發(Forword)
通過RequestDispatcher對象的forward(HttpServletRequest request,HttpServletResponse response)方法實現的。RequestDispatcher可以通過HttpServletRequest 的getRequestDispatcher()方法獲得。例如下面的代碼就是跳轉到login_success.jsp頁面。
request.getRequestDispatcher("login_success.jsp").forward(request, response);
重定向(Redirect) 是利用服務器返回的狀態嗎來實現的??蛻舳藶g覽器請求服務器的時候,服務器會返回一個狀態碼。服務器通過HttpServletRequestResponse的setStatus(int status)方法設置狀態碼。如果服務器返回301或者302,則瀏覽器會到新的網址重新請求該資源。
1. 從地址欄顯示來說
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器。瀏覽器根本不知道服務器發送的內容從哪里來的,所以它的地址欄還是原來的地址。
redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,所以地址欄顯示的是新的URL。
2. 從數據共享來說
forward:轉發頁面和轉發到的頁面可以共享request里面的數據.
redirect:不能共享數據.
3. 從運用地方來說
forward:一般用于用戶登陸的時候,根據角色轉發到相應的模塊.
redirect:一般用于用戶注銷登陸時返回主頁面和跳轉到其它的網站等
4. 從效率來說
forward:高.
redirect:低.
7、自動刷新(Refresh)
自動刷新不僅可以實現一段時間之后自動跳轉到另一個頁面,還可以實現一段時間之后自動刷新本頁面。Servlet中通過HttpServletResponse對象設置Header屬性實現自動刷新例如:
Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");
其中1000為時間,單位為毫秒。URL指定就是要跳轉的頁面(如果設置自己的路徑,就會實現沒過一秒自動刷新本頁面一次)
8、Servlet與線程安全
Servlet不是線程安全的,多線程并發的讀寫會導致數據不同步的問題。 解決的辦法是盡量不要定義name屬性,而是要把name變量分別定義在doGet()和doPost()方法內。雖然使用synchronized(name){}語句塊可以解決問題,但是會造成線程的等待,不是很科學的辦法。
注意:多線程的并發的讀寫Servlet類屬性會導致數據不同步。但是如果只是并發地讀取屬性而不寫入,則不存在數據不同步的問題。因此Servlet里的只讀屬性最好定義為final類型的。
9、JSP和Servlet有哪些相同點和不同點,他們之間的聯系是什么?
JSP是Servlet的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯后是"類Servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是java和HTML可以組合成一個擴展名為.jsp的文件。JSP偏重于視圖,Servlet偏重于業務邏輯。
10、JSP工作原理:
JSP是一種Servlet,但是與HttpServlet的工作方式不太一樣。HttpServlet是先由源代碼編譯為class文件后部署到服務器下,為先編譯后部署。而JSP則是先部署后編譯。JSP會在客戶端第一次請求JSP文件時被編譯為HttpJspPage類(接口Servlet的一個子類)。該類會被服務器臨時存放在服務器工作目錄里面。下面通過實例給大家介紹。
工程JspLoginDemo下有一個名為login.jsp的Jsp文件,把工程第一次部署到服務器上后訪問這個Jsp文件,我們發現這個目錄下多了下圖這兩個東東。
.class文件便是JSP對應的Servlet。編譯完畢后再運行class文件來響應客戶端請求。以后客戶端訪問login.jsp的時候,Tomcat將不再重新編譯JSP文件,而是直接調用class文件來響應客戶端請求。
由于JSP只會在客戶端第一次請求的時候被編譯 ,因此第一次請求JSP時會感覺比較慢,之后就會感覺快很多。如果把服務器保存的class文件刪除,服務器也會重新編譯JSP。
開發Web程序時經常需要修改JSP。Tomcat能夠自動檢測到JSP程序的改動。如果檢測到JSP源代碼發生了改動。Tomcat會在下次客戶端請求JSP時重新編譯JSP,而不需要重啟Tomcat。這種自動檢測功能是默認開啟的,檢測改動會消耗少量的時間,在部署Web應用的時候可以在web.xml中將它關掉。
11、Request對象的主要方法有哪些?
- setAttribute(String name,Object):設置名字為name的request 的參數值
- getAttribute(String name):返回由name指定的屬性值
- getAttributeNames():返回request 對象所有屬性的名字集合,結果是一個枚舉的實例
- getCookies():返回客戶端的所有 Cookie 對象,結果是一個Cookie 數組
- getCharacterEncoding() :返回請求中的字符編碼方式 = getContentLength() :返回請求的 Body的長度
- getHeader(String name) :獲得HTTP協議定義的文件頭信息
- getHeaders(String name) :返回指定名字的request Header 的所有值,結果是一個枚舉的實例
- getHeaderNames() :返回所以request Header 的名字,結果是一個枚舉的實例
- getInputStream() :返回請求的輸入流,用于獲得請求中的數據
- getMethod() :獲得客戶端向服務器端傳送數據的方法
- getParameter(String name) :獲得客戶端傳送給服務器端的有 name指定的參數值
- getParameterNames() :獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例
- getParameterValues(String name):獲得有name指定的參數的所有值
- getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱
- getQueryString() :獲得查詢字符串
- getRequestURI() :獲取發出請求字符串的客戶端地址
- getRemoteAddr():獲取客戶端的 IP 地址
- getRemoteHost() :獲取客戶端的名字
- getSession([Boolean create]) :返回和請求相關 Session
- getServerName() :獲取服務器的名字
- getServletPath():獲取客戶端所請求的腳本文件的路徑
- getServerPort():獲取服務器的端口號
- removeAttribute(String name):刪除請求中的一個屬性
12、request.getAttribute()和 request.getParameter()有何區別?
a、request.getParameter()獲取的類型是String;request.getAttribute()獲取的類型是Object。
b、request.getPrameter()獲取的是POST/GET傳遞的參數值和URL中的參數;request.getAttribute()獲取的是對象容器中的數據值/對象。
c、request.setAttribute()和request.getAttribute()可以發送、接收對象;request.getParamter()只能接收字符串,官方不開放request.setParamter()(也就是沒有這個方法)。
setAttribute()和getAttribute()的傳參原理:
setAttribute()是應用服務器把這個對象放在該頁面所對應的一塊內存中去,當你的頁面服務器重定向到另外一個頁面時,應用服務器會把這塊內存拷貝到另一個頁面所對應的那塊內存中。這個就可以通過getAttribute()獲取到相應的參數值或者對象。
13、JSP中動態include和靜態include的區別?
a、靜態include:語法:<%@ include file="文件名" %>,相當于復制,編輯時將對應的文件包含進來,當內容變化時,不會再一次對其編譯,不易維護。
b、動態include:語法:<jsp:include page="文件名">,能夠自動檢查被包含文件,當客戶端對JSP文件進行請求時,會重新將對應的文件包含進來,進行實時的更新。
14、JSP有哪些內置對象?作用分別是什么?
JSP一共有9個內置對象:
15、JSP有哪些動作?作用分別是什么?
JSP一共有以下6中基本動作:
16、JSP常用指令有哪些?
page、include、taglib
a、page指令:定義頁面的一些屬性。
常用屬性:
contentType="text/html;charset=utf-8"; 向瀏覽器端輸出數據的編碼
pageEncoding="utf-8"; JSP編譯成java文件時所用的編碼
session="true" 是否自動創建session
b、include指令:引入一個靜態的JSP頁面
c、taglib指令:引入一個標簽庫
17、講解JSP中的四種作用域
JSP中的四種作用域包括page、request、session和application,具體來說:
a、page是代表一個頁面相關的對象和屬性。一個頁面由一個編譯好的java servlet類(可以帶有include指令,但不可以帶有include動作)表示。這既包括servlet又包括編譯成servlet的jsp頁面。
b、request是代表與web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個web組件(由于forware指令和include動作的關系)
c、session是代表與用于某個web客戶機的一個用戶體驗相關的對象和屬性。一個web回話也可以經常跨域多個客戶機請求。
d、application是代表與整個web應用程序相關的對象和屬性。這實質上是跨域整個web應用程序,包括多個頁面、請求和回話的一個全局作用域。
18、如何實現JSP或Servlet的單線程模式?
在JSP中使用page指令進行設置,具體代碼如下:
<%@page isThreadSafe="false"%>
對于Servlet,可以讓自定義的Servlet實現SingleThreadModel標識接口。
說明:如果將JSP或Servlet設置成單線程工作模式,會導致每個請求創建一個Servlet實例,這種實踐將導致嚴重的性能問題(服務器的內存壓力很大,還會導致頻繁的垃圾回收),所以通常情況下并不會這么做。
19、JSP亂碼如何解決?
a、JSP頁面亂碼:<%@page contentType="text/html;charset=utf-8" %>
b、表單提交時出現亂碼:request.setCharacterEncoding("utf-8");
c、數據庫出現亂碼:jdbc:mysql://localhost:3306:/user?useSSL=false&useUnicode=true&characterEncoding=utf-8;
其實我一般的處理的方法就是配置一個過濾器對每個JSP頁面進行字符集處理。
20、實現會話跟蹤的技術有哪些?
1. 使用Cookie
向客戶端發送Cookie
Cookie c =new Cookie("name","value"); //創建Cookie
c.setMaxAge(60*60*24); //設置最大時效,此處設置的最大時效為一天
response.addCookie(c); //把Cookie放入到HTTP響應中
從客戶端讀取Cookie
String name ="name";
Cookie[]cookies =request.getCookies();
if(cookies !=null){
for(int i= 0;i<cookies.length;i++){
Cookie cookie =cookies[i];
if(name.equals(cookis.getName()))
//something is here.
//you can get the value
cookie.getValue();
}
}
優點: 數據可以持久保存,不需要服務器資源,簡單,基于文本的Key-Value
缺點: 大小受到限制,用戶可以禁用Cookie功能,由于保存在本地,有一定的安全風險。
2. URL 重寫
在URL中添加用戶會話的信息作為請求的參數,或者將唯一的會話ID添加到URL結尾以標識一個會話。
優點: 在Cookie被禁用的時候依然可以使用
缺點: 必須對網站的URL進行編碼,所有頁面必須動態生成,不能用預先記錄下來的URL進行訪問。
3. 隱藏的表單域
<input type="hidden" name ="session" value="..."/>
優點: Cookie被禁時可以使用
缺點: 所有頁面必須是表單提交之后的結果。
4. HttpSession
在所有會話跟蹤技術中,HttpSession對象是最強大也是功能最多的。當一個用戶第一次訪問某個網站時會自動創建 HttpSession,每個用戶可以訪問他自己的HttpSession??梢酝ㄟ^HttpServletRequest對象的getSession方 法獲得HttpSession,通過HttpSession的setAttribute方法可以將一個值放在HttpSession中,通過調用 HttpSession對象的getAttribute方法,同時傳入屬性名就可以獲取保存在HttpSession中的對象。與上面三種方式不同的 是,HttpSession放在服務器的內存中,因此不要將過大的對象放在里面,即使目前的Servlet容器可以在內存將滿時將HttpSession 中的對象移到其他存儲設備中,但是這樣勢必影響性能。添加到HttpSession中的值可以是任意Java對象,這個對象最好實現了 Serializable接口,這樣Servlet容器在必要的時候可以將其序列化到文件中,否則在序列化時就會出現異常。
21、Cookie和Session的的區別?
22、什么是Tomcat?
Tomcat是一種web服務器,java編寫的web項目可以部署在上面,用戶在客戶端請求時,都是將請求發到Tomcat上,Tomcat在將請求發到對應的項目上。
23、 詳細描述MVC
基于java的web應用系統采用MVC設計模型,即用Model(模型)、View(視圖)和Controller(控制)分離設計,這是目前web應用服務系統的主流設置方向。
Model:處理業務邏輯的模塊。
View:負責頁面顯示,顯示Model的處理結果給用戶,主要實現數據到頁面的轉換過程。
Controller:負責每個請求的分發,把Form數據傳遞給Model進行處理,處理完成后,把處理結果返回給相應的View顯示給用戶。
轉載于:https://www.cnblogs.com/ftl1012/p/9584821.html
總結
以上是生活随笔為你收集整理的【转】Java学习---Java Web基础面试题整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: deepin关机卡在图标界面 mysq
- 下一篇: SELinux 入门