六、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原理.png

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九个内置对象及其类型

jsp九个内置对象及其类型.png

内置对象 类型
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>标签的子标签,用来给转发或包含的页面传递数据。

静态包含与动态包含的区别

静态包含与动态包含的区别.png

include标签与inclue指令区别:

  1. include指令是静态包含,包含文件中包含了被包含文件的内容.
    include标签是动态包含,它包含的是被包含文件执行后的结果.

  2. include指令不能带参数
    include标签是可以带参数的

三、EL表达式

EL是Expression Language的缩写,它是jsp内置的表达式语言,从jsp2.0开始,就不让再使用java脚本,而是使用el表达式或动态标签来代替java脚本。EL表达式的格式如下:
${表达式}
EL表达式代替的是java脚本中的<%= …%>,也就是说EL表达式也是向浏览器端输出数据。例如${1+2}会向浏览器端输出3。

EL表达式的作用
为了使JSP写起来更加简单,更加安全,可以通过EL表达式来替换我们jsp页面上的脚本
EL主要作用:

  1. 获取数据:
    EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
  2. 执行运算:
    利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
  3. 获取web开发常用对象
    EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
  4. 调用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表达式获取数据

表达式之域查找

  1. pageContext--------------------${pageScope.xxx}
  2. request--------------------------${requestScope.xxx}
  3. session--------------------------${sessionScope.xxx}
  4. 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表达式支持三元运算符

  1. EL表达式不可以嵌套
    ${a+${b}}这种是不允许的。
  2. 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个标签

  1. c:out 输出内容到浏览器端
  2. c:set 设置值到四种数据范围,设置四个范围中java对象的一个属性值
  3. c:remove 用来删除四个数据范围的数据
  4. c:catch 捕获程序异常
  5. c:if 取代页面中if条件语句,记住没有c:else
    <c:if test="${m>5}" > </c:if>
  6. c:choose c:when c:otherwise 一起使用 ,取代if elseif else 结构 、switch-case 结构
  7. c:forEach 取代页面中for循环
  8. c:forTokens 切割字符串
  9. c:import 效果和include类似
  10. c:url 完成URL重写 (禁用cookie的session追踪 ) ---- 结合c:param完成 中文URL编码
  11. c:redirect 完成请求重定向
  12. 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

  1. begin属性
    设置循环变量从几开始

  2. end属性
    设置循环变量到几结束;

  3. step属性
    设置循环变量的步长

  4. var属性
    定义一个变量,用于接收循环或把数组或集合中遍历的每一个元素赋值给var指定的变量

  5. varStatus属性
    varStatus属性就是用来记录循环状态的,它可以创建一个循环变量vs,该循环变量有如下属性:
    count:用来记录循环元素的个数;
    index:用来记录所循环元素的下标;
    first:判断当前循环的元素是否是第一个元素;
    last:判断当前循环的元素是否是最后一个元素;
    current:代表当前循环的元素。

  6. items:属性
    指定要循环的变量,可以是一个数组也可以是一个集合,默认是支持EL表达式

  7. 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

  1. 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不写的时候,会把所有域中的同名的属性删除掉.

  2. 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>  将异常信息输出
  1. 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>
  1. c:import
    作用:用于在JSP页面中导入一个URL地址指向的资源内容,其作用有点类似<jsp:include>这个JSP标准标签
    最基本的使用
    <c:import url="if.jsp"></c:import>

  2. 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"/>

  3. c:redirect
    作用:主要应用于重定向
    例如:
    <c:redirect url="/jstl/if.jsp" context='/day11'></c:redirect>

  4. 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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335