目录

一、域对象

 9大内置对象:

二、EL表达式

1、概念:

2、基本语法格式:

3、EL表达式中的运算符

【注意事项】:

 三、JSTL库

JSP所提供的一套标准标签 :

 模拟登录


一、域对象

page域(pageContext):只能作用于当前页面,既不能用来做做转发的数据分享,也不能做重定向的数据分享。
    
request域:只能作用于同一个请求的数据共享,所以只能在请求的转发中使用。
    
session域:只能作用于一次对话中共享数据(一次对话:用户打开浏览器,浏览多个web站点后,关闭该浏览器),转发和重定向都可以使用
    
context域(application):只能在同一个web应用中使用。(全局的)

(1)通过jsp脚本的方式进行获取与对象所保存的值 【当前页面】

<%
	//pageContext   request   session   application
	pageContext.setAttribute("杨过", "小笼包");
	request.setAttribute("张无忌", "赵敏");
	session.setAttribute("风清扬", "海飞丝");
	application.setAttribute("黄回", "坤坤");
%>

<%
	out.println(pageContext.getAttribute("杨过") + "<br/>");
	out.println(request.getAttribute("张无忌") + "<br/>");
	out.println(session.getAttribute("风清扬") + "<br/>");
	out.println(application.getAttribute("黄回") + "<br/>");
%>

<jsp:forward page="demo2.jsp"></jsp:forward>

(2) 通过jsp表达式的方式进行获取与对象所保存的值 【当前页面】

<%
	//pageContext   request   session   application
	pageContext.setAttribute("杨过", "小笼包");
	request.setAttribute("张无忌", "赵敏");
	session.setAttribute("风清扬", "海飞丝");
	application.setAttribute("黄回", "坤坤");
%>

<%=pageContext.getAttribute("杨过")%><br />
<%=request.getAttribute("张无忌")%><br />
<%=session.getAttribute("风清扬")%><br />
<%=application.getAttribute("黄回")%><br />

<jsp:forward page="demo2.jsp"></jsp:forward>

运行结果:

 9大内置对象:

二、EL表达式

1、概念:

EL 是 JSP 表达式语言,全称是 ExpressionLanguage,使用 EL 的目的是简化在 JSP 中访问变量的方式,简单静态 HTML 与 Java 代码的耦合。

JSP页面的存在目的:从域对象中获取到数据进行显示

EL表达式是sunjava提供,不需要导包

2、基本语法格式:

${ EL Expression}

