Java Web開發之詳解JSP

JSP作爲Java Web開發中比較重要的技術,一般當作視圖(View)的技術所使用,即用來展現頁面。Servlet由於其本身不適合作爲表現層技術,所以一般被當作控制器(Controller)所使用,而JavaBean作爲模型(Model)層使用。這就是經典的MVC模型。

Servlet和JSP的關係上篇博客已經講過了,並演示了一個相當簡單的例子。在具體講述JSP之前,先把JavaBean簡單介紹一下。

JavaBean其實就是一個Java普通類,定義了類的屬性和行爲(get、set方法)。在MVC設計模式當中,並沒有提及數據庫交互操作,其實就是通過JavaBean實現具體的數據庫操作的。至於爲什麼叫JavaBean,據說還有一個故事。Java之父在一次喝咖啡的時候看到桌子上的咖啡豆,突發奇想就給起了個JavaBean的名字(Bean是豆子的意思)。

提到MVC,順便說一下三層(分層、多層)架構,很多人搞不清之間的關係,感覺MVC與三層架構非常相似,認爲它們沒有什麼太大的區別。其實用一句話概括,MVC是設計模式,而三層架構是分層模型。MVC包含模型-控制器-視圖,注意這裏沒有“層”,它強調的是將開發代碼分爲這幾個部分,通過這種模型來實現應用程序的開發。MVC也不是Web開發的專屬,其實在早期的C/S開發中已經用到了MVC設計模式。而三層架構指的是DAL(數據訪問層)、BLL(業務邏輯層)、UI(用戶界面層),它強調的是程序開發的結構。

理清上面的關係,利用Java語言就可以處理後臺所有相關的操作,而使用JSP就可以處理前臺頁面所有相關的操作。

一、JSP基本元素

一個JSP包含以下基本元素:

1、html部分

就是指JSP(Java Server Pages,Java服務端頁面)頁面的靜態部分。

2、指令

主要有如下3種指令:

page指令(每個JSP頁面都需要有,設置頁面編碼,導入需要jar包都需要page指令):<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

taglib指令(導入JSTL或者自定義標籤時使用):<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

include指令(包含頁面):<%@include file="test.jsp" %>

3、表達式

<%=方法(參數...)%>

[html] view plaincopy
  1. <%=getTime() %>  

4、腳本段(scriptlet)

格式:<%...%>。比如:

[html] view plaincopy
  1. <% Calendar c = Calendar.getInstance(); %>  
  2.     <%if (c.get(Calendar.AM_PM) == Calendar.AM) {%>  
  3.         上午  
  4.     <%} else {%>  
  5.         下午  
  6.     <%}%>  

5、聲明

格式:<%!...%> 比如:

[html] view plaincopy
  1. <%!public String getTime(){  
  2.     return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());  
  3. } %>  

6、動作

使用JavaBean:<jsp:useBean id="..." class="包名.類名" scope="page"/>

獲取屬性:<jsp:getProperty property="Bean的屬性名稱" name="使用的Bean的ID" />

設置屬性:<jsp:setProperty property="Bean的屬性名稱" name="使用的Bean的ID" value="爲屬性指定的顯式值"/>

頁面包含:<jsp:include page="test.jsp"/>

頁面跳轉:<jsp:forward page="test.jsp"/>

...

7、註釋

分兩種註釋:

a、<!--客戶端可以看到的註釋-->

b、<%--客戶端看不到的註釋%>

基本上上面的這7個元素,稍微複雜一點的jsp頁面都會包括。這裏特別提及一下,include指令和include動作的區別,兩者都可以在主頁面中引入別的頁面,達到嵌入頁面的目的。主要區別在於include指令會影響主jsp頁面的構造,對主頁面定義的變量會有影響,本質上是跟主頁面編譯爲一個新的頁面,因此頁面執行效率更高。而include動作是將新的頁面嵌入到主頁面當中,在執行時會先加載主jsp頁面,再加載include動作嵌入的頁面,執行效率比include指令低一點,但是這是更靈活的選擇。實際開發中,使用include動作更多一點。

二、JSP隱式對象

隱式對象的含義就是指不需要顯式new一個類的對象的對象,可以在JSP頁面直接使用。主要有四類:

1、輸入輸出對象:request、response、out

request.getParameter("name");

request.getParameterValues("name");

response.setContentType("text/html;charset=gbk");

response.sendRedirect("url");

out.println("...");

2、作用域對象:pageContext、request、session、appplication

pageContext.getAttribute("name");

pageContext.setAttribute("name","value");

request.getAttribute("name","value");

request.setAttribute("name","value");

session.getAttribute("name");

session.setAttribute("name","value");

application.getAttribute("name");

application.setAttribute("name","value");

