1. 程式人生 > >java面試題彙總(三)-----javaWeb

java面試題彙總(三)-----javaWeb

1、Tomcat的優化經驗

1. 記憶體優化-Xms

2. 增加執行緒數maxThreads="150"

3. 修正server.xml中的中文編碼

4. BIO改NIO

2、HTTP請求的GET與POST方式的區別

答:

1. URL地址長度不同, GET支援的字元少

2. GET的密碼是明文,安全問題,容易受到黑客攻擊

3. GET只傳輸文字,不支援檔案傳輸

4. GET方式通常用來查詢,不用來修改資料,是冪等操作,修改資料用POST

3.當service有一個例項變數,doGet和doPost去呼叫這個變數,會出現什麼問題,你是如何解決的。

會出現執行緒不安全問題。無論是doGet還是doPost去呼叫,伺服器端處理的過程都是一樣的,那麼我們可以把處理過程單獨寫在另外一個方法handle裡,讓兩個方法都去呼叫handle,根據不同請求去呼叫不同的方法。

4.有三臺伺服器,如果在一臺伺服器上登陸了這個使用者,其他兩臺就不能再登陸這個使用者,使用session共享,你是怎麼做的。

把所有的session的資料儲存到Mysql伺服器上,所有Web伺服器都來這臺Mysql伺服器來獲取Session資料。

5.寫一個自定義標籤要繼承什麼類

SimpleTagSupport,一般呼叫doTag方法或者實現SimpleTag介面
在 jsp 中處理 JSON,通常需要配套使用 JQuery 控制元件,並且匯入一些 Common jar 包。使用 JQuery 控制元件是因為它能有效的解析並且展示 JSON 資料,匯入Common 則是因為 Java 中的物件並不是純粹的資料,需要通過這些 Jar 包的處理使之轉化成真實資料。

7.Jsp的重定向和轉發的流程有什麼區別

重定向是客戶端行為,轉發是伺服器端行為
重定向時伺服器產生兩次請求,轉發產生一次請求,重定向時可以轉發到專案以外的任何網址,轉發只能在當前專案裡轉發
重定向會導致request物件資訊丟失。轉發則不會
轉發的url不會變,request.getRequestDispatch()。forward()
重定向的url會改變,response.getRedirect();

8.Jsp和servlet的區別

jsp的可讀性強,容易維護,並且jsp在最後會編譯成servlet,servlet容易除錯。

9.jsp可以操作視窗嗎?

Jsp不能夠直接呼叫視窗,只能先 生成開啟視窗的js,再由js呼叫
Session不能通過new建立,需要通過呼叫getSession()或者getSession(true)方法建立,getSession()是自動建立session,getSession(true)是強制建立session,setAttribute()方法可以用於傳值,getAttribute()可以用於取值
(第一次建立session的時候,就是訪問第一次一個jsp頁面<這個頁面的page指令 沒有設定session=false>) 
銷燬session呼叫invalidate方法
通過setMaxInactiveInterval()可以設定session的生存時間(web.xml可以設定session的生存時間)

11.jsp的三大指令,七大動作的具體功能

三大指令:

Page :指令是針對當前頁面的指令 Include :用於指定如何包含另一個頁面 Taglib :用於定義和指定自定義標籤

七大動作:

Forward,執行頁面跳轉,將請求的處理轉發到另一個頁面 Param :用於傳遞引數 Include :用於動態引入一個jsp頁面 Plugin :用於下載javaBean或applet到客戶端執行 useBean :使用javaBean setProperty :修改javaBean例項的屬性值 getProperty :獲取javaBean例項的屬性值

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

request.getParameter() 返回客戶端的請求引數與值
request.getParameterNames() 返回所有可用屬性名的列舉
request.getParameterValues() 返回包含引數的所有值的陣列

13.servlet和javaScript的區別,他們分別是什麼作用

一個是服務端,一個是客戶端
Servlet是獨立於平臺和協議的伺服器端的java應用程式,可以動態生成web頁面,並採用響應--請求的模式提供web服務
javaScript是一種解釋性語言,用於向html頁面提供互動行為,通常被直接嵌入在html頁面中
servlet是java語言編寫的web應用
js是基於html上的一種解釋語言
客戶端發出請求(request),jsp引擎將jsp頁面翻譯成servlet的java原始檔,在Tomcat中將原始檔編譯成class檔案,並載入到記憶體中執行,把結果返回(response)給客戶端。

