2020-11-26 02:48:09 登录注册 RSS

当前位置: 公理网 >> 网友举报 >> jsp隐藏对象

jsp隐藏对象
发布时间:2018-11-03| 来源:公理网 | 点击发表评论

jsp的最终表现形式

jsp代码最终会通过Tomcat转换成servlet的.java文件,通过java环境编译为.class文件。通过由jsp转成的servlet类中会包含9大隐藏对象

jsp的隐藏对象

jsp文件通过Tomcat编译后保存在项目目录文件夹下的.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\demo_10_29\org\apache\jsp中,文件包过jsp转换为.java和编译后的.class文件。

在jsp页面中有些对象需要经常使用,在jsp中提供了9大隐藏对象,如下



在一般的由jsp转换成的servlet中只有前8个隐藏对象,没有错误对象如下:


finaljavax.servlet.jsp.PageContextpageContext;
javax.servlet.http.HttpSessionsession=null;
finaljavax.servlet.ServletContextapplication;
finaljavax.servlet.ServletConfigconfig;
javax.servlet.jsp.JspWriterout=null;
finaljava.lang.Objectpage=this;
javax.servlet.jsp.JspWriter_jspx_out=null;
javax.servlet.jsp.PageContext_jspx_page_context=null;


出现这种情况的原因是因为exception对象只在错误页面中才起作用,需要在由eclipse生成的页面中加入isErrorpage=“true”,如下


//这是没加之前
%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%
//加了之后
%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"isErrorPage="true"%

out对象

隐藏对象out是javax.servlet.jsp.JspWriter包的实现,其和servlet中的printwriter同样有缓冲区,但jspwriter的缓冲区内容需要发送到printwriter对象中在由printwriter发送出去。所以如果printwriter存在缓冲区,就会发生在接收到jspwriter发来的数据对其进行缓冲,从而造成在输出是造成输出混乱。在写jsp页面时需要把printwriter的缓冲区大小设置为0kb


%@pageimport="java.io.PrintWriter"%
%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%
%--buffer="0kb"设置printwriter对象的缓冲区设置为0,因为隐藏对象out是javax.servlet.jsp.JspWriter包最终需要通过printwriter缓冲区,
所有设置printwriter缓冲区为0,使printwriter没有缓冲,即jspwriter发送到printwriter一条数据,printwriter不能缓冲直接输出--%
!DOCTYPEhtml
html
head
metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"
title/title
/head
body
h1用户登录界面/h1
formaction=""
用户名:inputtype="text"name="username"
密码:inputtype="password"name="userpass"
inputtype="submit"value="登录"
/form
Stringusername=request.getParameter("username");
Stringuserpass=request.getParameter("userpass");
out.print(username);
response.getWriter().print(userpass);
/body
/html
//设置printwriter的缓冲区为0
%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"buffer="0kb"%

pageContext对象

pageContext可以访问其他8个隐藏对象及访问4大作用域

四大作用域


Web应用中,JSP创建的对象有一定的生命周期,也有可能被其他组件或者对象访问。对象的声明周期和可访问性称为作用域。四种范围对象作用域从小到大顺序如下:pageContext----request----session----application。


(1)pageContext:页面域


页面作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。


(2)request:请求域


请求作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。


(3)session:会话域


会话作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。


(4)application:应用域


应用作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享


%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%
!DOCTYPEhtml
html
head
metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"
title/title
/head
body
h1页面容器对象-最强/h1
h2通过pageContext对象还可以访问其他8个对象/h2
h3通过pageContext对象还可以访问4大作用域/h3
//java小脚本测试pageContext页面容器对象
//1.获取其他对象
HttpServletRequestreq=(HttpServletRequest)pageContext.getRequest();
HttpSessionses=(HttpSession)pageContext.getSession();
//2.使用获取对象
req.setAttribute("req","form页面容器对象的req111");
request.setAttribute("req","form页面容器对象的req222");
req.setAttribute("req","form页面容器对象的req333");
//3.直接访问,默认放在当前页面容器总即PAGE_SCOPE,只能在当前页面取得,其他页面无法获得
pageContext.setAttribute("req","pagetContext直接获取的属性aaaa",pageContext.PAGE_SCOPE);//pageContext.PAGE_SCOPE设置其作用域,PAGE_SCOPE为当前页面
Stringstr1=(String)pageContext.getAttribute("req");
%--取出req的session对象--%
%=req.getAttribute("req")%
%=str1%
/body
/html


授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

最新新闻

手机浏览

公理网 版权所有

公理网 Total 0.031708(s) query 6, 报料QQ:点击这里

给我发消息