JavaWeb: Cookie,EL表达式,标准标签库

Cookie

Cookie概述

Cookie译为小型文本文件或小甜饼,Web应用程序利用Cookie在客户端缓存服务器端文件。Cookie是以键值对形式存储在客户端主机硬盘中,由服务器端发送给客户端,客户端再下一次访问服务器端时,服务器端可以获取到客户端Cookie缓存文件。

Cookie是由服务器端创建的,然后由服务器端发送给客户端,客户端以键值对形式存储Cookie,并标注Cookie的来源。客户端再次访问服务器端时,存储的Cookie会保存在请求协议中,服务器端可以获取上次存储的缓存文件内容。

Cookie的用途:

  • 管理浏览网站的人数(其中包含有多少人访问过,多少人是新用户等)
  • 电子商城中购物车功能(每买一样商品,保存一个Cookie)
  • 用户自动登录功能(第一次登录时,将用户名和密码存储在Cookie)

Cookie的缺点:

  • 多人共用一台计算机(例如导致用户名和密码不安全等问题)。
  • Cookie被删除时,利用Cookie统计用户数量出现偏差。
  • 一人使用多台计算机(网站会将看成多个用户等问题)
  • Cookie会被附加在每次Http请求协议中,增加流量。
  • Cookie使用明文(未加密)传递的,安全性低。
  • Cookie的大小限制在4KB左右,无法存储复杂需求。
JavaWeb: Cookie,EL表达式,标准标签库_第1张图片

Cookie规范

Http协议提供了有关Cookie的规范,现今市场上出现大量浏览器,一些浏览器对该Cookie规范进行了一些“扩展”,但Cookie缓存文件不会占满硬盘空间。

  • Cookie存储的大小上限为4KB。
  • 一个服务器最多在客户端浏览器中可以保存20个Cookie。
  • 一个浏览器最多可以保存300个Cookie。

值得注意的是,不同浏览器之间不能共享Cookie缓存文件。例如,上次使用IE浏览器访问网站,下次使用火狐浏览器访问该网站时,不能使用IE浏览器保存的Cookie缓存文件。

Cookie的作用

Cookie的作用可大了,但无论怎么夸大Cookie的作用都离不开“跟踪客户端状态”这句话。我们知道Cookie是服务器保存在客户端的信息,然后客户端会在下次请求时把Cookie在还给服务器,这样服务器就可以通过信息来识别客户端了。

就好比你去医院看病,第一次去需要买卡片,然后你去任何科室都需要你出示卡片。只要你出示卡片,医生就会知道你去过哪些科室,看了哪些病!卡片上只有一个ID,它就是Cooke,而你本人就是客户端,而医生就是服务器了。

Cookie的属性

Cookie最重要的4个属性:

l  名字(name);

l  值(value);

l  路径(path);

l  域(domain)。

javax.servlet.http.Cookie类只有一个构造器:Cookie(String name, String value)。创建一个Cookie对象:Cookie c = new Cookie(“id”, “HZ_001”);

保存Cookie到客户端

保存Cookie到客户端,这是响应工作的一部分,所以这个方法是response对象的。并且Cookie是HTTP协议中的内容,所以保存Cookie是HttpServletResponse类的方法。

void addCookie(Cookie c):添加Cookie对象到当前response对象中,这个方法可以被调用多次,从而完成添加多个Cookie对象到response中。

Cookie的生命

Cookie会在客户端存活多久呢?这就是Cookie的生命了。默认情况下,Cookie只在浏览器的内存中存活,也就是说,当你关闭浏览器后,Cookie就会消失!

可以使用Cookie#setMaxAge(int expiry)来设置Cookie的存活时间。参数expiry表示Cookie存活的秒数。

l  cookie.setMaxAge(60*60):表示cookie对象可存活1小时。就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时。因为当maxAge大于0时,浏览器不仅会把cookie保存在浏览器内存中,还会把cookie保存到硬盘上。

l  cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1(其实只要是负数都是一个意思),表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。

l  cookie.setMaxAge(0):cookie被作废!表示cookie即不在内存中存活,也不在硬盘上存活,这样的cookie设置只有一个目的,那就是覆盖客户端原来的这个cookie,使其作废。

例子:

登录并保存用户名

复制代码
 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8"%>
 3 DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title heretitle>
 8 head>
 9 <body>
