• JSP(3)


    1、9个JSP内置对象

    内置对象引用名称     对应的类型
    request HttpServletRequest
    response HttpServletResponse
    config ServletConfig
    application ServletContext
    session HttpSession(有开关的:page指令的session属性的取值,默认是true创建)
    exception java.lang.Throwable(有开关的:page指令的isErrorPage属性改为true)
    page this(当前Servlet对象)
    out JspWriter
    pageContext javax.servlet.jsp.PageContext(非常重要)

    ==> 注:前7个和servlet差不多,后3个中pageContext比较重要。这些对象都在jsp文件对应翻译成的.java文件中的_jspservice()方法中声明了的,故是局部变量,每个jsp页面有自己的对象

    2、out对象详解

    (1)out隐式对象用于向客户端发送文本数据

    (2)out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似

    (3)JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存

    (4)只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter()方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

    ==> 设置page指令的buffer属性关闭了out对象的缓存功能

    ==> out对象的缓冲区已满(并且可以自动刷新,即默认autoFlush=true;如果autoFlush=false,则不自动刷新,新数据会替换out缓存中的数据,直到页面结束)

    ==> 整个JSP页面结束

    (5)图解

    JspWrite缓存原理 - 小易

    3、pageContext对象详解

    (1)本身是一个域对象。同时还能操作其他三个域对象(PageContext ServletRequest HttpSession ServletContext)

    ①本身表示的域范围是本页面

    void setAttribute(String name,Object value)

    Object getAttribute(String name)

    void removeAttribute(String name)

    ②操作其他的三个域对象

    void setAttribute(String name,Object value,int scope)

    Object getAttribute(String name,int scope)

    void removeAttribute(String name,int scope)

    注 : 参数int scope是由PageContext类提供的静态变量规定的,取值为

    ==> PageContext.PAGE_SCOPE:页面范围(是PageContext本身中的那个Map,代号page)

    ==> PageContext.REQUEST_SCOPE:请求范围(是ServletRequest中的那个Map,代号request)

    ==> PageContext.SESSION_SCOPE:会话范围(是HttpSession中的那个Map,代号session)

    ==> PageContext.APPLICATION_SCOPE:应用范围(是ServletContext中的那个Map,代号application)

    (非常有用)Object findAttribute(String name):依次按照page request session application范围搜索指定名称的对象,找到为止

    (2)获取其他8个隐式对象

    ==> getRequest方法返回request隐式对象

    ==> getResponse方法返回response隐式对象

    ==> getServletConfig方法返回config隐式对象

    ==> getServletContext方法返回application隐式对象

    ==> getSession方法返回session隐式对象

    ==> getException方法返回exception隐式对象

    ==> getPage方法返回page隐式对象

    ==> getOut方法返回out隐式对象

    (3)提供了转发和包含的方法

    pageContext.forward("url"); (相对于servlet的转发更方便,由服务器负责转发,也是只为一次请求)

    pageContext.include("url");

    ==> servlet中的转发 : request.getRequestDispatcher("url").forward(request,response);

    ==> 和servlet一样,forward由服务器负责转发,所以url是给服务器用的,如果用绝对路径(加/),就不需要加项目名

    4、out实例

    实例1:a1.jsp的部分源码
    	<%@ page pageEncoding="UTF-8"%>
    	<body>
    		<%
    			out.print("aaa");
    			response.getWriter().write("bbb");
    		%>
    	</body>
    结果:bbbaaa
    -----------------------------------------
    实例2:b1.jsp的部分源码
    	<%@ page pageEncoding="UTF-8"%>
    	<body>
    		<%
    			out.print("aaa");
    			out.flush();
    			response.getWriter().write("bbb");
    		%>
    	</body>
    结果:aaabbb
    -----------------------------------------
    实例3:c1.jsp的部分源码
    	<%@ page pageEncoding="UTF-8" buffer="none"%>
    	<body>
    		<%
    			out.print("aaa");
    			response.getWriter().write("bbb");
    		%>
    	</body>
    结果:
    -----------------------------------------
    实例4:d1.jsp的部分源码
    	<%@ page pageEncoding="UTF-8"%>
    	<body>
    		<%
    			response.getWriter().write("aaa");
    			out.print("bbb");
    			response.getWriter().write("ccc");
    		%>
    	</body>
    结果:aaacccbbb
    

    5、pageContext实例

    实例1:
    a1.jsp源码
    	<body>
    		<%
    			pageContext.setAttribute("username", "小易");
    		%>
    		利用pageContext对象的getAttribute方法从a1.jsp(此页面)获得的username的值是:
    		<%
    			out.print(pageContext.getAttribute("username"));
    		%>
    	</body>
    a2.jsp源码
    	<body>
    		pageContext对象只针对本页面,所有想在a2.jsp中利用pageContext.getAttribute("username")
    		是获取不到a1.jsp中的值,所以结果是:
    		<%
    			out.print(pageContext.getAttribute("username"));
    		%>
    	</body>
    访问http://127.0.0.1:8080/testJsp/pagecontext/a1.jsp
    ==>输出:利用pageContext对象的getAttribute方法从a1.jsp(此页面)获得的username的值是: 小易
    访问http://127.0.0.1:8080/testJsp/pagecontext/a2.jsp
    ==>输出:pageContext对象只针对本页面,所有想在a2.jsp中利用pageContext.getAttribute("username") 是获取不到a1.jsp中的值,所以结果是: null
    -------------------------------------------------------------
    实例2:
    b1.jsp源码
    	<body>
    		<%
    			pageContext.setAttribute("username", "小易SESSION", PageContext.SESSION_SCOPE);
    		%>
    	<a href="/testJsp/pagecontext/b2.jsp">访问b2.jsp</a>
    	</body>
    b2.jsp源码
    	<body>
    		在b2.jsp中利用pageContext操作ServletRequest域对象来获取b1.jsp中的username的值,结果为:
    		<%
    			//或者为session.getAttribute("username");
    			out.print(pageContext.getAttribute("username",PageContext.SESSION_SCOPE));
    		%>
    	</body>
    先访问http://127.0.0.1:8080/testJsp/pagecontext/b1.jsp
    再访问http://127.0.0.1:8080/testJsp/pagecontext/b2.jsp
    ==>输出:在b2.jsp中利用pageContext操作ServletRequest域对象来获取b1.jsp中的username的值,结果为: 小易SESSION
    -------------------------------------------------------------
    实例3:
    c1.jsp源码
    	<body>
    		<%
    			pageContext.setAttribute("username", "小易page");
    			pageContext.setAttribute("username", "小易request", PageContext.REQUEST_SCOPE);
    			pageContext.setAttribute("username", "小易session", PageContext.SESSION_SCOPE);
    			pageContext.setAttribute("username", "小易application", PageContext.APPLICATION_SCOPE);
    			
    			//重定向,url是给浏览器使用的,所以绝对路径要加项目名
    			response.sendRedirect("/testJsp/pagecontext/c3.jsp");
    		%>
    	</body>
    c2.jsp源码
    	<body>
    		<%
    			pageContext.setAttribute("username", "小易page");
    			pageContext.setAttribute("username", "小易request", PageContext.REQUEST_SCOPE);
    			pageContext.setAttribute("username", "小易session", PageContext.SESSION_SCOPE);
    			pageContext.setAttribute("username", "小易application", PageContext.APPLICATION_SCOPE);
    			
    			//转发(这种方法更方便),url是给服务器使用的,所以绝对路径不用加项目名
    			pageContext.forward("/pagecontext/c3.jsp");
    		%>
    	</body>
    c3.jsp源码
    	<body>
    		findAttribute是按照page request session application的顺序来查找的,找到就停止。
    		结果为:
    		<%
    			//pageContext.getOut()获取out对象,同理pageContext还可以获取JSP的其他8个内置对象
    			pageContext.getOut().print(pageContext.findAttribute("username"));
    		%>
    	</body>
    访问http://127.0.0.1:8080/testJsp/pagecontext/c1.jsp
    ==>输出:findAttribute是按照page request session application的顺序来查找的,找到就停止。 结果为: 小易session
    访问http://127.0.0.1:8080/testJsp/pagecontext/c2.jsp
    ==>输出:findAttribute是按照page request session application的顺序来查找的,找到就停止。 结果为: 小易request





  • 相关阅读:
    paip.验证码识别使用字符集的选取
    paip.提升用户体验业务SQL注入漏洞的分析与解决
    人人网验证码识别
    paip.路由器拨号上网密码找回.txt
    PAIP.ASP技术手册
    PAIP.java程序调试的注意点及流程总结
    paip.XXListener is already configured监听器已经被配置的解决
    paip.目录文件列表排序算法
    paip.C#.net TIMER不起作用在用户控件中
    paip.按键精灵调用其它程序及DLL以及EXE命令行的方法
  • 原文地址:https://www.cnblogs.com/oldinaction/p/5167462.html
Copyright © 2020-2023  润新知