前面说到,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属性分别表示传入参数的参数名和值;

java_第一年_JavaWeb(8)的更多相关文章

  1. java_第一年_JavaWeb(14)

    EL :EL表达式主要用于获取数据.执行运算.获取对象.调用java方法: 获取数据 语法:"${标识符}" 会调用pageContext.findAttribute方法,从pag ...

  2. java_第一年_JavaWeb(13)

    JSTL标签库——核心标签库 为了弥补html标签的不足,为了更加方便地在jsp页面中使用java逻辑代码,JSTL标签库因运而生,而其中的佼佼者,被恩宠最多的就是核心标签库了: 核心标签库从功能上可 ...

  3. java_第一年_JavaWeb(11)

    自定义标签:主要是用来移除JSP页面中的java代码. 先从一个简单的案例了解其怎么移除代码: 一个正常的jsp页面: <%@ page language="java" pa ...

  4. java_第一年_JavaWeb(15)

    Filter过滤器,Servlet API 中提供了一个Filter接口,用于实现用户在访问某个目标资源前对其进行拦截: 拦截原理:web服务器通过Filter接口调用doFilter方法,会传递一个 ...

  5. java_第一年_JavaWeb(12)

    SimpleTag标签 定义了五个方法:setJspContext.setJspBody.setParent和getParent以及最重要的doTag方法(完成了所有的业务逻辑): setJspCon ...

  6. java_第一年_JavaWeb(10)

    JavaWeb的两种开发模式 JSP+JavaBean框架:JavaBean负责封装数据.提供方法,JSP负责处理用户请求和显示数据:只能开发较为简单的业务: JSP+JavaBean+Servlet ...

  7. java_第一年_JavaWeb(9)

    JavaBean是一个遵循某种特定写法的Java类,有以下特点: 必需具有一个无参的构造函数 属性必需私有化 私有化的属性必需通过public类型的方法暴露给其它程序,其方法命名也有一定的规范 范例: ...

  8. java_第一年_JavaWeb(7)

    JSP执行过程 客户端发出请求访问JSP文件 JSP Container将要访问的JSP文件转译为Servlet的源代码(转译时期),并将其编译成.class文件(编译时期): 执行编译后的.clas ...

  9. java_第一年_JavaWeb(6)

    会话 会话:浏览器从打开一个进程访问服务器到该浏览器关闭,我们称之为一个会话: 在浏览器和服务器交互期间,会不可避免地产生一些数据,而为了为每个用户保存其对应的数据,可使用两种技术:Cookie和Se ...

随机推荐

  1. R语言——ifelse函数

    在数据处理中,经常会遇到要对判断结果做处理的情况.if函数是经常遇到的. ifelse(cond,statment1,statment2) 如果cond成立,执行statment1,否则执行statm ...

  2. 22pygame 安装

    实战步骤 pygame 快速体验 飞机大战 实战 确认模块 --pygame pygame 就是一个 Python 模块, 专为电子游戏设计 提示 : 学习第三方模块, 通常最好的参考资料就在官方网站 ...

  3. CF1009F Dominant Indices 长链剖分

    题目传送门 https://codeforces.com/contest/1009/problem/F 题解 长链剖分的板子吧. 令 \(dp[x][i]\) 表示 \(x\) 的子树中的深度为 \( ...

  4. Linux下统计当前文件夹下的文件个数

    Linux下统计当前文件夹下的文件个数 √ ls -l |grep "^-"|wc -l

  5. 神仙dcx出的一道题

    题目大意 \(\;\;\)在一个坐标系上, 以\((0, 0)\)为起点, 每走一步,可以从\((x,y)\)走到\((x+1,y),(x-1,y),(x,y+1),(x,y-1)\)中的一个点上, ...

  6. spring mvc和spring boot的区别

    spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运行的代码 Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等 ...

  7. INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES

    [转] https://www.mobibrw.com/2016/3949 adb install 一个apk错误: INSTALL_FAILED_ALREADY_EXISTS 应用已存在,使用 ad ...

  8. size_t为什么重要

    参考:https://www.zhihu.com/question/24773728/answer/66535663 前言:使用size_t可能会提高代码的可移植性.有效性或者可读性,或许同时提高这三 ...

  9. C#中命名空间,C#程序中的一种代码组织形式,主要用来标识类的可以范围,引用using 命名空间

    C# C#中命名空间,C#程序中的一种代码组织形式,主要用来标识类的可以范围 use system; use system.collect.core; namespace sss{ } using 命 ...

  10. php strlen()函数 语法

    php strlen()函数 语法 作用:返回字符串的长度.大理石平台价格 语法:strlen(string) 参数: 参数 描述 string 必需.规定要检查的字符串.     说明:返回字符串的 ...