16.HTML和Servlet的異同

不同: Html是靜態,servlet是動態 html頁面由伺服器直接返回, servlet是用來處理客戶請求,並返回html頁面 //servlet需要伺服器呼叫servlet方法生成動態html頁面,且需要在web.xml中配置url路徑

17.會話跟蹤有哪些,他們的區別是什麼

Cookie,session和application, Cookie是http物件,客戶端與服務端都可以操縱

cookie是在客戶端保持狀態,session是在伺服器端保持狀態,由於cookie是儲存在客戶端本地的,所以資料很容易被竊取,當訪問量很多時,使用session則會降低伺服器的效能,application的作用域是整個工程裡只有一個,可以在不同瀏覽器之間共享資料,所有人都可以共享,因此application也是不安全的

18.session和application的作用

Session用於客戶端與伺服器之間保持狀態的解決方案,資料儲存在伺服器記憶體中,底層是有cookie實現的
Application的作用域是整個工程裡只有一個,可以在不同瀏覽器之間共享資料,所有人都可以共享,因此application是不安全的。

19.request ,response,session 和 application是怎麼用的

Request是客戶端向服務端傳送請求
Response是服務端對客戶端請求做出響應
Session在servlet中不能直接使用,需要通過getSession()建立,如果沒有設定它的生命週期,或者通過invildate()方法銷燬,關閉瀏覽器session就會消失
Application不能直接建立,存在於伺服器的記憶體中,由伺服器建立和銷燬

20.有幾種方式將頁面的值傳到後臺

可通過form表單的get或post將值傳遞到後臺,也可通過setAttribute()方法將值傳遞到後臺

21.一個form表單的值如何獲取

在servlet中通過request.getParameter()方法可以獲取表單的值 或者是request.getParameterValuse();

22.傳遞引數到後臺有幾種方式

表單傳參,url傳參,jquery.ajax傳參

23.Jsp中父頁面中怎麼拿到子頁面的表單元素,不是拿值怎麼拿

通過設定屬性setAttribute(),通過getAttribute()拿值,getParameter()方法可以做到

24.定義一個String型別的字串,如果重定向之後還能不能獲得這個資料

不能

25.404和500是什麼意思

404 :找不到url請求的路徑,一般是工程名不對或者拼寫錯誤
500 :伺服器內部錯誤,一般是伺服器內部程式碼編寫錯誤,也有可能是拋異常導致

26.寫出5種JSTL常用標籤

<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>

28.Jsp頁面把一個元素隱藏的方法

通過使用屬性hidden可以將元素隱藏

29.Session,application,cookie的區別

Session不能通過new建立,要通過呼叫getSession()方法建立,資料儲存在伺服器端,單個客戶端session是共享的,底層是由cookie實現的,大小沒有限制
Application的作用域是整個工程只有共享一個,生命週期比session大
Cookie需要通過new建立,資料儲存在客戶端中,cookie儲存的資料不能超過4k,不安全

30.我們在web應用開發過程中經常遇到輸出某種編碼的字元,如ISO-8859-1,如何輸出一個某種編碼的字串

如將ISO-8859-1輸出為GBK格式的字元, 通過new String(byte[] bytes,String charset) 構造器設定編碼構造一個新的String(new String("ISO-8859-1","GBK"));

32.怎麼判斷使用者請求時是第一次,如果客戶端和服務端斷開怎麼連到上一次操作

通過session中的isNew()可以判斷是否是新使用者

33.如果建立servlet例項不用構造方法,怎麼建立一個servlet例項

Web容器會自動為servlet寫一個無參的構造器,它使用class.forName("").newInstance()反射來建立servlet例項的

34.Servlet是安全的嗎?當service有一個例項變數,doGet和doPost去呼叫這個變數,會出現什麼問題,你是如何解決的

是執行緒不安全的,因為servlet是單例模式,當多個客戶端共同訪問的時候執行緒不安全。
儘量用區域性變數,同步塊,如果當前欄位是不會改變的,用final修飾

36.說明一下jsp中<jsp: include page..>和<%@ include file%>的區別

是行為元素、是在請求處理階段引入的,引入執行頁面或servlet所生成的應答文字
先編譯,後包含,就是將每個jsp頁面都單獨轉化成html頁面,最後再將所有的html頁面相加,如果有相同變數不會衝突

<%@ include file="" %> 靜態匯入

