JAVA WEB部分易混淆问题总结
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
前言???
????最近在看了一些java基礎(chǔ)問題,順便將這段時間看到的容易混淆和已忘記的問題進(jìn)行整理總結(jié)一下.
接下來會再寫一些數(shù)據(jù)庫方面易混淆或者不常用易忘記的問題梳理
??? 上一篇是java基礎(chǔ)方面易混淆問題總結(jié):? https://my.oschina.net/u/2342969/blog/1631422
問題列表
??? 1、servlet中forward()與redirect()的區(qū)別
???????? forward是服務(wù)器請求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。更加高效,它可以滿足需要時,盡量使用forward()方法,這樣也有助于隱藏實際的鏈接。
????????redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請求,但是在需要跳轉(zhuǎn)到一個其它服務(wù)器上的資源,必須使用此方法
??? 2、Request對象的主要方法
????????setAttribute(String name,Object):設(shè)置名字為name的request的參數(shù)值
getAttribute(String name):返回由name指定的屬性值
getAttributeNames():返回request對象所有屬性的名字集合,結(jié)果是一個枚舉的實例
getCookies():返回客戶端的所有Cookie對象,結(jié)果是一個Cookie數(shù)組
getCharacterEncoding():返回請求中的字符編碼方式
getContentLength():返回請求的Body的長度
getHeader(String name):獲得HTTP協(xié)議定義的文件頭信息
getHeaders(String name):返回指定名字的request Header的所有值,結(jié)果是一個枚舉的實例
getHeaderNames():返回所以request Header的名字,結(jié)果是一個枚舉的實例
getInputStream():返回請求的輸入流,用于獲得請求中的數(shù)據(jù)
getMethod():獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法
getParameter(String name):獲得客戶端傳送給服務(wù)器端的有name指定的參數(shù)值
getParameterNames():獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字,結(jié)果是一個枚舉的實例
getParametervalues(String name):獲得有name指定的參數(shù)的所有值
getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱
getQueryString():獲得查詢字符串
getRequestURI():獲取發(fā)出請求字符串的客戶端地址
getRemoteAddr():獲取客戶端的IP地址
getRemoteHost():獲取客戶端的名字
getSession([Boolean create]):返回和請求相關(guān)Session
getServerName():獲取服務(wù)器的名字
getServletPath():獲取客戶端所請求的腳本文件的路徑
getServerPort():獲取服務(wù)器的端口號
removeAttribute(String name):刪除請求中的一個屬性
??? 3、request.getAttribute()和 request.getParameter()有何區(qū)別?
????????getParameter得到的都是String類型的。或者是http://a.jsp?id=123中的123,或者是某個表單提交過去的數(shù)據(jù)。
getAttribute則可以是對象。
getParameter()是獲取POST/GET傳遞的參數(shù)值;
getAttribute()是獲取對象容器中的數(shù)據(jù)值;
getParameter:用于客戶端重定向時,即點擊了鏈接或提交按扭時傳值用,即用于在用表單或url重定向傳值時接收數(shù)據(jù)用。
getAttribute:用于服務(wù)器端重定向時,即在sevlet中使用了forward函數(shù),或struts中使用了mapping.findForward。getAttribute只能收到程序用setAttribute傳過來的值。
getParameter()是獲取POST/GET傳遞的參數(shù)值;
getAttribute()是獲取SESSION的值;
另外,可以用setAttribute,getAttribute發(fā)送接收對象.而getParameter顯然只能傳字符串。setAttribute是應(yīng)用服務(wù)器把這個對象放在該頁面所對應(yīng)的一塊內(nèi)存中去,當(dāng)你的頁面服務(wù)器重定向到另一個頁面時,應(yīng)用服務(wù)器會把這塊內(nèi)存拷貝另一個頁面所對應(yīng)的內(nèi)存中。這樣getAttribute就能取得你所設(shè)下的值,當(dāng)然這種方法可以傳對象。session也一樣,只是對象在內(nèi)存中的生命周期不一樣而已。getParameter只是應(yīng)用服務(wù)器在分析你送上來的request頁面的文本時,取得你設(shè)在表單或url重定向時的值。
getParameter返回的是String, 用于讀取提交的表單中的值;
getAttribute返回的是Object,需進(jìn)行轉(zhuǎn)換,可用setAttribute設(shè)置成任意對象,使用很靈活,可隨時用;
??? 4、jsp有哪些內(nèi)置對象?作用分別是什么?分別有什么方法?
????????JSP共有以下9個內(nèi)置的對象:
request 用戶端請求,此請求會包含來自GET/POST請求的參數(shù)
response 網(wǎng)頁傳回用戶端的回應(yīng)
pageContext 網(wǎng)頁的屬性是在這里管理
session 與請求有關(guān)的會話期
application servlet 正在執(zhí)行的內(nèi)容
out 用來傳送回應(yīng)的輸出
config servlet的構(gòu)架部件
page JSP網(wǎng)頁本身
exception 針對錯誤網(wǎng)頁,未捕捉的例外
request表示HttpServletRequest對象。它包含了有關(guān)瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header,和session數(shù)據(jù)的有用的方法。
response表示HttpServletResponse對象,并提供了幾個用于設(shè)置送回瀏覽器的響應(yīng)的方法(如cookies,頭信息等)
out對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結(jié)果。
pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對象的API,并且包裝了通用的servlet相關(guān)功能的方法。
session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態(tài)信息
applicaton 表示一個javax.servle.ServletContext對象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息
config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數(shù)。
page表示從該頁面產(chǎn)生的一個servlet實例
??? 5、注冊Jdbc驅(qū)動程序的三種方式???????
????????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把類先裝載到j(luò)ava的虛擬機(jī)中,并沒有創(chuàng)建Driver類的實例。
????第三種與第一種方法可以脫離jdbc的驅(qū)動進(jìn)行編譯,第二種方法不可以的,它一定要有jdbc的驅(qū)動才可以通過編譯,這樣對我們的程序就有很多的不好之處,為程序換數(shù)據(jù)庫會帶來麻煩
????第一種的好處在于能夠在編譯時不依賴于特定的JDBC?Driver庫,也就是減少了項目代碼的依賴性,而且也很容易改造成從配置文件讀取JDBC配置,從而可以在運(yùn)行時動態(tài)更換數(shù)據(jù)庫連接驅(qū)動。
??? 6、用JDBC如何調(diào)用存儲過程
??????? 前面注冊驅(qū)動以及后面關(guān)閉資源等固定模式代碼就不貼了,直接貼核心代碼:
????????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可以寫動態(tài)參數(shù)化的查詢
????????用PreparedStatement你可以寫帶參數(shù)的sql查詢語句,通過使用相同的sql語句和不同的參數(shù)值來做查詢比創(chuàng)建一個不同的查詢語句要好
??????? 2) PreparedStatement比?Statement?更快
????????使用?PreparedStatement?最重要的一點好處是它擁有更佳的性能優(yōu)勢,SQL語句會預(yù)編譯在數(shù)據(jù)庫系統(tǒng)中。執(zhí)行計劃同樣會被緩存起來,它允許數(shù)據(jù)庫做參數(shù)化查詢。使用預(yù)處理語句比普通的查詢更快,因為它做的工作更少(數(shù)據(jù)庫對SQL語句的分析,編譯,優(yōu)化已經(jīng)在第一次查詢前完成了)。為了減少數(shù)據(jù)庫的負(fù)載,生產(chǎn)環(huán)境中的JDBC代碼你應(yīng)該總是使用PreparedStatement?。值得注意的一點是:為了獲得性能上的優(yōu)勢,應(yīng)該使用參數(shù)化sql查詢而不是字符串追加的方式。
??????? 3) PreparedStatement可以防止SQL注入式攻擊
??? 8、數(shù)據(jù)連接池的工作機(jī)制是什么?
????????J2EE服務(wù)器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接。客戶端程序需要連接時,池驅(qū)動程序會返回一個未使用的池連接并將其表記為忙。如果當(dāng)前沒有空閑連接,池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個連接。
????????實現(xiàn)方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正關(guān)連接,而是把它代理的Connection對象還回到連接池中。
轉(zhuǎn)載于:https://my.oschina.net/u/2342969/blog/1632435
總結(jié)
以上是生活随笔為你收集整理的JAVA WEB部分易混淆问题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SMB协议漏洞分析
- 下一篇: AOP实现Controller参数日志