Cookie译为小型文本文件或小甜饼,Web应用程序利用Cookie在客户端缓存服务器端文件。Cookie是以键值对形式存储在客户端主机硬盘中,由服务器端发送给客户端,客户端再下一次访问服务器端时,服务器端可以获取到客户端Cookie缓存文件。
Cookie是由服务器端创建的,然后由服务器端发送给客户端,客户端以键值对形式存储Cookie,并标注Cookie的来源。客户端再次访问服务器端时,存储的Cookie会保存在请求协议中,服务器端可以获取上次存储的缓存文件内容。
Cookie的用途:
Cookie的缺点:
Http协议提供了有关Cookie的规范,现今市场上出现大量浏览器,一些浏览器对该Cookie规范进行了一些“扩展”,但Cookie缓存文件不会占满硬盘空间。
值得注意的是,不同浏览器之间不能共享Cookie缓存文件。例如,上次使用IE浏览器访问网站,下次使用火狐浏览器访问该网站时,不能使用IE浏览器保存的Cookie缓存文件。
Cookie的作用可大了,但无论怎么夸大Cookie的作用都离不开“跟踪客户端状态”这句话。我们知道Cookie是服务器保存在客户端的信息,然后客户端会在下次请求时把Cookie在还给服务器,这样服务器就可以通过信息来识别客户端了。
就好比你去医院看病,第一次去需要买卡片,然后你去任何科室都需要你出示卡片。只要你出示卡片,医生就会知道你去过哪些科室,看了哪些病!卡片上只有一个ID,它就是Cooke,而你本人就是客户端,而医生就是服务器了。
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到客户端,这是响应工作的一部分,所以这个方法是response对象的。并且Cookie是HTTP协议中的内容,所以保存Cookie是HttpServletResponse类的方法。
void addCookie(Cookie c):添加Cookie对象到当前response对象中,这个方法可以被调用多次,从而完成添加多个Cookie对象到response中。
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 全名为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 %> 8EL表达式通过[]取属性
9 ${user["name"] } 10 ${user["age"] } 11EL表达式通过.取属性
12 ${user.name } 13 ${user.age }
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类
判断变量是否为空:
1 ${empty num }
JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!
1
5 导入标签库需要使用taglib指令!
1 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
把光标放到uri属性位置上,使用Alt+/来查看uri列表,找到其中包含jstl,并且包含core的就是。
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>
<% pageContext.setAttribute("a", "pageContext"); request.setAttribute("a", "request"); session.setAttribute("a", "session"); application.setAttribute("a", "application"); %> |
删除所有域中name为a的数据! |
|
删除pageContext中name为a的数据! |
url标签会在需要URL重写时添加sessionId。
|
输出上下文路径:/day08_01/ |
|
把本该输出的结果赋给变量a。范围为request |
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。
|
choose标签对应Java中的if/else if/else结构
when标签的test为true时,会执行这个when的内容。
当所有when标签的test都为false时,才会执行otherwise标签的内容
|
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
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>
forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。
|
|
还可以使用forEach来遍历数据或集合,遍历数组:
<% String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"}; pageContext.setAttribute("ns", names); %> |
遍历List
<% List names.add("zhangSan"); names.add("liSi"); names.add("wangWu"); names.add("zhaoLiu"); pageContext.setAttribute("ns", names); %> |
遍历Map
<% Map stu.put("number", "N_1001"); stu.put("name", "zhangSan"); stu.put("age", "23"); stu.put("sex", "male"); pageContext.setAttribute("stu", stu); %> |
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:
l count:int类型,当前以遍历元素的个数;
l index:int类型,当前元素的下标;
l first:boolean类型,是否为第一个元素;
l last:boolean类型,是否为最后一个元素;
l current:Object类型,表示当前项目。
|
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>
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>
EL函数库是由第三方对EL的扩展,我们现在学习的EL函数库是由JSTL添加的。下面我们会学习JSTL标签库。
EL函数库就是定义一些有返回值的静态方法。然后通过EL语言来调用它们!当然,不只是JSTL可以定义EL函数库,我们也可以自定义EL函数库。
EL函数库中包含了很多对字符串的操作方法,以及对集合对象的操作。例如:${fn:length(“abc”)}会输出3,即字符串的长度。
因为是第三方的东西,所以需要导入。导入需要使用taglib指令!
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
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> |