是指令元素
是編譯時包含,引入靜態文字(html,jsp),在JSP頁面被轉化成servlet之前和它融和到一起。先包含,後編譯
就是將多個jsp一起解析,最後再一起生成html頁面,如果有相同變數會衝突
可以使用pageContext物件來設定屬性,並指定屬性的作用範圍,提供了對JSP頁面內所有的物件及名字空間的訪問
首先初始化過濾器,然後伺服器組織過濾器鏈,所有的請求都必須需要先通過過濾器鏈,
過濾器鏈是一個棧,遵循先進後出的原則 ,所有的請求需要經過一個一個的過濾器,執行順序要根據web.xml裡配置的<filter-mapping>的位置前後執行,每個過濾器之間通過chain.doFilter連線, 最後抵達真正請求的資源,執行完後再從過濾器鏈退出

40.Jsp中如何進行分頁,專案中如何進行分頁?

需要上一頁和下一頁的超連結(至少需要這兩個),通過計算當前頁的頁碼獲取下一頁資料
的起始位置,然後在 MySql 中查詢,如果使用 Oracle 則需要另外計算下一頁資料的結
束位置。
使用hibernate框架,它可以針對不同的資料庫自動產生為你分頁的程式碼。

1、Ajax特點:   區域性重新整理、提高使用者的體驗度,資料從伺服器商載入。 2、AJax的技術組成:不是新技術,而是之前技術的整合   Ajax: Asynchronous Javascript And Xml;(非同步的JavaScript和XML)   包括的技術:JavaScript、XML、CSS、XMLHttpRequest   非同步:傳送請求以後,不等結果,由回撥函式處理。   JavaScript:向伺服器傳送請求,獲得返回結果,更新頁面   XML: 用來封裝資料

3、Ajax核心原理   XMLHttpRequst物件:通過該物件向伺服器傳送請求。   它是非同步請求的技術,所有現代瀏覽器都支援(Chrome、IE5+)   1)建立XMLHttpReuest物件     非IE瀏覽器(Mozilla/Safari):     var xhr=new XMLHttpRequest();     IE:     xhr=new ActiveXObject("Msxml2.XMLHTTP");     低版本IE:     xhr=new ActiveXObject("Microsfot.XMLHTTP");    2)XMLHttpRequest物件的屬性與方法     a)方法:      open("GET/POST",URL,true/false):用來向伺服器建立連線       有三個引數:       引數1:提交方式,post或get       引數2:請求的URL       引數3:表示同步或非同步請求,true:表示非同步請求       false: 表示同步請求

     send(data):傳送請求       引數:提交的內容。

      POST方式:data就是提交的引數,send(username=root&password=abc123);

      GET方式:send(null)

   b)屬性:     onreadystatechange:設定狀態改變時的回撥函式,回撥函式用來獲取伺服器資料。

      onreadystatechange=function(){      

      }

    readyState:伺服器狀態響應       狀態碼:       0:未初始化       1:正在載入       2:載入完成       3:請求進行中       4:請求完成     responseText:伺服器返回的資料(文字格式)

responseXML:伺服器返回的資料(XML格式)

Html(超文字標記語言)是標準通用標記語言下的一個應用,也是一種規範,一種標準。

Xhtml(可擴充套件超文字標記語言)是一種置標語言,表現方式與html類似,不過語法上更加嚴格,主要不同:

1,所有元素必須被正確巢狀,

2,所有標記必須閉合,

3,標籤名,屬性名必須小寫字母,

4,所有的屬性必須用“”括起來,

5,所有非標籤一部分的><&都必須以編碼形式,

6,所有屬性必須要有值,

7,註釋中不要有--

8,圖片必須要有說明文字

四種:內聯,內嵌,外鏈,匯入

區別:

1,link屬於xhtml標籤,@import完全是css提供的一種方式,link除了載入css還可以定義rss,定義rel屬性等,@import只能載入css。

2,載入順序差別:link引用的css是同時被載入的,@import引用的css會等到頁面全部被下載完才會再被載入。

3,相容性差別,@import是css2.1提出,ie5以上才支援,link沒有相容問題。

4,使用dom控制樣式的差別,當用javascript去控制樣式的時候,只能使用link,@import不是dom能控制的。

5,@import可以在css中再次引入其他樣式表。

標籤選擇符,類選擇符,id選擇符,繼承的不如指定的,id>class>Tagname

Important優先順序高

結構層:html由html或者xhtml負責建立,運用標籤對網頁內容的含義作出描述。