10     <%
11         String username = "";
12         String password = "";
13     
14         Cookie[] cs = request.getCookies();//获取Cookie
15         //如果cookie不为空,遍历cookie,找到cookie的键为“username”的属性,获取他得值给username,找到键为“password”的属性,将它的值赋给password
16         if (cs != null) {
17             for(Cookie c : cs) {
18                 if("username".equals(c.getName())) {
19                     username = c.getValue();
20                     System.out.println("保存的用户名已经替换");
21                 }
22                 
23                 if("password".equals(c.getName())) {
24                     password = c.getValue();
25                     System.out.println("保存密码已经替换");
26                 }
27             }
28         }
29     %>
30     <hr>
31     <form action="LoginServlet" method="post">
32         <table>
33             <tr>
34                 <td>username:td>
35                 <td><input type="text" name="username" value="<%=username %>" />td>
36             tr>
37             <tr>
38                 <td>password:td>
39                 <td><input type="text" name="password" value="<%=password %>"/>td>
40             tr>
41             <tr>
42                 <td colspan="2">记住密码:<input type="checkbox" name="rememberme" value="do" />td>
43             tr>
44             <tr>
45                 <td colspan="2"><input type="submit" value="登录" />td>
46             tr>
47         table>
48     form>
49 body>
50 html>
复制代码
复制代码
 1 package com.servlet;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.annotation.WebServlet;
 6 import javax.servlet.http.Cookie;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 /**
12  * Servlet implementation class LoginServlet
13  */
14 @WebServlet("/LoginServlet")
15 public class LoginServlet extends HttpServlet {
16     private static final long serialVersionUID = 1L;
17        
18     /**
19      * @see HttpServlet#HttpServlet()
20      */
21     public LoginServlet() {
22         super();
23         // TODO Auto-generated constructor stub
24     }
25 
26     /**
27      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
28      */
29     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
30         String username = request.getParameter("username");
31         String password = request.getParameter("password");
32         String rememberme = request.getParameter("rememberme");
33         //如果username和password都有值,记住密码也有有值
34         if (username != null && username.trim().length() > 0 && password != null && password.trim().length() > 0) {
35             if (rememberme != null && rememberme.trim().length() > 0) {
36                 //获取Cookie
37                 Cookie[] cs = request.getCookies();
38                 //打印到控制台:Cookie中现在的属性名和属性值
39                 for (Cookie c : cs) {
40                     System.out.println(c.getName());
41                     System.out.println(c.getValue());
42                 }
43                 //设置Cookie的名和值
44                 Cookie c_username = new Cookie("username", username);
45                 Cookie c_password = new Cookie("password", password);
46                 //设置Cookie时间,单位是秒
47                 c_username.setMaxAge(3600);
48                 c_password.setMaxAge(3600);
49                 //添加到cookie
50                 response.addCookie(c_username);
51                 response.addCookie(c_password);
52                 System.out.println("cookie已经添加");
53             }
54             //跳转到主页
55             response.sendRedirect("index.jsp");
56         } else {
57             response.sendRedirect("fail.jsp");
58         }
59     }
60 
61     /**
62      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
63      */
64     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
65         // TODO Auto-generated method stub
66         doGet(request, response);
67     }
68 }
复制代码

EL表达式

EL 全名为Expression Language。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表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,例如:
${user.address.city}
${user.list[0]}:访问有序集合某个位置的元素
${map.key} : 获得map集合中指定key的值
. 和 [ ] 区别

属性名中含有特殊字符时不能通用,
结合JSTL的foreach标签,使用EL表达式也可以很轻松迭代各种类型的数组或集合,示例:
迭代数组
迭代collection类型集合
迭代map类型集合

复制代码
 1 <%
 2     User u=new User();
 3     u.setName("文字");
 4     u.setAge(23);
 5     session.setAttribute("user", u);
 6 
 7 %>
 8 

EL表达式通过[]取属性

9 ${user["name"] } 10 ${user["age"] } 11

EL表达式通过.取属性

12 ${user.name } 13 ${user.age }
复制代码

JavaWeb: Cookie,EL表达式,标准标签库_第2张图片

EL表达式不需要类型转换,可以直接计算数字

EL表达式范围顺序默认由小到大,如果指定: ${a}

  在${pageScope.a}中查找,如果找到就返回;
  在${requestScope}中查找,如果找到就返回;
  在${sessionScope}中查找,如果找到就返回;
  在${applicationScope}中查找,如果找到就返回,找不到就返回空字符串。

