JSP指令,JSP的九大内置对象,EL:

include 指令:
用于将一个JSP或HTML文件引入到另一个JSP中.
格式:

<%@ include file="引入的路径" %>

include 动作:
用于将一个JSP或HTML文件引入到另一个JSP中.
格式:

<jsp:include page="引入路径" flush="true"(刷新属性)/>

include 指令 与 include动作的区别:

include指令: 在JSP程序的转换时期,将被引入的JSP文件嵌入到include指令的位置,然后统一编译执行(最终生成了一个.java文件)

include动作: 在JSP程序的转换时期,被引入的文件不会嵌入到include动作的位置上,而是等客户端请求时,再临时将被引入的文件以额外的servlet的方式加载到响应中(最终生成的是多个.java文件)

JSP的内置对象(隐含对象):

内置对象指的是: JSP引擎在转换JSP文件时,帮我们的代码在执行之前 创建的一些 供我们使用的对象,
内置对象具备大量的JSP中的常用功能,使用JSP内置对象可以大大的简化我们的开发流程.

JSP的九大内置对象:

request:
类型: HttpServletRequest
作用: 请求对象,包含了请求相关的信息和参数

response:
类型: HttpServletResponse
作用: 响应对象,包含了一些用于响应的功能.

out:
类型: JSPWriter
作用: 是打印流,用于向响应体中输出数据

session:
类型: HttpSession
作用: 会话对象,用于状态管理以及会话跟踪

application:
类型: ServletContext
作用: Servlet的上下文,一个应用内存中同时只有一个上下文对象,用于多个Servlet/JSP之间通信.


config:
类型: ServletConfig
作用: Servlet的配置对象,用于配置一些初始的键值对信息.

pageContext:
类型: PageContext
作用: 页面的上下文,每一个JSP都拥有一个上下文对象,用于多段代码之间进行通信

exception:
类型: Throwable
作用: 当页面的page指令中 isErrorPage属性值为true时,才会存在此对象,用于收集错误信息!
通常此对象值为null,只有其他页面指定errorPage=当前页面时,且其他页面发生BUG后,跳转到此页面时,对象才不为null

page:
类型: Object
作用: 指当前JSP页面自身,在JSP引擎生成的代码中,page对象的赋值代码为:
Object page = this;

JSP的四大域对象:
九大隐含对象中,包含了四个较为特殊的隐含对象,这四个对象我们称其为域对象,它们都具备存储数据/删除数据/获取属性值的方法:
存储数据:

setAttribute(String key, Object value);

获取数据:

Object value = getAttribute(String key);

删除数据:
removeAttribute(String key);

这四个域对象,’域’指的是作用域

分别是:
pageContext : 页面的上下文 作用域: 一个JSP页面
request : 请求对象 作用域: 一次请求(请求可以被转发,一次请求可能包含多个JSP页面)
session : 会话对象 作用域: 一次会话(一次会话可能包含多次请求)
application : servlet上下文对象 作用域: 一次服务(服务器的启动到关闭)(一次服务可能包含多次会话)


点击加入购物车–>携带id发送给查询的servlet–>查询成功–>转发到添加购物车的servlet–>将商品信息添加到购物车中

JSP useBean 动作:
作用: 向四大域对象中,存储bean对象.
格式:

<jsp:useBean
    id="存储时的key"  
    scope="page/request/session/application"  
    class="要存储的对象类型">
</jsp:useBean>

JSP useBean + setProperty动作:
作用: 向四大域对象中,存储bean对象,且设置属性值
格式:

<jsp:useBean
    id="存储时的key"  
    scope="page/request/session/application"  
    class="要存储的对象类型">  
</jsp:uesBean>  
<jsp:setProperty name="存储时的key" property="属性名" value="属性值"/>  
//setProperty动作可以出现多次

案例:

<jsp:useBean id="p" scope="page" class="cn.xdl.bean.Person"></jsp:useBean>  
<jsp:setProperty name="p" property="name" value="刘建"/>  
<jsp:setProperty name="p" property="age" value="18"/>

JSP useBean + setProperty动作 快速获取表单提交的内容:
格式:

<jsp:useBean
    id="存储时的key"
    scope="page/request/session/application"
    class="要存储的对象类型">
</jsp:useBean>  
<jsp:setProperty name="存储时的key" property="属性名"/>  

