一虏辫、JSP簡介
JSP全名為Java Server Pages蚌吸,其根本是一個簡化的Servlet設(shè)計,他實現(xiàn)了在Java當(dāng)中使用HTML標(biāo)簽砌庄。JSP是一種動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)羹唠,也是JavaEES的標(biāo)準(zhǔn)。JSP與Servlet一樣娄昆,是在服務(wù)器端執(zhí)行的佩微。
常見動態(tài)網(wǎng)站開發(fā)技術(shù)對比
- JSP:Java平臺,安全性高萌焰,適合開發(fā)大型的哺眯,企業(yè)級的、分布式的Web應(yīng)用程序扒俯。
- Asp.net:Net平臺奶卓,簡單易學(xué),安全性以及跨平臺性差陵珍。
- PHP:簡單寝杖,高效,成本低開發(fā)周期短互纯,特別適合中小型企業(yè)的Web應(yīng)用開發(fā)瑟幕。(LAMP:Linux+Apache+MySQL+PHP)。
JSP頁面的元素構(gòu)成
- 靜態(tài)內(nèi)容
- 指令
- 表達(dá)式
- 小腳本
- 聲明
- 注釋
在JSP中其基本的核心語法都來源于Java。
二只盹、JSP注釋
在JSP中支持兩種注釋語句的操作辣往,一種是顯示注釋,這種注釋客戶端是可見的殖卑;另外一種是隱式注釋站削,這種注釋客戶端是無法看見的。
1孵稽、顯示注釋語法:(HTML注釋许起,客戶端可見)
<!-- 注釋內(nèi)容 -->
2、隱式注釋語法:(JSP注釋)
<%-- 注釋 --%>菩鲜,JSP注釋
3园细、隱式注釋語法:(JSP腳本注釋)
//注釋,單行注釋
/* 注釋 */接校,多行注釋
三猛频、JSP腳本
在JSP頁面中執(zhí)行的java代碼。
1蛛勉、Scriptlet(腳本小程序)
在JSP中鹿寻,最重要的部分就是Scriptlet(腳本小程序),所有嵌入在HTML代碼中的Java程序都必須使用Scriptlet標(biāo)記出來诽凌。在JSP中一共有3中Scriptlet代碼毡熏。
- <% java代碼 %>;在此Scriptlet中可以定義局部變量皿淋、編寫語句等招刹。
注意:
- 盡量不要再JSP中定義類或方法,當(dāng)JSP中需要類或方法時窝趣,往往會通過JavaBean的形式調(diào)用疯暑。
- 盡量不要使用out.println()輸出,而使用表達(dá)式輸出哑舒。
2妇拯、Scriptlet標(biāo)簽
在程序中如果過多的出現(xiàn)<%%>會導(dǎo)致代碼混亂,所以在新版本的JSP中提供了一種Scriptlet標(biāo)簽洗鸵,使用此標(biāo)簽可以完成與<%%>同樣的功能越锈。
格式:
<jsp:scriptlet>
java scriptlet 代碼
</jsp:scriptlet>
四、JSP聲明
在JSP頁面中定義變量或者方法膘滨。
- <%! java代碼 %>甘凭;在此中可以定義全局變量、方法火邓、類丹弱。
五德撬、JSP表達(dá)式
在JSP頁面中執(zhí)行表達(dá)式。
- <%=表達(dá)式 %>躲胳;在此中可輸出一個變量或一個具體內(nèi)容蜓洪。
六、JSP指令(三大指令page坯苹、include隆檀、taglib)
1、page指令
page指令通常位于JSP頁面的頂端粹湃,同一個頁面可以有多個page指令恐仑。
page指令在JSP開發(fā)中較為重要,使用此屬性再芋,可以定義一個JSP頁面的相關(guān)屬性菊霜,包括設(shè)置MIME類型,定義需要導(dǎo)入的包济赎,錯誤頁的指定等。
對于以上的操作指令记某,只有import指令可以重復(fù)出現(xiàn)多次司训,而對于其他屬性只能出現(xiàn)一次。且在以上若干指令中液南,比較常用的是Language壳猜、contentType、pageEncoding滑凉、errorPage/isErrorPage统扳、import這5個指令。
page指令語法:
<%@ page 屬性="內(nèi)容"%>
1.1畅姊、設(shè)置頁面的MIME
在page指令中咒钟,contentType屬性是使用最多的一個屬性,如果想讓一個JSP文件顯示中文若未,則必須對整個頁面指定MIME編碼朱嘴。
什么是MIME,有什么作用粗合?
許多文件都存在擴展名萍嬉,如.doc、.htm 隙疚,根據(jù)這些不同的擴展名可以打開不同的應(yīng)用程序壤追,那么MIME(Multipurpose Internet Mail Extensions,多功能Internet郵件擴充服務(wù))就是指定某個擴展名文件將使用何種應(yīng)用程序打開的一個說明供屉。當(dāng)該擴展名文件被訪問時行冰,瀏覽器會自動指定應(yīng)用程序來打開溺蕉。
為JSP頁面指定編碼
<%@ page language="java" contentType="text/html;charset=GBK"%>
從Tomcat安裝目錄/conf/web.xml中可以查詢MIME類型。例如资柔,如果現(xiàn)在希望頁面可以按照Word文檔的形式顯示焙贷,則可以使用如下的MIME類型:
<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>
1.2、設(shè)置文件編碼
除了使用contentType指定MIME類型外贿堰,還使用charset進(jìn)行頁面編碼的指定辙芍,當(dāng)然,在page指令中也可以使用pageEncoding進(jìn)行編碼的指定羹与。
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
contentType使用charset設(shè)置編碼故硅,和使用pageEncoding設(shè)置有什么區(qū)別?
pageEncoding指的是JSP文件本身的編碼纵搁,而contentType中的charset指的是服務(wù)器發(fā)送給客戶端的內(nèi)容編碼(更常使用)吃衅。
1.3、錯誤頁面的設(shè)置
當(dāng)一個頁面出錯后腾誉,會自動跳轉(zhuǎn)到一個頁面上進(jìn)行錯誤信息的提示徘层,那么這個操作,就可以通過錯誤頁面來指定利职。
要想完成錯誤頁的操作趣效,則一定要滿足一下兩個條件:
- 指定錯誤出現(xiàn)時的跳轉(zhuǎn)頁,通過errorPage屬性指定猪贪。
- 錯誤處理頁必須有明確的標(biāo)識跷敬,通過isErrorPage屬性指定。
如果一個JSP頁面運行時出現(xiàn)了錯誤热押,會通過errorPage指定的頁面進(jìn)行跳轉(zhuǎn)西傀,被跳轉(zhuǎn)的頁面中必須將isErrorPage的內(nèi)容設(shè)置為true。
會出現(xiàn)錯誤的頁面:
// show.jsp
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page errorPage="error.jsp"%>
<%
int result = 10 / 0;
%>
錯誤處理頁:
//error.jsp
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page isErrorPage="true"%>
<h1>程序出錯了</h1>
注意:
錯誤頁的跳轉(zhuǎn)屬于服務(wù)器端的跳轉(zhuǎn)桶癣。
一旦發(fā)生錯誤后拥褂,頁面的顯示內(nèi)容將變成error.jsp中設(shè)置的內(nèi)容,但是在地址欄上依然是show.jsp鬼廓。在整個操作工程中肿仑,客戶端對服務(wù)器只發(fā)送了一次請求,服務(wù)器對客戶端也只回應(yīng)了一次碎税。
以上的錯誤頁是在每一個JSP頁面中指定尤慰,當(dāng)然,也可以在整個虛擬目錄中指定全局的錯誤處理雷蹂,要想達(dá)到這個效果伟端,就必須修改web.xml文件,在其中加入錯誤頁的操作匪煌。
全局的錯誤處理可以處理兩種類型的錯誤责蝠,一種是HTTP代碼的錯誤党巾,如404或500;還有一種是異常的錯誤霜医,如NullPointerException等齿拂。
修改web.xml文件加入錯誤處理
<error-page>
<error-code>500</error-page>
<location>/ch05/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-page>
<location>/ch05/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/ch05/error.jsp</location>
</error-page>
1.4、數(shù)據(jù)庫連接操作
在page指令中可以使用import導(dǎo)入所需要的Java開發(fā)包肴敛,所以直接利用此屬性將java.sql包導(dǎo)進(jìn)來署海,即可進(jìn)行數(shù)據(jù)庫的開發(fā)操作。
配置數(shù)據(jù)庫的驅(qū)動程序医男,將mysql的驅(qū)動程序復(fù)制到Tomcat\lib目錄中砸狞。
配置完成后需要重新啟動服務(wù)器。只有這樣镀梭,才能將新配置的jar包在服務(wù)器啟動時加載進(jìn)來刀森,不會出現(xiàn)找不到驅(qū)動程序的錯誤。
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.sql.*"%>
<html>
<head>
<title></title>
</head>
<body>
<%!
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
public static final String DBURL = "jdbc:mysql://localhost:3306/databasename";
public static final String DBUSER = "root";
public static final String DBPASS = "";
%>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet = null;
%>
<%
try{
Class.forName(DBDRIVER);
conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
String sql = "select * from tablename";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
%>
<center>
<table border="1" width="80%">
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<%
while(rs.next()) {
}
%>
</table>
</center>
<%
} catch(Exception e) {
System.out.println(e);
} finally {
rs.close();
pstmt.close();
conn.close();
}
%>
</body>
</html>
2报账、include指令(包指令)
將一個外部文件嵌入到當(dāng)前JSP文件中研底,同時解析這個頁面中的JSP語句。
在一般的頁面開發(fā)中會有很多內(nèi)容要重復(fù)的顯示透罢。
要實現(xiàn)這種效果有兩種方法:
- 讓每一個頁面都分別包含該部分飘哨。
- 將每個部分做成一個文件,然后在需要的地方導(dǎo)入(包含)琐凭。
要想實現(xiàn)這樣的包含功能,在JSP中可以通過靜態(tài)包含和動態(tài)包含兩種方式完成浊服。
2.1统屈、靜態(tài)包含
靜態(tài)包含指令是在JSP編譯時插入一個包含文本或代碼的文件,這個包含的過程是靜態(tài)的牙躺,而包含的文件可以是JSP文件愁憔、HTML文件、文本文件孽拷,或是一般java程序吨掌。
靜態(tài)包含語法:
<%@ include file="要包含的文件路徑"%>
包含時不管文件的后綴是什么,都會將內(nèi)容直接包含并顯示脓恕。
2.2膜宋、動態(tài)包含
使用<jsp:include>指令可以完成動態(tài)包含的操作,與之前的靜態(tài)包含不同炼幔,動態(tài)包含語句可以自動區(qū)分被包含的頁面是靜態(tài)還是動態(tài)秋茫。如果是靜態(tài)頁面,則與靜態(tài)包含一樣乃秀,將內(nèi)容包含進(jìn)來進(jìn)行處理肛著;而如果被包含的頁面是動態(tài)頁面圆兵,則可以先進(jìn)行動態(tài)的處理,然后再將處理后的結(jié)果包含進(jìn)來枢贿。
動態(tài)包含語法:
//不傳遞參數(shù)
<jsp:include page="{要包含的文件路徑 | <%=表達(dá)式%>}" flush="true | false"/>
//傳遞參數(shù)
<jsp:include page="{要包含的文件路徑 | <%=表達(dá)式%>}" flush="true | false">
<jsp:param name="參數(shù)名稱" value="參數(shù)內(nèi)容"/>
</jsp:include>
flush屬性設(shè)置為false表示這個網(wǎng)頁完全被讀進(jìn)來以后才會輸出殉农。在每一個JSP的內(nèi)部都會有一個Buffer,所以如果是true局荚,當(dāng)Buffer滿了就輸出超凳,一般此屬性都會設(shè)置成true。
靜態(tài)包含的操作屬于先包含后處理危队,而動態(tài)包含如果被包含的頁面是動態(tài)頁聪建,則屬于先處理后包含。
在實際開發(fā)中建議使用動態(tài)包含茫陆。
3金麸、taglib指令
是一個標(biāo)簽庫。使用標(biāo)簽庫定義新的自定義標(biāo)齊簿盅,在JSP頁面中啟用自定義的標(biāo)簽挥下。
七、跳轉(zhuǎn)指令
在Web中可以使用<jsp:forward>指令桨醋,將一個用戶的請求(request)從一個頁面?zhèn)鬟f到另一個頁面棚瘟,完成跳轉(zhuǎn)的操作。
頁面跳轉(zhuǎn)語法
//不傳遞參數(shù)
<jsp:forward page="{要包含的文件路徑 | <%=表達(dá)式%>}">
//傳遞參數(shù)
<jsp:forward page="{要包含的文件路徑 | <%=表達(dá)式%>}" flush="true | false">
<jsp:param name="參數(shù)名稱" value="參數(shù)內(nèi)容"/>
</jsp:forward>
此跳轉(zhuǎn)語句也屬于服務(wù)器端跳轉(zhuǎn)喜最。
八偎蘸、JSP頁面生命周期
jspService()方法被調(diào)用來處理客戶端的請求。對每一個請求瞬内,JSP引擎創(chuàng)建一個線程來處理該請求迷雪。如果有多個客戶端同時請求該JSP文件,則JSP引擎會創(chuàng)建多個線程虫蝶。每個客戶端請求對應(yīng)一個線程章咧。以多線程方式執(zhí)行可以大大降低對系統(tǒng)資源的需求,提高系統(tǒng)的并發(fā)量及響應(yīng)時間能真。但也要注意多線程的編程帶來的同步問題赁严,由于該Servlet始終駐于內(nèi)存,所以響應(yīng)是非撤垲恚快的疼约。
八、項目聯(lián)系
1秦躯、實例操作:用戶登錄程序?qū)崿F(xiàn)(JSP+JDBC實現(xiàn))
1.1忆谓、創(chuàng)建數(shù)據(jù)庫表
1.2、程序設(shè)計思路
2踱承、開發(fā)實戰(zhàn)練習(xí)
2.1倡缠、增加分頁顯示功能哨免。
程序顯示格式如下:
2.2、在以上程序中增加模糊查詢的功能昙沦,之后對查詢出的數(shù)據(jù)進(jìn)行分頁顯示琢唾。