Java Web

第一章:JSP簡介

   WWW服務具有的特點:

  • 以超文本,超媒體的方式組織網絡內的消息資源
  • 用戶可以通過WWW瀏覽器獲取Internet上任意網址的信息
  • 提供直觀,易於使用的圖形用戶界面

         WWW服務的核心技術是超文本語言HTML,信息資源的統一定位格式URL和超文本傳送協議HTTP

 

後綴名爲htm或者html的網頁時靜態網頁,其不足:

  • 不能及時更新信息,頁面上提供的內容都是一成不變的
  • 當需要修改或者添加新的信息時,必須重寫HTML文件,缺乏擴展性
  • 不能根據用戶的需求提供不同的信息,不能滿足多樣性的需求

HTML語言由一系列標記組成的,所有標記都必須用角括號"<"和“>"括起來。大部分標記都是成對出現的,包括開始標記和結束標記。同時每個標記包含若干個屬性來定製網頁。例如標記<font size="12" coler="red">......</font>,其中<font>是開始標記,</font>是結束標記,而size和color是font標記的屬性。

HTML對大小是不敏感的<html>和<HTML>是一樣的,建議用小寫。

<head>和<body>標記是互相獨立的標記,不能嵌套使用。

HTML中,大部分標記的屬性都可以分爲可選屬性,標準屬性和事件屬性3類

文字內容通常被直接寫在標記中,一個空格符號使用一個”&nbsp”表示,特殊字符用”&。。。”表示

文字標題標記<h>,從<h1>到<h6>文字的字體大小依次遞減,每個標題標記所標記的文字將獨佔一行且上下均留一行空白,aligh屬性用於定義標題的對齊方式。

註釋標記:<comment>註釋內容</comment>,       ,        , <!--註釋內容-->

CSS彌補HTML的不足,使HTML頁面更美觀:

  • 將顯示格式和文檔結構分離
  • 彌補HTML在顯示屬性設定上的不足,如字體,段落間隔。。。
  • 使網址的體積更小,網頁的下載速度更快
  • 實現網頁的動態更新。可以通過簡單地更改CSS文件,改變網頁的整體表現形式,減少工作量

動態網頁技術

        常用的動態網頁技術有ASP,PHP和JSP

        JSP特點:

     1.將內容的生成和顯示進行分離

     2.強調可重用的組件

     3.一次編寫,各處運行

     4.移植性強

     5.多樣化和功能強大的開發工具支持

WWW服務的概念及WWW服務的工作原理:C/S模式

靜態網頁與動態網頁的區別:是否在服務器端執行

HTML通過<form></form>標記對實現動態功能

JSP頁面結構:HTML語言中嵌入java代碼

JSP執行的過程和基本原理:JSP頁面先被轉化爲Servlet代碼,然後被編譯成class文件,最後加載到內存運行,給客戶端提供服務

第二章:搭建JSP運行環境

       安裝和配置JDK

       下載安裝MyEclipse

        下載安裝Tomcat

       安裝配置MySQL

第三章:JSP基本語法

      面向對象程序設計有3大特徵:封裝,繼承,多態

輸出註釋<!--comment [ <%= expression %> ] -->

隱藏註釋<%--comment--%>

在JSP的page指令中,除了import屬性能多次出現之外,其他的page指令所定義的屬性都只能出現一次,import導入需要使用的包或類

與Java類似,在默認情況下,JSP頁面會自動導入一些常用的包:java.lang.*;javax.servlet.*;javax.servlet.jsp;javax.servlet.http.*

buffer(輸出流的緩衝模式)屬性與autoflash(緩衝已滿是,是否刷新緩衝區)屬性通常放在一起使用,而且當buffer屬性設置爲none時,不能將autoflash屬性設置爲false

Servlet採用ThreadSafe機制來控制多線程的處理,當Servlet需要同時處理多個用戶的請求時,並不會創建新的進程,而只是在當前的Servlet進程中創建一個新的線程來處理客戶端的請求,這樣可以減少同時運行的進程數,從而減輕服務器端的壓力。

通常我們不建議使用extends屬性,因爲JSP容器會自動提供轉換後的servlet類的父類,默認的父類是HttpJspBase類,而且使用extends屬性可能會影響JSP容器的性能

file屬性指定的相對路徑如果以”/"開頭,則表示使用的將是相對於JSP服務器應用的根目錄的路徑;如果直接使用文件名或“文件夾/文件名”的形式,則表示使用的是相對於當前JSP頁面文件所在的目錄

     表達式<%=expression %>

    scriptlet 腳本程序<% code fragment %>        在scriptlet的語法式中,並沒有等號的出現,而且,scriptlet中的java代碼,都是需要分號作爲結束符的,這是與表達式的一個重要區別。

      一個scriptlet能夠包含多個Java語句,包括方法,變量等內容。

  • 聲明將要用到的變量或方法
  • 編寫JSP表達式
  • 使用任何隱含的對象和任何用<jsp:useBean>聲明過得對象
  • 編寫Java程序語句

由於scriptlet中包含的是Java程序代碼段,所以其他任何文本,HTML標記,JSP元素都必須編寫在scriptlet之外。

