1)會(huì)話管理: 管理瀏覽器和服務(wù)器之間的會(huì)話過(guò)程中產(chǎn)生的會(huì)話數(shù)據(jù)
2)Cookie技術(shù): 會(huì)話數(shù)據(jù)保存在瀏覽器客戶端。
Cookie核心的API:
2.1 在服務(wù)器端創(chuàng)建Cookie對(duì)象
Cookeie cookie = new Cookie("name","value");
2.2 把cookie發(fā)送給瀏覽器端(通過(guò)響應(yīng)頭:set-cookie)
response.addCookie(cookie);
2.3 瀏覽器帶著cookie信息訪問(wèn)服務(wù)器(通過(guò)請(qǐng)求頭:cookie),服務(wù)器得到cookie信息
Cookie[] cookies = request.getCookies();
局限:
1)只能保存字符串類型,不能保存中文
2)一個(gè)cookie不能超過(guò)4kb
3)Session技術(shù):會(huì)話數(shù)據(jù)保存在服務(wù)器端。(內(nèi)存)
Session核心的API:
3.1 創(chuàng)建或得到session對(duì)象
HttpSession session = request.getSession(); //創(chuàng)建或得到session對(duì)象
request.getSession(false); //得到session對(duì)象
3.2 會(huì)話數(shù)據(jù)保存session對(duì)象中,和得到會(huì)話數(shù)據(jù)
session.setAttribute("name",Object); 保存數(shù)據(jù)
session.getAttribute("name") 得到數(shù)據(jù)
注意:
1)session.setIntactiveInterval(時(shí)間); 設(shè)置session過(guò)期時(shí)間
2)session.invalidate() 手動(dòng)銷毀session對(duì)象
用戶登錄場(chǎng)景
通訊錄程序
軟件的生命周期
功能分析:
1)添加聯(lián)系人
2)修改聯(lián)系人
3)刪除聯(lián)系人
4)查詢所有聯(lián)系人
功能流轉(zhuǎn)
美工設(shè)計(jì): 設(shè)計(jì)軟件的靜態(tài)原型
1)設(shè)計(jì)實(shí)體(抽象實(shí)體)
聯(lián)系人實(shí)體:
class Contact{
private String id;
private String name;
private String gender;
private int age;
private String phone;
private String email;
private String qq;
}
2)設(shè)計(jì)"數(shù)據(jù)庫(kù)",(xml代替"數(shù)據(jù)庫(kù)")
contact.xml
<contactList>
<contact id="1">
<name>張三</name>
<gender>男</gender>
<age>20</age>
<phone>13433334444</phone>
<email>zs@qq.com</email>
<qq>43222222<qq>
</contact>
</contactList>
3)設(shè)計(jì)涉及的接口
DAO接口(數(shù)據(jù)訪問(wèn)對(duì)象):實(shí)體對(duì)象的CRUD方法。
項(xiàng)目原則: 通常一個(gè)實(shí)體對(duì)象就會(huì)對(duì)應(yīng)一個(gè)DAO接口和一個(gè)DAO實(shí)現(xiàn)類
interface ContactDao{
public void addContact(Contact contact);//添加聯(lián)系人
public void updateContact(Contact contact);//修改聯(lián)系人
public void deleteContact(String id);//刪除聯(lián)系人
public List<Contact> findAll(); //查詢所有聯(lián)系人
public Contact findById(String id);//根據(jù)編號(hào)查詢聯(lián)系人
}
4)設(shè)計(jì)項(xiàng)目的目錄結(jié)構(gòu)
項(xiàng)目名稱: contactSys_web
目錄結(jié)構(gòu):
|- contactSys_web
|-src
|-gz.itcast.contactSys_web.entity : 存放實(shí)體對(duì)象
|-gz.itcast.contactSys_web.dao : 存放dao的接口
|-gz.itcast.contactSys_web.dao.impl: 存放dao的實(shí)現(xiàn)類
|-gz.itcast.contactSys_web.servlet: 存放servlet的類
|-gz.itcast.contactSys_web.test: 存放單元測(cè)試類
|-gz.itcast.contactSys_web.util: 存放工具類
|-gz.itcast.contactSys_web.exception: 存放自定義異常類
|-WebRoot
|-html文件
|-images:目錄。存放圖片資源
|-css:目錄。存放css資源
|-js:目錄。存放js資源
開發(fā)順序:
設(shè)計(jì)數(shù)據(jù)庫(kù)-> 實(shí)體 -> DAO接口,DAO實(shí)現(xiàn)-> Servlet+html頁(yè)面
Servlet的作用: 用java語(yǔ)言開發(fā)動(dòng)態(tài)資源的技術(shù)!!!
Jsp的作用:用java語(yǔ)言(+html語(yǔ)言)開發(fā)動(dòng)態(tài)資源的技術(shù)!!!
Jsp就是servlet!!!
1)jsp的運(yùn)行必須交給tomcat服務(wù)器!!!!
tomcat的work目錄: tomcat服務(wù)器存放jsp運(yùn)行時(shí)的臨時(shí)文件
2)jsp頁(yè)面既可以寫html代碼,也可以寫java代碼。
(html頁(yè)面不能寫java代碼 。而jsp頁(yè)面可以寫java代碼)
需求:顯示當(dāng)前時(shí)間到瀏覽器上
可以把jsp頁(yè)面當(dāng)做html頁(yè)面在tomcat中訪問(wèn)!!!
問(wèn)題: 訪問(wèn)http://localhost:8080/day12/01.hello.jsp 如何顯示效果?
1)訪問(wèn)到01.hello.jsp頁(yè)面,tomcat掃描到j(luò)sp文件,在%tomcat%/work把jsp文件翻譯成java源文件
(01.hello.jsp -> _01_hello_jsp.java) (翻譯)
2)tomcat服務(wù)器把java源文件編譯成class字節(jié)碼文件 (編譯)
(_01_hello_jsp.java -> _01_hello_jsp.class)
3)tomcat服務(wù)器構(gòu)造_01_hello_jsp類對(duì)象
4)tomcat服務(wù)器調(diào)用_01_hello_jsp類里面方法,返回內(nèi)容顯示到瀏覽器。
第一次訪問(wèn)jsp:
走(1)(2)(3)(4)
第n次訪問(wèn)jsp:
走(4)
注意:
1)jsp文件修改了或jsp的臨時(shí)文件被刪除了,要重新走翻譯(1)和編譯(2)的過(guò)程
問(wèn)題: 為什么Jsp就是servlet!!!
jsp翻譯的java文件:
public final class _01_hello_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
HttpJspBase類:
public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage {
結(jié)論: Jsp就是一個(gè)servlet程序!!!
servlet的技術(shù)可以用在jsp程序中
jsp的技術(shù)并不是全部適用于servlet程序!
Servlet的生命周期:
1)構(gòu)造方法(第1次訪問(wèn))
2)init方法(第1次訪問(wèn))
3)service方法
4)destroy方法
Jsp的生命周期
1)翻譯: jsp->java文件
2)編譯: java文件->class文件(servlet程序)
3)構(gòu)造方法(第1次訪問(wèn))
4)init方法(第1次訪問(wèn)):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()
jsp頁(yè)面中的html代碼就是jsp的模板
語(yǔ)法:<%=變量或表達(dá)式%>
作用: 向?yàn)g覽器輸出變量的值或表達(dá)式計(jì)算的結(jié)果
注意:
1)表達(dá)式的原理就是翻譯成out.print("變量" );通過(guò)該方法向?yàn)g覽器寫出內(nèi)容
2)表達(dá)式后面不需要帶分號(hào)結(jié)束。
語(yǔ)法:<%java代碼 %>
作用: 執(zhí)行java代碼
注意:
1)原理把腳本中java代碼原封不動(dòng)拷貝到_jspService方法中執(zhí)行。
語(yǔ)法:<%! 變量或方法 %>
作用: 聲明jsp的變量或方法
注意:
1)變量翻譯成成員變量,方法翻譯成成員方法。
語(yǔ)法: <%!-- jsp注釋 --%>
注意;
1)html的注釋會(huì)被翻譯和執(zhí)行。而jsp的注釋不能被翻譯和執(zhí)行。
作用: 在當(dāng)前頁(yè)面用于包含其他頁(yè)面
語(yǔ)法: <%@include file="common/header.jsp"%>
注意:
1)原理是把被包含的頁(yè)面(header.jsp)的內(nèi)容翻譯到包含頁(yè)面(index.jsp)中,合并成翻譯成一個(gè)java源文件,再編譯運(yùn)行!!,這種包含叫靜態(tài)包含(源碼包含)
2)如果使用靜態(tài)包含,被包含頁(yè)面中不需要出現(xiàn)全局的html標(biāo)簽了!!!(如html、head、body)
6.2 page指令
作用: 告訴tomcat服務(wù)器如何翻譯jsp文件
<%@ page
language="java" --告訴服務(wù)器使用什么動(dòng)態(tài)語(yǔ)言來(lái)翻譯jsp文件
import="java.util.*" --告訴服務(wù)器java文件使用什么包導(dǎo)入包,多個(gè)包之間用逗號(hào)分割
pageEncoding="utf-8" --告訴服務(wù)器使用什么編碼翻譯jsp文件(成java文件)
contentType="text/html; charset=utf-8" 服務(wù)器發(fā)送瀏覽器的數(shù)據(jù)類型和內(nèi)容編碼
注意:在開發(fā)工具中,以后只需要設(shè)置pageEncoding即可解決中文亂碼問(wèn)題
errorPage="error.jsp"
isErrorPage="false"
buffer="8kb"
session="true"
isELIgnored="false"
%>
1)編碼實(shí)戰(zhàn):
1.1 servlet應(yīng)用
1.2 初步了解軟件開發(fā)流程
2)Jsp基礎(chǔ)
2.1 Jsp的執(zhí)行原理(翻譯-》編譯-》servlet的生命周期)
2.2 語(yǔ)法(jsp表達(dá)式,jsp腳本)
2.3 指令
include指令
page指令
SP技術(shù)
題量: 15 滿分: 100
作答時(shí)間:11-01 22:20至
重做
100分
一. 單選題(共8題,52.8分)
1.JSP文件在第一次運(yùn)行的時(shí)候被JSP引擎編譯為( )文件
A. Servlet
B. Class
C. HTML
D. XML
我的答案: A正確答案: A
2.page指令的屬性中可以多次設(shè)計(jì)的屬性是( )
A. import
B. session
C. extends
D. info
我的答案: A正確答案: A
3.在JSP頁(yè)面中,能夠完成輸出操作的內(nèi)置對(duì)象是( )
A. out
B. response
C. request
D. config
我的答案: A正確答案: A
4. 在JSP中,若要在JSP正確使用標(biāo)簽:<x:getKing/>,在jsp中聲明的taglib
指令為:<%@taglib uri = “/WEB-INF/myTags.tld” prefix = “( )”%>,
下劃線處應(yīng)該是
A. x
B. getKing
C. myTags
D. king
我的答案: A正確答案: A
5.某JSP中有如下代碼,顯示結(jié)果為( )
<%
int a = 5;
request.setAttribute(“a”,”123”);
session.setAttribute(“a”,”456”);
%>
<c:out value="${a}"/>
A. 5
B. 123
C. 456
D. null
我的答案: B正確答案: B
6.要在jsp中使用ArrayList,做法正確的是( )
A. <% import java.util.ArrayList%>
B. <%@ import "java.util.ArrayList"%>
C. %@ page import="java.util.ArrayList"%>
D. <%@ page package="java.util.ArrayList"%>
我的答案: C正確答案: C
7.下面關(guān)于JSP作用域?qū)ο蟮恼f(shuō)法錯(cuò)誤的是( )
A. request對(duì)象可以得到請(qǐng)求中的參數(shù)
B. session對(duì)象可以保存用戶信息
C. application對(duì)象可以被多個(gè)應(yīng)用共享
D. 作用域范圍從小到達(dá)是request、session、application
我的答案: C正確答案: C
8.在JSP頁(yè)面中,保存數(shù)據(jù)的范圍由小到大依次是( )
A. pageContext,request,application,session
B. pageContext,application,session,request
C. pageContext,request,session,application
D. pageContext,session,request,application
我的答案: C正確答案: C
二. 多選題(共2題,13.2分)
9.Servlet與JSP的區(qū)別是( )
A. 性能更強(qiáng)
B. 編程方式不同
C. 運(yùn)行速度不同
D. 編譯順序不同
我的答案: BCD正確答案: BCD
10.在a.jsp中有代碼片斷如下:
<form action =”b.jsp” method =”POST”name=”form1”>
loginName:<input type=”text”name=”loginName”/>
<input type=”submit” name=”submit”/>
</form>
在b.jsp中加入下列( )代碼,可以輸出在a.jsp頁(yè)面上輸入的loginName的值
A. <%=request.getParameter(“l(fā)oginName”)%>
B. <%=request.gerAttribute(“l(fā)oginName”)%>
C. <%Stringname=request.getParameter(“l(fā)oginname”);
out.println(name); %>
D. <% Stringname=request.getAttribute(“l(fā)oginname”);
out.println(name); %>
我的答案: AC正確答案: AC
三. 判斷題(共5題,34分)
11.JSP頁(yè)面是采用JavaScript語(yǔ)言實(shí)現(xiàn)在服務(wù)端代碼。
A. 對(duì)
B. 錯(cuò)
我的答案: 錯(cuò)正確答案: 錯(cuò)
12<jsp:forward ... >標(biāo)記的page屬性值是相對(duì)的URL地址,只能靜態(tài)的URL。
A. 對(duì)
B. 錯(cuò)
我的答案: 錯(cuò)正確答案: 錯(cuò)
13.JSP代碼可以直接執(zhí)行,所以不會(huì)被翻譯成JAVA代碼。
A. 對(duì)
B. 錯(cuò)
我的答案: 錯(cuò)正確答案: 錯(cuò)
14.JSP頁(yè)面中不能包含腳本元素。
A. 對(duì)
B. 錯(cuò)
我的答案: 錯(cuò)正確答案: 錯(cuò)
15.JSP中Java表達(dá)式的值由服務(wù)器負(fù)責(zé)計(jì)算,并將計(jì)算值按字符串發(fā)送給客戶端顯示。
A. 對(duì)
B. 錯(cuò)
我的答案: 對(duì)正確答案: 對(duì)
SP的工作模式是請(qǐng)求/響應(yīng)模式,客戶端首先發(fā)出HTTP請(qǐng)求,JSP程序收到請(qǐng)求后將進(jìn)行處理并返回處理結(jié)果。在一個(gè)JSP文件第一次被請(qǐng)求的時(shí)候,JSP引擎(容器)把該JSP文件轉(zhuǎn)換成一個(gè)Servlet,而這個(gè)引擎本身也是一個(gè)Servlet。JSP的運(yùn)行原理如圖11-4所示。
圖11-4 JSP的運(yùn)行原理
JSP的運(yùn)行過(guò)程具體如下。
(1)客戶端發(fā)出請(qǐng)求,請(qǐng)求訪問(wèn)JSP文件。
(2)JSP容器先將JSP文件轉(zhuǎn)換成一個(gè)Java源文件(Java Servlet源程序),在轉(zhuǎn)換過(guò)程中,如果發(fā)現(xiàn)JSP文件中存在任何語(yǔ)法錯(cuò)誤,則中斷轉(zhuǎn)換過(guò)程,并向服務(wù)端和客戶端返回出錯(cuò)信息。
(3)如果轉(zhuǎn)換成功,則JSP容器會(huì)將生成的Java源文件編譯成相應(yīng)的字節(jié)碼文件*.class。該class文件就是一個(gè)Servlet,Servlet容器會(huì)像處理其他Servlet一樣處理它。
(4)由Servlet容器加載轉(zhuǎn)換后的Servlet類(class文件)創(chuàng)建一個(gè)該Servlet(JSP頁(yè)面的轉(zhuǎn)換結(jié)果)的實(shí)例,并執(zhí)行Servlet的jspInit()方法。jsInit()方法在Servlet的整個(gè)生命周期中只會(huì)執(zhí)行一次。
(5)執(zhí)行jspService()方法處理客戶端的請(qǐng)求。對(duì)于每一個(gè)請(qǐng)求,JSP容器都會(huì)創(chuàng)建一個(gè)新的線程處理它。如果多個(gè)客戶端同時(shí)請(qǐng)求該JSP文件,則JSP容器會(huì)創(chuàng)建多個(gè)線程,使每一個(gè)客戶端請(qǐng)求都對(duì)應(yīng)一個(gè)線程。
(6)如果JSP文件被修改了,則服務(wù)器將根據(jù)設(shè)置決定是否對(duì)該文件重新進(jìn)行編譯,如果需要重新編譯,則使用重新編譯后的結(jié)果取代內(nèi)存中的Servlet,并繼續(xù)上述處理過(guò)程。需要注意的是,雖然JSP效率很高,但在第一次調(diào)用時(shí)往往由于需要轉(zhuǎn)換和編譯,所以會(huì)產(chǎn)生一些輕微的延遲。
(7)如果系統(tǒng)出現(xiàn)資源不足等問(wèn)題,JSP容器可能會(huì)以某種不確定的方式將Servlet從內(nèi)存中移除,發(fā)生這種情況的時(shí)候,首先會(huì)調(diào)用jspDestroy()方法,然后Servlet實(shí)例會(huì)被作為“垃圾”進(jìn)行處理。
(8)當(dāng)請(qǐng)求處理完成后,響應(yīng)對(duì)象由JSP容器接收,并將HTML格式的響應(yīng)信息發(fā)送回客戶端。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。