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左右,无法存储复杂需求。
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,使其作废。
例子:
登录并保存用户名
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
String username = "";
String password = "";
Cookie[] cs = request.getCookies();//获取Cookie
//如果cookie不为空,遍历cookie,找到cookie的键为“username”的属性,获取他得值给username,找到键为“password”的属性,将它的值赋给password
if (cs != null) {
for(Cookie c : cs) {
if("username".equals(c.getName())) {
username = c.getValue();
System.out.println("保存的用户名已经替换");
}
if("password".equals(c.getName())) {
password = c.getValue();
System.out.println("保存密码已经替换");
}
}
}
%>
<hr>
<form action="LoginServlet" method="post">
<table>
<tr>
<td>username:</td>
<td><input type="text" name="username" value="<%=username %>" /></td>
</tr>
<tr>
<td>password:</td>
<td><input type="text" name="password" value="<%=password %>"/></td>
</tr>
<tr>
<td colspan="2">记住密码:<input type="checkbox" name="rememberme" value="do" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录" /></td>
</tr>
</table>
</form>
</body>
</html>
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String rememberme = request.getParameter("rememberme");
//如果username和password都有值,记住密码也有有值
if (username != null && username.trim().length() > 0 && password != null && password.trim().length() > 0) {
if (rememberme != null && rememberme.trim().length() > 0) {
//获取Cookie
Cookie[] cs = request.getCookies();
//打印到控制台:Cookie中现在的属性名和属性值
for (Cookie c : cs) {
System.out.println(c.getName());
System.out.println(c.getValue());
}
//设置Cookie的名和值
Cookie c_username = new Cookie("username", username);
Cookie c_password = new Cookie("password", password);
//设置Cookie时间,单位是秒
c_username.setMaxAge(3600);
c_password.setMaxAge(3600);
//添加到cookie
response.addCookie(c_username);
response.addCookie(c_password);
System.out.println("cookie已经添加");
}
//跳转到主页
response.sendRedirect("index.jsp");
} else {
response.sendRedirect("fail.jsp");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
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类型集合
<%
User u=new User();
u.setName("文字");
u.setAge(23);
session.setAttribute("user", u);
%>
<h2>EL表达式通过[]取属性</h2>
${user["name"] }
${user["age"] }
<h2>EL表达式通过.取属性</h2>
${user.name }
${user.age }

EL表达式不需要类型转换,可以直接计算数字
EL表达式范围顺序默认由小到大,如果指定: ${a}
在${pageScope.a}中查找,如果找到就返回;
在${requestScope}中查找,如果找到就返回;
在${sessionScope}中查找,如果找到就返回;
在${applicationScope}中查找,如果找到就返回,找不到就返回空字符串。
EL隐式对象
上面说到的各种Scope和param都是EL表达式中的隐式对象
param--->request请求中携带的参数的Map类
将整个form表单看做一个对象,对象的名字就是param
paramValues--->所有请求参数作为String类型的数组的Map类
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="NewFile.jsp" method="post">
<input type="text" name="num" >
<input type="submit" value="提交">
</form>
${param.num }
${paramValues.num[0] }
</body>
</html>
cookie将名称存储请求附带的cookies的Map类
获取cookie:
${cookie.username.name}
${cookie.username.value}
initParam按名称存储web应用程序上下文初始化参数的Map类
EL运算符


判断变量是否为空:
${empty num }
标准标签库 - JSTL概述
1 什么是JSTL
JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!
2 JSTL标签库例子
<form action="test.jsp" method="post">
<input type="text" name="num" value="${param.num }" />
<input type="submit" value="提交" />
</form>
<c:choose>
<c:when test="${param.num > 60 && param.num < 70 }">
<c:out value="及格了"></c:out>
</c:when>
<c:when test="${param.num > 70 && param.num < 90 }">
<c:out value="优秀"></c:out>
</c:when>
<c:when test="${param.num < 60 }">
<c:out value="不及格"></c:out>
</c:when>
<c:otherwise>
<c:out value="很棒"></c:out>
</c:otherwise>
</c:choose>
3 导入标签库
导入标签库需要使用taglib指令!
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
把光标放到uri属性位置上,使用Alt+/来查看uri列表,找到其中包含jstl,并且包含core的就是。
JSTL核心库
1 out和set(重点)
out
|
<c:out value=”aaa”/> |
输出aaa字符串常量 |
|
<c:out value=”${aaa}”/> |
与${aaa}相同 |
|
<c:out value=”${aaa}” default=”xxx”/> |
当${aaa}不存在时,输出xxx字符串 |
|
<% request.setAttribute("a","<script>alert('hello');</script>"); %> <c:out value="${a }" default="xxx" escapeXml="false" /> |
当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。 |
set:set标签的var、value、scope是一组,而target、property、value是一组。
|
<c:set var=”a” value=”hello”/> |
在pageContext中添加name为a,value为hello的数据。 |
|
<c:set var=”a” value=”hello” scope=”session”/> |
在session中添加name为a,value为hello的数据。 |
|
<jsp:useBean id="user" class="cn.itcast.domain.User"/> <c:set target="${user }" property="username" value="qdmmy6"/> <c:set target="${user }" property="password" value="123456"/> <c:out value="${user }" /> |
给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 here</title>
</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>

2 remove
|
<% pageContext.setAttribute("a", "pageContext"); request.setAttribute("a", "request"); session.setAttribute("a", "session"); application.setAttribute("a", "application"); %> <c:remove var="a"/> <c:out value="${a }" default="none"/> |
删除所有域中name为a的数据! |
|
<c:remove var="a" scope=”page”/> |
删除pageContext中name为a的数据! |
3 url
url标签会在需要URL重写时添加sessionId。
|
<c:url value="/"/> |
输出上下文路径:/day08_01/ |
|
<c:url value="/" var="a" scope="request"/> |
把本该输出的结果赋给变量a。范围为request |
4 if和choose(重点)
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。
|
<c:set var="a" value="hello"/> <c:if test="${not empty a }"> <c:out value="${a }"/> </c:if> |
choose标签对应Java中的if/else if/else结构
when标签的test为true时,会执行这个when的内容。
当所有when标签的test都为false时,才会执行otherwise标签的内容
|
<c:set var="score" value="${param.score }"/> <c:choose> <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when> <c:when test="${score >= 90 }">A级</c:when> <c:when test="${score >= 80 }">B级</c:when> <c:when test="${score >= 70 }">C级</c:when> <c:when test="${score >= 60 }">D级</c:when> <c:otherwise>E级</c:otherwise> </c:choose> |
<%
session.setAttribute("test", "61");
%>
<h1>c:if标签</h1>
<hr>
<c:if test="${test > 60 }">
<c:out value="及格了"></c:out>
</c:if>

<form action="jstl.jsp" method="post">
<input type="text" name="num" value="${param.num }" />
<input type="submit" value="提交" />
</form>
<c:choose>
<c:when test="${param.num > 60 && param.num < 70 }">
<c:out value="及格了"></c:out>
</c:when>
<c:when test="${param.num > 70 && param.num < 90 }">
<c:out value="优秀"></c:out>
</c:when>
<c:when test="${param.num < 60 }">
<c:out value="不及格"></c:out>
</c:when>
<c:otherwise>
<c:out value="很棒"></c:out>
</c:otherwise>
</c:choose>

5 forEach(重点)
forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。
|
<c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10"> <c:set var="sum" value="${sum + i}" /> </c:forEach> <c:out value="sum = ${sum }"/> |
|
<c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10" step[涛1] ="2"> <c:set var="sum" value="${sum + i}" /> </c:forEach> <c:out value="sum = ${sum }"/> |
还可以使用forEach来遍历数据或集合,遍历数组:
|
<% String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"}; pageContext.setAttribute("ns", names); %> <c:forEach var="item[涛2] " items="${ns }[涛3] "> <c:out value="name: ${item }"/><br/> </c:forEach> |
遍历List
|
<% List<String> names = new ArrayList<String>(); names.add("zhangSan"); names.add("liSi"); names.add("wangWu"); names.add("zhaoLiu"); pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }">[涛4] <c:out value="name: ${item }"/><br/> </c:forEach> |
遍历Map
|
<% Map<String,String> stu = new LinkedHashMap<String,String>(); stu.put("number", "N_1001"); stu.put("name", "zhangSan"); stu.put("age", "23"); stu.put("sex", "male"); pageContext.setAttribute("stu", stu); %> <c:forEach var="item[涛5] " items="${stu }"> <c:out value="${item.key }: ${item.value }[涛6] "/><br/> </c:forEach> |
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
l count:int类型,当前以遍历元素的个数;
l index:int类型,当前元素的下标;
l first:boolean类型,是否为第一个元素;
l last:boolean类型,是否为最后一个元素;
l current:Object类型,表示当前项目。
|
<c:forEach var="item" items="${ns }" varStatus="vs"[涛7] > <c:if test="${vs.first }[涛8] ">第一行:</c:if> <c:if test="${vs.last }[涛9] ">最后一行:</c:if> <c:out value="第${vs.count }[涛10] 行: "/> <c:out value="[${vs.index }[涛11] ]: "/> <c:out value="name: ${vs.current }[涛12] "/><br/> </c:forEach> |
<%@ 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 here</title>
</head>
<body>
<%
ArrayList<String> arr = new ArrayList<String>();
arr.add("山东");
arr.add("黑龙江");
arr.add("北京");
arr.add("河北");
arr.add("江苏");
arr.add("贵州");
session.setAttribute("dis", arr);
%>
<div>
<h1>c:forEach标签</h1>
<hr>
<h3>全部遍历</h3>
<c:forEach var="d" items="${dis }" step="1">
<c:out value="${d }"></c:out><br>
</c:forEach>
<h3>部分遍历</h3>
<c:forEach var="d" items="${dis }" step="2">
<c:out value="${d }"></c:out><br>
</c:forEach>
<h3>部分遍历2</h3>
<c:forEach var="d" items="${dis }" begin="2" end="4" varStatus="dissta">
<c:out value="${d }"></c:out><br>
varStatus--index属性: <c:out value="${dissta.index }"></c:out><br>
varStatus--count属性: <c:out value="${dissta.count }"></c:out><br>
varStatus--first属性: <c:out value="${dissta.first }"></c:out><br>
varStatus--last属性: <c:out value="${dissta.last }"></c:out><br>
<c:out value="=================="></c:out><br>
</c:forEach>
</div>
</body>
</html>