JSP中的聲明:  <%! declaration; [ declartion; ]+... %>

一次性聲明多個變量和方法,只要以“ ;”(分號)結尾就可以

這些聲明,它們只在網頁被加載時被計算一次。這一點就像在Visual C++中創建一個類並定義變量的初始化值,所以,無論如何加載頁面,執行結果都是相同的

一個聲明僅在一個頁面中有效,如果有多個頁面都需要用到同樣的聲明,最好把它們寫成一個單獨的文件,然後用<%@ include %>或<jsp:include>元素包含進來,實現代碼的複用

當我們使用標準動作元素時,格式裏的前綴應該使用"jsp"

<jsp:param>動作是用來追加參數的標記。通常,在單獨使用<jsp:param>動作時,是沒有任何意義的,而且編譯器在編譯JSP頁面時將會出錯並提示你應該將<jsp:param>動作與<jsp:include>或<jsp:forward>等動作一起使用

 include指令和include動作的區別,通過指令元素與動作元素的區別可以得出:include指令靜態地引用其他文件的內容,組合成一個新的文件,然後在編譯時一起被編譯;而include動作則是動態地引用其他文件,在運行時纔會進行引用

     <jsp:include>動作通常與<jsp:param>動作一起使用,但是隻有當<jsp:include>動作引用動態文件時,才需要通過<jsp:param>動作傳遞參數及其值

     <jsp:forward>動作用來重定向頁面,即允許將請求發送到另一個JSP頁面,Servlet或一靜態資源文件

     <jsp:forward  page=" ... " />page屬性用來定位將要跳轉的頁面的相對路徑

<jsp:useBean>中的scope取值範圍page,request,session,application

由於application對象是在應用服務器啓動時創建的,且直到應用服務器被關閉才銷燬,因此當scope屬性的取值爲application時,該JavaBean對象應該存在於整個application的生命週期中,任何共享一個application的JSP頁面均能使用該JavaBean

      雖然在JSP頁面的表單中傳遞的參數的數據類型都是String型的,但是在使用<jsp:setProperty>動作中的property屬性時,JSP的內在機制會將String型的參數轉化爲與JavaBean中的屬性相對應的數據類型。。。當JavaBean中的屬性爲基本數據類型時,<jsp:getProperty/>動作將其轉化爲String類型的值

      <jsp:plugin>動作用來在JSP頁面中加載Java小程序,並在客戶端的瀏覽器產生特殊標籤,例如<object>或<embed>標籤

 

JSP頁面的基本組成內容包括JSP的註釋,腳本元素,指令元素和動作元素

page指令用來定義JSP頁面的全局屬性,我們通常將其放在JSP頁面的源代碼首部

include指令用來在使用該指令的地方靜態地引用其他文件的內容

taglib指令用來指定頁面定義一個標記庫和自定義標籤的前綴

JSP中的動作元素包括自定義動作元素和標準動作元素

<jsp:param>動作用來追加參數

<jsp:include>動作用來在JSP頁面的動態地包含其他的文件

<jsp:forward>動作用來重定向頁面

<jsp:useBean>動作用來在JSP頁面中創建並使用一個JavaBean,同時指定它的名字和作用範圍

<jsp:setProperty>動作用來設置JavaBean的簡單屬性和索引屬性

<jsp:getProperty/>動作用與<jsp:setProperty/>動作相對應,用來獲取一個JavaBean中的各屬性值

<jsp:plugin>動作用來在JSP頁面中加載Java小程序

<jsp:fallback>動作用來在Java插件無法正常啓動時,向客戶端顯示一段提示性文字內容

<jsp:fallback>動作必須與<jsp:plugin>動作一起使用

JSP頁面是在頁面被編譯時起作用,而JSP動作元素則是在頁面請求的處理階段才起作用,它將影響JSP頁面的運行時的功能

第四章:JSP的內置對象

Web交互的最基本單位爲HTTP請求。每個用戶從進入網站到離開網站這段過程稱爲一個HTTP會話,一個服務器的運行過程中會有多個用戶訪問,就是多個HTTP會話。作用域如下:

  • application:服務器啓動到停止這段時間
  • session:HTTP會話開始到結束這段時間
  • request:HTTP請求開始到結束這段時間
  • page:當前頁面從打開到關閉這段時間

在JSP服務器的運行過程中,僅有一個application對象,application對象是由服務器創建的,由服務器自動清除它,不能被用戶創建,用戶也不能清除application對象,我們只能創建這個application對象的同步副本。application就是由JSP引擎自動創建的第一個application對象的同步副本。特別需要注意的是這些副本是同步的,任何一個副本上發生的變化都會影響到其他的副本

setAttribute()方法把參數和對象綁定在一起,getAttribute()和getAttributeNames()方法獲取它們的值

