最近在看了一些java基礎問題,順便將這段時間看到的容易混淆和已忘記的問題進行整理總結一下.java
接下來會再寫一些數據庫方面易混淆或者不經常使用易忘記的問題梳理mysql
上一篇是java基礎方面易混淆問題總結: https://my.oschina.net/u/2342969/blog/1631422sql
一、servlet中forward()與redirect()的區別數據庫
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。更加高效,它能夠知足須要時,儘可能使用forward()方法,這樣也有助於隱藏實際的連接。
redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來說瀏覽器會用剛才請求的全部參數從新請求,可是在須要跳轉到一個其它服務器上的資源,必須使用此方法數組
二、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):刪除請求中的一個屬性緩存
三、request.getAttribute()和 request.getParameter()有何區別?服務器
getParameter獲得的都是String類型的。或者是http://a.jsp?id=123中的123,或者是某個表單提交過去的數據。
getAttribute則能夠是對象。
getParameter()是獲取POST/GET傳遞的參數值;
getAttribute()是獲取對象容器中的數據值;
getParameter:用於客戶端重定向時,即點擊了連接或提交按扭時傳值用,即用於在用表單或url重定向傳值時接收數據用。
getAttribute:用於服務器端重定向時,即在sevlet中使用了forward函數,或struts中使用了mapping.findForward。getAttribute只能收到程序用setAttribute傳過來的值。
getParameter()是獲取POST/GET傳遞的參數值;
getAttribute()是獲取SESSION的值;
另外,能夠用setAttribute,getAttribute發送接收對象.而getParameter顯然只能傳字符串。setAttribute是應用服務器把這個對象放在該頁面所對應的一塊內存中去,當你的頁面服務器重定向到另外一個頁面時,應用服務器會把這塊內存拷貝另外一個頁面所對應的內存中。這樣getAttribute就能取得你所設下的值,固然這種方法能夠傳對象。session也同樣,只是對象在內存中的生命週期不同而已。getParameter只是應用服務器在分析你送上來的request頁面的文本時,取得你設在表單或url重定向時的值。
getParameter返回的是String, 用於讀取提交的表單中的值;
getAttribute返回的是Object,需進行轉換,可用setAttribute設置成任意對象,使用很靈活,可隨時用;cookie
四、jsp有哪些內置對象?做用分別是什麼?分別有什麼方法?session
JSP共有如下9個內置的對象:
request 用戶端請求,此請求會包含來自GET/POST請求的參數
response 網頁傳回用戶端的迴應
pageContext 網頁的屬性是在這裏管理
session 與請求有關的會話期
application servlet 正在執行的內容
out 用來傳送回應的輸出
config servlet的構架部件
page JSP網頁自己
exception 針對錯誤網頁,未捕捉的例外
request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,而且提供了幾個用於獲取cookie, header,和session數據的有用的方法。
response表示HttpServletResponse對象,並提供了幾個用於設置送回瀏覽器的響應的方法(如cookies,頭信息等)
out對象是javax.jsp.JspWriter的一個實例,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。
pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各類範圍的名字空間、servlet相關的對象的API,而且包裝了通用的servlet相關功能的方法。
session表示一個請求的javax.servlet.http.HttpSession對象。Session能夠存貯用戶的狀態信息
applicaton 表示一個javax.servle.ServletContext對象。這有助於查找有關servlet引擎和servlet環境的信息
config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實例的初始化參數。
page表示從該頁面產生的一個servlet實例
五、註冊Jdbc驅動程序的三種方式
1) Class.forName("com.mysql.jdbc.Driver"); --> 推薦
2)DriverManager.registerDriver(new com.mysql.jdbc.Driver())
3) System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");
註釋:
第二種與第三種註冊的方法看起來更加的直接與好理解。第一種方法是經過Class把類先裝載到java的虛擬機中,並無建立Driver類的實例。
第三種與第一種方法能夠脫離jdbc的驅動進行編譯,第二種方法不能夠的,它必定要有jdbc的驅動才能夠經過編譯,這樣對咱們的程序就有不少的很差之處,爲程序換數據庫會帶來麻煩
第一種的好處在於可以在編譯時不依賴於特定的JDBC Driver庫,也就是減小了項目代碼的依賴性,並且也很容易改形成從配置文件讀取JDBC配置,從而能夠在運行時動態更換數據庫鏈接驅動。
六、用JDBC如何調用存儲過程
前面註冊驅動以及後面關閉資源等固定模式代碼就不貼了,直接貼核心代碼:
cstmt = cn.prepareCall("{callinsert_Student(?,?,?)}");
cstmt.registerOutParameter(3,Types.INTEGER);
cstmt.setString(1,"wangwu");
cstmt.setInt(2, 25);
cstmt.execute();
七、JDBC中的PreparedStatement相比Statement的好處
1) PreparedStatement能夠寫動態參數化的查詢
用PreparedStatement你能夠寫帶參數的sql查詢語句,經過使用相同的sql語句和不一樣的參數值來作查詢比建立一個不一樣的查詢語句要好
2) PreparedStatement比 Statement 更快
使用 PreparedStatement 最重要的一點好處是它擁有更佳的性能優點,SQL語句會預編譯在數據庫系統中。執行計劃一樣會被緩存起來,它容許數據庫作參數化查詢。使用預處理語句比普通的查詢更快,由於它作的工做更少(數據庫對SQL語句的分析,編譯,優化已經在第一次查詢前完成了)。爲了減小數據庫的負載,生產環境中的JDBC代碼你應該老是使用PreparedStatement 。值得注意的一點是:爲了得到性能上的優點,應該使用參數化sql查詢而不是字符串追加的方式。
3) PreparedStatement能夠防止SQL注入式攻擊
八、數據鏈接池的工做機制是什麼?
J2EE服務器啓動時會創建必定數量的池鏈接,並一直維持很多於此數目的池鏈接。客戶端程序須要鏈接時,池驅動程序會返回一個未使用的池鏈接並將其表記爲忙。若是當前沒有空閒鏈接,池驅動程序就新建必定數量的鏈接,新建鏈接的數量有配置參數決定。當使用的池鏈接調用完成後,池驅動程序將此鏈接表記爲空閒,其餘調用就可使用這個鏈接。 實現方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正關鏈接,而是把它代理的Connection對象還回到鏈接池中。