表示層:css由css負責建立,對如何顯示有關內容做出回答。

行為層:javascript由javascript負責建立,負責回答應該如何對事件作出反應。

Ie(ie核心),火狐(Gecko),谷歌(webkit),opera(presto)

Alt是在你的圖片因為某種原因不能載入的時候在頁面顯示的提示資訊,它會直接輸出在原本載入圖片的地方,title是在滑鼠懸停在圖片上的顯示的小提示,滑鼠離開就沒了,絕大數html標籤都支援title。

Css reset重置瀏覽器的預設css樣式,瀏覽器種類不同,預設樣式不一樣,通過使用css reset重置,讓他們統一,方便開發。

51.你如何對網站的檔案和資源進行優化?期待的解決方案包括:

1,儘可能減少http請求數(檔案合併)

2,使用CDN(內容分發網路)

3,新增Expire/Cache-Control頭

4,啟用Gzip壓縮

5,css放在頁面最上面

6,scrip放在頁面最下面

7,避免在css中使用Expressions

8,把js和css放在外部檔案中

9,減少dns查詢

10,壓縮javascript和css

11,避免重定向

12,移除重複指令碼

13,配置實體標籤

14,使用ajax快取

根據內容的結構化(內容語義化),選擇合式的標籤(程式碼語義化),便於開發者的閱讀和寫出更加優雅的程式碼的同時讓瀏覽器的爬蟲和機器更好地解析。

1,父級定義height(優點:程式碼少,簡單易掌握;缺點:只適合固定高度元素,無法高度自適應)

2,結尾處使用空標籤清除浮動:Clear:both(優點:理論上能清除所有標籤的浮動,簡程式碼少瀏覽器支援好;缺點:增加了無意義的標籤)

3,父級定義偽類after和zoom(優點:瀏覽器支援好;缺點:程式碼多,兩句程式碼結合使用才能讓主流瀏覽器都支援)

4,父級定義overflow:hidden(優點:程式碼少,簡單,瀏覽器支援好;缺點:必須定義width或者zoom,同時不能定義height,不能和position配合使用)