application對象和session對象並非不能被創建,但是,它們只能由JSP引擎自動創建。application對象在服務器啓動時被創建,在服務器關閉時被刪除,session對象在新的HTTP連接產生時被創建,在HTTP連接中斷或者超時的時候被刪除,同時,JSP程序員也可以調用invalidate()方法強行刪除session對象,中斷HTTP連接,這是application對象和session對象的不同點之一

      能夠和application對象或者session對象綁定的只能夠是Java對象,如String,Integer,Vector等,而不能是普通的數據類型,如int,double,float等,如果真的需要將它們綁定到application對象或者session對象上,那麼它們必須首先轉化爲相應的Java對象

  • application對象用於在多個程序中保存信息,用來在多個程序中共享信息,並在Web應用程序運行期間持久地保持數據
  • session對象用於分別保存每一個用戶信息的對象,以便於跟蹤用戶的操作狀態。注意,不同的用戶對應的session對象是不同的
  • request對象用於接收所有從瀏覽器發送到服務器的請求內的所有信息
  • page對象代表JSP對象本身,或者說代表編譯後的servlet對象
  • config對象用於配置處理JSP程序的句柄,而且只在JSP頁面範圍內合法
  • exception對象代表JSP應用中的錯誤對象,只有在JSP頁面的page指令中指定isErrorPage=true後,纔可以在本頁面中使用exception對象
  • out對象用於向客戶端輸出數據
  • respose對象的作用是處理HTTP連接信息,如cookie,HTTP文件頭信息等,它有很多功能和request對象相匹配
  • pageContext對象用於管理屬於JSP中特殊可見部分中的已經命名對象的訪問。它是JSP內置對象中的集成者

第五章:使用JDBC連接數據庫

      關係的結構加上域的說明,以及對取值的所有約束,統稱爲關係的內涵(intension),它通常是固定的。除非關係的意義發生變化,需要加入新的屬性。元組稱爲關係的外延(extension)或狀態(state),它通常會發生改變

       一個關係通常具有如下性質:

  • 有一個唯一的關係名稱
  • 關係中的每一個單元格都包含且僅包含一個單一值
  • 每個屬性都有一個唯一的名稱
  • 同一屬性中的各個值都取自相同的域
  • 各個元組互不相同,即不存在重複元組
  • 屬性的順序並不影響關係
  • 理論上來說,元組的順序並不重要。但實際上,這個順序會影響對元組的訪問效率

     爲什麼在有了關係表之後,還要引進視圖的概念呢?這是因爲視圖能爲我們提供以下用途:

  • 提供對特殊用戶隱藏部分數據庫信息,提供一個強大而靈活的安全機制
  • 允許用戶根據自己的需要自定義訪問數據的方法,因此不同的用戶可以通過不同的路徑同時看到相同的數據信息
  • 可以簡化用戶對基本關係的複雜操作

      SQL語言包括以下幾個部分:

  • 數據定義語言。提供定義關係模式,刪除關係及修補關係模式的命令
  • 交互式數據操縱語言。包括基於關係代數和元組關係演算的查詢語言,還包括在數據庫中插入,刪除和修改元組的命令
  • 完整性。包括定義保存在數據庫中的數據必須滿足的完整性約束條件的命令。破壞完整性約束條件的更新操作都將被禁止
  • 視圖定義。包括定義視圖的命令
  • 事務控制。提供定義事務的開始和結束的命令
  • 嵌入式SQL和動態SQL。將SQL語句嵌入到通用或高級編程語言中
  • 授權。包括說明對關係和視圖的訪問權限的命令

   MySQL語句的一些特性:

  • 一條命令通常由SQL語句組成,以分號結束(有些特例不需要分號結束,例如QUIT命令)
  • MySQL將命令發送給服務器,隨後顯示結果,同時準備接收新的命令
  • MySQL通常以一張表格來顯示輸出結果。第一行包含列標籤,隨後的行即爲輸出結果。通常列標籤是數據庫表中列的名稱,但是當查詢請求是一個表達式而非表的列值,那麼MySQL將使用表達式本身作爲列的標籤
  • MySQL每次輸出結果時都會顯示有多少個元組被返回,以及查詢所消耗的時間值。但是由於它表示時鐘時間,而不是CPU或機器時間,並且可能受到諸如服務器和網絡延時的影響,所以這個值是不精確de