EL隐式对象
上面说到的各种Scope和param都是EL表达式中的隐式对象
param--->request请求中携带的参数的Map类

将整个form表单看做一个对象,对象的名字就是param
paramValues--->所有请求参数作为String类型的数组的Map类

复制代码
 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8"%>
 3 DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title heretitle>
 8 head>
 9 <body>
10 <form action="NewFile.jsp" method="post">
11     <input type="text" name="num" >
12     <input type="submit" value="提交">
13 form>
14 
15 ${param.num }
16 
17 ${paramValues.num[0] }
18 
19 body>
20 html>
复制代码

cookie将名称存储请求附带的cookies的Map类
获取cookie:
${cookie.username.name}
${cookie.username.value}
initParam按名称存储web应用程序上下文初始化参数的Map类

EL运算符

JavaWeb: Cookie,EL表达式,标准标签库_第3张图片

JavaWeb: Cookie,EL表达式,标准标签库_第4张图片

判断变量是否为空:

1 ${empty num }

标准标签库  -  JSTL概述

1 什么是JSTL

JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!

2 JSTL标签库例子
复制代码
 1         
2 3 4
5 6 7 8 9 10 11 12 13 14 15 16 17 18
复制代码
3 导入标签库

导入标签库需要使用taglib指令!

1 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

把光标放到uri属性位置上,使用Alt+/来查看uri列表,找到其中包含jstl,并且包含core的就是。

JSTL核心库

1 out和set(重点)

 out

输出aaa字符串常量

与${aaa}相同

当${aaa}不存在时,输出xxx字符串

<%

request.setAttribute("a","");

%>

当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。

 

set:set标签的var、value、scope是一组,而target、property、value是一组。

在pageContext中添加name为a,value为hello的数据。

在session中添加name为a,value为hello的数据。

给user的username属性赋值qdmmy6,给user的password属性赋值123456。

 

 

复制代码
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" import="java.util.ArrayList"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<jsp:useBean id="user" class="com.hanqi.maya.util.User">jsp:useBean>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title heretitle>
head>
<body>
<%
    session.setAttribute("test", "这是session中test属性的值");
%>
    <div>
        <h1>c:out 输出标签h1>
        <hr>
        <c:out value="这是一个页面">c:out>
        <br>
        <c:out value="${test}">c:out>
        <br>
        <c:out default="默认值" value="${test1}">c:out>
        <br>
        <c:out value="你 好">c:out>
        <br>
    div>
        <div>
        <h1>c:set标签h1>
        <hr>
        
        <c:set scope="session" var="tt" value="tt的值">c:set>
        注意:如果scope不写, 默认设置在pageContext<br>
        <c:set target="${user }" property="username" value="username的值">c:set>
        <c:out value="${tt}">c:out><br>
        <c:out value="${user }">c:out>
    div>
body>
html>
复制代码

JavaWeb: Cookie,EL表达式,标准标签库_第5张图片

2 remove

         <%

                  pageContext.setAttribute("a", "pageContext");

                  request.setAttribute("a", "request");

                  session.setAttribute("a", "session");

                  application.setAttribute("a", "application");

         %>

        

        

删除所有域中name为a的数据!

删除pageContext中name为a的数据!

 

3 url

  url标签会在需要URL重写时添加sessionId。

输出上下文路径:/day08_01/

把本该输出的结果赋给变量a。范围为request

 

4 if和choose(重点)

  if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。

"a" value="hello"/>

   

 

choose标签对应Java中的if/else if/else结构

when标签的test为true时,会执行这个when的内容。

当所有when标签的test都为false时,才会执行otherwise标签的内容

"score" value="${param.score }"/>

    错误的分数:${score }

    A级

    B级

    C级

    D级

    E级

复制代码
1 <%
2     session.setAttribute("test", "61");
3 %>
4         <h1>c:if标签h1>
5         <hr>
6         <c:if test="${test > 60 }">
7             <c:out value="及格了">c:out>
8         c:if>
9         
复制代码

JavaWeb: Cookie,EL表达式,标准标签库_第6张图片

复制代码
 1         <form action="jstl.jsp" method="post">
 2             <input type="text" name="num" value="${param.num }" />
 3             <input type="submit" value="提交" />
 4         form>
 5         <c:choose>
 6             <c:when test="${param.num > 60 && param.num < 70 }">
 7                 <c:out value="及格了">c:out>
 8             c:when>
 9             <c:when test="${param.num > 70 && param.num < 90 }">