作用域對象的生命週期:pageContext(頁面)<request(請求)<session(會話)<application(應用)。

3、Servlet對象:page、config

((HttpJspPage)page).getServletInfo();

config.getInitParameter("name");

4、錯誤對象:exception

exception.printStackTrace(out);

三、EL表達式(表達式語言)

雖然能夠通過表達式在JSP頁面嵌入Java代碼實現結果輸出,但是這並不是最好的開發方式。從開發角度來講,前臺JSP頁面應該不出現Java代碼(Java代碼應該在後臺出現)。爲了解決這個問題,推出了JSP表達式語言。

語法:${...} 。

舉個簡單點的例子:

[html] view plaincopy
  1. <jsp:useBean id="bean" class="com.JspPractise.bean.City" scope="page"/>  
  2.   
  3. <jsp:setProperty property="name" name="bean" value="測試EL"/>  
  4.   
  5. ${bean.name}   or    ${bean["name"]}  
通過jsp的useBean動作使用了某個JavaBean,再通過setProperty動作給name屬性賦值,最後通過${bean.name}或者${bean["name"]}輸出:測試EL。

再比如form表單提交:

我們可以使用<%=request.getParameter("name") %>輸出結果,但是更好的方式是通過${param.name}來輸出。由於該作用域爲page,所以也可以通過${pageScope.bean.name}EL隱式對象輸出。從作用域從小到大排序其它還有requestScope、sessionScope、applicationScope等各種EL隱式對象(區別於JSP隱式對象)。

此外,EL表達式還有運算功能,比如:

[html] view plaincopy
  1. ${10+1.0} <!-- 11.0 -->  
  2. ${90E2-120} <!-- 8880.0 -->  
  3. ${23.8*7} <!-- 166.6 -->  
  4. ${1/0} <!-- Infinity  -->  
  5. ${10 div 5} <!-- 2.0 -->  
  6. ${10%4} <!-- 2 -->  
  7. ${10 mod 4} <!-- 2 -->  
  8. ${10*10 eq 100} <!-- true -->  
  9. ${'c' gt 'b'} <!-- true -->  
  10. ${9 le 8} <!-- false-->  

四、JSTL(Java標準標籤庫)

JSTL也是JSP頁面中使用的技術,這套標籤庫設置的目的就是在JSP頁面中面對一些判斷(條件標籤:if)、循環(迭代標籤:foreach)、數據庫操作(SQL標籤庫:update、param、query等)操作的時候,總不可避免的要嵌入Java代碼,而使用這些標籤則讓JSP頁面代碼“清爽”了許多。除了上面的這些標籤之外,還有一些通用標籤,比如:set、remove、out等。

使用JSTL,首先要使用taglib指令,導入JSTL。

[html] view plaincopy
  1. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
導入之後就可以在JSP頁面中使用JSTL了。

下面用JSTL將上面的輸出“上午/下午”的嵌入Java代碼的例子,改用JSTL實現。

[html] view plaincopy
  1. <c:set var="cc" value="<%=Calendar.getInstance().get(Calendar.AM_PM)%>" />  
  2. <c:set var="pm" value="<%=Calendar.PM%>" />  
  3. <c:set var="am" value="<%=Calendar.AM%>" />  
  4. <c:if test="${cc==am}">  
  5.     <c:out value="上午"></c:out>  
  6. </c:if>  
  7. <c:if test="${cc==pm}">  
  8.     <c:out value="下午"></c:out>  
  9. </c:if>  
除了value裏面的代碼是Java代碼之外(這裏爲了簡單演示沒有將Java代碼存放到後臺代碼中去),再也看不到Java的身影了,取而代之的是JSTL。
再看看foreach標籤如何使用。

[html] view plaincopy
  1. <%  
  2.     String[] colors = new String[] { "red", "green", "yellow", "black","silver" };  
  3.     pageContext.setAttribute("colors", colors);  
  4. %>  
  5.   
  6. <c:forEach var="color" items="${pageScope.colors}">  
  7.     <c:if test="${color=='yellow'}">  
  8.         <c:out value="${color}" />  
  9.     </c:if>  
  10. </c:forEach>  
將一個String數組存放到了pageContext(JSP作用域對象)當中,然後通過JSTL結合EL表達式pageScope(EL作用域對象)取出並循環輸出。

JSTL還提供了SQL標籤庫,由於我們開發一般都會在後臺封裝這部分代碼,所以基本上用不着,這裏也就不再演示。


本篇博客主要回顧了JSP開發過程中的很多基礎性的細節知識,熟練掌握以上知識就能夠進行Java Web開發了。當然隨着項目規模的越來越大,單純的JSP開發也不能夠勝任,需要引入開發框架。著名的struts、hibernate、spring等框架我會在以後再介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章