标签:黑马课程
<pre>
day09
昨天内容回顾
(1)response
*response里面对应http协议里面的对应的方法
*在response里面做了四个案例(不包含验证码)代码至少写三遍
*验证码的案例,看懂就可以了。
*重点掌握看不清换一张实现
*Response向页面输出中文乱码解决(****)
(2)request
*获取客户机信息和头信息的方法
*获取表单提交的数据
*获取表单提交中文数据乱码问题解决(****)
*request域
*重定向和转发的区别
思维导图
1、JSP入门(代码位置/day09/WebRoot/jsp)
*什么是jsp:学过servlet,如果向页面输出内容,需要使用字节流或者字符流输出,这样很麻烦。
针对这种很麻烦的情况,sun公司开发了一个新的技术jsp(方便向页面进行输出)
*java server pages:java服务器端的页面,jsp运行在服务器里面。
*jsp就是一个servlet,jsp最终会被编译成servlet,会把编译之后的servlet放到tomcat的work目录下
*jsp在什么时候编译成servlet:在请求jsp时候会把jsp编译成servlet
*jsp组成:html+java代码+jsp自身的一些东西
*jsp里面如何嵌入java代码(*****)
**有三种方式
第一种:<%! %>:在定义的变量是成员的变量
=<%! int i = 10; %>
第二种:<%= %>:向页面输出的内容
=在servlet里面生成的代码 out.print("hello" );
第三种:<% %>
=在servelt里面生成的代码在service里面
在实际开发中一般 jsp里面经常 html代码和java代码混合使用
*练习:使用html和java代码在jsp里面生成五行五列的表格
<table border="1">
<%
for(inti=1;i<=5;i++) {
%>
<tr>
<%
for(intj=1;j<=5;j++) {
%>
<td>aaaaaaaaa</td>
<%
}
%>
</tr>
<%
}
%>
</table>
2、EL表达式入门(代码位置/day09/WebRoot/el)
*什么是el表达式:用于获取域对象里面的值
*el表达式用于jsp页面中,不能在html中使用
*语法: ${域对象名称}
* <!-- 使用el表达式获取域对象里面的值-->
<!-- 向域对象里面设置值 -->
<%
//向servletContext里面设置值
getServletContext().setAttribute("msg1","itcast");
//向request域里面设置值
request.setAttribute("msg2","itheima");
%>
<!-- 使用传统方式获取域对象里面的值-->
<%=getServletContext().getAttribute("msg1") %>
<%=request.getAttribute("msg2")%>
<hr/>
<!-- 使用el表达式获取域对象里面的值-->
${msg1 }
${msg2 }
*如果向不同的域对象里面设置值的名称是相同的,使用el表达式获取的是域对象范围小的里面的值
*如果使用传统方式获取域对象里面的值,名称不存在得到null
如果使用el表达式获取域对象里面的值,名称不存在返回空字符串 ""
3、会话管理
*什么是会话:打开一个浏览器进行网页的浏览,在一个浏览器里面浏览很多的网页,到关闭浏览器的这个过程
称为一次会话。
*会话管理的技术有两种
第一种:cookie,客户端的技术
第二种:session,服务器端的技术
*使用域对象保存购物信息
**使用request域对象保存购物信息
=因为request域范围是一次请求,所以request域不能保存购物信息
**使用servletContext域对象保存购物信息
=因为servletContext域范围是整个web项目,每个web项目都有一个servletContext域
,进行结算时候,谁先结算把servletContext里面的所有商品都结算
*可以使用会话技术保存购物信息
**使用cookie保存购物信息
=基本过程:
第一次买百度,到服务器端得到百度,把百度放到cookie里面,把cookie返回到浏览器内存中
第二次买ibm,从浏览器内存中得到信息,拿着这个百度发送请求,到服务器端得到ibm和百度,
把这两个值放到cookie里面,把现在cookie返回到浏览器内存中。
最终进行结算,拿着内存中的百度和ibm发送请求,在服务器端得到两个值进行结算
**使用session保存购物信息
=基本的过程:
第一次买电脑,到服务器端得到电脑,在服务器端开辟一个空间,把得到放到空间里面,返回一把可以打开
这个空间唯一钥匙,把这把钥匙返回浏览器的内存中。
第二次买鼠标,拿着第一次返回的钥匙进行购买,到服务器端得到鼠标,拿着钥匙打开空间,
把鼠标放到空间里面,也会返回一把新的钥匙,返回到浏览器的内存中。
最终结算:拿着新的钥匙进行结算,到服务器端使用钥匙把空间打开,从里面取出值完成结算
4、案例一:使用cookie记录用户的上次访问时间(cn.itcast.cookie.CookieDemo1)
*需求描述:第一次访问某个servlet,产生一个访问时间,显示欢迎
第二次再次访问这个servlet,有一个上次的时间,产生一个现在的时间
*案例的分析(画图分析)
*得到所有的cookie:Cookie[] getCookies()
*把cookie的值返回到浏览器内存中(回写): response.addCookie(Cookie cookie)
*创建cookie:Cookie(String name, String value)
*代码片段
//得到所有的cookie
Cookie[]cookies = request.getCookies();
//比如时候cookie的名称 visit,判断是否有和visit名称相同的cookie
Cookiecookie = findCookie(cookies,"visit");
//得到当前的时间
Datedate = new Date();
Stringtimes = date.toLocaleString();
//把times保存到cookie里面
Cookiec = new Cookie("visit",times);
//把cookie值返回浏览器内存
response.addCookie(c);
5、cookie的API使用
*创建cookie:Cookie(String name, String value)
*得到cookie的名称:getName()
*得到cookie的值:getValue()
*setMaxAge(int expiry):设置cookie的有效时长
*setPath(String uri) :设置cookie的有效路径
(1)cookie的分类有两种
第一种:会话级别的cookie,关闭浏览器cookie消失了(销毁了)
第二种:持久性的cookie,cookie会在一定的时间内一直有效
*可以进行设置
*使用 setMaxAge(int expiry):参数是int类型,值是秒
*使用 setPath(String uri):一般参数传递成 setPath("/")
*代码
Cookiec = new Cookie("visit",times);
//设置持久性cookie
//设置有效时长
c.setMaxAge(3600);
//设置有效路径
c.setPath("/");
//把cookie值返回浏览器内存
response.addCookie(c);
*cookie一些细节问题
**一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
**一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
**浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
我的总结:
**如果你在浏览器中设置了自动清除cookies的话,也达不到想要的效果。
**不同的sevlet是共享Cookie的,即使在不同的servletnew出了相同名称的Cookie,
但是它们还是同一个Cookie。Cookie是存储在客户端浏览器中的,服务器与Cookie
存储无关,只与它的创建、修改、获取有关。
**不同的浏览器即使Cookie名称相同,也不是同一个Cookie。
**如果创建了一个cookie,并将他发送到浏览器,
默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。
若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。
6、案例二:使用cookie记录用户浏览的商品
(页面位置:/day09/WebRoot/cookie/product.jsp
servlet位置:/day09/src/cn/itcast/cookie/CookieDemo2.java)
(1)实现的步骤:
1、创建页面,在页面里面有多个超链接表示不同的商品 ,使用id的值区分
* 1、判断是否是第一次浏览
* 2、如果是第一次浏览,获取id值,把id值存到cookie里面,再把cookie写到浏览器的内存中
* 3、如果不是第一次浏览,首先得到第二次购物的id值,到cookie里面进行判断,判断是否有相同的id
* 如果有相同的id,不需要回写cookie
* 4、如果没有相同的id值的cookie,首先获取之前id值,在之前的基础之上追加一个id值,回写到浏览器的内存中
**代码片段
*//判断id是否相同 cookie里面存结构 his 1,2,3
Stringvalues = cookie.getValue();
//切割values
String[]ids = values.split(",");
//写方法实现遍历数组,和id值进行比较
booleanflag = checkIds(ids,id);
//没有相同的id才进行下一步操作
if(!flag){
Stringvalue = values+","+id; //比如values 1,2 追加之后 1,2,3
//存到cookie
Cookiec = new Cookie("his",value);
//设置cookie是持久性的cookie
c.setMaxAge(3600);
c.setPath("/");
//把cookie写到浏览器的内存中
response.addCookie(c);
}
(2)清空浏览记录的功能(代码位置:/day09/src/cn/itcast/cookie/Clear1.java)
*因为浏览信息存到cookie里面,所有销毁cookie就可以了
*如果是会话级别的cookie,关闭浏览器就销毁cookie
*如果是持久性的cookie如何销毁呢?
c.setMaxAge(3600);
c.setPath("/");
*访问的路径里面包含setPath里面的值,会携带cookie信息发送请求
比如:c.setPath("/day01");
如果通过这个路径进行访问http://127.0.0.1/day01/... 会携带cookie信息
如果通过这个地址访问http://127.0.0.1/day02/..... 不会写到cookie信息
*一般都是设置成 /
*销毁持久性cookie的步骤
1、创建一个和要销毁cookie相同名称的cookie
Cookiecookie = new Cookie("his","")
2、设置这个cookie的有效时长是0
cookie.setMaxAge(0)
3、设置有效路径和要删除cookie的路径一样
cookie.setPath("/");
4、把这个cookie回写到浏览器的内存
7、session的简介
*第一次买电脑,到服务器端得到电脑,在服务器端开辟一个空间,把得到放到空间里面,返回一把可以打开
这个空间唯一钥匙,把这把钥匙返回浏览器的内存中。
第二次买鼠标,拿着第一次返回的钥匙进行购买,到服务器端得到鼠标,拿着钥匙打开空间,
把鼠标放到空间里面,也会返回一把新的钥匙,返回到浏览器的内存中。
最终结算:拿着新的钥匙进行结算,到服务器端使用钥匙把空间打开,从里面取出值完成结算
(1)如何创建session?
*执行getSession() 方法之后创建session对象 名称是 HttpSession
*一个浏览器独占一个session对象
*举例看效果
**创建一个servlet1,在创建session,打印session的id值
**在servlet1写一个超链接到servlet2,在servlet2也是创建session,打印id值
***看这两个id值是否一样
*session向浏览器回写钥匙,也是使用cookie来实现的,jsessionid=值
**session也是要依赖于cookie实现的
8、案例三:使用session实现简单的购物车(****)
(代码的位置
页面:/day09/WebRoot/session
servlet:/day09/src/cn/itcast/session/SessionDemo1.java
)
*首先创建商品的列表的页面
(区别不同的商品id)
*点击某个商品加入到购物车
*会到一个页面(结算还是继续购物)
**点击继续购物,回到列表页面
*到结算页面,在结算页面上显示商品名称和数量
*session也是一个域对象,范围:一次会话
**存值 setAttribute(name,value)
**取值 getAttribute(name)
* 1、判断是否是第一次购物
* 2、如果是第一次购物,创建购物车,把商品名称和数量1放到map里面(得到id,根据id得到商品名称)
* 3、根据商品名称进行判断,判断购物车里面是否有相同名称的商品,如果有,把商品的数量取出来+1,放回map里面
* 4、如果没有相同名称的商品,直接把商品名称和数量1放到map里面
* 5、最终把map放到session里面
9、session的创建、销毁和清空购物车
(代码:/day09/src/cn/itcast/session/ClearSession.java)
*request.getSession()进行创建
*session的销毁(****)
**有三种方式
第一种:非正常关闭服务器
第二种:session有一个默认的过期时间 这个时间是30分钟
第三种:直接调用session里面的方法实现invalidate() (重点掌握)
10、案例四:使用session进行验证码的校验
(代码位置:/day09/src/cn/itcast/session/CodeServlet.java
/day09/src/cn/itcast/session/LoginServlet.java)
*创建一个登陆页面,在添加验证码,完成校验
*debug调试web项目
* 1、获取输入的验证码
* 2、获取session里面的验证码
* 3、判断这两个验证码是否相同
11、禁用cookie后session的使用(了解)
** 创建一个servlet1,在创建session,打印session的id值
**在servlet1写一个超链接到servlet2,在servlet2也是创建session,打印id值
***看这两个id值是否一样
**在请求的地址后面添加一个参数 ;jsessionid=session的id值
**如果网站里面有很多地址,这些地址都需要加jsessionid
**一般的购物网站,如果禁用了cookie,直接不让你买东西
=======================================================================
完成的任务:
(1)昨天写的request和response案例的代码写一遍
(2)cookie里面的两个案例代码至少写两遍
(3)session里面购物车的代码至少写一遍
*根据实现步骤把代码写出来
</pre>
本文出自 “行意天下” 博客,请务必保留此出处http://4259297.blog.51cto.com/4249297/1671016
【黑马程序员】第9课:Cookie与HttpSession详解
标签:黑马课程
原文地址:http://4259297.blog.51cto.com/4249297/1671016