一.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提供了使用容器服務的若干重要對象和方法。
ServletContext接口:是Servlet的上下文對象,這個對象是在服務器啟動時創建的,為servlet提供了使用容器服務的若干重要方法。
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中的數據.
作者“風漂雨落”