${ "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 指定键的值。

"."与"[ ]"的相同点和差别

1、相同点:都可以访问对象有属性。

2、不同点:当属性的名字包含有空格,点号等复杂符号时。使用"." 来访问对象有属性将会出现异常

(1)通过EL表达式的方式去获取域对象所保存的值

<%
	//EL表达式	
	pageContext.setAttribute("杨过", "小笼包");
	request.setAttribute("张无忌", "赵敏");
	session.setAttribute("风清扬", "海飞丝");
	application.setAttribute("黄回", "坤坤");
%>

<h4>通过EL表达式的方式去获取域对象所保存的值</h4>
${杨过 }
<%=pageContext.getAttribute("杨过")%>
${"杨过" } ${张无忌 }

运行结果:

(2)通过EL表达式获取数组,集合所保存的值

<%
	String[] names = { "黄回", "胡庆邦", "谢文建", "廖加俊" };
	session.setAttribute("names", names);

	List<String> list = new ArrayList<String>();
	list.add("张无忌");
	session.setAttribute("list", list);

	Map<String, String> maps = new HashMap<String, String>();
	maps.put("刘亦菲", "小老婆");
	session.setAttribute("maps", maps);

	List<Student> list2 = new ArrayList<Student>();
	list2.add(new Student("东方不败", 18));
	session.setAttribute("list2", list2);
%>
${names[3] } ${list[0] } ${maps.刘亦菲 } ${list2[0].name }

运行结果:

3、EL表达式中的运算符

<ul>
    <li>算术运算符: + - * / %</li>
    <li>关系运算符:== > >= 《= 《 !=</li>
    <li>逻辑运算符:! && ||</li>
    <li>条件运算符:表达式?结果1:结果2</li>
    <li>empty运算符</li>
</ul>

${1+1 } ${10%3 } ${"换回" == "黄回" } ${sb} ${empty 杨过 } ${"换回" eq "黄回" }

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

(3)EL表达式中的隐式对象(域对象)

<%
	pageContext.setAttribute("zkingzz", "小笼包");
	request.setAttribute("zkingzz", "赵敏");
	session.setAttribute("zkingzz", "海飞丝");
	application.setAttribute("zkingzz", "坤坤");
%>
${zkingzz } ${sessionScope.zkingzz }

运行结果:

【注意事项】:

(a)EL的算术运算符和Java中的运算符的大致相同,优先级也相同。
(b)'+' 运算符不会连接字符串了,他只用于加法运算。

 三、JSTL库

前提:导入taglib指令

<!-- JSTL标准标签库  -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

JSP所提供的一套标准标签 :

通用标签:set out remove
条件标签:if  if...else
迭代标签:forEach   for循环

(1)out标签的使用

<%
	session.setAttribute("username", "admin");
%>
${username }
<c:out value="${username2 }" default="sb"></c:out>

运行结果: 

(2)set标签的使用

<!-- var 变量的名称 -->
<!-- value  变量的值 -->
<!-- scope 域对象的范围,默认page -->

<c:set var="mylove" value="刘亦菲" scope="session"></c:set>
<c:out value="${mylove }"></c:out>

 运行结果:

(3)remove标签的使用

<c:set var="stu" value="${87+2 }" scope="session"></c:set>
移除前:
<c:out value="${stu }"></c:out>
<br />
<c:remove var="stu" scope="request" />
移除后:
<c:out value="${stu }"></c:out>

运行结果: 

 

(4)if标签的使用(JSTL中有if没有else) if(){}

<c:if test="${1==1 }">
	这是OK的
</c:if>
<c:if test="${1!=1 }">
	这是不OK的
</c:if>

运行结果:

(5)foreach标签

<!-- 打印输出1-100的结果 -->
<!-- step="5" 计布器(步长) -->
<c:forEach var="i" begin="1" end="100" step="2" varStatus="sb">
	${i }-----${sb.index }----${sb.count } <br />
</c:forEach>

运行结果:

<!-- 遍历集合 使用的属性  items = "遍历的集合"start end 不需要-->

<%-- <%
	List<Student> listStudents = new ArrayList<Student>();
	listStudents.add(new Student("aa", 12));
	listStudents.add(new Student("bb", 12));
	listStudents.add(new Student("cc", 12));
	listStudents.add(new Student("ee", 12));
	listStudents.add(new Student("dd", 12));
	listStudents.add(new Student("ff", 12));
	session.setAttribute("listStudents", listStudents);
%>
<c:forEach items="${listStudents }" var="stu">
	${stu.name }-----${stu.age }
</c:forEach> --%>

这里需要建立一个实体类:Student . java

运行结果:

 模拟登录

<!-- 假设域对象中保存一个用户   判断用户是否为空 -->
<%
	//当页面提交后   进行登录   保存
	String uname = request.getParameter("username");
	session.setAttribute("uname", uname);
%>

<!-- 如果用户为空  显示表单 -->
<c:if test="${empty uname }">
	<form action="demo5.jsp" method="post">
		用户名: <input type="text" name="username" /> <input type="submit" value="登录" />
	</form>

</c:if>
<!-- 如果点击了登录  说明跳转了   session保存了用户 -->
<!-- uname不为空   显示对应的账户  将表单隐藏 -->
<c:if test="${not empty uname }">
	<h4>欢迎您回来!${sessionScope.uname }</h4>
</c:if>

运行结果: 跳转到当前页面