在上一章中總結了Web開發中應用MVC架構模式,將Servlet 用做控制器,JSP作為視圖,JavaBean作為模型,實現業務流程控制,頁面邏輯和業務邏輯的分離。然而,使用前面的技術實現MVC,並不是最完美的。
在當代的一個最佳的JavaWeb開發實踐就是在MVC架構模式中,中和使用JavaBean,EL(expression language),JSP自定義標記庫以及JSP標准標記庫JSTL,編寫無java腳本的JSP頁面。
一 JSP表達式語言EL
在使用基於MVC架構模式的Web應用開發中,我們使用Servlet解析用戶的請求,調用業務邏輯或數據訪問代碼,將得到的結果放入Bean中,然后將Bean出處在請求,會話或Servlet上下文中。最后將請求轉發給JSP頁面。JSP頁面通過標准動作jsp:getProperty,和jsp:useBean得到儲存在作用域中的Bean屬性數據,顯示在頁面上。我們使用EL就是在最后的步驟不一樣。我們不在使用jsp:getProperty和jsp:useBean。不同之處看看下面的案例。
有兩個示例的JavaBean,Person和Dog。 Person有一個字符串類型的userName屬性,同時有一個Dog類型的dogName屬性。Dog有一個字符串類型的name屬性。
我們取出人的名字,和dog的名字。
Dog
1 package com.cy.bean; 2 3 import java.io.Serializable; 4 5 public class Dog implements Serializable{ 6 private String name; 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 16 17 }
Person
1 package com.cy.bean; 2 3 import java.io.Serializable; 4 5 public class Person implements Serializable { 6 private String userName; 7 private Dog dogName; 8 9 public String getUserName() { 10 return userName; 11 } 12 public void setUserName(String userName) { 13 this.userName = userName; 14 } 15 public Dog getDogName() { 16 return dogName; 17 } 18 public void setDogName(Dog dogName) { 19 this.dogName = dogName; 20 } 21 22 }
編寫一個Servlet作為控制器,在控制器中創建Person實例。將請求轉發到.jsp頁面。
1 package com.cy.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 import com.cy.bean.Dog; 11 import com.cy.bean.Person; 12 13 public class MyDog extends HttpServlet{ 14 private static final long serialVersionUID = 1L; 15 16 @Override 17 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 18 throws ServletException, IOException { 19 20 resp.setCharacterEncoding("utf-8"); 21 resp.setContentType("text/html;charset=utf-8"); 22 23 Person p= new Person(); 24 p.setUserName("小明"); 25 Dog d=new Dog(); 26 d.setName("小狗狗"); 27 p.setDogName(d); 28 req.setAttribute("person", p); 29 30 req.getRequestDispatcher("/jsp/myDog.jsp").forward(req, resp); 31 32 33 } 34 35 @Override 36 protected void doPost(HttpServletRequest req, HttpServletResponse resp) 37 throws ServletException, IOException { 38 doGet(req, resp); 39 } 40 41 42 }
在web.xml中配置servlet
1 <servlet> 2 <servlet-name>mydog</servlet-name> 3 <servlet-class>com.cy.servlet.MyDog</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>mydog</servlet-name> 7 <url-pattern>/mydog</url-pattern> 8 </servlet-mapping>
作為視圖的jsp頁面;
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'myDog.jsp' starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 <jsp:useBean id="person" type="com.cy.bean.Person" scope="request"></jsp:useBean> 27 主人:<jsp:getProperty property="userName" name="person"/><br/> 28 寵物:<jsp:getProperty property="dogName" name="person"/><br/> 29 </body> 30 </html>
得出來的結果卻是:
因為:person的屬性dogName是個對象,而<jsp:getProperty>的Property屬性只能訪問Bean的屬性,而不能訪問嵌套的屬性。
解決方案就是JSP EL(即表達式語言 Expression Language)
我們使用EL
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'myDog.jsp' starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 27 主人: ${person.userName} 28 寵物: ${person.dogName.name } 29 </body> 30 </html>
結果:
1.1 EL表達式和JSP腳本表達式
EL表達式形式:${ }
${person.userName} ${userName}
JSP表達式形式:<%= userName%>
一個<div>元素的style屬性的代碼:
JSP表達式設置: 1 <div style=<%=mystyle%>>hello</div>
EL表達式設置: 1 <div style=${mystyle} >hello</div>
EL表達式不能在腳本中定義變量
JSP中定義一個變量,只需要用<%! int num=10%>
num的值:<%=num%> 值為10;
num的值:${num} 返回一個未定義的值;
1.2在EL表達式中使用隱式變量
類別 |
隱式變量名 |
描述 |
JSP |
pageContext |
用來訪問JSP的隱式對象 |
作用域 |
pageScope |
與page作用域屬性的名稱和值相關聯的 Map 類 |
requestScope |
與request作用域屬性的名稱和值相關聯的 Map 類 |
|
sessionScope |
與session作用域屬性的名稱和值相關聯的 Map 類 |
|
applicationScope |
與application作用域屬性的名稱和值相關聯的 Map 類 |
|
請求參數 |
param |
包含請求參數字符串的Map 類 |
paramValues |
包含請求參數字符串數組( String[])的 Map 類 |
|
請求頭 |
header |
包含請求頭字符串的 Map 類 |
headerValues |
包含請求頭字符串數組(String[])的 Map 類 |
|
Cookie |
cookie |
按名稱存儲請求附帶的 cookie 的 Map 類 |
注意:pageScope,requestScope,sessionScope,applicationScope這些變量並沒有直接賦予我們在EL中直接訪問真正的page,ServletRequset,HttpSession以及ServeltContext的權利,他們返回的只是一個分別與page作用域,request作用域,session作用域,application作用域有關的屬性名和值的Map對象。
當容器解析EL表達式中的變量時,例如${x}中的x,容器首先檢查隱式變量。如果隱式變量中找不到x,他將依次查找page,request,session,application范圍的屬性,如果還找不到x,則返回null。
測試EL表達式中是個隱式變量
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@ taglib prefix="juxing" uri="http://function/getJuXing" %> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>隱式變量</title> 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 </head> 23 24 <body> 25 <br/>---------------- 1 pageContext對象 :獲取JSP頁面中的pageContext對象---------------------- <br/> 26 ${pageContext}<br/> 27 28 <br/>---------------- 2 pageScope對象 :從page域(pageScope)中查找數據--------------------------<br/> 29 <% pageContext.setAttribute("name","kitty");%> <!-- map --> 30 ${pageScope.name}<br/> 31 32 <br/>---------------3 requestScope對象:從request域(requestScope)中獲取數據------------------------<br/> 33 <% request.setAttribute("name", "kitty1"); %> <!-- map --> 34 ${requestScope.name}<br/> 35 36 <br/>---------------4 sessionScope對象:從session域(sessionScope)中獲取數據------------------------<br/> 37 <%session.setAttribute("name", "kitty2"); %> <!-- map --> 38 ${sessionScope.name}<br/> 39 40 <br/>---------------5 applicationScope對象:從application域(applicationScope)中獲取數據------------------------<br/> 41 <%application.setAttribute("name", "kitty3"); %><!-- map --> 42 ${applicationScope.name}<br/> 43 44 <br/>--------------6 param對象:獲得用於保存請求參數map,並從map中獲取數據------------------------<br/> 45 <br/>--------------7 paramValues對象:paramValues獲得請求參數 ------------------------<br/> 46 param或paramValues變量使我們可以獲取ServletRequest中傳遞過來的參數值。<br/> 47 param相當於是使用參數名,調用getParameter(String name)后 得到的結果。<br/> 48 paramValues是使用getParameter(String[] name)方法所返回的指定參數名的數組值<br/> 49 50 <br/>--------------8 header對象:header獲得請求頭------------------------<br/> 51 ${header.Accept}<br/> 52 53 <br/>--------------9 headerValues對象:headerValues獲得請求頭的值------------------------<br/> 54 <%--headerValues表示一個保存了所有http請求頭字段的Map對象,它對於某個請求參數,返回的是一個string[]數組 55 例如:headerValues.Accept返回的是一個string[]數組 ,headerValues.Accept[0]取出數組中的第一個值 56 --%> 57 58 ${headerValues.Accept[0]}<br/> 59 <br/>--------------10、cookie對象:cookie對象獲取客戶機提交的cookie------------------------<br/> 60 <!-- 從cookie隱式對象中根據名稱獲取到的是cookie對象,要想獲取值,還需要.value --> 61 ${cookie.JSESSIONID.value} //保存所有cookie的map 62 </body> 63 </html>
結果:
1.3 EL運算符
運算符可以分為四類:屬性和集合訪問運算符,算術運算符,關系運算符,邏輯運算符。
1.3.1用於訪問屬性和集合的EL運算符
屬性訪問運算符是我們可以訪問對象的成員,集合訪問運算符可以返回Map,List 或Array中的元素。
1.3.2 EL算數,關系,邏輯運算符
1.3.2.1 算術運算符就是加減乘除取模;
1.3.2.2 關系運算符
1.3.2.3 邏輯運算符
1.3.2.4 其他
empty運算符:檢查對象是否為null(空)
二元表達式:${user!=null?user.name :""}
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>運算符</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 <br/>--------------------用於訪問屬性和集合的EL運算符----------------<br/> 27 <% 28 Map<String,String> map = new LinkedHashMap<String,String>(); 29 map.put("a","aaaaxxx"); 30 map.put("b","bbbb"); 31 map.put("c","cccc"); 32 map.put("1","aaaa1111"); 33 request.setAttribute("map",map); 34 %> 35 ${map.a}<br/> 36 ${map.b}<br/> 37 ${map["1"]}<br/> 38 39 <br/>--------------------算術運算符----------------<br/> 40 5+5= ${5+5}<br/> 41 5-5= ${5-5}<br/> 42 5*5= ${5*5}<br/> 43 5/5= ${5/5}<br/><%-- ${5div5} --%> 44 5%3= ${5%3}<br/><%-- ${5mod3} --%> 45 <br/>--------------------關系運算符----------------<br/> 46 ${5==5} <br/> 47 ${5!=6} <br/> 48 ${5<=5} <br/><%-- ${5 le 6} --%> 49 ${5< 6} <br/><%-- ${5 lt 6} --%> 50 ${5>=5} <br/><%-- ${5 ge 6} --%> 51 ${5> 4} <br/> <%-- ${5 gt 6} --%> 52 <br/>--------------------是否為空----------------<br/> 53 <% 54 List<String> list = new ArrayList<String>(); 55 list.add("1111"); 56 list.add("222"); 57 request.setAttribute("list",list); 58 %> 59 ${empty(list)} 60 <br/>--------------------條件運算----------------<br/> 61 ${3==5?3:5} 62 63 </body> 64 </html>
結果顯示:
1.4 函數
EL函數使用起來比較復雜,但是他為JSP提供了完全的業務邏輯和表現邏輯分離。
JSP頁面(*.jsp):使用標記庫URI和函數名調用方法
示例:打印個矩形方法。
Rectangle
1.4.1 創建靜態方法
Rectangle.java
1 package com.cy.functionn; 2 3 public class Rectangle{ 4 /*方法必須被聲明為public和static,而方法所屬的類必須聲明為public。這樣Servlet就可以直接訪問該類及其方法,而不用創建一個新對象*/ 5 /*方法的參數和返回值必須在EL中是有效的。*/ 6 /*類文件一般保存在/WEB-INF/下*/ 7 public static String getRectangle(int clos,int rows){ 8 StringBuffer sb=new StringBuffer(); 9 for(int i=0;i<clos;i++){ 10 for(int j=0;j<rows;j++){ 11 sb.append("*"); 12 } 13 sb.append("<br/>"); 14 } 15 return sb.toString(); 16 } 17 18 }
1.4.2 創建標記庫描述文件(TLD)
function.tld
Rectangle
1 <!--TLD的目標是講靜態方法映射到可以在JSP中使用的函數名,這是必須的,因為EL中不允許直接調用java方法 --> 2 <taglib xmlns="http://java.sun.com.xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com.xml/ns/j2ee web-jsptaglibrary_2_0.xsd" 4 version="2.0"> 5 6 <tlib-version>1.0 </tlib-version> 7 <function> 8 <name>aaa</name><!-- 定義要在JSP中使用的函數名 --> 9 <function-class>com.cy.functionn.Rectangle</function-class><!-- 定義方法所在的類的全名 --> 10 <function-signature>java.lang.String getRectangle(int,int)</function-signature><!--定義靜態方法及其參數和返回值的全數據類型 --> 11 </function> 12 13 </taglib>
1.4.3 更改部署描述文件
1
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>EL</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <jsp-config> 14 <taglib> 15 <taglib-uri>http://function/getRectangle</taglib-uri><!-- 定義用於 Servlet, JSP要訪問的路徑--> 16 <taglib-location>/WEB-INF/tld/function.tld</taglib-location><!-- 定義標記庫描述文件的上下路徑 --> 17 </taglib> 18 </jsp-config> 19 20 </web-app>
1.4.4 在JSP內訪問EL函數
1
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <!-- 使用taglib指令訪問TLD,並用一個前綴代表該標記庫。使用TLD前綴和函數名創建一個EL表達式。 3 prefix:定義前綴 4 uri:定義路徑與taglib-uri相同 5 --> 6 <%@ taglib prefix="myFun" uri="http://function/getRectangle"%> 7 <% 8 String path = request.getContextPath(); 9 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 10 %> 11 12 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 13 <html> 14 <head> 15 <base href="<%=basePath%>"> 16 17 <title>My JSP 'MyJsp.jsp' starting page</title> 18 19 <meta http-equiv="pragma" content="no-cache"> 20 <meta http-equiv="cache-control" content="no-cache"> 21 <meta http-equiv="expires" content="0"> 22 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 23 <meta http-equiv="description" content="This is my page"> 24 <!-- 25 <link rel="stylesheet" type="text/css" href="styles.css"> 26 --> 27 28 </head> 29 <body> 30 <pre>${myFun:aaa(6,10)}</pre> 31 </body> 32 </html>
二 JSP自定義標記庫與標准標記庫JSTL
JSTL(JSP標准標准庫,JavaServlet Page Standard Tag Liabary)
jstl規范是SUN JCP指定的一個官方java規范請求(JSR).
JSTL標准標記庫
功能范圍 |
作用 |
URI |
前綴 |
核心(core) |
一般用途處理的標記 |
http://java.sun.com/jsp/jstl/core |
c |
xml |
解析、選擇、轉換XML數據的標記 |
http://java.sun.com/jsp/jstl/xml |
x |
數據庫(sql) |
訪問關系型數據庫的標記 |
http://java.sun.com/jsp/jstl/sql |
sql |
國際化(I18N) |
為國際化應用格式化數據的標記 |
http://java.sun.com/jsp/jstl/fmt |
fmt |
函數(Functions) |
處理字符串和集合的標記 |
http://java.sun.com/jsp/jstl/functions |
fn |
我們最常用的是核心標記庫。
為了給JSP提供JSTL能力,我們需要兩個JAR文件。第一個文件是jstl.jar,他為JSTL標記庫提供API類。
第二個文件是standard.jar,他提供了標記庫的實現類。我們需要把這兩個文件復制到我們自己的應用程序的WEB-INF下的lib目錄。
我們需要在JSP中通過taglib指令引用標記庫。
1 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.1 通用標記
<c:catch > ,<c:out>
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>My JSP 'jstl.jsp' starting page</title> 14 15 <meta http-equiv="pragma" content="no-cache"> 16 <meta http-equiv="cache-control" content="no-cache"> 17 <meta http-equiv="expires" content="0"> 18 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 19 <meta http-equiv="description" content="This is my page"> 20 <!-- 21 <link rel="stylesheet" type="text/css" href="styles.css"> 22 --> 23 </head> 24 <body> 25 <%-- 標記<c:catch>允許我們在jsp中不需要錯誤頁面捕獲程序錯誤。標記<c:out>與JSP腳本表達式類似,用於顯示內容 --%> 26 <c:catch var="a"> 27 會拋異常的代碼 ,異常的值會存儲在頁面范圍變量a中。<br/> 28 </c:catch> 29 <c:out value=""></c:out> 30 如----------------------------:<br/> 31 <c:catch var="e"> 32 ${"1aaa"+1} <!-- 會拋異常的代碼 --> 33 </c:catch> 34 <c:out value="e"></c:out><br/> 35 <c:out value="${e}"></c:out> <br/> 36 </body> 37 </html>
顯示:
2.2 變量支持標記
1<c:set>:用於設置變量和對象的值;
2<c:remove>:用於講一個變量從其作用域中刪除;
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>My JSP 'jstl.jsp' starting page</title> 14 15 <meta http-equiv="pragma" content="no-cache"> 16 <meta http-equiv="cache-control" content="no-cache"> 17 <meta http-equiv="expires" content="0"> 18 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 19 <meta http-equiv="description" content="This is my page"> 20 <!-- 21 <link rel="stylesheet" type="text/css" href="styles.css"> 22 --> 23 </head> 24 <body> 25 <c:set var ="num"> ${8*7} </c:set> 26 <c:set var ="num" value="${8*7}"></c:set> 27 <% Map<String,String> map = new LinkedHashMap<String,String>(); 28 map.put("a","aaaaxxx"); 29 map.put("b","bbbb"); 30 request.setAttribute("map",map); 31 %> 32 <!-- 用於javabean和map對象 --> 33 <c:set target="${map}" property="a"> 狗狗</c:set> 34 ${map.a} <br/> 35 <c:set target="${map}" property="b" value="小狗狗"></c:set> 36 ${map.b} <br/> 37 ${num}<br/> 38 remove標記不用於javaBean和Map對象<br/> 39 <c:remove var="num" scope="page"/> 40 ${num}<br/> 41 </body> 42 </html>
2.3 流程控制
2.3.1 JSTL條件處理
2.3.2 循環
1 <c:if> <c:choose>條件處理
2 <c:forEach><c:forTokens> 循環
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme() + "://" 6 + request.getServerName() + ":" + request.getServerPort() 7 + path + "/"; 8 %> 9 10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 11 <html> 12 <head> 13 <base href="<%=basePath%>"> 14 15 <title>My JSP 'jstl.jsp' starting page</title> 16 17 <meta http-equiv="pragma" content="no-cache"> 18 <meta http-equiv="cache-control" content="no-cache"> 19 <meta http-equiv="expires" content="0"> 20 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 21 <meta http-equiv="description" content="This is my page"> 22 <!-- 23 <link rel="stylesheet" type="text/css" href="styles.css"> 24 --> 25 </head> 26 <body> 27 28 test:設置布爾表達式,true,false. 29 <br /> 30 <c:if test="${9==9}"> 31 你好!<br /> 32 </c:if> 33 <c:choose> 34 <c:when test="${5!=5}"> 35 錯誤<br /> 36 </c:when> 37 38 <c:when test="${5==5}"> 39 正確1<br /> 40 </c:when> 41 42 <c:when test="${5!=5}"> 43 正確2<br /> 44 </c:when> 45 46 </c:choose> 47 48 x:變量 begin:起始值 end:結束值 step:間隔值 49 <c:forEach var="x" begin="0" end="10" step="3"> 50 ${x} 51 </c:forEach> 52 <br /> 53 54 <c:set var="str" value="hello,world,kitty"></c:set> 55 items:要處理的用分隔符分隔的字符串對象; delims:指定分隔符 56 <c:forTokens var="bl" items="${str}" delims=","> 57 ${bl} 58 </c:forTokens> 59 60 </body> 61 </html>
2.4 用JSTL訪問URL信息
2.4.1 <c:url> 重寫URL並對其參數編碼
2.4.2 <c:import> 訪問Web應用程序之外的內容
2.4.3 <c:redirect> 重定向到不同的URL