在上一章中总结了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提供了完全的业务逻辑和表现逻辑分离。
使用EL函数的步骤
–方法类(.java):包含需要在JSP中使用的Java方法;
–标记库描述文件(*.tld):映射每个Java方法到XML函数名;
–部署描述文件(web.xml):映射TLD到标记库URI
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