day07笔记.docx
《day07笔记.docx》由会员分享,可在线阅读,更多相关《day07笔记.docx(21页珍藏版)》请在冰豆网上搜索。
![day07笔记.docx](https://file1.bdocx.com/fileroot1/2023-2/23/b9d94ed1-f666-43cc-bfa6-2783b2717c49/b9d94ed1-f666-43cc-bfa6-2783b2717c491.gif)
day07笔记
今日任务:
1、request介绍
2、JSP相关技术简单介绍
3、Cookie技术
4、Seesion技术
课堂笔记
1、Request请求
1.1、URL编码问题
在浏览器端给服务器发送请求的时候,请求的数据URL,都会被浏览器先进行编码。
然后把编码后的数据先通过请求发给tomcat服务器。
服务器接收到数据之后会对其中的编码数据进行ISO8859-1解码。
当在Servlet程序中我们通过HttpServletRequest对象获取到数据时已经是tomcat服务器解码后的乱码数据。
浏览器为什么要进行URL数据的编码呢?
浏览器把数据提交给服务器的时候,必须以安全数据的方式提交。
安全数据ascii码表中的数据。
sex=%E7%94%B7
男------》编码--------》E794B7------》编码后的数据,每个字节使用%作为分割符
服务器端拿到数据之后,会按照ISO-8859-1进行解码。
我们也可以自己手段的进行URL编码:
在学习js的时候,学习过全局函数。
1.2、request利用请求转发传递数据
演示请求转发:
需要2个Servlet程序。
在第一个Servlet程序中转到第二个Servlet中,然后在第二个Servlet中给用户响应数据。
publicclassAServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=utf-8");
//在AServlet中转到BServlet中,给用户响应数据
/*
*RequestDispatcher称为转发器,主要实现从一个Servlet中转到其他的Servlet中
*forward转发,forward(request,response)接收的Request和response对象
*就是当前这个Servlet中的request和response对象
*
*request.getRequestDispatcher("")
*我们通过request对象中的getRequestDispatcher方法,可以得到一个转发器,转到其他的Servlet中
*getRequestDispatcher方法需要一个字符串数据。
这个字符串表示的是转发的目的地
*转发的路径是给服务器使用的,在写路径的时候千万别加项目名
*/
System.out.println("数据正在转发.......");
RequestDispatcherdispatcher=request.getRequestDispatcher("/b");
dispatcher.forward(request,response);
//request.getRequestDispatcher("/b").forward(request,response);
/*
*给客户端响应数据
*在使用转发的时候,在forward之后,不要使用response给客户端写数据,
*只有在最后的那个Servlet中才能通过response给客户端写响应数据,数据才会写给客户端。
*/
response.getWriter().write("转发之后数据不会到客户端");
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
publicclassBServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
System.out.println("转发过来的.........");
response.getWriter().write("转发后的数据在最后的一个Servlet中是可以写给客户端的......");
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
1.3、request对象在转发中当作容器使用
ServletContext对象就可以保存项目中的共享数据。
在任何一个Servlet中都可以取出其中的数据。
用户的本次请求中需要保存一些参数,最后在响应到页面上的时候,把这些数据全部给当前用户这次请求而服务。
当用户下次在请求的时候,就会是一个新的request对象,保存新的数据,和上次的没有任何关系。
**
*在当前的Servlet中通过requeset对象保存数据,然后转发到其他的Servlet中取出数据,并处理
*@author上海传智播客
*@2015年1月31日上午10:
46:
28
*
*/
publicclassServletForward1extendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//把requeset对象当作容器来使用
request.setAttribute("name","张三");
request.setAttribute("addr","天上人间");
System.out.println("数据已经保存到request对象中");
//转发过去
request.getRequestDispatcher("/forward2").forward(request,response);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
/**
*处理转发过来的数据
*@author上海传智播客
*@2015年1月31日上午10:
47:
16
*/
publicclassServletForward2extendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//取出request中的数据
Objectname=request.getAttribute("name");
Objectaddr=request.getAttribute("addr");
System.out.println("从request中取出的数据:
"+name+"....."+addr);
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("从request中取出的数据:
"+name+"....."+addr);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
1.4、客户端访问服务器的流程图解
2、JSP相关技术简单介绍
JSP:
JavaServerPage。
jsp的出现主要是方便我们书写网页的。
2.1、Servlet的缺点
Servlet程序主要是用来处理用户的请求和响应。
但是通过Servlet动态的给客户端响应html相关的数据时,十分的麻烦。
直接通过html文件CSS文件、JS文件等书写的资源都属于静态的web资源。
而通过Servlet程序生成的html数据都称为动态的web资源。
使用Servlet书写html标签十分麻烦。
并且网页的设计和维护一般不是后台程序员管理。
而是公司的美工(网站前端工程师)通过专业的软件来制作。
在开发中一般是由美工写好静态的html页面,然后交给后台的程序员使用。
后台程序员书写的代码如果在生成html数据,导致美工无法维护。
后台书写的过程十分麻烦。
并且美工是不懂后台程序,这样导致工作无法进行。
sun公司也发现Servlet的缺点。
因此研发了JSP技术。
jsp技术,主要是用来书写html代码。
同时在jsp文件中可以嵌入CSS、JS以及Java代码。
JSP文件和html几乎一样。
这样我们就可以在jsp中书写html代码。
后期开发我们使用JSP显示Servlet处理完的数据。
一般开发模式:
用户请求Servlet程序程序,在Servlet中处理数据,处理完成之后,使用请求转发技术,转发到JSP页面上,在JSP页面上使用html代码显示处理完的数据(MVC设计模式)。
2.2、JSP快速入门
使用MyEclipse的模版创建JSP页面:
修改MyEclipse打开JSP文件的默认方式:
jsp文件的保存位置:
jsp页面访问过程:
JSP翻译完成之后,其中有三个方法,表示的是jsp的生命周期方法:
在service中为用户服务。
MyEclipse的jsp模版编码表修改:
2.3、JSP三种脚本元素
--
由于在jsp可以书写htm代码,也可以书写java代码。
在jsp页面上书写html和直接写html文件没有区别。
但是如果要写java代码就必须使用对应的JSP脚本嵌入。
-->
--
JSP的脚本声明
-->
<%!
//称为jsp的脚本声明
intx=100;
classPerson{
}
%>
--
JSP脚本表达式
jsp脚本表达式中不能书写分号
-->
<%="你好jsp"%>
--
jsp脚本片段
-->
<%
for(inti=0;i<10;i++){
%>
<%
out.println(i);
%>
<%
}
%>
总结三种脚本:
1、脚本声明
格式:
<%!
java代码
%>
2、脚本表达式
格式:
<%=表达式%>表达式后面不能加分号
3、脚本片段
格式:
<%
java代码
%>
html代码
<%
java代码
%>
html代码
2.4、EL表达式入门
EL表达式:
expressionlanguage表达式语言。
它的主要作用是在jsp页面中取出不同范围(ServletContext,request容器)中保存的数据。
使用EL表达式简化JSP页面上的Java代码。
EL表达式的格式:
${表达式}
3、Cookie介绍&Cookie案例
3.1、Cookie和Session技术概述
会话技术:
当用户打开浏览器开始访问某个网站,到用户关闭浏览器,不再做任何操作,这个过程称为一次会话。
基于这次会话,用户的操作后台会有相应的数据需要通过用户的操作进行保存。
在会话的过程中,每次的请求服务器都会记录住用户的操作,并把这些操作写给浏览器,浏览器下次在进行其他操作时,就会显示上次的操作轨迹。
在会话中要保存用户的操作,就需要使用到其他的对象来专门负责保存这些操作中的数据。
sun公司给我们提供了2个对象:
Cookie对象:
Cookie对象主要是在服务器端把数据保存在其中之后,最后在给用户响应的时候,会把Cookie对象中保存的数据写给浏览器,然后浏览器会保存在自己的缓存目录中。
当用户下次在访问服务器的时候,会携带上次服务器给用户写的Cookie信息,服务器接收到Cookie之后,就会知道用户上次的操作。
Seesion对象:
Seesion对象是在服务器端把用户的操作保存在其中,在给用户响应的时候,不会把Session对象中的数据写给客户端,只要客户端不关闭浏览器,那么服务器端就一直会有一个Session对象和用户当前的这个浏览器一一对应。
并保存当前浏览器所有会话期间操作的数据保存工作。
3.2、Cookie案例演示
3.3、Cookie的API介绍
案例:
记录用户的上次访问时间。
需要一个Servlet程序专门处理每次用户的请求时间,和携带的上次访问时间的信息,以及给客户端回送访问时间。
3.3.1、创建Cookie
使用Cookie的构造方法就可以直接创建Cookie对象,在创建的时候,需要指定key和value值,当浏览器携带Cookie到服务器端,获取到Cookie对象之后,就需要根据key值判断是不是我们需要的Cookie数据。
3.3.2、获取Cookie
当浏览器访问服务器的时候,只要访问的这个网站以前给客户端写过Cookie对象,那么浏览器在访问的时候,就会自动携带Cookie到服务端,在Servlet中我们可以使用Request对象中的getCookies方法拿到所有的携带Cookie对象。
在Servlet中获取到Cookie数组之后,首先需要判断当前的数组是否存在,如果不存在,浏览器没有携带Cookie到服务器。
如果存在,得到的是一个数组,需要遍历数组取出每个Cookie对象,然后获取Cookie的key值,判断是否是自己想要的Cookie数据。
使用Cookie对象中的getName方法,可以取到当前某个Cookie对的key值
使用getValue方法取到某个Cookie的value值。
3.3.3、发送Cookie
在Servlet中给客户端写Cookie数据,直接使用response完成。
3.3.4、Cookie分类
Cookie分类:
临时Cookie(会话级别的Cookie):
临时Cookie,仅仅在浏览器运行的期间有效。
关闭浏览器Cookie数据消失。
Cookie是在服务端写给客户端的数据,在客户端下次访问服务器的时候会携带给服务器。
持久Cookie:
可以使用Cookie对象中的方法,把Cookie设置成持久的Cookie,那么在关闭浏览器之后Cookie数据会被保存在浏览器的缓存文件中。
setMaxAge(intexpiry)设置Cookie过期时间。
3.3.5、设置路径
3.3.6、Cookie的有效域名
设置Cookie的有效域名。
可以不设置。
一般一个网站都会设置和自己网站相关的Cookie数据。
如果设置的域名不是自己网站的域名,这样的Cookie我们称为第三方Cookie。
一般的浏览器默认都会阻止第三方Cookie数据。
3.3.7、删除Cookie
删除持久Cookie信息:
1、创建一个Cookie对象,key值和以前保存的Cookie的key值必须一致。
然后value写“”
2、把过期时间设置成-1.这样在浏览器关闭之后,持久的所有Cookie全部无效了。
删除Cookie信息的时候,一定要保证新创建的Cookie的setPath和原始的path一定一致。
Cookiecookie=newCookie(“time”,””);
cookie.setMaxAge(-1);
cookie.setPath(“/day07”);
response.addCookie(cookie);
3.3.8、Cookie案例(商品浏览记录)
案例:
浏览记录
1、jsp页面显示所有的商品,同时用户可以点击商品,进行查询和购买
2、定义Servlet程序处理用户的请求,同时记录用户本次访问的商品信息,以Cookie的形式写给客户端
所有的商品显示所有的商品
id=1">笔记本
id=2">手机
id=3">电视机
id=4">空调
id=5">冰箱
--
使用jsp脚本代码取出Cookie中的数据。
显示浏览记录
-->
您曾经浏览过的商品是
<%
String[]goods={"","笔记本","手机","电视机","空调","冰箱"};
//获取Cookie数据
Cookie[]cookies=request.getCookies();
if(cookies!
=null){
//遍历
for(Cookiec:
cookies){
if(c.getName().equals("good")){
Stringids=c.getValue();
String[]strs=ids.split(",");
//{"1","2","3","4","5"}
for(Strings:
strs){
inti=Integer.parseInt(s);
out.println(goods[i]);
}
}
}
}else{
out.println("您还没有浏览商品");
}
%>
/**
*处理用户的单个商品请求
*@author上海传智播客
*@2015年1月31日下午4:
30:
15
*/
publicclassGoodsServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取用户携带的商品的id信息
Stringid=request.getParameter("id");
//获取携带的Cookie
Cookie[]cookies=request.getCookies();//Cookie("good","1")
Cookiecook=null;
Stringold_id=null;
//判断是否获取到Cookie
if(cookies!
=null){
//遍历数组,取出和商品相关的Cookie对象
for(Cookiecookie:
cookies){//遍历会获取到某个单独的Cookie对象
//获取Cookie的名字,判断是否和商品相关
if(cookie.getName().equals("good")){
cook=cookie;
//说明用户以前已经访问过某个商品了,获取访问过的商品的id信息
//Cookie("good","1")
StringgoodId=cookie.getValue();
//判断当前拿到的这个商品是否已经是访问过的商品
if(!
(goodId.contains(id))){
old_id=goodId+","+id;
}else{
old_id=goodId;
}
}
}
}
if(cook==null){
cook=newCookie("good",id);
}else{
cook=newCookie("good",old_id);
}
//把Cookie写给客户端
cook.setMaxAge(60*60);
cook.setPath("/day07");
response.addCookie(cook);
//重定向到显示所有商品的页面上
response.sendRedirect("/day07/allGoods.jsp");
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
4、Session原理和案例