5,父級定義overflow:auto(優點:程式碼少,簡單,瀏覽器支援好;缺點:必須定義width或者zoom,同時不能定義height,內部元素高度超過父級會出現滾動條

還有,父級一起浮動,父級定義display:table,結尾加br的clear:both等

是一種網頁圖片應用處理方式。它允許你將一個頁面涉及到的所有零星圖片都包含到一張大圖中去,這樣一來,當訪問該頁面時,載入的圖片就不會像以前那樣一幅一幅地慢慢顯示出來了。頁面icon很多的情況下使用合適。

55,html5有哪些新特性、移除了那些元素?如何處理HTML5新標籤的瀏覽器相容問題?如何區分 HTML 和HTML5??

HTML5 現在已經不是 SGML 的子集,主要是關於影象,位置,儲存,多工等功能的增加。

繪畫 canvas用於媒介回放的 video 和 audio 元素本地離線儲存 localStorage 長期儲存資料,瀏覽器關閉後資料不丟失;sessionStorage 的資料在瀏覽器關閉後自動刪除

語意化更好的內容元素,比如 article、footer、header、nav、section

表單控制元件,calendar、date、time、email、url、search

新的技術webworker, websockt, Geolocation

移除的元素

純表現的元素:basefont,big,center,font, s,strike,tt,u;

對可用性產生負面影響的元素:frame,frameset,noframes;

支援HTML5新標籤:

IE8/IE7/IE6支援通過document.createElement方法產生的標籤,

可以利用這一特性讓這些瀏覽器支援HTML5新標籤,

瀏覽器支援新標籤後,還需要新增標籤預設的樣式:

當然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架

<!--[if lt IE 9]>

<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>

<![endif]-->

如何區分: DOCTYPE宣告\新增的結構元素\功能元素

一段指令碼只能讀取來自於同一來源的視窗和文件的屬性,這裡的同一來源指的是主機名、協議和埠號的組合

57、HTML的 form提交之前如何驗證數值文字框的內容全部為數字?否則的話提示使用者並終止提交?

<form onsubmit='chkForm(this)'>

            <input type="text" name="d1" />

            <input type="submit" />

        </form>

<script type="text/javascript">

function chkForm(this){

    var value1 = this.d1.value;

    var len =value1.length;

    for(var i=0;i<len;i++){

        if(value1.charAt(i)>"9"|| value1.charAt(i)<"0"){

            alert("含有非數字字元");

            return false;

        }

    }

    return true;

}

</script>

60. jsp有哪些動作?作用分別是什麼?

(這個問題似乎不重要,不明白為何有此題)

答:JSP共有以下6種基本動作

jsp:include:在頁面被請求的時候引入一個檔案。

jsp:useBean:尋找或者例項化一個JavaBean。

jsp:setProperty:設定JavaBean的屬性。

jsp:getProperty:輸出某個JavaBean的屬性。

jsp:forward:把請求轉到一個新的頁面。

jsp:plugin:根據瀏覽器型別為Java外掛生成OBJECT或EMBED標記

61、JSP的常用指令

isErrorPage(是否能使用Exception物件),isELIgnored(是否忽略表示式)

62. JSP中動態INCLUDE與靜態INCLUDE的區別?

<jsp:include page=included.jsp flush=true />它總是會檢查所含檔案中的變化,適合用於包含動態頁面,並且可以帶引數 靜態INCLUDE用include偽碼實現,不會檢查所含檔案的變化,適用於包含靜態頁面 <%@include file=included.htm %>

標籤不同

執行的時機不同,動態include是在執行時把兩個JSP合併,靜態include是在編譯期合併動態include在頁面發生改變時,能及時更新,而靜態頁面,不會再次重新編譯

63、頁面間物件傳遞的方法

1. request

2. session

3. application

4. cookie

5. URL地址

64、解釋一下什麼是servlet;

答: 通常Servlet特指HttpServlet,用來接受瀏覽器的訪問請求,瀏覽器最常用的請求為GET和POST方式,還有其它五種,而HttpServlet分別有七個方法(PUT、DELETE、HEADER、TRACE、OPTION)處理這些型別的請求,另有一個是J2EE不支援的,是CONNECT。Servlet是J2EE規範中的重要成員,是構成WEB的重要元件

65、說一說Servlet的生命週期?  

1. 載入Servlet類

2. 例項化

3. 初始化init

4. 處理請求 service à 進一步呼叫doGet/doPost方法

5. 銷燬 destory

66、Servlet的基本架構

1. 定義一個Servlet類,繼承HttpServlet抽象類

2. 在web.xml中定義一個servlet標籤,配置類名和servlet名

3. 配置servlet處理的URL請求連線,可以用模糊匹配

4. 在J2EE生命週期中,一個Servlet只有一個例項

5. 一個Servlet可以為多個請求服務,每個請求在獨立的執行緒中執行

67、Servlet API中forward()與redirect()的區別?

Forward: 伺服器端內部跳轉,URL地址不變,屬於單次請求

Redirect: 伺服器通知瀏覽器中轉,URL地址發生改變,是兩次跳轉

Forward不能跨域跳轉

Redirect可以跨域跳轉

Forward在兩個頁面傳值可以通過parameter,也可以通過attribute,能傳遞Java物件

Redirect在兩個頁面傳值只能通過parameter,在URL中傳參

68、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):刪除請求中的一個屬性

69、request.getAttribute()和 request.getParameter()有何區別?

1. getParameter是表單資料或URL引數,不能在server端修改

getAttribute是兩個頁面或servlet之間內部跳轉傳遞物件引數,可以修改

2. getParameter的型別只能是String

getAttribute的型別可以是任意Java物件

3. forward跳轉時才有attribute,redirect時,attribute全部為null

70、MVC的各個部分都有那些技術來實現?如何實現?

MVC是Model-View-Controller的簡寫。

Model代表的是應用的業務邏輯(通過JavaBean,EJB元件實現),通常是資料訪問層。

View是應用的表示層(由JSP頁面產生)或模板框架,如freemarker、velocity

Controller是提供應用的處理過程控制(一般是一個Servlet),負責頁面間跳轉

通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的元件實現。這些元件可以進行互動和重用。

Model:JDBC、Hibernate、MyBatis

View:JSP、FreeMarker、Struts

Controller:Spring MVC、Struts、Servlet

SpringSide整合Spring、Struts、Hibernate、WebService、View展示框架,作者江南白衣

71、我們在web應用開發過程中經常遇到輸出某種編碼的字元,如iso-8859-1等,如何輸出一個某種編碼的字串?

public String translate(String str) {

        try {

            return new String(str.getBytes("ISO-8859-1"), "GBK").trim();

        } catch (Exception e) {

            System.err.println(e.getMessage());

            throw new RuntimeException(e);

        }

}