前面说到,JSP在运行时会被编译成Servlet源代码,通过_jspServlet方法处理请求,此时该方法会传递和提供9个与web开发相关的对象进行使用,开发人员在JSP页面通过对这些变量即可引用这9大变量;

其中的request、response、session、application(servletContext)、config在前面的博客已经或多或少有对其介绍,这篇重点说下pageContext、out、page这3对象;

page对象:把当前的jsp页面当做一个对象使用,在开发中很少使用,看看眼熟即可;

out 对象:向客户端发送文本数据,通过调用pageContext对象的getOut方法返回,对象类型是JspWriter,具有缓存功能,当其缓冲区已满或者jsp页面结束或通过page指令将其buffer缓存功能关闭时,out对象会调用ServletResponse,getWriter方法,通过PrintWriter对象将其缓冲区的内容写入到Servlet引擎提供的缓冲区中;图解:

pageContext对象:及其重要的一个对象,代表整个jsp页面的运行环境,封装的对其他8大隐式对象的引用,也是一个域对象(容器),可以保存数据、引入、跳转等等功能

  • getException方法返回exception隐式对象
  • getPage方法返回page隐式对象
  • getRequest方法返回request隐式对象
  • getResponse方法返回response隐式对象
  • getServletConfig方法返回config隐式对象
  • getServletContext方法返回application隐式对象
  • getSession方法返回session隐式对象
  • getOut方法返回out隐式对象

常用的方法有:setAttribute、getAttribute、removeAttribute、findAttribute;

JSP的属性范围:

  • page:只能在当前页寻找属性值,跳转到其他页则访问不到;
  • request:服务器跳转有效,即转发状态其属性是一直可用的,如forward;
  • ’session:用户跳转有效,即超链接、重定向等都可查到属性;
  • application:任何用户都共用,即在服务器设置好属性后,无论哪个客户端都可进行访问;

其查找的顺序是page>request>session>application从小到大范围寻找;也可以通过制定域寻找,如:

pageContext.getAttribute("Name",PageContext.SESSION_SCOPE);

其结果等于:

session.getAttribute("Name");

代表各个域的常量有:

PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE

使用pageContext中的forward跳转页面,如:

pageContext.forward("/xxx/xxx");

第一个"/"表示当前的web应用,不过该方法在jsp开发中并不常用,因为引进了java代码,一般会使用<jsp:forward>标签进行转发;

同样的可以用pageContext对象中的include方法进行引入资源:

pageContext.include("/xxx/xxx");

由于需嵌入java代码,因此在实际开发中,使用pageContext的include方法引入页面这种做法也很少用,一般都使用<jsp:include>标签引入资源;

常用的JSP标签有3种:

  • <jsp:include>标签:用于引入资源,动态引入;

动、静态引入的区别:静态是合并为一个Servlet,先合并后执行;而动态是有各种不同的Servlet,各自执行后再合并;

语法:

<jsp:include page = "relativeURL | <% =expression%>" flush = "true|false" />

page属性指定引入资源的相对路径,也可用表达式表示;

flush属性表示在插入别的资源时,本身是否再刷新到客户端;

扩展名为.jspf的文件在jsp:include、@include的区别:.jspf文件在被解析时会被当做纯文本解析,因此只有在运用@include静态引入时会正确显示结果,在运用jsp:include动态引入时会出现乱码;

解决办法:

  1. 修改web.xml文件,增加

    <servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jspf</url-pattern>
    </servlet-mapping>

    让扩展名为.jspf也成为JSP Servlet处理的文件

  2. 修改tomcat中的web.xml文件,然后根据Servlet名找到对应的servlet-mapping配置,增加一个*.jspf的扩展名:
    <servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>
  • <jsp:forward>标签:用于将请求转发到另外一个资源;

语法:

<jsp:forward page = "relativeURL | <%expression%>" />

page属性用于指定转发资源的相对路径,也可通过一个表达式来获得;

  • <jsp:param>标签:在使用include和forward标签时,可通过param标签向资源传递参数;

语法:

<jsp:include page = "relativeURL | <%=expression%>">
<jsp:param name = "parameterName" value = "parameterValue|<%=expression%>" />
</jsp:include>

其中的name属性和value属性分别表示传入参数的参数名和值;

最新文章

  1. Jquery学习笔记 --ajax删除用户,使用了js原生ajax
  2. tyvj1125 JR&#39;s chop
  3. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(4)
  4. UVA 11039 - Building designing(DP)
  5. LeetCode2:Median of Two Sorted Arrays
  6. (转载)解决ListView中使用EditText所遇到的一些冲突
  7. android学习笔记五——AutoCompleteTextView
  8. tornado框架之路一
  9. svn服务器的搭建
  10. PAT 1014. Waiting in Line
  11. Linux上MongoDB的安装与配置
  12. ReplaceGoogleCDN:将 Google CDN 更换国家
  13. 使用swift语言进行IOS应用开发
  14. 初步了解PE分析
  15. 电脑浅色显示器不显示怎么办,如何用PS去除logo底色
  16. Android 页面跳转之生命周期调用顺序问题
  17. 【css】css 中文字体 unicode 对照表
  18. Ant scp upload文件至linux server(用java调用Ant api)
  19. php中错误处理机制
  20. Golang channel 的基本使用方法

热门文章

  1. polyfill.io 试用
  2. vue.js(18)--父组件向子组件传值
  3. X-MAS CTF 2018 - Crypto - Hanukkah
  4. Java List 类型转换
  5. alert(1) to win 7
  6. 关于BFC的总结
  7. canvas一个简单粗暴的中奖转盘
  8. VUE的系统指令
  9. 使用Fabric在tomcat中部署应用的问题总结
  10. Java缓冲流写出数据实例