一.域对象
page域(pageContext):只能作用于当前页面,既不能用来做做转发的数据分享,也不能做重定向的数据分享。
request域:只能作用于同一个请求的数据共享,所以只能在请求的转发中使用。
session域:只能作用于一次对话中共享数据(一次对话:用户打开浏览器,浏览多个web站点后,关闭该浏览器),转发和重定向都可以使用
context域(application):只能在同一个web应用中使用。(全局的)
<%@page import="com.zking.entity.Student"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//四大域对象 pageContext request session application
//1.域对象的作用:临时的存储有效的数据,四个作用域保存的值,
//范围不同,存储的方式是一样
//2.都是通过setAttribute和getAttribute
//3.域对象的范围:pageContext<request<session<application
%>
<ul>
<li>pageContext:只在当前JSP页面中有效,其它页面访问无效</li>
<li>request:只在同一个请求当中访问有效,其它无效</li>
<li>session:只在同一个会话(打开浏览器与关闭浏览器的过程)中访问有效,其它无效(浏览器关闭或者session失效)</li>
<li>application:只要服务器没有关闭,期间访问都有效。</li>
</ul>
<%
//存储值
pageContext.setAttribute("杨过", "小龙女");
request.setAttribute("张无忌", "赵敏");
session.setAttribute("郭靖", "黄蓉");
application.setAttribute("渣渣辉", "刘亦菲");
%>
<hr/>
<!-- 超链接跳转 属于重定向 -->
<p>
<a href = "demo3.jsp">跳转</a>
</p>
<hr/>
<!-- 通过jsp表达式的方式进行输出作用域保存的值 -->
<%=pageContext.getAttribute("杨过") %>
<br/>
<%=request.getAttribute("张无忌") %>
<br/>
<%=session.getAttribute("郭靖") %>
<br/>
<%=application.getAttribute("渣渣辉") %>
<hr/>
<!--
EL表达式
属于JSP的一个基础语法,作用:让数据调用的更简单。
$ { }
-->
<h2>EL表达式获取域对象所保存的值</h2>
<!-- 通过EL表达式的方式进行输出域对象所保存的值 -->
<%=pageContext.getAttribute("杨过") %> ==== ${杨过 }
<br/>
${郭靖 }
<!-- 通过域对象保存同一个键 不同的值 -->
<%
//存储值
pageContext.setAttribute("aa", "西施");
request.setAttribute("aa", "王昭君");
session.setAttribute("aa", "貂蝉");
application.setAttribute("aa", "杨玉环");
%>
<hr/>
<!-- 获取 -->
<!-- 通过jsp表达式的方式进行输出作用域保存的值 -->
<%=pageContext.getAttribute("aa") %>
<br/>
<%=request.getAttribute("aa") %>
<br/>
<%=session.getAttribute("aa") %>
<br/>
<%=application.getAttribute("aa") %>
<h3>通过EL表达式获取同一个键不同的值</h3>
${zkingzz }
<!-- 超链接跳转 属于重定向 -->
<p>
<a href = "demo3.jsp">跳转</a>
</p>
<!-- 转发 -->
<%-- <jsp:forward page="demo3.jsp"></jsp:forward> --%>
<!-- 通过EL表达式获取四个域对象分别保存的值 -->
<!-- EL表达式中提供了四个隐式域对象 -->
<hr/>
${pageScope.aa}
<br/>
${requestScope.aa}
<br/>
${sessionScope.aa}
<br/>
${applicationScope.aa}
<hr/>
<!-- EL表达式获取的值可以有哪些? -->
${123 }
${"123" }
${1==2 }
${"love"=="爱" }
equals
${"love" eq "爱" }
${1>2 }
<%
List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");
session.setAttribute("list",list);
%>
${list }
<hr/>
<!-- 保存实体 -->
<%
Student stu = new Student("张三","男");
session.setAttribute("stu", stu);
%>
${sessionScope.stu.name }
<!-- empty 判断EL表达式中的变量是否存在 -->
${empty list }
二.EL表达式
2.1 概述
EL 是 JSP 表达式语言,全称是 ExpressionLanguage,使用 EL 的目的是简化在 JSP 中访问变量的方式,简单静态 HTML 与 Java 代码的耦合。
2.2 基本语法格式
${ EL Expression}
2.3 示例代码
${ "Helloworld" } // 输出字符串常量
${ str } // 输出字符串变量 str 的值
${ 3 + 2 } // 输出 3+2 的结果
${ user.name} // 输出 user 对象的 name 属性
${user["name"] } // 同上
${ sessionScope ["user"].name } // 同上
${user.name} //访问对象 user 的 getName () 方法以得到 name 成员的值。
${list[1]} //访问 list 对象的第二项。
${map["key"]} //访问 map 指定键的值。
2.4 "."与"[ ]"的相同点和差别
(1)相同点:都可以访问对象有属性。
(2)不同点:当属性的名字包含有空格,点号等复杂符号时。使用"." 来访问对象有属性将会出现异常
2.5 EL表达式中的操作符
(1)算术操作符 (+,-,*,/,%)
(2)逻辑操作符 (&&,||,! 或 and,or,not )
(3)比较操作符 (>,>=,<,<=,==,!==) 可以自动转换数据类型
(4)空操作符 (empty) 当值为 null 时返回 true
【注意事项】
(a)EL的算术运算符和Java中的运算符的大致相同,优先级也相同。
(b)'+' 运算符不会连接字符串了,他只用于加法运算。
(5)EL关系运算符有以下六个运算符
关系运算符 说 明 范例 结果
== 或 eq | 等于 | ${ 5 = = 5 } 或 ${ 5 eq 5 } | true
!= 或 ne | 不等于 | ${ 5 != 5 } 或 ${ 5 ne 5 } | false
< 或 lt | 小于 | ${ 3 < 5 }或 ${ 3 lt 5 } | true
> 或 gt | 大于 | ${ 3 > 5 }或 ${ 3 gt 5 } | false
<= 或 le | 小于等于 | ${ 3 <= 5 }或 ${ 3 le 5 } | true
>= 或 ge | 大于等于 | ${ 3 >= 5 }或 ${ 3 ge 5 } | false
(6)集合访问
<!--
EL表达式
属于JSP的一个基础语法,作用:让数据调用的更简单。
$ { }
-->
<h2>EL表达式获取域对象所保存的值</h2>
<!-- 通过EL表达式的方式进行输出域对象所保存的值 -->
<%=pageContext.getAttribute("杨过") %> ==== ${杨过 }
<br/>
${郭靖 }
三.JSTL库
由JSP所提供的一套标准标签
--通用标签:set out remove
--条件标签:if if...else
--迭代标签:forEach for循环
JSTL库怎么使用
导入------taglib指令
<!--
JSTL
1.由JSP内部提供的一套标签库
问题:纯JSP页面中不允许Java代码 需要使用JSTL提供的标签去替代。
2.JSTL
out,set,if,foreach
3.使用步骤:
(1)导入依赖库 lib
(2)在指定的页面中通过taglib指令来引入具体的标签库依赖文件
-->
<%
//通过JSP脚本保存一个值
session.setAttribute("username", "admin");
out.println(session.getAttribute("username"));
%>
<%=session.getAttribute("username") %>
${sessionScope.username }
<!-- 通过JSTL库中的out标签进行值的输出 -->
<!-- default 当value值访问的结果不存在时 会输出默认结果 -->
<c:out value="${username }" default="sb"></c:out>
<!-- 通过JSTL库中的set标签进行对值的设置 -->
<!--
属性:
var 存储的变量名
value 存储的值
scope 作用域(pageContext request session application)
-->
<c:set var="uname" value="风清扬" scope="session"></c:set>
${uname }
<c:out value="${uname }"></c:out>
<!-- 通过JSTL库中提供的if标签来实现对数据进行有效的判断 -->
<c:if test="${1==12 }">
<c:out value="你的条件是OK的"></c:out>
</c:if>
<!-- 通过JSTL库中的if标签实现一个登录案例 -->
<!--
已登录----显示当前的登录名
未登录 ----显示登录的表单
-->
<%
//获取
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
if(username!=null){
Student student = new Student(username,"男");
session.setAttribute("student", student);
}
%>
<c:if test="${empty student }">
<form action = "demo4.jsp" method = "post">
账户 <input type = "text" name = "username"/>
<br/>
<br/>
密码 <input type = "password" name = "password"/>
<br/>
<br/>
<input type = "submit" value = "登录"/>
</form>
</c:if>
<c:if test="${not empty student }">
<h4>欢迎您回来!${student.username }</h4>
</c:if>
<!-- remove标签 移除 -->
<c:set var="bb" value="123456"></c:set>
移除前: <c:out value="${bb }"></c:out>
<!-- 移除 -->
<hr/>
<c:remove var="bb" />
移除后:<c:out value="${bb }"></c:out>
<!-- foreach循环标签 -->
<hr/>
<!--
sb 变量
begin 起始值
end 终值
step 每次增长2
varStatus 获取数据对应的行号(Y1阶段 J2EE 自定义JSP标签)
-->
<c:forEach var="sb" begin="1" end="100" step="2" varStatus="demo" >
${sb }----${demo.index }----${demo.count } <br/>
</c:forEach>
<br/>
<%
List<Student> myList = new ArrayList<Student>();
myList.add(new Student("张三1","男"));
myList.add(new Student("张三2","男"));
myList.add(new Student("张三3","男"));
myList.add(new Student("张三4","男"));
myList.add(new Student("张三5","男"));
session.setAttribute("myList", myList);
%>
<c:forEach items="${myList }" var="stu">
${stu.username } ${stu.sex }
</c:forEach>