10                 <c:out value="优秀">c:out>
11             c:when>
12             <c:when test="${param.num < 60 }">
13                 <c:out value="不及格">c:out>
14             c:when>
15             <c:otherwise>
16                 <c:out value="很棒">c:out>
17             c:otherwise>
18         c:choose>
复制代码

5 forEach(重点)

  forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。

"sum" value="0" />

"i" begin="1" end="10">

    "sum" value="${sum + i}" />

"sum" value="0" />

"i" begin="1" end="10" step[涛1] ="2">

    "sum" value="${sum + i}" />

 

  还可以使用forEach来遍历数据或集合,遍历数组:

<%

String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};

pageContext.setAttribute("ns", names);

%>

"item[涛2] " items="${ns }[涛3] ">

   

 

遍历List

<%

    List names = new ArrayList();

    names.add("zhangSan");

    names.add("liSi");

    names.add("wangWu");

    names.add("zhaoLiu");

    pageContext.setAttribute("ns", names);

%>

"item" items="${ns }">[涛4] 

   

 

遍历Map

<%

    Map stu = new LinkedHashMap();

    stu.put("number", "N_1001");

    stu.put("name", "zhangSan");

    stu.put("age", "23");

    stu.put("sex", "male");

    pageContext.setAttribute("stu", stu);

%>

"item[涛5] " items="${stu }">

    [涛6] "/>

 

forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:,这时就可以使用vs这个变量来获取循环的状态了。

l  count:int类型,当前以遍历元素的个数;

l  index:int类型,当前元素的下标;

l  first:boolean类型,是否为第一个元素;

l  last:boolean类型,是否为最后一个元素;

l  current:Object类型,表示当前项目。

 

"item" items="${ns }" varStatus="vs"[涛7] >

    [涛8] ">第一行:

    [涛9] ">最后一行:

    [涛10] 行: "/>

    [涛11] ]: "/>

    [涛12] "/>

复制代码
 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8" import="java.util.ArrayList"%>
 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 4 DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <jsp:useBean id="user" class="com.hanqi.maya.util.User">jsp:useBean>
 8 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 9 <title>Insert title heretitle>
10 head>
11 <body>
12     <%    
13         ArrayList<String> arr = new ArrayList<String>();
14         arr.add("山东");
15         arr.add("黑龙江");
16         arr.add("北京");
17         arr.add("河北");
18         arr.add("江苏");
19         arr.add("贵州");
20         session.setAttribute("dis", arr);
21     %>
22     <div>
23         <h1>c:forEach标签h1>
24         <hr>
25         <h3>全部遍历h3>
26         <c:forEach var="d" items="${dis }" step="1">
27             <c:out value="${d }">c:out><br>
28         c:forEach>
29         <h3>部分遍历h3>
30         <c:forEach var="d" items="${dis }" step="2">
31             <c:out value="${d }">c:out><br>
32         c:forEach>
33         <h3>部分遍历2h3>
34         <c:forEach var="d" items="${dis }" begin="2" end="4" varStatus="dissta">
35             <c:out value="${d }">c:out><br>
36             varStatus--index属性: <c:out value="${dissta.index }">c:out><br>
37             varStatus--count属性: <c:out value="${dissta.count }">c:out><br>
38             varStatus--first属性: <c:out value="${dissta.first }">c:out><br>
39             varStatus--last属性: <c:out value="${dissta.last }">c:out><br>
40             <c:out value="==================">c:out><br>
41         c:forEach>
42     div>
43 body>
44 html>
复制代码

JavaWeb: Cookie,EL表达式,标准标签库_第7张图片

JavaWeb: Cookie,EL表达式,标准标签库_第8张图片

 

 

 

 

 

 

 

 

 

6  

1     <%    
2 
3         session.setAttribute("teststring", "0533-1234567890-110");
4 
5     %>
复制代码
1     <div>
2         <h1>c:forTokens标签h1>
3         <hr>
4         <c:forTokens items="${teststring }" delims="-" var="r">
5             <c:out value="${r }">c:out><br>
6         c:forTokens>
7     div>
复制代码

JavaWeb: Cookie,EL表达式,标准标签库_第9张图片

EL函数库

 

