jsp中9大内置对象以及4个作用域

jsp中9大内置对象以及4个作用域

标签(空格分隔): jsp


内置对象的本质
是指翻译后java代码中,在_jspService()方法内部的变量,
9大内置对象
application:javax.servlet.ServletContext 最大与域对象,针对整个项目;
session:javax.servlet.http.HttpSession ,针对会话级别的域对象;
request:javax.servlet.http.httpServletRequest,针对请求的域对象,信息请求的封装对象;
pageContext:javax.servlet.jsp.PageContext,JSP独有的,最小的域对象,作用范围当前页
response:javax.servlet.http.HttpServletResponse,响应信息的封装对象
page: java.lang.Object ,jsp这个servlet实例,相当于this
out: javax.servlet.jsp.JspWriter ,jsp字符输出流
config:javax.servlet.ServletConfig ,jsp这个servlet配置信息的封装对象
exception:java.lang.Throwable ,异常信息的封装对象
其中page和config不经常用。在这里就省去不说了,
out:查看jsp翻译后的java源码可以知道,out对象的缓冲区内容最终会追加到Servlet字符输出流缓冲区 的末尾。然后由Servlet字符输出流缓冲区刷新到 响应体中
eg:<%
//JSP字符输出流
out.write("hehe1");
out.write("hehe2");
//Servlet原生的字符输出流
response.getWriter().write("333333333");
response.getWriter().write("444444444");
out.write("hehe3");
%>

所以会输出:
33333333344444444 hehe1hehe2hehe3
PageContext对象:是jsp独有的,作用范围为本页面 ,研发中会用到,很强势的一个功能
1、可以获取其他八大内置对象:
写一个工具类,可以任意操作JSP。只需要传递一个pageContext,就相当于把整个JSP页面传递过去
2、可以操作其他作用域 (四大作用域,都被它玩遍了,不信你看)
pageContext.setAttribute("msg", "hehe", pageContext.APPLICATION_SCOPE);
pageContext.setAttribute("msg", "hehe", pageContext.SESSION_SCOPE);
pageContext.setAttribute("msg", "hehe", pageContext.REQUEST_SCOPE);
pageContext.setAttribute("msg", "hehe", pageContext.PAGE_SCOPE);

同时开发中会用到的一个功能,也很强势(findAttribute)
1、去作用域中寻找键值对
pageContext.findAttribute("msg");
依次从小到大的作用域中寻找键值对,能找到就直接返回,找不到最终返回null
如果不使用findAttribute()这个方法,最终底层源码是这样的
//需要从作用域中取得msg,但是忘了在哪个作用域中放着
if(pageContext.getAttribute("msg", pageContext.PAGE_SCOPE)!=null){
//使用
}else if(pageContext.getAttribute("msg", pageContext.REQUEST_SCOPE)!=null){
//使用
}else if(pageContext.getAttribute("msg", pageContext.SESSION_SCOPE)!=null){
//使用
}else if(pageContext.getAttribute("msg", pageContext.APPLICATION_SCOPE)!=null){
//使用
}else{
//返回null
}

怎么样是不是代码很冗余,是不是findAttribute(“要查内容的名字”)这个方法很强悍!
jsp四大作用域
说jsp四大作用域之前呢,先来说一下Servlet的三大作用域
即:ServletContext 针对当前项目 项目任意Servlet
HttpSession 针对会话 可以存在于会话中,可以存在请求转发中
HttpServletRequest 针对某次请求 只存在于请求转发中
通常我们去使用三大作用域的时候呢,会先从小的来看合不合适,如果不合适,往大的走
先看request作用域是否适合,如果适合直接使用,不适合再看session。session也不适合,再考虑ServletContext。
JSP四大作用域
PageScope 当前页面中有效 pageContext PageContext
RequestScope 一次请求范围 request HttpServletRequest
SessionScope 一次会话范围 session HttpSession
ApplicationScope 应用范围 application ServletContext
通常情况下,不去向pageContext作用域中直接存放数据,因为pageContext作用域太小,只针对当前页面有效,所以倒不如干脆直接创建一个变量。
考虑到低使用哪一个域对象呢,和Servlet的考虑是一样一样的
JSP的四大作用域,从request开始进行考虑—-》session—-》application

猜你喜欢

转载自blog.csdn.net/little_calf/article/details/52337437