一.Jsp與servlet的區別:
1.jsp經編譯後就變成了Servlet.(JSP的本質就是Servlet,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)
2.jsp更擅長表現於頁面顯示,servlet更擅長於邏輯控制.
3.Servlet中沒有內建對象,Jsp中的內建對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象得到.
Jsp是Servlet的一種簡化,使用Jsp只需要完成程式員需要輸出到用戶端的內容,Jsp中的Java指令碼如何鑲嵌到一個類中,由Jsp容器完成。而Servlet則是個完整的Java類,這個類的Service方法用於產生對用戶端的響應。
老師發的答案1:
JSP在本質上就是SERVLET,但是兩者的建立方式不一樣.Servlet完全是JAVA程式碼構成擅長於流程式控制制和交易處理而通過Servlet
來產生動態網頁;JSP由HTML代碼和JSP標籤構成,可以方便地編寫動態網頁
因此在實際應用中採用Servlet來控制商務程序,而採用JSP來產生動態網頁.在struts架構中,JSP位於MVC設計模式的視圖層,而Servlet位於控制層.
答案2:
JSP是Servlet技術的擴充,本質上就是Servlet的簡易方式。JSP編譯後是“類servlet”。Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java檔案中,並且完全從展示層中的HTML裡分離開來。而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp的檔案。JSP側重於視圖,Servlet主要用於控制邏輯。
二.Jsp的九大對象,七大動作,三大指令
jsp九大內建對象:
1>out 向用戶端輸出資料,位元組流.如out.print(" dgaweyr");
2>request 接收用戶端的http請求.
String getParameter(String name):得到表單參數名name的值.
String[] getParameterValues(String name):(得到String[]複選框時常用).
setAttribute(String name,Object obj):設定屬性名稱為name,屬性值為obj.
getAttribute(String name);得到屬性值.
3>response:封裝jsp產生的回應,然後發送到用戶端以響應客戶的請求.重新導向跳轉任意介面.(伺服器跳轉)
addCookie(Cookie cookie):
sendRedirect("/wel.jsp"):跳轉到指定頁面
4>session:用於儲存使用者資訊,跟蹤使用者行為,當前開啟的瀏覽器內,多個頁面共用資料. session對象指的是用戶端與伺服器的一次會話,從客戶連到伺服器的一個WebApplication開始,直到用戶端與伺服器中斷連線為止.它是HttpSession類的執行個體.
setAttribute(String name,Object obj):設定屬性名稱為name,屬性值為obj.
getAttribute(String name):得到屬性值.
5>application對象:實現了使用者間資料的共用,可存放全域變數.它開始於伺服器的啟動,直到伺服器的關閉,在此期間,此對象將一直存在;這樣在使用者的前後串連或不同使用者之間的串連中,可以對此對象的同一屬性進行操作;在任何地方對此對象屬性的操作,都將影響到其他使用者對此的訪問.伺服器的啟動和關閉決定了application對象的生命.它是ServletContext類的執行個體.
session,application,request的區別:
一個項目中session盡量少用幾個,因為過多的session會影響程式的執行效率.它主要用於儲存登入資訊(使用者資訊,許可權,資源)即頻繁使用的資訊.
application: 用於多個瀏覽器之間共用資料,多個使用者共用該對象,可以做計數器.它的用法與session完全一樣.
資料範圍:
application(伺服器關閉時失效)>ression(瀏覽器關閉時失效)>request(只能用於兩個跳轉頁面之間)
6>page對象代表jsp這個實體本身,即當前頁面有效.相當於java中的this.
資料範圍:page<session<application
7>.exception:代表運行時的異常.
在會發生異常的頁面加入指令:<%@ page errorPage="處理錯誤的頁面.jsp"%>
在處理異常的頁面寫入:<%@ page isErrorPage="true"%>
8>.pageContext對象 pageContext對象提供了對JSP頁面內所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當於頁面中所有功能的集大成者,它的本類名也叫pageContext.
9>.config jsp對應的servlet的配置,可以得到web.xml中的初使化參數.
jsp七大動作:
一:include 動態包含(分別編譯):
用jsp:include動作實現<jsp: include page="included.jsp" flush="true" />
它總是會檢查所含檔案中的變化,適合用於包含動態網頁面,並且可以帶參數。flush屬性: 用true ,表示頁面可重新整理。預設為false;
二:useBean動作(jsp頁面使用javaBean的第二種方式):
<jsp:useBean id="對象名" class="包名.類名" scope="作用範圍(request/page/application/session)"/>
範圍預設為page(本頁面有效).
三:getProperty動作(name為useBean動作中的id).
從對象中取出屬性值:<jsp:getProperty name="javaBean對象" property="javaBean對象屬性名稱" />
四:setProperty動作(name為useBean動作中的id):
為對象設定屬性值:<jsp:setProperty name="javaBean對象" property="javaBean對象屬性名稱" value="值"/>
為對象設定屬性值:<jsp:setProperty property="javaBean對象屬性名稱" name="javaBean對象" param="username"/>
(param="username" 相當於 value=<%=request.getParameter("username")%>)
五:param動作(傳遞參數)):
到達跳轉頁面可以通過 request.getParameter(“參數名”)方式取出參數值
<jsp:include page="轉向頁面的url" >
<jsp:param name="參數名1" value="參數值1">
<jsp:param name="參數名2" value="參數值2">
...........
</jsp:include>
或:
<jsp:forward page="轉向頁面的url" >
<jsp:param name="參數名1" value="參數值1">
<jsp:param name="參數名2" value="參數值2">
...........
</jsp:forward>
六:forward動作:
跳轉頁面:<jsp:forward page="login.jsp" />
七:plugin動作:<jsp:plugin>:用於指定在用戶端啟動並執行外掛程式
JSP三大指令之:
一:page指令:
1.指定頁面編碼.例:
<%@ page language="java" contentType="text/html;charset=gbk" pageEncoding="gbk" %>
2.匯入包,例:
<%@ page import="java.util.*,java.text.*" %>.
二:include 指令
靜態包含(統一編譯):<%@ include file="included.jsp"%>
三:taglib
三.Jsp中的靜態包含與動態包含
動態include(<jsp: include page="included.jsp"/>)
靜態include(<%@ include file="included.jsp"%>)
1. 靜態include的結果是把其他jsp引入當前jsp,兩者合為一體,可以達到資料的共用即可以說是統一編譯的,而
動態include的結構是兩者獨立的,直到輸出時才合并即為分別編譯的.
2.動態include的jsp檔案獨立性很強,是一個單獨的jsp檔案,需要使用的對象,版面設定,都由自己建立,而靜態include純粹是把代碼寫在外面的一種共用方法,所有的變數都是可以和include它的主檔案共用,兩者高度緊密結合,不能 有變數同名的衝突.而版面設定也可以借用主檔案的.
3.動態包含總是檢查被包含頁面的變化,靜態包含不一定檢查被包含頁面的變化.
4.動態包含可帶參數,靜態包含不能帶參數.如(<jsp: include page="included.jsp">放入參數</jsp:include>);
四.Servlet的生命週期
載入(伺服器啟動時,會到web.xml檔案中去找到Servlet檔案的配置並建立servlet的執行個體) → 初使化(init()此方法只執行一次) → 執行(service(),doGet(),doPost()) → 清理(銷毀destory())
service():方法本身包含了doGet()和doPost().如果伺服器發現了service()方法,則不再執行doGet(),doPost().
一般不建議去重寫父類的service方法.因為重寫了此方法doGet方法和doPost方法將得不到利用.
沒有service()方法預設執行doGet()方法.
五.Servlet的十大方法
init(HttpServletConfig config): 被servlet 容器調用以指明一個servlet被放進服務中。
service(HttpServletRequest request, HttpServletResponse response):被servlet 容器調用以允許servlet響應一個請求
doGet(HttpServletRequest request, HttpServletResponse response):被server調用處理用戶端的GET請求 .
doPost(HttpServletRequest request, HttpServletResponse response):被server調用處理用戶端的POST請求.
doPut(HttpServletRequest request, HttpServletResponse response):被server調用處理用戶端的PUT請求.
doDelete(HttpServletRequest request, HttpServletResponse response):被server調用處理用戶端的DELETE請求.
destroy():被 servlet container調用以告知一個servlet它被剔除服務。
getServletInfo():返回有關servlet的資訊,例如作者、版本、著作權。
getServletConfig():返回ServletConfig對象
doHead(HttpServletRequest request, HttpServletResponse response):被server調用處理用戶端的Head請求.
六.Servlet類的基本架構
Servlet 介面:主要定義了servlet的生命週期方法
ServletConfig介面:為servlet提供了使用Container Service的若干重要對象和方法。
ServletContext介面:是Servlet的內容物件,這個對象是在伺服器啟動時建立的,為servlet提供了使用Container Service的若干重要方法。
GenericServlet抽象類別:為servlet提供了一般的實現(包括實現了servlet和ServletConfig兩個介面),儲存了容器通過init方法傳遞給servlet的一個ServletConfig類型的重要對象。
HttpServlet抽象類別:為處理http請求的servlet提供了一般實現,主要是定義和實現了若干service方法。
繼承關係:GenericServlet繼承了Servlet和ServletConfig介面;HttpServlet繼承了GenericServlet;我們寫的servlet繼承了HttpServlet
七.如何配置一個servlet使它運行
1.servlet的名字,包類
<servlet>
<servlet-name>httpServletDemo(為servlet取的名字)</servlet-name>
<servlet-class>com.lxitedu.HttpServletDemo(包名.類名)</servlet-class>
</servlet>
2.映射.訪問的地址(url)
<servlet-mapping>
<servlet-name>httpServletDemo(與上面的servlet名字要完全一樣)</servlet-name>
<url-pattern>/myServlet(運行時地址欄顯示的檔案名稱)</url-pattern>
</servlet-mapping>
八. Get與post有何區別
1.post比get安全.(get用的問號傳值法)
2.post接收的長度比較長.
3.post是以表單的形式提交請求的,get是以瀏覽器的形式提交請求的。所以get比較快。
4.post更能解決我們的中文亂碼問題。
在預設情況下是get請求,form的method屬性如果不指定,也預設為get請求。
get請求,會將參數顯示在瀏覽器的地址欄上,其顯示格式,在地址之後會以?開始,以'&'分隔參數,可以通過HttpServletRequest()對象的getQueryString()方法來獲得get請求的參數值。
post請求:ServletRequest對象的getInputStream()方法可以獲得一個由Socket得來的輸入資料流,可以使用這個流來實現檔案的上傳。getReader()方法可以直接擷取post請求的參數
九.說說jsp或servlet中有哪幾種跳轉方式。它們有何區別
1.用戶端跳轉:
1).使用form表單的action屬性設定要跳轉的頁面(此方法可以將此頁面的form表單屬性值傳遞到下一頁面):如下
<form action="my.jsp" name="lili" onsubmit="return test()">
<input type="submit" value="提交">
或者(為button類型需要手動提交表單):
<input type="button" value="註冊" onclick="test()">
javascript的函數:
function test(){
//手動設定跳轉頁面
document.lili.action="my1.jsp";
document.lili.submit();
}
2).使用javascript中的頁面跳轉的方法(不能將form表單中的屬性值傳遞到下一頁面):
window.location.href="my.jsp";
window.location.replace("my.jsq");//此方法不可將頁面後退.
2.服務端跳轉的兩種方法對比:
<jsp:forward page="xxx.jsp"/>:等價於
request.getRequestDispatcher("xxx.jsp").forward(request,response);
本伺服器的資源跳轉,效率更高.地址欄不改變(仍為跳轉前的頁面).可得到request屬性值.
response.sendRedirect("xxx.jsp"):
重新導向到任意資源.地址欄改為當前頁面.無法得到request屬性值.
十.servlet中的資料能與jsp共用嗎?如果可以如何傳遞
能,我們可以將servlet中的資料放入HttpSession,HttpServletRequest,ServletContext,PageContext對象中,
在jsp頁面中使用其相對應的內建對象得到我們servlet中的資料.