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、表達式
<%=方法(參數...)%>
- <%=getTime() %>
4、腳本段(scriptlet)
格式:<%...%>。比如:
- <% Calendar c = Calendar.getInstance(); %>
- <%if (c.get(Calendar.AM_PM) == Calendar.AM) {%>
- 上午
- <%} else {%>
- 下午
- <%}%>
5、聲明
格式:<%!...%> 比如:
- <%!public String getTime(){
- return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
- } %>
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表達式語言。
語法:${...} 。
舉個簡單點的例子:
- <jsp:useBean id="bean" class="com.JspPractise.bean.City" scope="page"/>
- <jsp:setProperty property="name" name="bean" value="測試EL"/>
- ${bean.name} or ${bean["name"]}
再比如form表單提交:
我們可以使用<%=request.getParameter("name") %>輸出結果,但是更好的方式是通過${param.name}來輸出。由於該作用域爲page,所以也可以通過${pageScope.bean.name}EL隱式對象輸出。從作用域從小到大排序其它還有requestScope、sessionScope、applicationScope等各種EL隱式對象(區別於JSP隱式對象)。
此外,EL表達式還有運算功能,比如:
- ${10+1.0} <!-- 11.0 -->
- ${90E2-120} <!-- 8880.0 -->
- ${23.8*7} <!-- 166.6 -->
- ${1/0} <!-- Infinity -->
- ${10 div 5} <!-- 2.0 -->
- ${10%4} <!-- 2 -->
- ${10 mod 4} <!-- 2 -->
- ${10*10 eq 100} <!-- true -->
- ${'c' gt 'b'} <!-- true -->
- ${9 le 8} <!-- false-->
四、JSTL(Java標準標籤庫)
JSTL也是JSP頁面中使用的技術,這套標籤庫設置的目的就是在JSP頁面中面對一些判斷(條件標籤:if)、循環(迭代標籤:foreach)、數據庫操作(SQL標籤庫:update、param、query等)操作的時候,總不可避免的要嵌入Java代碼,而使用這些標籤則讓JSP頁面代碼“清爽”了許多。除了上面的這些標籤之外,還有一些通用標籤,比如:set、remove、out等。
使用JSTL,首先要使用taglib指令,導入JSTL。
- <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
下面用JSTL將上面的輸出“上午/下午”的嵌入Java代碼的例子,改用JSTL實現。
- <c:set var="cc" value="<%=Calendar.getInstance().get(Calendar.AM_PM)%>" />
- <c:set var="pm" value="<%=Calendar.PM%>" />
- <c:set var="am" value="<%=Calendar.AM%>" />
- <c:if test="${cc==am}">
- <c:out value="上午"></c:out>
- </c:if>
- <c:if test="${cc==pm}">
- <c:out value="下午"></c:out>
- </c:if>
再看看foreach標籤如何使用。
- <%
- String[] colors = new String[] { "red", "green", "yellow", "black","silver" };
- pageContext.setAttribute("colors", colors);
- %>
- <c:forEach var="color" items="${pageScope.colors}">
- <c:if test="${color=='yellow'}">
- <c:out value="${color}" />
- </c:if>
- </c:forEach>
JSTL還提供了SQL標籤庫,由於我們開發一般都會在後臺封裝這部分代碼,所以基本上用不着,這裏也就不再演示。
本篇博客主要回顧了JSP開發過程中的很多基礎性的細節知識,熟練掌握以上知識就能夠進行Java Web開發了。當然隨着項目規模的越來越大,單純的JSP開發也不能夠勝任,需要引入開發框架。著名的struts、hibernate、spring等框架我會在以後再介紹。