一些字段屬性的說明:

  • 如果不爲某一字段指定null或not null的完整性的約束說明,那麼它將被默認爲null
  • 如果一個字段的數據類型爲整型,那麼可以爲其加上auto_increment的附加屬性。在進行值的插入操作時,可以不指定該列所對應的值,或者可以指定爲null或0,其自動被賦予當前該列的最大值value再加1的值。需要注意的是,每個數據表中,都只能有一個auto_increment的列,而且它必須被索引。同時MySQL爲了與一些ODBC或JDBC應用程序兼容,可以認爲最後插入的元組的auto_increment列值爲null,並且可以通過下面的語句對其進行查詢:select * from tbl_name where auto_col is null
  • 當列的數據類型爲TIMESTAMP時,對null值的處理與其他數據類型不同。無論你對該列賦予null或not null的完整性約束說明,都將被忽視。如果將該列設爲null,那麼MySQL自動將其轉化爲當前的日期和時間。在對該列進行賦值時,如果賦予了null值,雖然MySQL服務器不會提示非法錯誤的信息,但實際上TIMESTAMP是不可能包含一個null值的。但是,你可以爲該列賦0值,因爲0是一個有效的TIMESTAMP值
  • 如果沒有爲列指定default值,那麼MySQL將自動爲其分配。如果其數據類型允許它取值爲null,那麼該列的默認值則爲null。如果該列已被聲明爲not null,那麼其默認值則需要取決於它的數據類型:1.如果該字段是數字類型,且沒有聲明附加屬性auto_increment,那麼其默認值爲0.如果聲明瞭auto_increment附加屬性,那麼其默認值是自增序列中的下一個值  2.日期和時間類型中,除TIMESTAMP外,其默認值均爲該類型適當的零值。而對於TIMESTAMP類型,其默認值則爲當前的日期和時間
  • 字符串類型中,除ENUM外,其默認值均爲空字符串。而ENUM類型的默認值則是第一個枚舉值
  • key是index的一個同義詞,在MySQL中發揮同樣的作用
  • primary key(主鍵)可以是一個多列索引,但是所有的主鍵列都必須被定義爲not null,且一個表只能有一個主鍵 

 JDBC中的url要與各種不同的驅動程序一起使用,因此關於它的約定非常靈活:

  • 允許不同的驅動程序使用不同的方案對數據庫進行命名,例如ODBC子協議允許url中含有屬性值
  • JDBC的url允許開發人員將一切需要的信息加入其中,使得與特定數據庫連接的Applet能夠直接打開數據庫連接,而無須要求用戶去進行任何系統管理操作
  • JDBC的url允許一定程度的間接性,即url指向邏輯主機或數據庫名,而這種邏輯主機或數據庫名將由網絡命名系統動態地轉換爲 實際的名稱。使得系統管理員不必將特定主機聲明爲JDBC名稱的一部分

Absolute()方法中的int型參數row可以爲正數或負數

  • 爲正數時:從記錄的第一條數據開始移動指定的個數
  • 爲負數時:則表示倒數,從最後一條數據向前進行移動

通過JSP對數據庫進行連接訪問及操作的一般步驟:

  • 導入java.sql包。java.sql包中包含了Java語言中提供的所有與數據庫相關的對象及其方法,並且包含了使用Java語言操作數據庫的類和接口
  • 加載JDBC驅動程序。在這裏我們通過使用Class.forName()方法顯示地加載指定的JDBC驅動程序,這種方式與外部數據庫設置無關
  • 指定數據庫的連接所需信息。數據庫的url對象與網絡資源的統一定位方式類似。另外,根據需要,指定適當的數據庫用戶名和密碼的信息
  • 建立與數據庫的連接。在創建數據庫連接時,首先需要提供數據庫的url地址和JDBC的驅動程序類型,然後通過DriverManager類的getConnection()方法建立連接
  • 對數據庫進行訪問及操作。使用Connection類的creatStatement()方法從指定的數據庫連接得到一個Statement類的實例對象,再通過這個實例對象來執行指定的SQL語句
  • 關閉數據庫的連接。這一步至關重要,在數據庫的訪問結束後,需要及時關閉數據庫的連接,釋放其所佔的資源

 

  • 一個典型的關係型數據庫通常由一個或多個被稱爲表的對象組成,數據庫中的所有數據或信息都被保存在這些數據庫表中。關係型數據庫是具有不同關係名稱的規範化關係的一個集合
  • 關係數據庫中的基本概念:表,屬性,域,元組,維和基數等
  • 大部分數據庫系統通常提供兩類數據庫語言:數據定義語言和數據操縱語言
  • SQL語言集數據定義語言DDL,數據操縱語言DML,數據控制語言DCL等功能於一體,語言風格統一
  • MySQL數據庫的相關管理操作。MySQL數據庫中的數據庫類型和語言規範基本符合ANSI/ISOSQL92規範
  • JDBC主要包括3個部分:Connection(連接),Statement(語句)和ResultSet(結果集)
  • JDBC提供4類驅動程序:JDBC-ODBC橋驅動,JDBC-Native橋驅動,JDBC-Net橋驅動和Pure Java JDBC驅動
  • JDBC連接數據庫的基本步驟爲:1.導入java.sql包 2.加載JDBC驅動程序 3.指定數據庫的連接所需信息 4.建立與數據庫的連接 5.對數據庫進行訪問與操作 5.關閉數據庫連接