6
<%
session.setAttribute("teststring", "0533-1234567890-110");
%>
<div>
<h1>c:forTokens标签</h1>
<hr>
<c:forTokens items="${teststring }" delims="-" var="r">
<c:out value="${r }"></c:out><br>
</c:forTokens>
</div>

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) }<br/><!--3--> ${fn:length(list) }<br/><!--1--> ${fn:toLowerCase("Hello") }<br/> <!-- hello --> ${fn:toUpperCase("Hello") }<br/> <!-- HELLO --> ${fn:contains("abc", "a")}<br/><!-- true --> ${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true --> ${fn:contains(arr, "a")}<br/><!-- true --> ${fn:containsIgnoreCase(list, "A")}<br/><!-- true --> ${fn:endsWith("Hello.java", ".java")}<br/><!-- true --> ${fn:startsWith("Hello.java", "Hell")}<br/><!-- true --> ${fn:indexOf("Hello-World", "-")}<br/><!-- 5 --> ${fn:join(arr, ";")}<br/><!-- a;b;c --> ${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World --> ${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c --> ${fn:substring("0123456789", 6, 9)}<br/><!-- 678 --> ${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 --> ${fn:substringAfter("Hello-World", "-")}<br/><!-- World --> ${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello --> ${fn:trim(" a b c ")}<br/><!-- a b c --> ${fn:escapeXml("<html></html>")}<br/> <!-- <html></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下)
|
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="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"> <description>ITCAST 1.0 functions library</description> <display-name>ITCAST functions</display-name> <tlib-version>1.0</tlib-version> <short-name>itcast</short-name> <uri>http://www.itcast.cn/jsp/functions</uri> <function> <name>test</name> <function-class>cn.itcast.el.funcations.ItcastFuncations</function-class> <function-signature>String test()</function-signature> </function> </taglib> |
index.jsp
|
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="itcast" uri="/WEB-INF/classes/itcast.tld" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <h1>${itcast:test() }</h1> </body> </html> |
如果把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文件中的<uri>元素内容。
一般这种方式都是打包成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(七)Cookie,EL表达式,标准标签库的更多相关文章
- JavaWeb(七):EL表达式、自定义标签和JSTL
一.EL表达式 语法 el.jsp <%@page import="java.util.Date"%> <%@page import="com.atgu ...
- JavaWeb基础Day17 (JSP EL表达式 jstl标签库 beanutil工具类)
JSP jsp的实质就是指在html界面中嵌入Java代码 jsp脚本 <% Java代码 %> 相当于写在service方法中. <%=java 变量或者表达式 %> ...
- 2.EL表达式&JSTL标签库常用方法
1.EL表达式 Expression Language表达式语言,主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出. 格式为${表达式} EL表达式输出Bean的普通属性.数组属性.Li ...
- jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...
- EL表达式与标签库
https://blog.csdn.net/panhaigang123/article/details/78428567
- EL表达式和JSTL标准标签库
一.EL表达式 什么是EL表达式 EL(Express Lanuage)表达式可以嵌入在jsp页面内部 减少jsp脚本的编写 EL出现的目的是要替代jsp页面中脚本的编写. EL表达式的作用 EL最主 ...
- EL表达式 与 JSTL标准标签库
目录 EL表达式 什么是EL表达式 作用 EL内置11对象 EL执行表达式 JSTL 什么是JSTL JSTL标准标签库有5个子库 把JSTL标签库jar包引入工程当中 if标签 foreach标签 ...
- JavaWeb:JSP标准标签库
JavaWeb:JSP标准标签库 说明 什么是JSTL? JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个定制的标签库的集合,用来解决像遍 ...
- Javaweb--- EL表达式 JSTL标准标签库
一.EL表达式(expression language): 语法 ${...} jsp中page指令有一个属性叫isELIgnored, 用来标记此页面是否忽略EL表达式, 默认为false 举个例 ...
随机推荐
- AOP in dotnet :AspectCore的参数拦截支持
距离上一篇AspectCore的介绍发布已经很长一段时间了,这篇文章也早该和大家见面,最近一直忙于适应新工作,并在业余时间有幸向何镇汐,Savorboard,农夫,AlexLEWIS等几位大牛请教学习 ...
- AndroidDemo - FloatWindowDemo
安卓悬浮窗Demo 在桌面上创建一个小的悬浮窗.点击小悬浮窗后会弹出一个大的窗口.大窗口上有2个按键,分别为返回与关闭.点击大窗口外的部分能返回小窗口. 小窗口可以自由拖动.小窗口上显示的是当前内存使 ...
- 中国(北方)大学生程序设计训练赛(第一周) (D E)
比赛链接 D题是个二分,每次check复杂度为O(n),类似于xdu_1068,只是一个是求积,一个是求商 #include<bits/stdc++.h> using namespace ...
- [C++ Calculator 项目] 文件读入与可视化实现
Calculator V1.1 注:这是C++计算器项目第三.四部分-文件读写与可视化 [基于原代码重构而得] 源文件已上传至Github 文件读写 可视化 文件读写: Ⅰ.在原基础代码上增加了-f参 ...
- 解决kindeditor编辑器中使用百度地图时不能拖动坐标的问题
覆盖\plugins\baidumap文件夹下的map.html代码即可 <!doctype html><html><head> <meta http- ...
- MySQL Database Command Line Client
.输入密码:****** 1.1.create datatable Name;创建数据库 1.2.source D://taotao.sql; source后面加sql文件是批量导入sql语句 .ue ...
- vc++MFC开发上位机程序
用vc++MFC开发过不少跟单片机通讯的上位机程序了.搞懂了MFC架构,开发还是很快的,与底层单片机程序通讯,可以用串口.usb.网络.短信形式.串口现在用的越来越少了,一般电脑跟单片机在一块,使用串 ...
- 52. leetcode 96. Unique Binary Search Trees
96. Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees) tha ...
- 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...
- Hibernate 中Criteria Query查询详解【转】
当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中.此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询 ...

