get和post請(qǐng)求的區(qū)別
- GET參數(shù)通過URL傳遞荚虚,POST放在Request body中摄凡。
- GET在瀏覽器回退時(shí)是無害的,而POST會(huì)再次提交請(qǐng)求弟劲。
- GET產(chǎn)生的URL地址可以被Bookmark蟋软,而POST不可以镶摘。
- GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache嗽桩,而POST不會(huì),除非手動(dòng)設(shè)置凄敢。
- GET請(qǐng)求只能進(jìn)行url編碼碌冶,而POST支持多種編碼方式。
- GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里涝缝,而POST中的參數(shù)不會(huì)被保留扑庞。
- GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,而POST么有拒逮。
對(duì)參數(shù)的數(shù)據(jù)類型嫩挤,GET只接受ASCII字符,而POST沒有限制消恍。 - GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上以现,所以不能用來傳遞敏感信息狠怨。
轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的區(qū)別
- 轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為邑遏。
轉(zhuǎn)發(fā)(Forward) 通過RequestDispatcher對(duì)象的forward(HttpServletRequest request,HttpServletResponse response)方法實(shí)現(xiàn)的佣赖。RequestDispatcher可以通過HttpServletRequest 的getRequestDispatcher()方法獲得。例如下面的代碼就是跳轉(zhuǎn)到login_success.jsp頁面记盒。request.getRequestDispatcher("login_success.jsp").forward(request, response);
重定向(Redirect) 是利用服務(wù)器返回的狀態(tài)碼來實(shí)現(xiàn)的憎蛤。客戶端瀏覽器請(qǐng)求服務(wù)器的時(shí)候纪吮,服務(wù)器會(huì)返回一個(gè)狀態(tài)碼俩檬。服務(wù)器通過 HttpServletResponse 的 setStatus(int status) 方法設(shè)置狀態(tài)碼。如果服務(wù)器返回301或者302碾盟,則瀏覽器會(huì)到新的網(wǎng)址重新請(qǐng)求該資源棚辽。 - 從地址欄顯示來說
forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來的,所以它的地址欄還是原來的地址. redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL. - 從數(shù)據(jù)共享來說
forward:轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù). redirect:不能共享數(shù)據(jù). - 從運(yùn)用地方來說
forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊. redirect:一般用于用戶注銷登陸時(shí)返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等 - 從效率來說
forward:高. redirect:低.
自動(dòng)刷新(Refresh)
自動(dòng)刷新不僅可以實(shí)現(xiàn)一段時(shí)間之后自動(dòng)跳轉(zhuǎn)到另一個(gè)頁面,還可以實(shí)現(xiàn)一段時(shí)間之后自動(dòng)刷新本頁面冰肴。Servlet中通過HttpServletResponse對(duì)象設(shè)置Header屬性實(shí)現(xiàn)自動(dòng)刷新例如:Response.setHeader("Refresh","5;URL=http://localhost:8080/servlet/example.htm");
其中5為時(shí)間屈藐,單位為秒。URL指定就是要跳轉(zhuǎn)的頁面(如果設(shè)置自己的路徑熙尉,就會(huì)實(shí)現(xiàn)每過5秒自動(dòng)刷新本頁面一次)
Servlet與線程安全
- Servlet不是線程安全的联逻,多線程并發(fā)的讀寫會(huì)導(dǎo)致數(shù)據(jù)不同步的問題。
- 解決的辦法是盡量不要定義name屬性检痰,而是要把name變量分別定義在doGet()和doPost()方法內(nèi)包归。雖然使用synchronized(name){}語句塊可以解決問題,但是會(huì)造成線程的等待攀细,不是很科學(xué)的辦法箫踩。
JSP有9個(gè)內(nèi)置對(duì)象:
request:封裝客戶端的請(qǐng)求爱态,其中包含來自GET或POST請(qǐng)求的參數(shù);
response:封裝服務(wù)器對(duì)客戶端的響應(yīng)境钟;
pageContext:通過該對(duì)象可以獲取其他對(duì)象锦担;
session:封裝用戶會(huì)話的對(duì)象;
application:封裝服務(wù)器運(yùn)行環(huán)境的對(duì)象慨削;
out:輸出服務(wù)器響應(yīng)的輸出流對(duì)象洞渔;
config:Web應(yīng)用的配置對(duì)象;
page:JSP頁面本身(相當(dāng)于Java程序中的this)缚态;
exception:封裝頁面拋出異常的對(duì)象磁椒。
Request對(duì)象的主要方法有哪些
setAttribute(String name,Object):設(shè)置名字為name的request 的參數(shù)值
getAttribute(String name):返回由name指定的屬性值
getAttributeNames():返回request 對(duì)象所有屬性的名字集合,結(jié)果是一個(gè)枚舉的實(shí)例
getCookies():返回客戶端的所有 Cookie 對(duì)象玫芦,結(jié)果是一個(gè)Cookie 數(shù)組
getCharacterEncoding() :返回請(qǐng)求中的字符編碼方式 = getContentLength() :返回請(qǐng)求的 Body的長(zhǎng)度
getHeader(String name) :獲得HTTP協(xié)議定義的文件頭信息
getHeaders(String name) :返回指定名字的request Header 的所有值浆熔,結(jié)果是一個(gè)枚舉的實(shí)例
getHeaderNames() :返回所以request Header 的名字,結(jié)果是一個(gè)枚舉的實(shí)例
getParameterNames() :獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字桥帆,結(jié)果是一個(gè)枚舉的實(shí)例
getParameterValues(String name):獲得有name指定的參數(shù)的所有值
getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱
getQueryString() :獲得查詢字符串
getRequestURI() :獲取發(fā)出請(qǐng)求字符串的客戶端地址
getRemoteAddr():獲取客戶端的 IP 地址
getRemoteHost() :獲取客戶端的名字
getSession([Boolean create]) :返回和請(qǐng)求相關(guān) Session
getServerName() :獲取服務(wù)器的名字
getServletPath():獲取客戶端所請(qǐng)求的腳本文件的路徑
getServerPort():獲取服務(wù)器的端口號(hào)
removeAttribute(String name):刪除請(qǐng)求中的一個(gè)屬性
getParameter(String name) :獲得客戶端傳送給服務(wù)器端的有 name指定的參數(shù)值
getMethod() :獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法
getInputStream() :返回請(qǐng)求的輸入流医增,用于獲得請(qǐng)求中的數(shù)據(jù)
request.getAttribute()和 request.getParameter()有何區(qū)別
- 從獲取方向來看:
getParameter()是獲取 POST/GET 傳遞的參數(shù)值;
getAttribute()是獲取對(duì)象容器中的數(shù)據(jù)值老虫; - 從用途來看:
getParameter用于客戶端重定向時(shí)叶骨,即點(diǎn)擊了鏈接或提交按扭時(shí)傳值用,即用于在用表單或url重定向傳值時(shí)接收數(shù)據(jù)用祈匙。
getAttribute用于服務(wù)器端重定向時(shí)忽刽,即在 sevlet 中使用了 forward 函數(shù),或 struts 中使用了 mapping.findForward。 getAttribute 只能收到程序用 setAttribute 傳過來的值夺欲。 - 總結(jié):
getParameter 返回的是String,用于讀取提交的表單中的值;(獲取之后會(huì)根據(jù)實(shí)際需要轉(zhuǎn)換為自己需要的相應(yīng)類型跪帝,比如整型,日期類型啊等等)
getAttribute 返回的是Object洁闰,需進(jìn)行轉(zhuǎn)換,可用setAttribute 設(shè)置成任意對(duì)象歉甚,使用很靈活,可隨時(shí)用
include指令include的行為的區(qū)別
- include指令
JSP可以通過include指令來包含其他文件扑眉。被包含的文件可以是JSP文件纸泄、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分腰素,會(huì)被同時(shí)編譯執(zhí)行聘裁。 語法格式如下: <%@ include file="文件相對(duì) url 地址" %> - include動(dòng)作
jsp:include動(dòng)作元素用來包含靜態(tài)和動(dòng)態(tài)的文件。該動(dòng)作把指定文件插入正在生成的頁面弓千。語法格式如下: <jsp:include page="相對(duì) URL 地址" flush="true" />
JSP中的四種作用域包括page衡便、request、session和application,具體來說:
- page代表與一個(gè)頁面相關(guān)的對(duì)象和屬性镣陕。
- request代表與Web客戶機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性谴餐。一個(gè)請(qǐng)求可能跨越多個(gè)頁面,涉及多個(gè)Web組件呆抑;需要在頁面顯示的臨時(shí)數(shù)據(jù)可以置于此作用域岂嗓。
- session代表與某個(gè)用戶與服務(wù)器建立的一次會(huì)話相關(guān)的對(duì)象和屬性。跟某個(gè)用戶相關(guān)的數(shù)據(jù)應(yīng)該放在用戶自己的session中鹊碍。
- application代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性厌殉,它實(shí)質(zhì)上是跨越整個(gè)Web應(yīng)用程序,包括多個(gè)頁面侈咕、請(qǐng)求和會(huì)話的一個(gè)全局作用域公罕。GET參數(shù)通過URL傳遞,POST放在Request body中耀销。