1 什么EL函数库

  EL函数库是由第三方对EL的扩展,我们现在学习的EL函数库是由JSTL添加的。下面我们会学习JSTL标签库。

EL函数库就是定义一些有返回值的静态方法。然后通过EL语言来调用它们!当然,不只是JSTL可以定义EL函数库,我们也可以自定义EL函数库。

  EL函数库中包含了很多对字符串的操作方法,以及对集合对象的操作。例如:${fn:length(“abc”)}会输出3,即字符串的长度。

 

2 导入函数库

  因为是第三方的东西,所以需要导入。导入需要使用taglib指令!

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

 

3 EL函数库介绍

l  String toUpperCase(String input):

l  String toLowerCase(String input):

l  int indexOf(String input, String substring):

l  boolean contains(String input, String substring):

l  boolean containsIgnoreCase(String input, String substring):

l  boolean startsWith(String input, String substring):

l  boolean endsWith(String input, String substring):

l  String substring(String input, int beginIndex, int endIndex):

l  String substringAfter(String input, String substring):

l  substringBefore(String input, String substring):

l  String escapeXml(String input):

l  String trim(String input):

l  String replace(String input, String substringBefore, String substringAfter):

l  String[] split(String input, String delimiters):

l  int length(Object obj):

l  String join(String array[], String separator):

 

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

String[] strs = {"a", "b","c"};

List list = new ArrayList();

list.add("a");

pageContext.setAttribute("arr", strs);

pageContext.setAttribute("list", list);

%>

${fn:length(arr) }

${fn:length(list) }

${fn:toLowerCase("Hello") }

${fn:toUpperCase("Hello") }

${fn:contains("abc", "a")}

${fn:containsIgnoreCase("abc", "Ab")}

${fn:contains(arr, "a")}

${fn:containsIgnoreCase(list, "A")}

${fn:endsWith("Hello.java", ".java")}

${fn:startsWith("Hello.java", "Hell")}

${fn:indexOf("Hello-World", "-")}

${fn:join(arr, ";")}

${fn:replace("Hello-World", "-", "+")}

${fn:join(fn:split("a;b;c;", ";"), "-")}

 

${fn:substring("0123456789", 6, 9)}

${fn:substring("0123456789", 5, -1)}

${fn:substringAfter("Hello-World", "-")}

${fn:substringBefore("Hello-World", "-")}

${fn:trim("     a b c     ")}

${fn:escapeXml("<html>")}

 

 

4 自定义EL函数库

l  写一个类,写一个有返回值的静态方法;

l  编写tld文件,可以参数fn.tld文件来写,把tld文件放到classes下;

l  在页面中添加taglib指令,导入自定义标签库。

 

ItcastFuncations.java

package cn.itcast.el.funcations;

 

public class ItcastFuncations {

    public static String test() {

        return "传智播客自定义EL函数库测试";

    }

}

 

itcast.tld(放到classes下)

"1.0" encoding="UTF-8" ?>

 

"http://java.sun.com/xml/ns/j2ee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

  version="2.0">

   

  ITCAST 1.0 functions library

  ITCAST functions

  1.0

  itcast

  http://www.itcast.cn/jsp/functions

 

 

    test

    cn.itcast.el.funcations.ItcastFuncations

    String test()

 

 

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib prefix="itcast" uri="/WEB-INF/classes/itcast.tld" %>

 

 

   

${itcast:test() }

 

 

如果把itcast.tld文件放到classes\META-INF\itcast.tld,那么就可以把

<%@ taglib prefix="itcast" uri="/WEB-INF/classes/itcast.tld" %>

修改为

<%@ taglib prefix="itcast" uri="http://www.itcast.cn/jsp/functions" %>

对应itcast.tld文件中的元素内容。

 

一般这种方式都是打包成Jar时,在Jar中的META-INF目录中存放TLD文件。

 

 

 


步长为2,默认步长为1。相当于i+=2的意思!而默认为i++。

把ns是中每一项赋给item。

ns是被遍历的数组。

与遍历数组没有区别!

for(String s : ns) {

   …

}

因为遍历的是Map,所以每一项是Entry类型

获取Entry的key和value

把循环状态赋给vs

如果是第一行,那么${vs.first}为true

如果是最后一行,那么${vs.last}为true

返回行数,从1开始

返回行数,从0开始

当前项,与${item}相同

你可能感兴趣的:(JavaWeb)