第六章:JSP與JavaBean

      JavaBean組件與EJB(企業級JavaBean)組件是完全不同的兩個概念。EJB是J2EE的核心技術,是一個用來創建分佈式,服務器端及基於Java的企業級應用程序組件的功能強大的組件模型

      JavaBean組件模型通常由3部分組成:方法,屬性及事件

      JavaBean的一些基本特性:

  • 沒有參數的構造函數:JavaBean類必須有一個公有的而且不具有參數的構造函數,這個構造函數將在使用<jsp:useBean>標籤進行實例化JavaBean類的時候被調用。如果一個JavaBean類中沒有任何構造函數,系統會默認自動生成一個沒有參數的構造函數
  • 私有的屬性:將屬性都定義爲私有的,是一種良好的編程習慣,因爲這樣能夠使得這些屬性都只能通過JavaBean中提供的方法進行間接訪問或修改,較好地保證數據的完整性和封裝性,也利於對某些數據進行約束,當然,這不是強制性的
  • 操作屬性值的get/set方法:每一個屬性均有其對應的get()方法和set()方法,來設置或獲取屬性的值
  • 支持自檢:就是提供一種方法來獲得該組件的內部信息,JavaBean API提供了很多用於自檢的工具。通過自檢,應用程序可以查詢一個組件的功能或狀態,然後與該組件進行相應的交互操作。自檢功能是組件模型的一個重要因素,因爲只有這樣才能使得一個組件嚮應用程序及其他組件描述自己的功能
  • 支持定製:不同的用戶對JavaBean組件模型的使用情況也不相同,因此,JavaBean組件模型要允許用戶通過某些工具來定製組件的外觀和行爲操作
  • 支持持久化:組件被用戶定製後,必須要保存其自身狀態
  • 支持屬性:不同的組件模型都有其自身的狀態。JavaBean的屬性其實就是對象的屬性,只是它在此基礎上提供了屬性讀取和設置API的支持。每個屬性都要遵守一定的命名規範,這樣開發工具和使用者可以按照這種規範找出JavaBean中提供的屬性,繼而查詢或修改屬性值。另外,JavaBean能夠對屬性值的更改做出及時的反應
  • 支持分佈式計算:現在,基於互聯網的B/S架構開發越來越被重視,也使得組件模型中支持分佈式計算的要求越來越高
  •  
  • 軟件複用是將已有的軟件及其有效成分用於構造新的軟件或系統。它不僅是對軟件程序的複用,還包括對軟件產生過程中其他勞動成果的複用
  • JavaBean是使用Java語言進行描述的,與平臺無關的軟件組件模型,通常用於設計可複用的組件
  • 從本質上來看,JavaBean其實就是一個遵循了某些命名方法及設計規範的類,並且用來完成特定的功能
  • JavaBean按功能可以分爲可視化JavaBean和非可視化JavaBean
  • JavaBean組件模型通常由3部分組成:方法,屬性及其事件
  • JavaBean的屬性與普通Java程序中所指的屬性是相同的概念,用來表示一些特性,共有4種:簡單屬性,索引屬性,綁定屬性和約束屬性
  • JavaBean中的屬性,都具有其相應的get()方法和set()方法
  • 在JSP頁面中通過<jsp:useBean>動作元素使用JavaBean,通過<jsp:setProperty>動作元素和<jsp:getProperty>動作元素分別設置或獲取JavaBean中的屬性值

第七章:JSP與Servlet

     Servlet的描述:

  • 效率:傳統的CGI對每個HTTP請求都會使用一個新的進程,這樣會花費很大的額外時間,而Servlet,Java虛擬機會一直運行,並用輕量級的Java線程處理每個請求。如果對同一CGI請求多次,則CGI程序代碼會被載入多次,而使用Servlet則將啓動多個線程,僅載入Servlet類的單一副本,減少了服務器對內存的需求
  • 易用:Servlet提供了強大的類庫,可以自動分析解碼HTML的表單數據,讀取和設置HTTP報頭,處理cookie,跟蹤會話。而對於CGI,這類工作大部分需要我們自己來完成。
  • 強大:Servlet能完成CGI不能實現的功能,它能與Web服務器對話,而CGI在不使用專門的API情況下是做不到的。如服務器通信使得將相對URL轉化爲絕對路徑變得更容易,多個Servlet可以共享數據,從而易於實現數據庫連接共享和類似的資源共享
  • 移植性:Servlet是用Java語言編寫的,且遵循標準的API,所有主要的Web服務器實際上直接或通過插件支持Servlet。所以在Apache Tomcat上編寫的Servlet,可以不經任何修改就可以在Macromedia JRun,IBM WebSphere,Oracle9i As等主流Web服務器上運行
  • 廉價:使用Servlet我們可以通過使用免費的服務器開始,如Apache Tomcat。在項目獲得成功後,可以移植到更高性能或高級管理工具的昂貴服務器上。而CGI在初期要購買專門軟件包投入大量的資金

 Servlet是運行在Web服務器上的Java程序,它是一箇中間層,負責連接來自Web瀏覽器或其他HTTP客戶程序的請求與HTTP服務器上的數據庫或應用程序

           service:被Servlet容器調用,用來服務客戶端的請求,Servlet是線性安全的,Servlet容器可以讓多個線程調用同一個Servlet對象實例的service()方法

