Jsp笔记 第二天
一. 复习
二. 动作元素(包含,转发)
1. 包含动作 【重点】
1)语法: <jsp:include page=“被包含网页资源的网名” />
2)功能: 将其他网页资源的“输出结果”包含到当前jsp页面里 — 合并输出结果 , 也称为“动态包含”或者“编译 后包含”
3)作用:做复杂网页的显示 ( 可能是由多个jsp包含完成)
2. 转发动作 【了解】
1)语法: <jsp:forward page=“下一个资源的网名”/>
servlet — request.getRequestDispatcher(“网名”).forward(request,response);
重定向 — <% response.sendRedirect("…") %>
2 ) 功能: 与servlet里的forward完全一致( forward动作一般发生在servlet Action程序中 )
三. 隐含对象(内置对象)
1. 概念
jsp页面里创建好,一直存在的,定义好名字的,可以直接使用的 对象
2. 九大隐含对象
1) request ---- HttpServletRequest ( servlet程序中使用过的request对象)
2) response ---- HttpServletResponse
3) session ---- HttpSession ( tomcat采用饿汉式为jsp创建session对象)
4) application ---- ServletContext
5) config ---- ServletConfig (关于一个servlet的描述信息,是application的一部分)
6) out ---- JspWriter(等价于servlet里使用过的PrintWriter)
7) page ---- this
8) exception ---- Exception (只有isErrorPage=true的jsp页面里有 )
9) pageContext ---- PageContext (jsp特有的,功能最强大的隐含对象)
注意: 这些隐含对象只能在 表达式脚本 里 和 普通脚本里使用,不能在声明脚本里使用
3. 隐含对象的本质
隐含对象本质就是servlet程序service方法的局部变量,在当前页面代码翻译前,tomcat为service方法创建
和初始化了这些局部变量。(声明脚本代码不属于service方法,不能使用service方法的局部变量)
4. PageContext对象
1)是一个作用域,可以存放命名属性
存: pageContext.setAttribute(“name”,value);
取:Object value = pageContext.getAttribute(“name”);
生命周期短,只在当前jsp页面中生效
作用: 用来在jsp页面 与 嵌入的其他技术(EL JSTL) 之间做数据传递
2)管理其他三个作用域里的数据
3)可以获取其他八个隐含对象
getRequest() getSession() getApplication() getResponse() getOut() …
4) 可以 include 和 forward
四. EL技术
1. 干净的jsp页面(无脚本标签 — 尽量减少)
1)声明脚本 — 函数定义成普通java类 , 里面的变量线程不安全(不建议定义)
2)表达式脚本 ---- 输出java中的数据 (使用EL技术替换)
3) 普通脚本 ---- 用来定义一般的java代码(使用JSTL替换 )
2. EL技术使用前的准备
1)使用页面指令声明当前页面支持EL技术 <%@page isELIgnored=“false” %>
2)语法: ${ el代码 }
3) 功能: 计算表达式的值, 并且默认输出浏览器
3. 功能一 :做运算
${ 1+1 } ${ 3>4 } <==> ${ 3 gt 4 } ${ empty xxxx } ${ !empty xxxx }
4. 功能2 : 可以访问请求参数并打印
语法 ---- 使用关键字param访问
${ param.请求参数名 } 《===》 <%= request.getParameter(“name”) %>
5. 功能3 : 可以访问作用域里的命名属性
1)基础语法 — 使用关键字 pageScope requestScope sessionScope applicationScope 访问
${ xxxScope.命名属性名 }
2) 特殊的写法: ${ 变量名 } — el认为变量是一个命名属性,el会去所有作用域里查找这个变量的value,按
照生命周期由短到长的顺序查找,找到第一个返回。 等价于 pageContext.findAttribute("…")
6. 功能4:可以访问对象的属性
1)前提: 如果获取的 ”命名属性“ 值是一个对象,可以使用el进一步访问对象的属性
2)语法: ${ 对象 . 属性名 }
3)建议: 在将对象存入作用域时,命名属性的名最好与 变量(对象名)保持一致
4)原理: el在执行时,会将给定的属性名首字母变大写,前面加get,去类里访问getXxx()
5)扩展: el访问的是类里的getXxx() , 根本不在乎是否有这个实例变量。
反之如果类里的功能函数不是以get开头,则el无法访问调用
6)特例: 在el技术里,只承认jsp页面中的pageContext隐含对象(其他八个不认识)
— 请使用el技术调用request对象中的getContextPath()
${ pageContext.request.contextPath }
— 请使用el技术访问并打印当前client对应的session的id值
${ pageContext.session.id }
五. JSTL — jsp标准标签库
1. 用户自定义标签
1)写程序 实现特定的接口
2) 写配置文件 xxx.tld (这是一种特殊的xml文件)
3) 发布使用
2. Jstl使用
1) apache组织定义的一组 ”用户自定义标签“
2)使用标签库需要引入相关当 jar包 和 配置文件
3)标签的构成: core(课堂使用) fmt sql …
4) 准备: 在jsp页面中明确导入核心(core)标签库
<%@taglib uri=" http://java.sun.com/jsp/jstl/core" prefix=“c” %>
3. 条件判断标签
~~~xml
<c:if test=“boolean值”> 标签体 </c:if>
如果test的值为true,则执行标签体;反之不执行。 这个标签没有对应的else
~~~
4. 循环标签
1)遍历集合(所有的集合 List Set Map )
~~~jsp
遍历List或者Set集合
<c:forEach var=“变量名” items=“${ 集合对象 }” varStatus=“循环状态变量”>
如果需要打印得到的数据,可以通过 ${ 变量名.属性名 }
</c:forEach>
注意: 在标签属性赋值的过程中,只有String,数字和boolean类型值可以直接通过字面值来赋值,其他类型的数
据必须先通过el获取值,然后再赋值
varStatus:循环状态变量,可以通过访问它的count属性,来做循环计数 ${ vs.count }
~~~
遍历Map集合
<c:forEach var="变量名" items="${Map集合对象}" varStatus=""> --- 底层采用键值遍历
如果需要打印获取到的数据,可以通过 ${ 变量名.key } ${变量名.value }
</c:forEach>
vs.count }
~~~
遍历Map集合
<c:forEach var="变量名" items="${Map集合对象}" varStatus=""> --- 底层采用键值遍历
如果需要打印获取到的数据,可以通过 ${ 变量名.key } ${变量名.value }
</c:forEach>