JAVA WEB部分易混淆问题总结
2019獨角獸企業重金招聘Python工程師標準>>>
前言???
????最近在看了一些java基礎問題,順便將這段時間看到的容易混淆和已忘記的問題進行整理總結一下.
接下來會再寫一些數據庫方面易混淆或者不常用易忘記的問題梳理
??? 上一篇是java基礎方面易混淆問題總結:? https://my.oschina.net/u/2342969/blog/1631422
問題列表
??? 1、servlet中forward()與redirect()的區別
???????? forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。更加高效,它可以滿足需要時,盡量使用forward()方法,這樣也有助于隱藏實際的鏈接。
????????redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數重新請求,但是在需要跳轉到一個其它服務器上的資源,必須使用此方法
??? 2、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):刪除請求中的一個屬性
??? 3、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設置成任意對象,使用很靈活,可隨時用;
??? 4、jsp有哪些內置對象?作用分別是什么?分別有什么方法?
????????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實例
??? 5、注冊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配置,從而可以在運行時動態更換數據庫連接驅動。
??? 6、用JDBC如何調用存儲過程
??????? 前面注冊驅動以及后面關閉資源等固定模式代碼就不貼了,直接貼核心代碼:
????????cstmt = cn.prepareCall("{callinsert_Student(?,?,?)}");
????????cstmt.registerOutParameter(3,Types.INTEGER);
????????cstmt.setString(1,"wangwu");
????????cstmt.setInt(2, 25);
????????cstmt.execute();
??? 7、JDBC中的PreparedStatement相比Statement的好處
??????? 1) PreparedStatement可以寫動態參數化的查詢
????????用PreparedStatement你可以寫帶參數的sql查詢語句,通過使用相同的sql語句和不同的參數值來做查詢比創建一個不同的查詢語句要好
??????? 2) PreparedStatement比?Statement?更快
????????使用?PreparedStatement?最重要的一點好處是它擁有更佳的性能優勢,SQL語句會預編譯在數據庫系統中。執行計劃同樣會被緩存起來,它允許數據庫做參數化查詢。使用預處理語句比普通的查詢更快,因為它做的工作更少(數據庫對SQL語句的分析,編譯,優化已經在第一次查詢前完成了)。為了減少數據庫的負載,生產環境中的JDBC代碼你應該總是使用PreparedStatement?。值得注意的一點是:為了獲得性能上的優勢,應該使用參數化sql查詢而不是字符串追加的方式。
??????? 3) PreparedStatement可以防止SQL注入式攻擊
??? 8、數據連接池的工作機制是什么?
????????J2EE服務器啟動時會建立一定數量的池連接,并一直維持不少于此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接并將其表記為忙。如果當前沒有空閑連接,池驅動程序就新建一定數量的連接,新建連接的數量有配置參數決定。當使用的池連接調用完成后,池驅動程序將此連接表記為空閑,其他調用就可以使用這個連接。
????????實現方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正關連接,而是把它代理的Connection對象還回到連接池中。
轉載于:https://my.oschina.net/u/2342969/blog/1632435
總結
以上是生活随笔為你收集整理的JAVA WEB部分易混淆问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SMB协议漏洞分析
- 下一篇: AOP实现Controller参数日志