六、JSP & EL & JSTL
一、jsp介绍
jsp作用
jsp全称java server pages(java服务器页面),本质是一个servlet。
它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。
jsp作用:将内容的生成和显示进行分离 。
用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面,并使用JSP标识或者小脚本来生成页面上的动态内容
jsp原理
jsp脚本
有三个基本的脚本元素,作用是使JAVA代码可以直接插入到HTML代码中。
声明标签
格式:<%! int a = 1; %>
作用:声明的变量在类的成员位置上
脚本片断
格式:<% int a = 1; out.println(a); %>
作用:内容会生成在_jspService()方法中
脚本表达式
格式:<%= "hello " + a %>
作用:它就相当于是out.println()将内容直接输出到页面中,注意表达式不能以分号结尾
jsp注释
在jsp页面中可以使用三种注释
可以使用html中注释
<!-- html的注释 -->
可以对jsp脚本内容使用java注释
//单行注释 /* 多行注释 */ /**文档注释*/
可以使用jsp注释(推荐)
<%-- jsp注释 --%>
二、 jsp指令
jsp指令介绍
当我们创建一个jsp页面时,在页面第一行有一段代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
这个就是指令,对于指令它有以下作用
a. 用于指示JSP执行某些步骤
b. 用于指示JSP表现特定行为
jsp指令格式
格式:
<%@指令名 attr1=”” attr2=””%>
注意:
其中attr1和attr2表示指令中的属性,通常我们将JSP指令写在JSP文件的的最上方,但是这不是必须的。
jsp指令分类
JSP中有三大指令,分别是以下三个:
page
include
taglib
其中这三个指令中,page是最复杂的,我们会详细讲解(导入类,编码的设置等等);include指令表示静态包含,我们之前学习的请求包含属于动态包含;taglib指令是用来导入标签库。
3. jsp指令-page
重点属性:
import
作用:在jsp页面上导包操作.
这个属性可以有多个.
pageEncoding
作用:指定当前jsp页面的编码。这个编码是给服务器看的,服务器需要知道当前页面的编码,否则服务器无法正确的把jsp翻译成Java文件。
contentType
在jsp文件中有如下指令:
<%@page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
其中contentType属性的作用等同于response.setContentType(“text/html;charset=utf-8”)
的作用。response的setContentType()方法这里我们就不再多说,当我们在jsp文件中提供了contentType属性,那么jsp对应的java文件中就会存在response.setContentType(“text/html;charset=utf-8”)
这句代码。contentType属性的默认值是“text/html; charset=ISO-8859-1”,但是我们知道iso-8859-1并不支持中文,所以我们需要将charset的值修改为“utf-8“。
pageEncoding与contentType的区别与联系
pageEncoding与contentType都是page指令的属性,它们都是用来设置编码,有如下联系:
如果这两个属性只提供了其中一个,那么没有提供的那个属性的编码值就是提供的这个属性的编码值,例如:在jsp页面中设置了contentType=”text/html;charset=utf-8”,那么没有设置的pageEncoding的值就为utf-8,反之亦然;
如果两个属性都没有提供,那么两者的默认编码就是ISO-8859-1。
根据对这两个属性的讲解,它们有如下区别:
pageEncoding是设置当前页面的编码,该编码是给服务器看的,可以让服务器正确的将jsp文件翻译成Java文件;
contentType有两个作用:一是设置响应字符流的编码,二是设置Content-Type响应头,即通知浏览器使用什么编码方式解码响应信息。
其他属性
language
代表在jsp脚本中可以写的语言, 只有一个值 java
extends
它用于设置jsp翻译后的java类的父类. 要求必须是HttpServlet或其子类.
session
面上是否禁用session。可取值为true/false 如果值为false,在页面上不能使用session。
isELIgnored
用是否忽略el表达式.可取值为true/false 如果值为true,那么页面上的el表达式就不会被解析.
autoFlush与buffer
用于设置jsp中out流的默认缓冲区大小以及是否自动刷新.
errorPage
设置错误页面,当jsp中如果出现了异常,会自动跳转到指定的错误页面
isErrorPage
指示当前页面是一个错误页面,这时就可以使用一个内置对象 exception
通过这个内置对象就可以获取异常信息.
4. jsp指令-include和taglib
include
作用
include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容
格式
<%@ include file=“filename” %>
功能分析
包含的是目标文件的源码;包含过来,一起翻译
main.jsp中的代码
<%
String s = “abc”;
%>
<%include file=“part.jsp” %>
part.jsp中的代码
<%=s %> 没有定义变量s
尽管part.jsp本身没有错误但是运行main.jsp就可以正确引入part.jsp
taglib
作用
作用:是用于导入标签库.
格式
<%@taglib prefix="" uri="" %>
uri 标签文件的URI地址
prefix 标签组的命名空间前缀
5. jsp内置对象
jsp九个内置对象及其类型
内置对象 | 类型 |
---|---|
request | HttpServletRequest |
response | HttpServletResponse |
session | HttpSession |
application | ServletContext |
config | ServletConfig |
page | this(Servlet) |
pageContext | PageContext |
exception | Throwable |
out | JspWriter |
jsp九个内置对象的创建过程
我们可以创建一个demo1.jsp页面,启动服务器,在浏览器中访问 demo1.jsp页面,在tomcat下的work目录中查找到它翻译后的demo1_jsp.java文件,在java文件中我们可以查找到每一个内置对象的创建。
request,response这两个对象是jspService的参数
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
注意:exception对象只有在jsp页面上设置了page指令的isErrorPage才会有exception对象。
jsp中的四个域对象
jsp有四个域对象,分别是:
application:域范围是整个应用;
session:域范围是整个会话,注意一个会话中只有一个用户,如果要统计站点的访问次数,使用的域是ServletContext,因为这个时候统计的是多个用户,而非一个用户;
request:域范围是整个请求链;
pageContext:域范围是一个jsp页面,在一个页面中存数据再取数据没有任何意义,所以这里所说的域指的是在当前jsp页面和当前jsp页面中使用的标签之间共享数据。
6. jsp内置对象pageContext的作用
获取其他内置对象
可以通过pageContext对象获取jsp中其他的内置对象. PageContext类中定义了如下八个方法:getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父类中定义的,有了这些方法,pageContext对象自然能够获取其他八个内置对象了。
操作四个域对象
pageContext也是一个域对象,所以他有以下方法:
void setAttribute(String name,Object value)
Object getAttribute(String name);
Void removeAttribute(String name);
我们还可以利用以下方法操作其他域中的对象:
Object getAttribute(String name, int scope);
该方法的第一个参数是域属性的名称,第二个参数指定是从那个域中取出域属性;
在PageContext中已经定义了如下几个静态常量作为scope的可选值:
int APPLICATION_SCOPE
:表示从application域中获取数据;
int PAGE_SCOPE
:表示从pageContext域中获取数据;
int REQUEST_SCOPE
:表示从request域中获取数据;
int SESSION_SCOPE
:表示从session域中获取数据。
void setAttribute(String name,Object value,int scope);
该方法的第一个参数指的是域属性的名称,第二参数指的是域属性的值,第三个参数指定域属性保存的域,scope的取值同上;
void removeAttribute(String name,int scope);
该方法的第一个参数指的是域属性的名称,第二个参数指的是将指定域属性从哪个域中移出,scope的取值同上;
便捷查询域中数据
PageContext类的父类中定义了如下方法:
Object findAttribute(String name)
:该方法是从jsp的四个域pageContext、request、session、application依次查找指定名称的域属性,如果找到就停止,这说明如果这四个域中存在同名的属性,那么返回的数据是从page范围中获取的。即表示谁的域范围越小,谁的优先级越高。
7. jsp动作标签
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
常用的jsp标签
jsp:forward
<jsp:forward>标签是用来做请求转发,它与RequestDispatcher接口的forward()方法一样,唯一不同的是它是在jsp页面中使用。
jsp:include
<jsp:include>标签的作用使用来包含其他jsp页面,之前学习的include指令属于静态包含,而include动作标签是动态包含,它和RequestDispatcher接口的include()方法一样,是运行级别的包含
jsp:param
<jsp:param>标签作为<jsp:forward>标签和<jsp:include>标签的子标签,用来给转发或包含的页面传递数据。
静态包含与动态包含的区别
include标签与inclue指令区别:
-
include指令是静态包含,包含文件中包含了被包含文件的内容.
include标签是动态包含,它包含的是被包含文件执行后的结果. -
include指令不能带参数
include标签是可以带参数的
三、EL表达式
EL是Expression Language的缩写,它是jsp内置的表达式语言,从jsp2.0开始,就不让再使用java脚本,而是使用el表达式或动态标签来代替java脚本。EL表达式的格式如下:
${表达式}
EL表达式代替的是java脚本中的<%= …%>,也就是说EL表达式也是向浏览器端输出数据。例如${1+2}会向浏览器端输出3。
EL表达式的作用
为了使JSP写起来更加简单,更加安全,可以通过EL表达式来替换我们jsp页面上的脚本
EL主要作用:
- 获取数据:
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组) - 执行运算:
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null} - 获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。 - 调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
EL表达式使用时注意事项
EL表达式是JSP 2.0(JavaEE1.4)规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。
注意:有些Tomcat服务器如不能使用EL表达式
(1)升级成tomcat6
(2)在JSP中加入<%@ page isELIgnored="false" %>
以下为jsp,servlet,javaee,jdk版本之间的对应关系
jsp | javaee | servlet | tomcat | jdk |
---|---|---|---|---|
Jsp2.0 | javaee1.4 | servlet2.4 | tomcat5.x | jdk1.4 |
Jsp.2.0/2.1 | javaee5.0 | servlet2.5 | tomcat6.0 | jdk1.5 |
Jsp2.1 | javaee6.0 | servlet3.0 | tomcat7.x | jdk1.6 |
1. EL表达式获取数据
表达式之域查找
- pageContext--------------------${pageScope.xxx}
- request--------------------------${requestScope.xxx}
- session--------------------------${sessionScope.xxx}
- application---------------------${applicationScope.xxx}
通过el获取时,如果没有查找到,会返回"".除了上面的获取方式外还有一种,例如
${requestScope[“xxx”]}
关于.与[ ]区别
[ ]与.在使用方式上是一样的.但是如果名称中包含了"."等特殊字符,就必须使用[ ]来获取.
例如
request.setAttribute("login.message", "登录失败");
${requestScope.login.message} 错误的
${requestScope["login.message"] }正确的
如果没有写范围,会默认从page,request,session.application依次查找
EL表达式获取复杂数据
获取数组中数据
例如:${数组名称[索引] }
获取List中数据
例如:${集合名称[索引]}
获取Map中数据
例如:${集合名称.key名称}
EL表达式之javabean导航
如果在域中保存的是javaBean对象,那么也可以使用EL表达式来访问javaBean的属性,因为EL表达式只做读操作,所以javaBean一定要为属性提供get方法,而对set方法没有要求。使用EL表达式获取javaBean属性就是javaBean导航。
3. EL表达式执行运算
常见的运算符
EL表达式执行运算.png
empty我们在开发中检查对象是否为null或“空”或判断容器size是否为0
注意事项:
1 .EL表达式支持三元运算符
- EL表达式不可以嵌套
${a+${b}}这种是不允许的。 - EL中的加号问题:
EL表达式中加号两边必须是数字或者字符串形式的数字
4. EL表达式内置对象
EL表达式的11个内置对象。11个内置对象如下所示:
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
initParam
cookie
pageContext
其中,pageScope,requestScope,sessionScope,applicationScope是域相关的内置对象,这里我们就不再多说。这11个内置对象中,有10个内置对象的类型是Map类型,只有pageContext的类型不是Map类型,它的类型是PageContext。
pageContext
EL表达式的11个内置对象中,有10个内置对象的类型是Map类型,只有pageContext的类型是PageContext。它的使用类似于我们jsp的内置对象pageContext,. 通过pageContext对象可以获取其他内置对象的任意的属性值。
常用操作:${pageContext.request.contextPath}
关于请求参数相关内置对象的介绍
请求参数相关的内置对象是:
param:该内置对象的类型是Map<String,String>,可以用来获取值为单值的请求参数,其中key指的是请求参数的名称,value指的是请求参数的值,使用param获取请求参数与request.getParameter()方法一样。
paramValues:该内置对象的类型是Map<String,String[]>,可以用来获取值为多值的请求参数,其中key是参数名,value是多个参数值组成的字符串数组。
注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。
关于请求头相关内置对象的介绍
与请求头相关的内置对象是:
header:该内置对象的类型是Map<String,String>,用来获取值为单值的请求头信息,其中key代表的是请求头名称,value代表的是请求头的值;
headerValues:该内置对象的类型是Map<String,String[]>,用来获取值为多值的请求头信息,key代表的是请求头名称,value代表的是请求头的多个值。
关于全局初始化参数的内置对象的介绍
我们再学习Servlet时,讲过在web.xml文件中配置全局初始化参数,并且全局初始化参数可以使用ServletContext对象获取,现在在EL表达式中内置了一个与初始化参数相关的对象:
initParam:该内置对象的类型是Map<String,String>,用来获取web.xml文件中<context-param>标签的参数值,其中key代表的是参数名,value代表的是参数值。
关于cookie相关内置对象的介绍
EL表达式也内置一个名为cookie的对象,该内置对象与cookie相关,如下:
cookie:该内置对象的类型为Map<String,Cookie>,其中key是Cookie的名字,value是Cookie对象本身。
5. EL函数使用
EL函数库是由第三方对EL的扩展,我们现在学习的EL函数库是有JSTL提供的,JSTL我们会在后面的课程中详解。EL函数库就是定义了一些有返回值的静态方法,然后通过EL表达式来调用它们
在jsp页面中使用taglib指令导入EL函数库,就可以在页面中使用函数库中的方法。另外,导入的函数库可以使用的前提是,我们的项目中有相关的jar包
EL函数库使用
要使用EL函数库,首先要在jsp文件的上面使用taglib指令导入函数库:
<%@ taglib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions”%>
其中,uri的值并不是一个网络路径,只是在定义函数库时,拟定的一个位置。
下面我们来了解EL函数库中的相关方法,具体如下:
String toUpperCase(String input)
:把字符串参数转换成大写,并返回;
String toLowerCase(String input)
:把字符串参数转换成小写,并返回;
int indexOf(String input, String substring)
:返回input中substring出现的索引位置;
boolean contains(String input, String substring)
:查看input中是否包含substring,包含返回true,否则返回false;
boolean containsIgnoreCase(String input, String substring)
:在忽略大小写的情况下,查看input中是否包含substring,包含返回true,否则返回false;
boolean startsWith(String input, String substring)
:判断input是否是以substring为前缀,如果是就返回true,否则就返回false;
boolean endsWith(String input, String substring)
:判断input是否是以substring为后缀,如果是就返回true,否则就返回false;
String substring(String input, int beginIndex, int endIndex)
:以beginIndex为开始值,endIndex为结束值,在input上截取子串;
String substringAfter(String input, String substring)
:获取input中,substring所在位置后面的字符串;
substringBefore(String input, String substring)
:获取input中,substring所在位置前面的字符串;
String escapeXml(String input)
:把input中“<”、“>“、”&“、”'“、“"”进行转义;
String trim(String input)
:去除input中的前后空格;
String replace(String input, String substringBefore, String substringAfter)
:将input中的substringBefore替换成substringAfter;
String[] split(String input, String delimiters)
:以delimiters为标识分割input,返回一个字符串数组;
int length(Object obj)
:可以获取字符串、数组、各种集合的长度!
String join(String array[], String separator)
:将array数组中的元素以separator连接起来,返回一个字符串。
示例代码
<!-- 导入函数库 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!-- 以下为body内容,头部自行添加 -->
<body>
<%
String[] strs = {"a", "b","c"};//定义一个字符数组
List list = new ArrayList();//定义一个list集合
list.add("a");//向集合中添加一个字符
pageContext.setAttribute("arr", strs);//将字符数据以arr的名字保存在page域中
pageContext.setAttribute("list", list);//将list集合以list的名字保存在page域中
%>
${fn:length(arr) }<br/><!--返回arr的长度-->
${fn:length(list) }<br/><!--返回list的长度-->
${fn:toLowerCase("Hello") }<br/> <!-- 将Hello变成小写 -->
${fn:toUpperCase("Hello") }<br/> <!-- 将Hello变成大写 -->
${fn:contains("abc", "a")}<br/><!-- 判断abc中是否包含a -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- 在忽略大小写的情况下,判断abc中是否包含Ab -->
${fn:contains(arr, "a")}<br/><!-- 判断arr数组中是否包含a -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- 在忽略大小写的情况下,判断list集合中是否包含A -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- 判断Hello.java是否以.java结束 -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- 判断Hello.java是否以Hell开始 -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 返回“-”在Hello-World中出现的位置 -->
${fn:join(arr, "-")}<br/><!-- 将arr数组中的元素以“-”连接,并返回 -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- 将Hello-World中的“-”替换成“+” -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!--最终是将数组的元素以“-”连接,并返回 -->
${fn:substring("0123456789", 6, 9)}<br/><!-- 返回0123456789中索引值为6到索引值为9之间的元素 -->
${fn:substring("0123456789", 5, -1)}<br/><!-- 返回0123456789中索引值为6到结束的元素 -->
${fn:substringAfter("Hello-World", "-")}<br/><!-- 返回Hello-World中“-”后面的字符串 -->
${fn:substringBefore("Hello-World", "-")}<br/><!-- 返回Hello-World中“-”前面的字符串 -->
${fn:trim(" a b c ")}<br/><!-- 去掉 a b c 前后的空格 -->
${fn:escapeXml("<html></html>")}<br/> <!-- 将“<html></html>”中的“<”,“>”转义,即原样输出 -->
</body>
四、 JSTL
1. JSTL标签介绍
jstl标签库介绍
JSTL(JSP Standard Tag Library,jsp标准标签库)是Apache对EL表达式的扩展,也就是说JSTL依赖EL表达式。JSTL是标签语言,使用起来非常方便。但是它不是jsp内置的标签,所以用的时候需要我们自己导包,以及指定标签库。
如果你使用Myeclipse开发javaweb,那么把项目发布到Tomcat时,你会发现,Myeclipse会在当前工程的lib目录下存放jstl的jar包,如果没有使用Myeclipse开发,那么就需要自己导入这个jstl的jar包:jstl-1.2.jar。
jstl标签库功能介绍
Jstl标签库一共包含了四大标签库:
core:核心标签库,这是我们学习的重点;
fmt:格式化标签库,用的很少;
sql:数据库标签库,这个标签库已经过时,本文档不再对其进行介绍;
xml:xml标签库,这个标签库已经过时,本文档不再对其进行介绍。
另外Jstl标签库中还包含了jstl函数。
如何使用jstl标签库
除了jsp动作标签外,使用其他第三方的标签都需要做以下两件事:
a. 导入jar包;
b. 在使用标签的jsp页面中使用taglib指令导入标签库。
例如:
在jsp页面导入jstl的核心标签库:
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core”%>
其中:
prefix="c":指定标签库的前缀,这个前缀可以赋任意的值,但大家都会在使用core标签库时指定前缀为c;
uri="http://java.sun.com/jsp/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件。
jstl核心标签库标签介绍
JSTL core标签库中 12个标签
- c:out 输出内容到浏览器端
- c:set 设置值到四种数据范围,设置四个范围中java对象的一个属性值
- c:remove 用来删除四个数据范围的数据
- c:catch 捕获程序异常
- c:if 取代页面中if条件语句,记住没有c:else
<c:if test="${m>5}" > </c:if> - c:choose c:when c:otherwise 一起使用 ,取代if elseif else 结构 、switch-case 结构
- c:forEach 取代页面中for循环
- c:forTokens 切割字符串
- c:import 效果和include类似
- c:url 完成URL重写 (禁用cookie的session追踪 ) ---- 结合c:param完成 中文URL编码
- c:redirect 完成请求重定向
- c:param 设置参数 一般和c:url,c:redirect或者c:import一起使用.
重点: c:if c:foreach c:set
2. JSTL核心标签
c:set
格式1:设置域中属性的值
<c:set var=’域中属性名称’ value=’属性的值’ [scope=’page(默认)|request|session|application’]></c:set>
例如:
<c:set var="password" value="tom" scope="request"></c:set>
格式2:设置域中对象属性的值
<c:set property=’对象的属性’ value=’属性的值’ target=’域中对象’></c:set>
例如:
<c:set property="id" value="10" target="${user }"></c:set>
c:if
作用:页面上的逻辑判断
格式:
<c:if test="判断的内容(一般是el表达式)" var="给前面表达式的结果起个名称" [scope="page|request|session|application"] />
注意:
scope 用来表达式结果存放的域
若指定了标签的scope属性,则必须指定var属性
例如:
<c:if test="${3>4 }" var="flag">
三大于四
</c:if>
<c:if test="${3<=4}" var='flag1'>
三不大于四
</c:if>
c:choose与c:when c:otherwise
作用:用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
格式:
<c:choose>
<c:when test=”el表达式”>
语句
</c:when>
<c:otherwise>
语句
</c:otherwise>
</c:choose>
例如:
<c:set var="day" value="17"/>
<c:choose>
<c:when test="${day ==1 }">
周1
</c:when>
<c:when test="${day ==2 }">
周2
</c:when>
<c:when test="${day ==3 }">
周3
</c:when>
<c:when test="${day ==4 }">
周4
</c:when>
<c:when test="${day ==5 }">
周5
</c:when>
<c:when test="${day ==6 }">
周6
</c:when>
<c:when test="${day ==7 }">
周7
</c:when>
<c:otherwise>
你估计来自火星
</c:otherwise>
</c:choose>
c:forEach
-
begin属性
设置循环变量从几开始 -
end属性
设置循环变量到几结束; -
step属性
设置循环变量的步长 -
var属性
定义一个变量,用于接收循环或把数组或集合中遍历的每一个元素赋值给var指定的变量 -
varStatus属性
varStatus属性就是用来记录循环状态的,它可以创建一个循环变量vs,该循环变量有如下属性:
count:用来记录循环元素的个数;
index:用来记录所循环元素的下标;
first:判断当前循环的元素是否是第一个元素;
last:判断当前循环的元素是否是最后一个元素;
current:代表当前循环的元素。 -
items:属性
指定要循环的变量,可以是一个数组也可以是一个集合,默认是支持EL表达式 -
c:out
格式:
<c:out value=’要输出的值’ default=’默认值’ escapeXml=’是否不解析为xml’></c:out>
例如:
在域中有
username=”<a href='#'>jack</a>”
<c:out value="${username }" default="ok" escapeXml="false" ></c:out>
显示的效果为 超链接的jack
-
c:remove
作用:移除域中的属性
格式:
<c:remove var=’属性的名称’ [scope=’page|request|session|application’]></c:remove>
例如:
<c:set var="password" value="123" scope='request'></c:set>
<c:remove var="password" scope=’request’></c:remove>
注意:
scope不写的时候,会把所有域中的同名的属性删除掉. -
c:catch
作用:
用于捕获嵌套在标签体中的内容抛出的异常
格式:
<c:catch var='异常对象名称'>
...
</c:catch>
例如:
<c:catch var="e">
<%
int i=0;
int j=1;
double k=j/i;
%>
</c:catch>
<c:out value="${e }"></c:out> 将异常输出
<c:out value="${e.message }"></c:out> 将异常信息输出
- c:forTokens
作用:用指定的分隔符切分指定内容
格式:
<c:forTokens items=’指定的内容或者el表达式’ delims=’分隔符[分隔符]’ var=’给分割出来的对象起个名字’>
</c:forTokens>
例如:
<c:set var="arr" value="12,23,34|45,56"></c:set>
<c:forTokens items="${arr }" delims="|," var='a'>
${a }-
</c:forTokens>
-
c:import
作用:用于在JSP页面中导入一个URL地址指向的资源内容,其作用有点类似<jsp:include>这个JSP标准标签
最基本的使用
<c:import url="if.jsp"></c:import>
-
c:url
作用:用于在JSP页面中构造一个URL地址
格式:
<c:url value=’路径’ [context=’工程名’] [var=’给当前路径起个名称’] [scope=’page|request|session|application’]></c:url>
例如:
<c:url value="/jstl/if.jsp" var="ifurl" context="/day11" scope="request"/>
-
c:redirect
作用:主要应用于重定向
例如:
<c:redirect url="/jstl/if.jsp" context='/day11'></c:redirect> -
c:param
作用:在地址栏后面设置参数,一般和c:import ,c:url,c:redirect一起使用
例如:
<c:url value="/jstl/if.jsp" var="ifurl" context="/day11" scope="request">
<c:param name="username" value="sansan"></c:param>
<c:param name="password" value="123"></c:param>
</c:url>