一般我們不應覆蓋方法service,當Servlet接收到HTTP請求後會調用service方法,service方法檢查HTTP請求的類型(GET,POST,PUT,DELETE)並相應地調用doGet,doPost,doPut,doDelete等方法。GET請求起因於正常的URL請求,或沒有指定METHOD的HTML的HTML表單。POST請求起因於將表單中的METHOD設爲POST。其他請求都可以由表單定製

        Session的默認的超時時間由Servlet容器來定義,而這個值我們可以用上述的方法getMaxInactiveInterval()獲得,也可以通過setMaxInactiveInterval來設置。如果將超時時間設置爲-1,則會話永遠不會超時

           ServletConfig對象和ServletContext對象的區別在於,前者的參數是在Servlet啓動時得到,而後者是在運行時使用

         在Servlet中得到參數的值時其參數名一定要和表單中的參數名一致,否則得不到其參數的值。如表單中name=“name”參數是指等號後面的名字,而不是前面的名字

         <load-on-startup>,此標籤就是標記是否在容器啓動時加載這個servlet。如: <load-on-startup>value</load-on-startup>

當value爲0或者大於0時表示容器在啓動時就應該加載這個Servlet,如<load-on-startup>1</load-on-startup>.如果多個Servlet都有此標籤,則值的大小表示啓動時的優先級,值越小,越先被啓動。如果沒有此標籤或者此值爲負數,則在被請求時才啓動。當容器加載Servlet後就會爲該Servlet創建一個實例

  • Servlet與CGI相比效率更高,更易用,更容易移植,更廉價
  • 與Servlet實現相關的接口和類:Servlet,GenericServlet,HttpServlet
  • 爲了克服HTTP無狀態的缺點,介紹了與會話相關的接口HttpSession的各方法的使用,與上下文相關的ServletContext接口
  • 爲了得到服務器配置信息介紹了ServletConfig接口的使用方法
  • 在介紹了Servlet的類結構後,介紹了Servlet的運行條件,配置部署Servlet的方法
  • 介紹了Servlet的整個生命週期,使用Servlet訪問request對象的方法
  • 最後介紹了MVC架構,並將JSP,Servlet,JavaBean與之對應
  • 應用MVC模式實現了購物車和網上書店的大部分功能

第八章:JSP與XML

