cookie和jsp入门.docx
《cookie和jsp入门.docx》由会员分享,可在线阅读,更多相关《cookie和jsp入门.docx(22页珍藏版)》请在冰豆网上搜索。
cookie和jsp入门
Jsp页面的格式
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
%>
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
">
Inserttitlehere
JSP的全称为JavaServerPages,译为Java服务器端页面。
其根本是一个简化的Servlet,实现了HTML语法中的Java扩展内容。
JSP与Servlet一样是运行在服务器端的,通常返回给客户端一个HTML页面内容。
说白了一个JSP就是由HTML代码、Java代码及JSP动作标签组成。
JSP与Servlet一样,都是由Tomcat服务器运行的。
Tomcat服务器是如何运行JSP页面的呢?
具体流程如下:
ØJSP运行的文件存储在Tomcat服务器安装目录的work目录中。
Ø由上图我们可以知道,JSP被Tomcat服务器生成Java文件,并编译成Class文件后运行。
Tomcat服务器将JSP页面生成Java文件的命名规则为:
Ø通过HttpJspBase类的源代码,我们知道该类继承于HttpServlet类。
所以,JSP其实就是Servlet,与Servlet一样具有生命周期方法_jspInit()、_jspSerivce()和_jspDestroy()。
SP本质上就是简化了的Servlet,但是还是有一些区别的:
ØJSP与Servlet的创建方式不同。
ØJSP更适合生成动态HTML页面,Servlet更适合来控制逻辑处理。
ØServlet需要配置web.xml文件,JSP不需要配置任何内容。
ØJSP中内置了九大对象,Servlet中没有内置对象。
ØServlet必须编译之后运行,而JSP不需要编译。
Ø由于JSP需要编译成Servlet文件后再运行,所以JSP的运行速度要比Servlet慢。
Cookie是由服务器端创建的,然后由服务器端发送给客户端,客户端以键值对形式存储Cookie,并标注Cookie的来源。
客户端再次访问服务器端时,存储的Cookie会保存在请求协议中,服务器端可以获取上次存储的缓存文件内容。
Cookie的用途:
Ø管理浏览网站的人数(其中包含有多少人访问过,多少人是新用户等)
Ø电子商城中购物车功能(每买一样商品,保存一个Cookie)
Ø用户自动登录功能(第一次登录时,将用户名和密码存储在Cookie)
Cookie的缺点:
Ø多人共用一台计算机(例如导致用户名和密码不安全等问题)。
ØCookie被删除时,利用Cookie统计用户数量出现偏差。
Ø一人使用多台计算机(网站会将看成多个用户等问题)
ØCookie会被附加在每次Http请求协议中,增加流量。
ØCookie使用明文(未加密)传递的,安全性低。
ØCookie的大小限制在4KB左右,无法存储复杂需求。
Cookie
创建一个Servlet用于向客户端发送Cookie信息
packageservlet;
importjava.io.IOException;
importjava.util.UUID;
importjavax.servlet.ServletException;
importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclasscookieextendsHttpServlet{
/**
*
*/
privatestaticfinallongserialVersionUID=-5413710647661656169L;
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//TODOAuto-generatedmethodstub
//1利用UUID生成一个随机字符串
Stringid=UUID.randomUUID().toString();
//2创建Cookies实例对象
Cookiecookie=newCookie("id",id);
//3将Cookies实例对象,添加到Response对象中
resp.addCookie(cookie);
}
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//TODOAuto-generatedmethodstub
super.doPost(req,resp);
}
}
Ø创建另一个Servlet用于获取上次服务器端向客户端发送的Cookie信息。
packageservlet;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclasscookierextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//TODOAuto-generatedmethodstub
resp.setContentType("text/html;charset=utf-8");
//1通过Request对象获取上次服务器端发送的Cookie信息
Cookie[]cookies=req.getCookies();
//2判断Request对象中的Cookie是否存在
if(cookies!
=null){
//3遍历Request对象中的所有Cookie
for(Cookiecookie:
cookies){
//4获取每一个Cookie的名称
Stringname=cookie.getName();
//5判断Cookie的名称是否存在是id
if(name.equals("id")){
//6打印Cookie名称为id的Cookie值
resp.getWriter().println("你的ID是"+cookie.getValue());
}
}
}
}
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//TODOAuto-generatedmethodstub
super.doPost(req,resp);
}
}
配置xml
xmlversion="1.0"encoding="UTF-8"?
>
xmlns="
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
cookie
app.java.cookie.cookie
cookier
app.java.cookie.cookier
cookie
/cookie1
在浏览器地址栏输入http:
//localhost:
8080/10_cookies/cookie1
cookier
/cookie2
要把Cookie发送到客户端,Servlet先要调用newCookie(name,value)用合适的名字和值创建一个或多个Cookie,通过cookie.setXXX设置各种属性,通过response.addCookie(cookie)把cookie加入应答头。
要从客户端读入Cookie,Servlet应该调用request.getCookies(),getCookies()方法返回一个Cookie对象的数组。
在大多数情况下,你只需要用循环访问该数组的各个元素寻找指定名字的Cookie,然后对该Cookie调用getValue方法取得与指定名字关联的值。
1.1. 显示上次访问时间案例
xmlversion="1.0"encoding="UTF-8"?
>
xmlns="
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
CookieServlet3
app.java.cookie.CookieServlet3
CookieServlet3
/cookie3
packageservlet;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.Date;
importjavax.servlet.ServletException;
importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassCookieServlet3extendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//TODOAuto-generatedmethodstub
resp.setContentType("text/html;charset=utf-8");
PrintWriterout=resp.getWriter();
//1通过Request对象获取请求中的Cookies
Cookie[]cookies=req.getCookies();
//2判断请求中的Cookies是否存在
if(cookies!
=null){
//3遍历所有Cookies
for(Cookiecookie:
cookies){
//4获取每一个Cookies的名称
Stringname=cookie.getName();
//5判断是否存在一个名为"lastvisit"的Cookie
if(name.equals("lastvisit")){
//如果存在,说明不是第一次访问,显示上次访问的时间.
out.println("
你上次访问的时间是"+cookie.getValue()+"
");
}
}
}else{
//如果不存在,说明是第一次访问,显示欢迎信息.
out.println("
欢迎访问XXX网站.
");
}
//创建用于显示最后一次访问时间的Cookie实例对象
Cookiecookie=newCookie("lastvisit",newDate().toString());
//将Cookie实例对象添加到Response对象中
resp.addCookie(cookie);
}
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//TODOAuto-generatedmethodstub
super.doPost(req,resp);
}
}
Ø打开浏览器,在浏览器地址栏输入http:
//localhost:
8080/10_cookies/cookie3。
Ø设置Cookie的有效访问路径
✧设置Cookie的有效访问路径,使用setPath()方法。
✧默认情况下,Cookie的有效访问路径为当前Web应用程序的根目录“/10_cookies”(Web应用程序的内部路径)。
✧默认情况下,生成的持久Cookie文件的名称为有效访问路径(例如10_cookies/)。
✧设置setPath(“/”)表示Cookie的有效访问路径为当前Web应用程序下的所有目录。
✧请求资源路径与Cookie的有效访问路径必须一致。
//创建Cookie实例对象
Cookiecookie=newCookie("id",newDate().toString());
//设置Cookie的有效时间
cookie.setMaxAge(60*60);
//设置Cookie的有效访问路径
cookie.setPath("/abc");
//将Cookie实例对象添加到Response对象中
response.addCookie(cookie);
这时再次访问相同资源路径时,由于访问资源路径为http:
//localhost:
8080/10_cookies,与Cookie的有效访问路径不一致,导致Cookie失效。
Ø设置Cookie的有效域名
✧利用setDomain()方法设置Cookies的有效域名,例如setDomain(“”)。
✧大部分的浏览器不支持setDomain()方法,因为可能A网站生成B网站的域名Cookie(第三方Cookie)。
Ø删除持久Cookie
✧可以将Cookie的最大有效时间设置为0。
注意的是删除Cookie时,有效路径必须一致!
1.2.商品浏览记录案例
Show,jsp
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
MyJSP'Show.jsp'startingpage--商品列表-->
商品列表
id=1">Java编程思想
id=2">Java设计模式
id=3">Java语言入门
id=4">数据结构和算法
id=5">MySQL数据库
--浏览记录-->
浏览记录
清空记录
showServlet.java
packageservlet;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassShowServletextendsHttpServlet{
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//TODOAuto-generatedmethodstub
//1通过Request对象获取请求参数ID
Stringid=req.getParameter("id");
//2通过Request对象获取Cookie信息
Cookie[]cookies=req.getCookies();
//3判断请求中的Cookies是否存在
if(cookies!
=null){
//4遍历所有Cookies
for(Cookiecookie:
cookies){
//5获取每一个Cookies的名称
Stringname=cookie.getName();
//6判断是否存在一个名为"history"的Cookie
if(name.equals("history")){//存在名为"history"的Cookie
//获取Cookie的value值
Stringvalue=cookie.getValue();
//将Cookie的value值以","切割
String[]ids=value.split(",");
//遍历所有书籍ID
for(