注意:
如果setProperty动作中,property的值即是对象的属性名,又是我们用户请求的参数的名称的话,会自动将参数获取到并赋值给对象

JSP getProperty动作:
作用:
从四大域对象中取出某个对象的属性,并显示到网页中

格式:

<jsp:getProperty name="对象的key" property="属性名">

通过重写URL,得到session:
//1. 重写普通的网址,通常是超链接/表单中使用的网址
// url = response.encodeUrl(url);

//2. 重写重定向的网址,这种网址用于重定向
url = response.encodeRedirectUrl(url);

EL表达式:
作用:
用于快速的从域对象中取出数据,并将结果输出到网页
也可以用于一些运算,运算的结果也会输出到网页
格式:
${表达式}
例如:

运算的结果:${ 1+2+3+4+5 }

用于取出域对象中的数据:
访问存储数据的格式:
${存储的key}

访问存储的对象属性值:
静态取值:${存储的key.属性名}
静态取值:${存储的key[属性名]}
动态取值:${存储的key[“属性名的key”]}

访问集合/数组中的对象:
静态取值:${存储的key[下标].属性名}
静态取值:${存储的key[下标][“属性名”]}
动态取值:${存储的key[下标][属性名的key]}

有时我们需要使用变量的值,可以将其先存储到域对象中,再在el表达式中使用存储的key来操作
例如:

<%
    User[] data = {new User("root1","123"),new User("root2","223"),new User("root3","323"),new User("root4","423"),};
    pageContext.setAttribute("Users",data);
    pageContext.setAttribute("a","username");
%>
<%
    for(int i = 0; i<data.length;i++){
        pageContext.setAttribute("index",i);
    }
%>
    静态取值: ${user[index].username}
<%} %>

EL表达式 取出数据的流程:

取出顺序: 范围从小到大

步骤:

  1. 先从pageContext中寻找数据是否存在
  2. 当pageContext中不存在数据时,去request中寻找数据是否存在
  3. 当request中不存在数据时,去session中寻找数据是否存在
  4. 当session中不存在此数据时,去application中寻找数据是否存在
  5. 当application中不存在此数据时,向网页输出长度为0的字符串(是””,不是null)

在上述的流程中,一旦某个步骤寻找到了数据,就会将数据输出到网页中,且后续流程不再执行.

taglib指令:
用于在JSP中引入标签库
语法格式:

<%@ taglib prefix="" uri=""%>

属性:
prefix: 是引入标签库的名称,用于区分多个标签库,在使用此标签库中的标签时,需在标签前添加标签库名称:
例如: 我们引入一个标签库,prefix=a,则其中的标签在使用时:

<a:标签名></a:标签>

uri: 用于匹配标签库,在引入的tld文件中存在一个uri属性值,我们uri属性与tld文件中的属性相同,则引入这个文件描述的库.

JSTL标签库:

是一套JSP的标准标签库,对JSP的标签进行了扩展

IF标签:

用于判断元素是否显示

格式:

<库的名称:if test=""></库的名称:if>  
test属性值:  
    可以是boolean值,或运算结果为boolean的el表达式. 

案例:

<%--
<heiheihei:if test="true">
    从前有座山
</heiheihei:if>  
<heiheihei:if test="false">
    从前有座山
</heiheihei:if>  
--%>  
<%
    pageContext.setAttribute("flag",false);
%>  
<heiheihei:if test="${ flag }">  
    从前有座山  
</heiheihei:if>  
<%
    pageContext.setAttribute("flag",true);
%>  
<heiheihei:if test="${ flag }">  
    山上有座庙  
</heiheihei:if>

choose+when+otherwise标签:
类似Java中的: switch+case+default
这三个标签,只有when是由test属性的,属性值是boolean值,允许使用el表达式传入
作用:
用于多分支显示.

forEach标签:
用于遍历集合 或数组元素
格式:

<标签库名称:forEach items="" var="">

</标签库名称:forEach>

属性:
items : 要遍历的数组或集合 必须通过el表达式传递
var : 从循环遍历时,从数组或集合中取出每个元素会被存储到pageContext中,key就是var的值

如何自定义标签库:

自定义标签库的类:
两种实现的方式:

  1. 继承SimpleTagSupport
  2. 继承TagSupport