一.EL表达式
作用:EL :为了消除jsp中的Java代码
1.语法
${EL表达式}
a.EL不需要导包
b.在el中调用属性,其实是调用的getXxx()方法
${范围.对象.属性.属性的属性 }
${requestScope.student.address.schoolAddress }
2.操作符:操作:属性,不是对象
. : 使用方便
[] : 如果是常量属性,需要使用双引号/单引号 引起来;比点操作符更加强大(可以访问数据,获取变量值)
[]强大之处:
a.可以容纳一些 特殊符号 (. ? -)
b.[]可以容纳 变量属性 (可以动态赋值)
String x =“a”; $ {requestScope.a}等价于$ {requestScope[“a”]}等价于KaTeX parse error: Expected '}', got 'EOF' at end of input: …e[x]} c.可以处理数组:{requestScope.arr[0] }
获取map属性
Map<String,Object> map = new HashMap<>();
map.put(“cn”,“中国”);
map.put(“us”,“美国”);
request.setAttrubute(“map”,map);
${requestScope.map.cn}
3.通过EL获取JSP 九大内置对象
${pageContext }
${pageContext.request }
${pageContext.sessoin }
${pageContext.方法名去掉()和get并且将首字母小写} //上面的就是
4.各内置对象的作用域
<%// 向page作用域存入内容
pageContext.setAttribute("name", "张三"); // 同一页面中的信息
request.setAttribute("name", "李四"); // 一次请求有效的信息(例如servlet存入结果,jsp获取结果)
session.setAttribute("name", "王五"); // 每个用户(浏览器)独有的信息(例如购物车信息)
application.setAttribute("name", "赵六"); // 适合放全局信息(城市信息, 类别信息)
%>
<!-- 从page作用域获取内容-->
<%= pageContext.getAttribute("name")%>
<!-- 从page作用域获取内容(推荐) -->
${pageScope.name}
<!-- 从request作用域取-->
<%= request.getAttribute("name")%>
<!-- 从request作用域取(推荐)-->
${requestScope.name}
<!-- 从session作用域取值 -->
<%= session.getAttribute("name")%>
<!-- 从session作用域取值(推荐) -->
${sessionScope.name}
<!-- 从application作用域取值 -->
<%= application.getAttribute("name")%>
<!-- 从application作用域取值(推荐) -->
${applicationScope.name}
<hr/>
<!-- 在el表达式取作用域变量时,不加前缀,先搜索pageScope, 再搜索requestScope, 继续搜索sessionScope, 再搜索applicationScope-->
${name}
二.JSTL (比EL更加强大)
需要引入2个jar :jstl.jar standard.jar
引入tablib :
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
其中prefix=“c” :前缀
核心标签库: 通用标签库、条件标签库、 迭代标签库
1.通用标签库
1.<c:set>赋值
i:
在某个作用域之中(4个范围对象),给某个变量赋值
<%-- request.setAttribute(“name”, “zhangsan”) ; --%>
<c:set var=“name” value=“zhangsan” scope=“request”/>
${requestScope.name }
<c:set var=“变量名” value=“变量值” scope=“4个范围对象的作用域”/>
给普通对象赋值
在某个作用域之中(4个范围对象),给某个对象的属性复制 (此种写法,不能指定scope属性)
${requestScope.student.sname} //取出studen对象sname属性值
<c:set target="${requestScope.student}" property="sname" value="zxs" />
给map对象赋值
${requestScope.countries.cn} //取出countries对象cn属性值
<c:set target="${requestScope.countries}" property="cn" value="中国" />
<c:set target=“对象” property=“对象的属性” value=“赋值” />
注意 <c:set>可以给不存在的变量赋值 (但不能给不存在的对象赋值)
2.<c:out>显示
传统EL:$ {requestScope.student }
c:out方式:<c:out value ="$ {requestScope.student }"
c:out显示不存在的数据:<c:out value="$ {requestScope.stu}>" default=“zs-23”>
true:<c:out value=‘百度’ default=“当value为空的,显示的默认值” escapeXml=“true” /> //将a标签内容以文字形式显示
false:<c:out value=‘百度’ escapeXml=“false” /> //显示链接
3.<c:remove >:删除属性
<c:set var=“a” value=“aaa” scope=“request”/> //赋值
${a} // 赋值后显示
<c:remove var=“a” scope=“request”/> //删除
${a} //删除后再显示
2.条件标签库
1.选择
单重选择
<c:if test="${6>2}" var = "result" scope="request" ></c:if>
if else if… esle if… else /switch
<c:choose>
<c:when test="${requestScope.role == '老师'}">
老师代码 ....
</c:when>
<c:when test="${requestScope.role == '学生'}"> ==可以用 eq 代替
学生代码....
</c:when>
<c:otherwise>
管理员其他人员....
</c:otherwise>
</c:choose>
3.迭代标签库(循环)
for(int i=0;i<5;i++)
<c:forEach var=“name” items=“r e q u e s t S c o p e . n a m e s " > − {requestScope.names }” > -requestScope.names">−{name }-
</c:forEach>
//相当于 for(int i=0;i<5;i++)
<c:forEach begin="0" end="5" step="1" varStatus="status" >
${status.index}
</c:forEach>
//相当于for(String str:names)
<c:forEach var="name" items="${requestScope.names}">
${name}
</c:forEach>
<c:forEach var="student" items="${requestScope.students }" >
${student.sname }-${student.sno }
</c:forEach>