W3C是英文World Wide Web Consortium的縮寫,中文意思是W3C理事會或萬維網聯盟。W3C與1994年10月在麻省理工學院計算機科學實驗室成立。創建者是萬維網發明者Tim Berners-Lee。W3C組織是針對網絡標準的一個非盈利組織,像HTML,XHTML,CSS,XML的標準就是由W3C來定製的。W3C會員包括生產技術產品及服務的廠商,內容提供商,團體用戶,研究室,標準制定機構和政府部門,一起協同工作,致力在萬維網發展方向上達成共識

     XML聲明:<?xml version="1.0" encoding="gb2312" standalone="yes"?>

     UTF-8,它是採用一個或幾個字節來表示一個字符。對Unicode字符集中代碼點0~127的字符,UTF-8將該字符編碼爲一個字節,且高位是0,也就是說UTF-8編碼保留ASCII字符的編碼。對Unicode字符集中代碼點爲128~2047d的字符,UTF-8採用2個字節編碼,且高字節以“110”作爲前綴,低字節以“10”作爲前綴。對於Unicode字符集中的其他字符,UTF-8採用3個字節編碼,並且3個字節分別用“110”,“10”和“10”作爲前綴。儘管UTF-8編碼會多佔用一些空間,如一個漢字需要3個字節,但UTF-8很好地解決了國際化問題,能支持多國語言

      <title>JSP開發入行真功夫</title>元素和標籤具有不同的意義,元素是指開始標籤,結束標籤,以及兩者之間的一切內容,包括屬性,文本,子元素,註釋及子元素。標籤是一對角括號(<>)和兩者之間的內容,包括元素名和所有屬性

      屬性和子標籤可以相互轉化,那麼是用屬性還是子標籤呢?屬性不體現數據的結構,只是數據的附加信息,一個信息是否作爲一個元素的屬性或作爲該元素的子元素,取決於具體問題。一個基本原則是:不要因爲屬性的頻繁使用破壞了XML的數據結構

       XML元素的命名規則:

  • 名稱只能以字母,下劃線(_),或者冒號(:),而不能以數字或標點符號開頭
  • 名稱中不能包含空格
  • 如果不是表示名字空間,就不要使用冒號。因爲冒號是在名稱空間中被用於分隔名稱空間前綴和本地部分的
  • 元素的名稱不能以XML(或者xml,Xml,xMl等)開頭,因爲XML字母組合被定爲保留字
  • 名稱中可以包含字母,數字,下劃線及其他在XML中允許的字符
  • 名稱是區分大小寫的

      XML的註釋:<!--......註釋.......-->           註釋中不能有“--”,也不能以“--->"結尾

      CDATA段中包含的但是純字符,它主要用於需要將整個文本解釋爲非標籤的情況下。CDATA段中的任何內容不被XML處理器分析,所以在其中可以包含任意的字符。例如:在XML文檔中,我們需要包含Java代碼或者其他語言的代碼,而代碼中有一些特殊的字符如小於(<),與(&)等。那麼它與註釋有什麼區別呢?當解析器遇到註釋時,解析器會忽視它們,而解析器遇到CDATA時,解析器會認爲它的內容是字符數據,而不是標籤。這樣就不會與其他標籤的起始定界符發生衝突了。

         如字符:&,字符引用(十進制)是&#38,字符引用(十六進制)是&#x26,實體引用是&amp

       當標籤的類名和通用類同名時,標籤使用的是自己標籤定義的類的格式

       XSL中,用<xsl:for-each>或<xsl:apply-templates>元素可以匹配很多節點,如果我們想對它們進行排序,可以使用<xsl:sort>元素。另外,還有一種指定排序的方法,就在<xsl:for-each>元素中加入order-by屬性,如:<xsl:for-each select=“book” order-by=“title”>

      CSS和XSL屬於樣式單的一種,都可以用來設定文檔的外觀,它們的主要區別:

  • 用途不同:CSS最早是針對HTML提出的,後來又將其應用於XML中,它既可以爲HTML文檔中的各個成分設定樣式,也可以爲XML中的成分設定樣式。XSL是專門針對XML提出的,它不能處理HTML文檔。但它有一個CSS無法達到的功能,即用一個命令行將一個XML轉化爲另一個文檔並保存
  • 處理結果不同:XSL採用的是一種轉換的思想,它將一種不含顯示信息的XML文檔轉換爲另一種可以用某種瀏覽器瀏覽的文檔,轉換後的輸出結果或者存爲一個新的文檔,或者暫存於內存中,但都不能修改代碼。而CSS則沒有任何轉換動作,只是針對結構文檔的各個成分,依照樣式規定:設定外觀式樣,再由瀏覽器依據這些式樣顯示文檔,在這個過程中沒有新的代碼的產生
  • 表現能力不同:在XSL中定義的90%的式樣規定,實際上在CSS中都有定義。但仍然有一些效果由CSS無法描述的,必須使用XSL不可。這些功能包括文本的置換,例如將一個美國的時間表示格式轉換爲一箇中國的時間表示格式,根據文本內容決定顯示方式,例如,將60分以上的分數用黑色顯示,60分以下的分數用紅色顯示,將文檔中的成分按照某一個子成分的值進行排序,例如,將書本按其排序。此外,還有對於超級鏈接的支持,對於FRAME的支持等,都是XSL所獨有的

   生成的XML文檔的默認編碼格式爲“UTF-8”,文檔中聲明encoding的值爲“UTF-8”

         當我們調用parse()方法得到文檔對象時,給它傳遞的參數是XML文件名,程序中給的是XML文件的絕對路徑,因爲如果不給絕對路徑,而是給定相對路徑的話,當執行方法parse()時,會去安裝目錄的bin目錄中去找指定文件名的XML文件。也就是說使用相對路徑時,要把文件放入服務器安裝目錄下的bin目錄。此目錄與生成XML文件的默認路徑是一樣的。在程序中給定路徑時,要用斜槓來表示轉義,加“\”(右斜槓)在程序中要用“\\"(雙斜槓)來表示

  • XML是由W3C提出的,它以一種開放的,自我描述的方式定義了數據結構,體現出了數據與數據之間的關係
  • XML文檔結構包括邏輯結構和物理結構。從文檔的邏輯結構上來講,每個XML文檔可以分爲兩個部分,即序言和文檔元素
  • XML文檔通常都以一個XML聲明開始,它能指定文檔的版本,內容可以是文本,子元素,或是二者都有
  • 雖然我們可以自定義標籤,也就是可以自定義元素名。但是定義元素的時候,給元素取名必須遵循一定的規範
  • XML文檔必須有且僅有一個根元素,其他元素都必須被包含在根元素內
  • 層疊樣式單CSS是一種樣式描述規則,它能指定XMl標記的顯示格式
  • 可擴展樣式單語言XSL不僅能指定XML文檔的顯示樣式,而且還能對XML文檔進行變換
  • DOM的全稱是Document Object Model,即文檔對象模型,通過DOM接口我們可以解析和生成XML文件

第九章:EL與JSTL

       EL(Expression Language)表達式語言,是JSP的一個新特性,在JSP中使用可以簡化對變量和對象的訪問。所有EL表達式都是以${起始,以}結尾的

${表達式}  例如:${1+2+3}計算1+2+3的值並將結果返回       ${username}查找並返回username的值      ${user,name}訪問JavaBean對象user的屬性name

在EL中,允許定義和使用函數,語法 ns:func(a1,a2,......an)

前綴ns爲該數據標籤庫的前綴,func爲函數名,a1,a2,......爲函數的參數

例如:比較23和45,其中較大值是${myfn:max(23,45)}

        JSTL(JavaServer Pages Standard Tag Library)標準函數庫,可以簡化JSP頁面的設計

在使用JSTL時,可以不需要tld目錄下的文件。當我們想要修改標籤庫的URI時,可以在web.xml文件中使用<taglib-uri>元素來設置,相應要修改<taglib-location>中TLD文件所在的位置,此時,可能將用到tld目錄下的TLD文件

     在JSP中使用JSTL中的標籤庫時,必須使用<%@taglib%>指令,並且設定prefix和uri的值

  <%@taglib  prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>

 所謂動態值,是指屬性值可以是Java表達式,EL表達式或者通過<jsp:attribute>設置的值。一般,JSTL標籤的屬性值均可以指定爲動態,但是保存JSTL標籤結果的變量及其作用域屬性,以及XML標籤的select屬性除外(該屬性可以指定一個XPath表達式)

  <c:set>屬性中的var和scope兩個屬性不能使用表達式來表示,我們不能寫成scope=”${ourScope}"或var=“${a}”

