这篇文章主要的内容是介绍更多的 JSP
内容,主要包括 JSP
的指令元素、JSP
的内置对象、EL
表达式以及 JSTL
标准标签库,能够熟练的掌握更多的工具就可以更熟练的开发,也能提高自己的开发效率,因此下面会介绍的知识和工具还是非常有用的。
1.JSP模板
在我们使用 Eclipse
开发 Web
项目时,如果新建一个 JSP
文件,当我们打开新建的 JSP
文件时,会发现文件中所有关于字符编码的设置都是 ISO8859-1
的,但是现在来说,我们最常使用的字符编码是 UTF-8
的,那就需要我们修改 JSP
页面的字符编码了,但是如果等 JSP
文件新建之后再去修改编码的话,那就太麻烦了,因为文件一多起来之后,修改的地方就太多了,其实比较简单的方法就是修改新建 JSP
文件时使用模板里面的字符编码,只要将该编码修改为我们所需要的,那么后面再新建 JSP
文件就全部都是我们需要的了。
修改 JSP
文件使用模板中的字符编码的方法为:首先点击 Eclipse
中的 Window
菜单,然后选择其中的 Preferences
,再选择 Web
,就可以看到其中有一个选项为 JSP Files
,然后对于右侧的 Encoding
选择自己想要使用的字符编码,当然我们这里就直接选择 UTF-8
了。
2.JSP中的注释
JSP
文件简单看做是由 HTML
和 Java
代码组成的,因此在 JSP
中是可以使用 HTML
注释和 Java
的注释的,当然 JSP
也有自己的注释,因此这三者都是可以使用的。
首先看 HTML
的注释,格式为:
<!-- HTML注释 -->
那 HTML
注释在 JSP
的整个生命周期存在的情况是怎样的呢?答案就是 HTML
的注释在 JSP
被翻译为 Servlet
文件还会存在,而且在生成 HTML
文件响应到浏览器之后也会存在,这个我们在浏览器中查看页面源代码就可以知道了。
再看 Java
的注释,当然 Java
的注释我们就很熟悉了,主要分为三种:单行注释、多行注释和文档注释,具体看下面:
<%
// 单行注释
/* */ 多行注释
/**
* 文档注释
*/
%>
那 Java
的注释在 JSP
的生存周期中存在的情况是怎样的呢?在 JSP
文件翻译为 Servlet
之后 Java
的注释是依然存在的,不过在生成 HTML
文件响应给浏览器之后就不会存在了。
最后就是 JSP
自身的注释了,格式为:
<%-- JSP注释 --%>
JSP
的注释在其生命周期存在的情况就是只存在于 JSP
的源码当中,当 JSP
翻译为 Servlet
之后就不会存在了。
3.JSP的指令元素
JSP
的指令元素相当于是一些特殊的命令,指示 JSP
页面执行特定的行为,指令元素的语法如下所示:
<%@ 指令名称 属性名称=属性值 属性名称=属性值 %>
JSP
一共有 3
种指令元素,名称以及对应的作用如下:
page指令:指定JSP页面的属性和行为
include指令:指定JSP包含哪些页面
taglib指令:指定JSP页面使用的标准标签库
3.1 page指令
page
指令主要是用于设置页面中的属性的属性值,其基本的语法为:
<%@ page 属性名=属性值 %>
page
指令有很多属性可以设置,在一个页面中可以只设置一个属性,也可以设置多个属性,不过一般属性都只能出现一次,即被设置一次,但是 import
属性是可以被使用多次的。
下面是 page
指令的属性名称以及相对应的含义:
language:指定JSP中所使用的脚本语言,现在只能为Java
extends:指定JSP翻译为Servlet时要继承的类,默认值为HttpJspBase
session:指定JSP中是否可以直接使用session对象,默认值为true
buffer:指定JSP对客户端的缓冲区大小,默认值为8kb
autoFlush:指定达到缓冲区大小,是否自动刷新,默认值为true
import:用于导入Java类或包
contentType:指定JSP被浏览器解析和打开时所使用的字符集编码
pageEncoding:指定JSP以及被翻译成的Servlet文件保存到硬盘中采取的字符集编码
isErrorPage:指定是否为页面发生异常时所跳转到的页面
errorPage:指定页面发生异常时所要跳转到的页面
isELIgnored:指定JSP页面是否忽略EL表达式
其实看上面列出的内容就知道 page
指令的属性是非常多的,全部记在脑袋里面的话,也没有那个必要,因为内容相对来说还是太多了,而且写博客的目的也是为了整理知识,所以只需要记得到哪里可以查找到就可以了。
3.2 include指令
include
主要是用来进行页面的包含,因为有的网站页面中有的部分相对于来说比较固定,比如说网站 logo
、网站菜单栏以及网页的尾部,如果每个页面都去写一遍的话,重复代码就会很多,经常会变得难以维护,所以可以将一些比较固定的部分抽取出来,然后需要使用的页面直接进行包含就好了,这样就可以减少代码的重复。
include
指令的语法为:
<%@ include 属性名=属性值 %>
include
指令中的属性相对来说较少,只有一个 file
属性,其属性值的取值就是要包含页面所在的路径了。
这种 include
指令的包含,我们一般称之为静态包含
,需要重点说明的就是静态包含的原理,其实静态包含的过程也是很简单的,就是比如主页 index.jsp
需要包含其它页面,那这时 index.jsp
就会先将别的需要包含的部分一起合起来成为一个大的 JSP
文件,然后再翻译为一个 Servlet
文件,最后生成 HTML
响应给用户浏览器,这就是静态包含的整个过程。
因为静态包含是先将 JSP
文件合在一起再翻译为 Servlet
文件的,因此是可以去掉被包含文件中的页面结构的,而且在被包含页面中声明变量,也是可以直接在包含页面中使用的。
3.3 taglib指令
taglib
主要是用来在页面中引入标准标签库,像我们后面将会介绍的 JSTL
,在使用之前就需要在页面之中先进行引用。taglib
指令的语法为:
<%@ taglib 属性名=属性值 %>
taglib
指令起来也是很简单的,因为就只有 uri
和 prefix
这两个属性,下面分别说一下这两个属性所对应的含义。
uri:所引入标签库的路径
prefix:所引入标签库在使用时的别名
4.JSP的内置对象
为了简化开发,JSP
提供了很多的内置对象供我们使用,都是可以在页面中直接使用的,这样就可以大大的提升开发效率,JSP
中一共有 9
个内置对象,它们各自的作用如下:
request:从客户端向服务器端发送的请求对象
response:从服务器端向客户端响应的响应对象
session:服务器端为客户端创建的会话对象
application:代表的是整个应用,也就是ServletContext对象
out:向输出流写入内容的对象
page:JSP翻译为Servlet之后的对象引用
pageContext:JSP页面的上下文对象
config:该JSP的配置对象,对应于ServletConfig
exception:表示JSP运行时产生的异常对象
上面是说的 JSP
内置对象所代表的含义,那它们各自对应的 Java
对象又是什么呢?
request:HttpServletRequest
response:HttpServletResponse
session:HttpSession
application:ServletContext
out:JspWriter
page:Object
pageContext:PageContext
config:ServletConfig
exception:Throwable
那是如何知道这些 JSP
内置对象所对应的 Java
类是什么的呢?其实在 JSP
翻译为 Servlet
的响应方法之中就可以看到了,因为是 JSP
已经内置好的,因此不管多么简单的 JSP
文件翻译之后都可以看到。
4.1 pageContext对象
在 JSP
这 9
个内置对象当中,有一个需要十分注意的,那就是 pageContext
对象了,因为通过这个对象我们是可以拿到其它的 8
个内置对象的,因此只要记住了这个对象,其它的对象也就很自然的引出来了,下面就先看 pageContext
对象的 api
方法吧。
首先 pageContext
是可以作为域对象来存取数据的,这是因为在它的父类 javax.servlet.jsp.JspContext
中是有下面两个方法的。
abstract public void setAttribute(String name, Object value)
abstract public Object getAttribute(String name)
上面这两个方法就是 pageContext
父类所定义的存取数据的抽象方法,而 javax.servlet.jsp.PageContext
作为子类当然也就可以覆盖使用了,而且父类中还有
abstract public void removeAttribute(String name, int scope)
abstract public Object findAttribute(String name)
这两个方法,其中 removeAttribute()
方法当然就是从域对象中移除相关数据了,而 findAttribute()
则是在域对象中查找相关数据。
下面还需要介绍的 api
方法就是使用 pageContext
对象获取其它 8
个内置对象的方法了。先看 javax.servlet.jsp.PageContext
类中的:
abstract public ServletRequest getRequest()
abstract public ServletResponse getResponse()
abstract public HttpSession getSession()
abstract public ServletContext getServletContext()
abstract public Object getPage()
abstract public ServletConfig getServletConfig()
abstract public Exception getException()
在它的父类 javax.servlet.jsp.JspContext
中也有一个方法用来获取其它的内置对象,那就是
abstract public JspWriter getOut()
这样的话,使用 pageContext
对象来获取其它 8
的内置对象的方法就介绍完了。
4.2 pageContext的四个作用范围
上面已经介绍了 pageContext
对象作为域对象存取数据的 api
方法,那就是 setAttribute()
和 getAttribute()
方法了,其实使用这两个方法就是相当于对当前页面范围进行数据的存取,作用范围也就是当前 JSP
页面了。
而在前面学习过的知识中,我们已经知道,其实除了这里的当前页面范围之外,还有就是请求范围、会话范围以及整个应用范围,那已经学了 9
个内置对象了,如果使用内置对象来对上面的四个作用范围存值呢?其实也是很简单的。
// 页面范围
pageContext.setAttribute("name", "one1");
// 请求范围
request.setAttribute("name", "one2");
// 会话范围
session.setAttribute("name", "one3");
// 应用范围
application.setAttribute("name", "one4");
这样的话就可以对上面的四个范围存值了,其实响应的取数据的方法也是十分简单的,那就是:
pageContext.getAttribute("name")
request.getAttribute("name")
session.getAttribute("name")
application.getAttribute("name")
这样也就能实现在四个范围内取数据了,这里需要注意的一点就是,其实使用 pageContext
对象也可以实现上面对四个作用范围的存取值,因为 pageContext
对象的 setAttribute()
方法和 getAttribute()
方法其实都是有重载方法的,在它的父类 JspContext
中就可以看到了,如下:
abstract public Object getAttribute(String name)
abstract public Object getAttribute(String name, int scope)
第二个方法中的第二个参数 scope
就是代表的不同作用范围,而在 PageContext
类中就定义了这几个作用范围,分别是:
REQUEST_SCOPE:请求作用域
SESSION_SCOPE:会话作用域
APPLICATION_SCOPE:应用作用域
因此想往四个作用域中存值的话,也是可以这样写的:
// 页面范围
pageContext.setAttribute("name", "one1");
// 请求范围
pageContext.setAttribute("name", "one2", PageContext.REQUEST_SCOPE);
// 会话范围
pageContext.setAttribute("name", "one3", PageContext.SESSION_SCOPE);
// 应用范围
pageContext.setAttribute("name", "one4", PageContext.APPLICATION_SCOPE);
上面就是说明了使用 pageContext
对象也是可以向四个作用范围存值的,其实取值的操作也是一样的,因为 getAttribute()
方法其实也是有重载方法的。
abstract public Object getAttribute(String name)
abstract public Object getAttribute(String name, int scope)
因此取值的时候也是可以这样操作的:
pageContext.getAttribute("name")
pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)
pageContext.getAttribute("name", PageContext.SESSION_SCOPE)
pageContext.getAttribute("name", PageContext.APPLICATION_SCOPE)
需要注意的一点就是使用内置对象取值和 pageContext
对象取值取不到数据的时候,比如
request.getAttribute("name")
pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)
如果取不到数据的话,第一个表达式返回的会是 null
,而第二个表达式返回的则是空字符串。这样就说完了使用 pageContext
对象往四个作用域存取数据的方法了,那四个作用域的范围大小是怎样的呢?其实四个作用范围从小到大的排序应该是:
当前页面范围--请求范围--会话范围--应用范围
其实是可以进行测试的,先像上面那样在一个页面中为四个作用范围保存属性名相同的四个值,然后在当前页面取值,在使用请求转发之后在另一个页面再取值,在当前页面使用超链接跳转到另一个页面之后再取值,关闭浏览器之后再到另一个页面取值,这样就可以测试四个作用范围的大小了,这里也引出了另一个方法的使用,那就是:
abstract public Object findAttribute(String name)
其实使用这个方法取值的话,它是会根据作用范围来取数据的,先到作用范围小的取值,取不到的话再到作用范围大的取值,如果一直取不到,就一直向上寻找,直到最后返回一个空字符串。
5.JSP的动作标签
JSP
的动作标签其实就是用来在页面中执行相关动作的,比如请求转发,或者包含其它文件,常用的动态标签有如下几个:
<jsp:forward />:请求转发
<jsp:include />:包含标签(这里就是动态包含了)
<jsp:param />:传递参数
先说 <jsp:forward />
动作标签,一般使用的时候语法为:
<jsp:forward page="/demo/demo2.jsp"></jsp:forward>
则表示当有浏览器请求当前页面时,会自动请求转发到 demo2.jsp
页面上,这样的话我们就可以不使用 Java
代码而实现请求转发了,当然请求转发时也可能会需要携带参数,那就可以使用 <jsp:param />
动作标签了,比如下面这样:
<jsp:forward page="/demo/demo2.jsp">
<jsp:param value="Kobe" name="name"/>
</jsp:forward>
上面就是实现在请求转发时携带参数过去了,不过也可以直接将参数放在 request
对象当中,这样也是可以的,所以现在 <jsp:param />
的使用还是比较少的。
最后就是动态包含标签 <jsp:include />
,还是先说它运行的整个过程吧,现在假如有 index.jsp
,menu.jsp
和 foot.jsp
三个页面,而 index.jsp
需要包含 menu.jsp
和 foot.jsp
这两个页面,如果是使用动态包含的话,那整个过程应该是怎样的呢?其实就是三个 JSP
页面分别翻译为 3
个 Servlet
,然后再分别运行出结果,最后由 index.jsp
运行出来的结果包含其它两个 JSP
页面运行出来的结果,这就是动态包含的整个过程了。
和之前我们说过的静态包含相比的话,就会很容易发现两者的不同,静态包含是先使用包含 JSP
将被包含 JSP
整合为一个大的 JSP
页面,然后再一起翻译为 Servlet
,最后再运行;而动态包含则是分别进行翻译运行之后,由包含页面最后包含另外两个页面运行的结果,其实在它们各自编译为 Servlet
的目录就可以看到区别了,静态包含的 Servlet
目录只会看到一个 Servlet
,而动态包含的则会看到三个,这也是由于上面包含方式的不同导致的。
6.EL表达式
EL
表达式其实就是 Expression Language
的缩写,其实使用 EL
的话主要是为了使 JSP
使用起来更加简单,使用 EL
和后面将要介绍的 JSTL
可以有效去除 JSP
页面中的 Java
代码,这样就使 JSP
的功能更加单一,也便于开发维护。
6.1 EL表达式的功能
EL
表达式的功能主要有以下这些:
可以用来获取数据
可以用来执行运算
可以用来获取Web开发中常用的对象
可以用来调用Java方法
最后一个功能用来调用 Java
方法的话,其实现在用的很少了,我们就不进行介绍了,EL
表达式的语法为:
${ EL表达式 }
6.2 EL表达式获取数据
使用 EL
表达式获取数据的时候,底层其实是调用的内置对象 pageContext
的 findAttribute()
方法,也就是说取数据时是依次在 page
、request
、session
和 application
这四个作用范围来寻找数据的,先找到就先返回,如果都找不到,那就只能返回空字符串了。
下面请看例子:
<%
pageContext.setAttribute("name", "James");
request.setAttribute("name", "Jordan");
session.setAttribute("name", "Nash");
application.setAttribute("name", "Kobe");
%>
<%=pageContext.getAttribute("name") %>-${ pageScope.name }<br>
<%=request.getAttribute("name") %>-${ requestScope.name }<br>
<%=session.getAttribute("name") %>-${ sessionScope.name }<br>
<%=application.getAttribute("name") %>-${ applicationScope.name }<br>
后面使用 EL
表达式取值时,里面的 pageScope
、requestScope
、sessionScope
以及 applicationScope
,这些都是 EL
中定义的常用对象,表示的就是在哪个作用域中取数据,其实上面使用 EL
表达式取数据时,还可以直接使用 ${ name }
来取,然后依次注释掉上面的设值方法,这样就可以看出其实 EL
表达式取数据时其实还是使用的 pageContext
对象的 findAttribute()
方法了。
当然也有可能后台返回的是一个数组,或者是集合这样的数据结构,那使用 EL
表达式也是可以取到数据的。先看取集合时候的情况:
<%
String[] strs = {"aaa","bbb","ccc"};
pageContext.setAttribute("strs", strs);
%>
${ strs[0] }
${ strs[1] }
${ strs[2] }
其实使用 EL
表达式取数组中的值时,就像直接使用该数组就可以了,这也看出了 EL
表达式的好用之处。
下面再看使用 EL
表达式获取 List
集合中的数据,其实也是非常简单的。
<%
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
pageContext.setAttribute("list", list);
%>
${ list[0] }
${ list[1] }
${ list[2] }
获取 List
集合中数据的时候,也是和操作数组一样,使用元素的下标就可以获取对应数据结构中的数据了。下面再看获取 Map
集合中的数据,Map
中保存数据的格式是键值对的,使用 EL
表达式获取其中的数据时,是将键值对中的键当做 Map
集合的属性,而值则是当做 Map
集合的属性值,因为访问元素的属性时是使用点号 .
来访问的,那有一种特殊情况就是,当 Map
集合中的键也包含像点号 .
这样的特殊符号时,应该如何取值呢?其实还可以像数组那样取值,只是这里不是传入元素所在的下标了,而是直接传入键的名称了,看一下下面的代码就明了了。
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aaa", "111");
map.put("bbb", "222");
map.put("ccc.ddd", "333");
pageContext.setAttribute("map", map, PageContext.SESSION_SCOPE);
%>
${ map.aaa }
${ map.bbb }
${ map["ccc.ddd"] }
6.3 EL表达式执行运算
我们可以使用 EL
表达式执行很多数学运算,比如算数运算、关系运算、逻辑运算、三元运算等等,这些都可以使用 EL
表达式轻松地搞定,其实只要看一下代码就知道是怎么回事了。
算数运算:
<%
pageContext.setAttribute("a1", "10");
pageContext.setAttribute("a2", "30");
%>
${ a1+a2 }
这里得到的结果是 40
,EL
表达式自动将字符串转换为整形数据然后再进行加法操作。
关系运算:
<%
pageContext.setAttribute("a1", "10");
pageContext.setAttribute("a2", "30");
%>
${ a1 < a2 }-${ a1 lt a2 }<br>
${ a1 > a2 }-${ a1 gt a2 }<br>
${ a1 == a2 }-${ a1 eq a2 }<br>
${ a1 <= a2 }-${ a1 le a2 }<br>
${ a1 >= a2 }-${ a1 ge a2 }<br>
${ a1 != a2 }-${ a1 ne a2 }
逻辑运算:
<%
pageContext.setAttribute("a1", "10");
pageContext.setAttribute("a2", "20");
pageContext.setAttribute("a3", "30");
pageContext.setAttribute("a4", "40");
%>
${ (a1<a2) && (a2<a4) }-${ (a1<a2) and (a2<a4) }
<br> ${ (a1<a2) || (a2<a4) }-${ (a1<a2) or (a2<a4) }
<br> ${ !(a1<a2) }-${ not (a1<a2) }
三元运算:
<%
pageContext.setAttribute("a1", "10");
pageContext.setAttribute("a2", "20");
%>
${ a1 < a2?"a1小于a2":"a1不小于a2" }
empty
运算符:
这个运算符主要是判断对象是否为 null
,或者空字符串 ""
,以及空集合,如果是这三者的话,那就会返回 true
了,否则就会返回 false
了。
<%
pageContext.setAttribute("user", "");
pageContext.setAttribute("member", "Kobe");
%>
${ empty user } ${ empty member }
其实上面的代码最好还是要自己写一遍运行一下,看看结果,这样才能理解的深刻,因为当输入的时候,自己会使用各种情况的数据,根据不同的输出结果则可以把握原理了。
6.4 EL表达式获取Web常用开发对象
EL
表达式提供了 11
个 Web
开发的常用对象,使用这些对象可以很轻松地获取 Web
开发中需要使用的对象,并且同时可以获得其中的数据,下面分别列举这 11
个对象以及它们对应的说明。
pageContext:相当于JSP内置对象中的pageContext
pageScope:获取当前页面范围作用域的数据
requestScope:获取请求范围作用域的数据
sessionScope:获取会话范围作用域的数据
applicationScope:获取应用范围作用域的数据
param:在页面中接受请求参数(适用于一个名称对应一个值的参数)
paramValues:在页面中接受请求参数(适用于一个名称对应多个值的参数)
header:在页面中获取请求头(适用于一个key对应一个值的请求头)
headerValues:在页面中获取请求头(适用于一个key对应多个值的请求头)
cookie:获取cookie的名称和值
initParam:获取全局初始化参数的值
就拿最后的 initParam
来举例子吧,这个是获取全局化的参数配置的,因此需要在 web.xml
中配置一下如下内容:
<context-param>
<param-name>team</param-name>
<param-value>Lakers</param-value>
</context-param>
然后当项目启动,就可以在页面中使用 ${ initParam.team }
来获取数据了,当然获取到的值就是 Lakers
了。
7.JSTL标签
JSTL
其实就是 JSP Standard Tag Library
的缩写,意思当然也就是 JSP
标准标签库了,它的作用就是和 EL
表达式来替换 JSP
页面中的 Java
代码了,以便于提高代码的可读性和维护性。
JSTL
的版本一共有 3
个,分别为 JSTL1.0
、JSTL1.1
以及 JSTL1.2
了,需要注意的是 1.0
版本是不支持 EL
表达式的,而后面的 1.1
和 1.2
版本是支持 EL
表达式的。
JSTL
标签库的标签一共分为以下几种:
c标签(core标签库)
fmt标签(国际化标签库)
xml标签
sql标签
jstl函数库(EL函数)
我们使用的最多的还是 c
标签库了,也就是核心标签库了,这里提供了很多标签能使我们的开发变得更简单,下面具体介绍。
7.1 JSTL标签库的使用
要想使用 JSTL
进行开发的话,首先需要引入两个 jar
包,那就是:
jstl.jar
standard.jar
添加 jar
包成功之后,那就可以在 JSP
页面中引用 JSTL
的标签库进行开发了,引入的方式就是使用之前已经介绍过的 taglib
指令了,如下所示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
上面就是引入的 JSTL
标签库里面的核心库了,uri
的属性值代表的是核心标签库所在的目录,而 prefix
的属性值则是代表的在页面中使用核心标签时所需要使用的前缀,下面就是使用的例子:
<c:set var="name" value="Kobe" scope="page"></c:set>
代表的就是在当前页面范围内,存储一个名称为 name
的变量,其取值为 Kobe
。
7.2 JSTL标签库中的if标签
JSTL
标签库中的 if
标签则是来解决条件判断的问题的,具体的格式为:
<c:set var="i" value="10" scope="page"></c:set>
<c:if test="${ i < 10 }">
i小于10
</c:if>
<c:if test="${ i >= 10 }">
i大于等于10
</c:if>
核心标签库中是只有 if
标签,而没有 else
标签的,因此在需要判断多个分支时,其实是需要把各个分支的条件都写清楚的,if
标签中的 test
属性则是判断条件的地方,很明显可以看到这里是可以使用 EL
表达式的,而且使用起来非常简洁,
7.3 JSTL中的foreach标签
使用 foreach
可以很方便地获取数组或集合中的数据,这里就直接看代码了。
遍历数组:
<%
String[] arr = { "aa", "bb", "cc" };
pageContext.setAttribute("arr", arr);
%>
<c:forEach var="ele" items="${ arr }">
${ ele }
</c:forEach>
遍历 List
集合:
<%
List<String> list = new ArrayList<String>();
list.add("11");
list.add("22");
list.add("33");
pageContext.setAttribute("list", list);
%>
<c:forEach var="ele" items="${ list }">
${ ele }
</c:forEach>
遍历 Map
集合:
<%
Map<String, String> map = new HashMap<String, String>();
map.put("aaa", "111");
map.put("bbb", "222");
map.put("ccc", "333");
pageContext.setAttribute("map", map);
%>
<c:forEach var="entry" items="${ map }">
${ entry.key }-${ entry.value }
</c:forEach>
其实上面的知识还是需要多敲代码,只有自己在敲的过程中才能真正理解很多细节,比如 foreach
都有哪些属性,每个属性的作用都是什么?再看下面一个例子:
<c:forEach var="i" begin="1" end="10" step="2" varStatus="status">
<c:if test="${ status.count%3 == 0 }">
<font color="red">${ i }</font>
</c:if>
<c:if test="${ status.count%3 != 0 }">
<font color="green">${ i }</font>
</c:if>
</c:forEach>
varStatus
这个属性就代表了遍历数据过程中的状态,而它的属性值又有很多的属性,比如 count
属性则是代表计数走到了哪一位,因此上面的这个例子就是以步长为 2
遍历 1
到 10
的过程中,每当遍历第 3
个数时,都将对应的数字显示为红色,而其它的数字则显示为绿色。
8.总结
真的是不整理不知道,一整理的话发现知识点有这么多,其实这也是要整理的目的,就是方便以后需要用到相关知识点的话,可以快速回来查找,由于是自己已经整理过的知识,所以就能很快的找到对应的位置,以便迅速地解决问题,整理完成之后,还有一点蛮深刻的就是,还是应该多敲代码,因为只有在敲代码的过程中,才是真正的在使用,而且编程也是一项更加注重实践的技能,所以还是要多动手。