day08笔记.docx
- 文档编号:16690977
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:18
- 大小:422.43KB
day08笔记.docx
《day08笔记.docx》由会员分享,可在线阅读,更多相关《day08笔记.docx(18页珍藏版)》请在冰点文库上搜索。
day08笔记
课堂笔记
1、Seesion技术
2、JSP技术入门和常用指令
3、JSP的内置对象&标签介绍
4、EL表达式&EL的内置对象
1、Session原理和案例
1.1、Session原理分析
会话过程:
从用户打开浏览器开始访问服务器,直到用户不再使用浏览器和当前的网站做任何的交互(用户关闭浏览器)这个过程称为一次完整的会话。
在会话的过程中,用户的各种操作,都会有数据产生。
就需要保存用户的数据。
保存数据可以使用Cookie完成,但是Cookie是把用户的操作的少量数据保存在浏览器中。
如果用户操作的数据量比较大,或者说有些敏感的数据,不能给Cookie中保存。
sun公司就提供另外一个对象Session对象,它可以在服务器端保存用户的数据。
1.1.1、获取Session对象
Session对象是在服务器端的一个容器,主要用来保存用户的数据。
通过HttpServletRequest对象中的方法获取:
学习Servlet过程中,我们学习的大部分都是接口。
而这些接口的实现类由具体的web服务器来实现。
在我们书写的Servlet程序中,我们需要通过对应的方法来获取到web服务器实现了接口的真实类的对象。
然后操作这些对象。
给服务器端提交数据jsp页面
把数据保存在Session中之后重定向到显示提交数据的jsp页面
处理用户的提交数据,并获取到Session对象,把数据保存在Session中
显示数据的jsp页面
思考:
HttpServletRequest、HttpSession、ServletContext三种容器都可以保存数据,区别是什么?
1.1.2、Session的获取细节
在HttpServletRequest对象中获取Session对象的方法重载了。
getSession()方法,它的确可以在Servlet程序中获取Session对象。
在获取的过程中,如果服务器当前没有和浏览器对应的那个Session对象,这时web服务器会针对当前这个浏览器创建一个唯一的Session对象。
如果已经存在了Session对象,那么在使用getSession()方法的时候,仅仅只会获取到已经存在的那个Session对象,而不会创建Session对象。
getSession(booleancreate):
使用这个方法也可以获取Session对象。
如果传递的boolean为true,那么它的用法和getSession()没有区别。
如果传递的boolena是false,它的功能仅仅是获取Session,如果没有Session对象,返回null,而不会去创建Session。
1.1.3、Session的细节
服务器是如何区别每个不同浏览器的不同Session的?
服务器区别每个浏览器的不同的Session对象,需要依靠jsessionid这个标识。
在用户的每次请求中,都会携带服务器给用户创建的jsessionid这个Cookie数据到服务器,然后服务器才能获取到Session对象。
为什么浏览器关闭之后,再次打开,无法获取以前给Session中保存的数据?
服务器给浏览器创建了一个唯一的Session容器在服务端保存用户的数据。
需要给客户端回送Cookie,在Cookie中保存着当前和浏览器唯一相关的Session容器的唯一标识jsessionid。
而服务器给客户端回送的Cookie信息是会话级别的Cookie,当浏览器关闭之后,Cookie数据丢失。
再次打开浏览器,服务器端的上次针对浏览器的Sesssion还存在。
只是没有jsessionid,因此无法获取到Session对象。
1.2、思考:
关闭浏览器后再次访问能获取到Session吗?
一般是不可以的。
因为服务器给浏览器写的保存jsessionid的Cookie是一个会话级别的Cookie,关闭浏览器,Cookie丢失。
如果在关闭浏览器之后,再次访问服务器需要获取到以前的Session对象,需要把Cookie持久化,其实就是把jsessionid保存在浏览器的缓存中,下次访问就可以携带jsessionid的Cookie到服务器。
要保证浏览器关闭之后,再次访问还可以获取到以前的Sesion对象,需要把Cookie变成持久的Cookie对象。
1.3、Session案例(登录用户名显示)
对于一个网站,当用户登录成功之后,那么在访问访问的任何页面的时候,都会显示当前登录的用户名信息。
案例:
登录成功用户名显示
1、提供登录的JSP页面
2、需要Servlet程序处理用户的用户名和密码是否正确
3、登录成功之后,跳到欢迎的主页面(JSP)
/**
*处理用户登录的Servlet
*@author上海传智播客
*@2015年2月2日下午2:
17:
35
*/
publicclassLoginServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//设置编码
request.setCharacterEncoding("utf-8");
Stringusername=request.getParameter("username");
Stringpassword=request.getParameter("password");
//应该是到后台查询用户名和密码是否正确
if(username==null||password==null){
//用户直接访问Servlet,定向到登录页面
response.sendRedirect("/day08/login.jsp");
return;
}
if(username.startsWith("it")&&password.startsWith("it")){
//登录成功,需要把用户名保存在Session中,可以达到用户在访问任何一个页面的时候都可以取出用户名
request.getSession().setAttribute("username",username);
//定向到登录成功之后的欢迎页面
response.sendRedirect("/day08/success.jsp");
return;
}else{
//用户名或密码错误,把错误信息保存到request容器中,然后转发到login.jsp页面上
request.setAttribute("loginError","用户名或密码错误");
//转发技术
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
1.4、禁用Cookie后Session追踪
把浏览器的隐私中的级别调制到最高,浏览器会禁用接收任何服务器发送的Cookie数据。
这样导致用户每次访问服务器,都不会携带jsessionid的这个Cookie数据。
那么就会导致服务器端无法使用Session对象。
Cookie被禁用了,Sessoin对象一般是无法使用的,但是sun公司给出了解决方案:
Cookie禁用了,导致浏览器不会在携带任何的Cookie对象到服务器,导致服务器无法获取到jsessionid,同时就无法使用Session对象。
sun公司给出了重写所有url地址,在url地址的后面拼接jsessionid信息,这样依然可以拿到jsessionid,就可以使用Session对象。
1.5、Session的生命周期
Session的生命周期:
创建:
当在Servlet程序中第一次调用getSession()方法时会创建Session对象。
后续程序调用getSession方法时,都会使用到前面已经存在的session对象。
销毁:
1、当Session的存活时间到,就会自动的销毁。
Session在服务器端的默认存活时间是30分钟。
在web.xml文件中可以配置Session的存活时间。
Session在服务器端的存活时间,如果是用来一直在操作,Session就一直存在。
配置的过期的时间,当用户不再访问服务器,这时就会开始计时到指定的时间,服务器就会销毁Session。
2、不正常关闭服务器,Session会被销毁。
如果是正常关闭服务器,web服务器会把当前的Session使用IO流中的对象序列化技术,把Session对象保存在tomcat/work目录下。
3、使用Sessoin对象的方法,强制销毁Session。
invalidate();
1.6、Session案例一次性验证码登录(理解实现过程)
参考:
day08项目:
reg.jsp页面为注册页面
ImgServlet.java生成一次性验证码,重点是在生成验证码的时候需要把验证码数据保存在Session中,在处理注册的Servlet中从Session中取出,同时把Session中的验证码删除。
RegisterServlet.java处理注册的Servlet程序。
在处理注册的过程中需要先判断验证码是否正确,然后在判断其他数据。
1.7、Servlet三种数据范围
学习到这里,我们学习和web相关的三个容器,都可以保存数据:
ServletContext:
它是项目的描述,在整个项目中只有这个一个容器,保存的数据整个项目共享。
HttpSession:
它是针对用户的浏览器而言,每个浏览器的访问都会有一个单独的Session对象来保存当前的数据。
HttpServletRequest:
它表示的是用户的一次请求,在请求中我们可以保存数据,转发到其他的jsp,或者Servlet中可以继续使用request中的数据,
但当本次请求响应结束,这个request对象就消失。
ServletContext范围最大,HttpSession同一个浏览器共享HttpServletRequest每次请求就是一个单独的容器
后期经常使用的容器HttpServletRequest。
尽量不要把数据给ServletContext中保存。
它们的共同方法:
getAttribute
setAttibute
removeAttribute
2、JSP技术入门和常用指令
jsp技术主要是代替Servlet生成页面。
可以在JSP页面中书写html、CSS、JS、java代码
2.1、JSP的由来、脚本元素
jsp的由来,因为我们在Servlet程序使用response对象获取输出流写html代码非常麻烦,难以维护页面,因此才有JSP技术。
JSP文件在访问的时候会被翻译成java代码,其实就是一个Servlet程序。
存放在tomcat/work目录下。
JSP的脚本:
三种
JSP脚本声明:
翻译后保存在Servlet源码的成员位置上,可以是成员变量,可以成员内部类
<%!
java代码
intnum=100;
classDemo{}
%>
JSP脚本表达式:
翻译后保存在Servlet的service方法中out输出
<%=表达式%>
JSP脚本片段:
翻译之后保存在service方法中
<%
java代码
%>
html代码
<%
java代码
%>
2.2、JSP中注释
由于JSP页面中可以书写html、java代码,因此在jsp页面上可以书写html注释和java注释。
同时sun公司还给jsp页面定义自己的特有注释:
JSP的注释分成三种:
html注释:
--注释内容-->
java注释:
//单行注释
/*多行注释*/
/**文档注释*/
JSP特有的注释:
<%----%>
在jsp页面中嵌入的html注释在翻译成Java代码的时候,会在service中使用out.write();写出,最后在页面的html源码的中存在,只是浏览器不会显示出来。
在JSP中嵌入的Java注释,在jsp翻译成java程序的时候,会在java的源码中存在,在java源码编译成class的时候,消失了。
在jsp页面上写jsp注释:
仅仅只会保存在JSP的源码中,在翻译成JAVA代码的时候就消失了。
2.3、JSP中的page指令
JSP页面中的指令:
它的作用主要是用来控制JSP页面上能够使用的类,编码表,包含其他页面,引用其他的标签等功能。
指令的书写格式:
<%@指令名称属性=值,属性=值,属性=值,属性=值。
。
。
。
。
。
%>
page指令主要是用来控制jsp页面上的编码表,是否可以使用Java中的其他类等功能。
page指令中的属性值可以拆开单独书写。
page指令中的属性:
language声明当前jsp页面中使用的编程语言,不写默认java
import当前页面中如果要使用到其他的java类,需要使用import导入。
page指令中一般只有import会定义多个,其他的都定义一个。
在JSP中不用导入的包:
pageEncoding当前jsp页面在硬盘上保存的时候的编码表
contentType设置浏览器在解析当前的jsp中的文本时使用的编码表。
一般在jsp页面上可以不设置。
如果不设置会使用pageEncoding的编码表
extends属性设置当前的jsp页面翻译完之后对应的Java类继承的父类。
JSP翻译后的Java程序,会自动的继承Date类。
JSP就不在Servlet程序,翻译直接报错。
一般开发不写extends属性,如果要写,定义的类必须是HttpServlet或者是HttpServlet的子类
当前jsp页面发生异常或者错误时,通过errorPage属性指定跳转到处理错误的页面(错误友好页面)。
这个属性所在的那个jsp页面就是一个错误的处理页面
后期开发的时候,我们程序中肯定会发生错误,这时需要配置错误的友好页面,不能把错误给用户直接显示在浏览器上。
后期可以在web.xml文件中配置整个项目的错误处理页面。
<%@pageautoFlush="true"当页面中使用输出流给客户端写数据的时候,是否会自动刷新
buffer="8kb"在页面上有个out对象,它可以直接写出数据。
指定jsp页面上out输出流的缓冲区大小
session="true"表示当前页面上是否可以直接使用Session对象。
在jsp页面上就可以直接使用Sessoin对象,而不需要再次获取
isELIgnored="false"%>当前的jsp页面是否支持EL表达式。
2.4、JSP中的include指令
<%@includefile="文件"%>
include指令主要是用来完成页面的布局。
使用include指令引入其他的页面时,其他的页面只需要核心的数据显示部分,而不需要完成html框架。
使用include指令引入其他的jsp页面时,翻译JSP的时候,会把引入其他的jsp页面中的所有的内容全部翻译到同一个java程序中。
把通过include指令引入的其他jsp页面的包含,称为静态的包含。
在翻译完之后就已经全部包含在其中。
2.5、JSP中的taglib指令
taglib标签库:
使用这个指令可以在jsp页面上引入其他的标签。
uri是表示要引入的标签库的位置。
perfix是引入的标签的前缀
3、JSP的内置对象&标签介绍
JSP页面在被tomcat翻译之后,对应的还是一个Java程序,这个Java程序其实就是一个Servlet程序。
在学习Servlet时,我们知道Servlet中有很多对象都可以在Servlet中直接使用。
Session、ServletContext、ServletConfig、Request、Response等
也就是说在JSP页面上也可以使用上述的这些对象。
我们可以在JSP页面上使用JSP脚本嵌入Java代码,然后通过requeset对象获取所有的其他对象等对象。
但是这个做麻烦。
因为JSP本身就是Servlet,那么在JSP页面中应该就可以直接使用某些对象。
sun公司在JSP翻译完之后,提供9个内置对象让我们使用。
这9个内置对象都在jsp翻译之后的java程序中存在。
JSP的内置对象都保存在JSP翻译后的Servlet程序的service方法中:
HttpServletRequestrequest
HttpServletResponseresponse
HttpSessionsession
ServletContextapplication
ServletConfigconfig
Objectpage=this这里的this是jsp翻译之后的那个Servlet对象,然后把Servlet对象赋值给了page引用。
开始发中,我们一般不会使用page当作Servlet使用,因此类型Object类型。
JspWriterout输出流对象
PageContextpageContext
Exceptionexception只有在jsp页面上的page指令属性中书写isErrorPage才可以在jsp页面中使用exception
3.1、JSP的内置对象——page使用
page表示的当前的jsp对象。
而jsp翻译之后就是Servlet,因此这个page本身就是一个Servlet对象,但是在翻译后的java程序把page类型定义成Object类型,因此我们很少把page当作Servlet使用。
而在jsp页面上我们使用page作为一个Map容器使用。
在当前这个page页面中负责保存数据。
在page中保存的数据仅仅只能在当前这个jsp页面中使用。
3.2、JSP内置对象——pageContext使用
pageContext:
jsp页面的上下文对象。
1、负责给page、request、session、application这4个容器中保存数据,取出数据,删除数据
2、它可以获取到jsp页面上的其他8个内置对象。
获取值:
getAttribute(Stringname)默认从page范围中找数据如果没有找到得到null
根据指定的key从page、request、session、application四个范围中找。
pagerequestsessionapplication这个容器的大小:
page最小,只在当前jsp页面有效
request一次请求
session针对浏览器
application表示项目对象
3.3、JSP内置对象——out的使用
3.4、exception对象
3.5、JSP的动作标签
3.6、jsp:
include标签
4、EL表达式&EL的内置对象
4.1、EL使用——获得四个范围的数据
4.2、EL获取复杂数据
4.3、EL使用——执行运算
4.4、EL的11个内置对象使用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- day08 笔记