<c:forEach>屬性中的items支持的類型包括數組和各類集合類型之外,還包括以逗號分隔的字符串。在迭代時,將以逗號作爲分隔符,循環進行處理

  要跨Web應用程序訪問資源,需要在當前Web應用程序的context元素設置中,指定crossContext屬性的值爲true

例如:<context path="/ch09" docBase="F:\book\ch09" reloadable="true" crossContext="true"/>

  • 表達式語言是JSP2.0的一個新的特性,在JSP頁面中使用EL,可以簡化對變量和對象的訪問
  • 所有EL表達式都是以“${”起始,以“}”結尾,可以使用“.”和“[]”操作符訪問數據
  • EL變量的查找順序是page,request,session,application
  • EL定義了11個隱含對象。有關請求和其他數據的所有信息都可以通過EL隱含對象來訪問
  • JSTL是由JCP(Java Community Process)制定的標準規範,它爲Java Web開發人員提供了一套標準通用的標籤函數庫
  • JSTL由5個不同的標籤庫組成
  • 在JSP中使用JSTL中的標籤庫時,必須使用<%@taglib%>指令,並且設定prefix和uri的值
  • Core標籤庫主要用於基本輸入輸出操作,條件控制,迭代操作和URL操作等通用性任務的操作
  • I18標籤庫主要用於編寫國際化的Web應用程序,它分爲2個部分,一部分是國際化標籤,另一部分格式化標籤
  • SQL標籤提供了基本的訪問關係數據庫的能力,可以實現包括查詢,更新,事務處理和設置數據源等強大的功能
  • XMl標籤庫讓我們無須瞭解DOM和SAX,也可以對XML文檔進行操作
  • Function標籤庫是在JSTL中定義的標準的EL函數庫,主要用於對字符串進行操作,包括了16個函數

第十章:JSP聊天室的設計與實現

    synchronized(application){}可以防止多個線程同時訪問這個對象實例的synchronized方法。如果一個對象有多個synchronized方法,只要一個線程訪問了其中的一個synchronized方法,其他線程不能同時訪問這個對象中任何一個synchronized方法。這時,不同的對象實例的synchronized方法是不相互干擾的。也就是說,其他線程照樣可以同時訪問相同類的另一個對象實例中的synchronized方法

     通過JavaBean進行數據庫的操作,實現了代碼的複用

第十一章:基於JSP的網上購物系統

軟件工程開發的一般過程包括:問題定義,可行性研究,需求分析,總體設計,詳細設計,編碼和單元測試,綜合測試,軟件維護

doGet()和doPost()方法的區別:doget在網頁使用get方法時調用,dopost在接收post方法時調用。get方法在網頁的地址欄顯示傳遞參數信息,post方法將數據都打包進行傳遞

getServletConfig()方法,功能是在servlet初始化時,容器傳遞進來一個ServletConfig對象並保存在Servlet實例中,該對象允許訪問兩項內容:初始化參數和ServletContext對象,前者通常由容器在文件中指定,允許在運行時向Servlet傳遞有關調度信息,比如說getServletConfig().getInitParameter(“debug”);後者爲Servlet提供有關容器的信息。此方法可以讓Servlet在任何時候獲得該對象及配置信息

第十二章:基於JSP的在線考試系統

UML圖是軟件工程設計過程中,進行可視化建模的一個重要工具。它的作用域不限於支持面向對象的分析與設計,還支持從需求分析開始的軟件開發的全過程。UML適用於以面向對象技術來描述任何類型的系統,而且適用於系統開發的不同階段,從需求規格描述直至系統完成後的測試和維護

需求分析的成果就是找出系統內的實體,實體的屬性以及實體與實體之間的關係。概念結構設計的主要成果物就是通過建模工具畫出E-R圖。邏輯結構設計的成果物就是根據E-R圖確定關係到的屬性和主鍵。物理結構設計的成果物則是編寫SQL語句,最終建立數據庫

可以通過建模工具Rose或者Microsoft Visio來實現E-R圖的構造。有些工具還提供了另外一種方法進行模型圖的生成,在數據庫中的表結構建好之後,可以利用反向工程,將數據庫中的表與表之間的關係導入到建模工具中,只需要做少量的修改即可生成模型圖

WebRoot文件夾下的JSP文件在訪問時,不需要再加WebRoot/路徑。需要訪問某個頁面時,直接在瀏覽器地址欄輸入http:localhost:8080/工程名/test.jsp即可

數據庫連接用完後一定要關閉,在進行數據庫訪問之後的finally語句裏面進行關閉操作。不管try,catch內的語句執行情況如何,finally裏面的內容都會執行,這樣的關閉方式是最保險的

發佈了16 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章