JSP第三章知识点总结——JSTL EL
知识点预览
一.使用JSP EL
二.EL运算符
三.标准标记库JSTL
四 EL示例
五 JSTL示例
一 使用JSP EL
a) <jsp:getProperty>的property属性只能访问Bean的属性,而不能访问嵌套的属性
b) 使用JSP EL(即表达式语言Expression Language)Web应用上的过滤器
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<body>
我的狗的名字是:${person.dog.name}
</body>
</html>
c) EL表达式和JSP脚本表达式
EL表达式总是放在大括号里,而且前面有一个美元符前缀 ${person.name}
与JSP脚本表达式比较:
外温度是 <%= temp %>度。
如果使用EL,则是:
室外温度是${temp}度。
d) 在EL表达式中使用隐式变量
二 EL运算符
a) EL运算符可以分为四类
i. 属性和集合访问运算符
ii. 算术运算符
iii. 关系运算符
iv. 逻辑运算符
b) 访问属性和集合的EL运算符:
访问属性和集合的EL运算符:
a.b:返回a的属性b的值。
a[b]:返回a的键或索引为b的值。
三 标准标记库JSTL
需要两个JAR文件。第一个文件是jstl.jar,它为JSTL标记库提供API类。第二个文件是standard.jar,它提供了标记库的实现类。复制到WEB-INF目录下的lib子目录下。
通过<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>引入到JSP
a) JSTL通用标记
i. 不使用JSP脚本执行Java程序成为可能
<c:out value="${number}" />
b) 支持变量
<c:set var="num" value="${4*4}" />
<c:set var="num">
${8*2}
</c:set>
<c:set var="num">
<c:out value="${8+8}" />
</c:set>
设置对象属性
<c:set target="customer1" property="zipcode">
55501
</c:set>
或者
<c:set target="customer1" property="zipcode" value="55501">
c) JSTL流程控制
i. JSTL条件处理
<c:if test="${x == '9'}">
${x}
</c:if>
<c:choose>
<c:when test="${color == 'white'}">
Light!
</c:when>
<c:when test="${color == 'black'}">
Dark!
</c:when>
<c:otherwise>
Colors!
</c:otherwise>
</c:choose>
d) 循环
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html><body>
<c:forEach var="x" begin="0" end="30" step="3">
${x}
</c:forEach>
</body></html>
循环赋值
<c:forEach var="num" items="${numArray}">
<c:set var="num" value="100" />
</c:forEach>
四 EL示例
<%@page import="com.test.entity.Address"%>
<%@page import="com.test.entity.Product"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'el.jsp' starting page</title>
</head>
<body>
<%! int var = 100; %>
<% out.println(var); %>
<%=var %>
<%
request.setAttribute("name", "Wentasy");
session.setAttribute("var", var);
%>
EL: ${sessionScope.var}
${requestScope.name}
<%
Product product = new Product();
product.setName("小白");
product.setPrice(123.4f);
Address addr2 = new Address();
addr2.setName("成都");
product.setAddr(addr2);
request.setAttribute("product", product);
session.setAttribute("product", product);
//session.setAttribute("login", "aaa");
List<Product> lists = new ArrayList<Product>();
for(int i = 1; i <= 10; i++) {
Product p = new Product();
p.setId(i);
p.setName("p" + i);
p.setPrice(i);
lists.add(p);
Address addr = new Address();
addr.setName("addr" + i);
p.setAddr(addr);
}
session.setAttribute("lists", lists);
%>
<h4>EL(Expression Language) test</h4>
<ol>
<li>\${var}试图获得当前页面里的变量var的值,EL不支持直接取变量的写法:${var},<%=var%></li>
<li>\${requestScope.product}获得存放在request里的product:${requestScope.product}</li>
<li>\${sessionScope.product}获得存放在session里的product:${sessionScope.product}</li>
<!-- request里的 当有application、session和request都有,默认选择最小范围的 -->
<li>\${product.name}获得存放在里的product的name:${product.name}</li>
<li>\${sessionScope.product.name}获得存放在session里的product的name属性:${sessionScope.product.name}</li>
<li>\${sessionScope.product.addr.name}获得对应的商品产地:${sessionScope.product.addr.name}
<li>\${requestScope.product.addr.name}获得对应的商品产地:${requestScope.product.addr.name}
<li>\${param.name}获得从查询字符串里提交的参数name的值:${param.name}</li>
<li>\${paramValues}获得从查询字符串里提交的参数paramValues的值:${paramValues}</li>
<li>\${paramValues.name}获得从查询字符串里提交的参数name的值:${paramValues.name}</li>
<li>\${paramValues.name[0]}获得从查询字符串里提交的参数name的值:${paramValues.name[0]}</li>
<li>\${header.accept}获得请求头里的accept属性值 : ${header.accept}</li>
<li>\${sessionScope.login}获得存放在session里login的值: ${sessionScope.login}</li>
<li>\${1+1}: ${1+1}</li>
<li>\${1>2}: ${1>2}</li>
<li>\${1>2 || 2>1}: ${1>2 || 2>1}</li>
<li>\${requestScope.product.price * 2}: ${requestScope.product.price * 2}</li>
</ol>
<%
for(Product p : (List<Product>)session.getAttribute("lists")) {
out.println(p.getName());
}
%>
<h4>JSTL</h4>
<%
Object test = "你好";//Java源代码
//EL 表达式取值不考虑数据类型
%>
<!-- http://localhost:8088/web_0803_tag_el_jstl/el.jsp?age= -->
<!-- ${param.age > 18} 查询字符串或者表单提交的数据-->
<ul>
<li>c:set , <c:set var="test" value="你好"></c:set>${test}</li>
<li>c:set , <c:set var="age" value="19"></c:set>${age}</li>
<li>c:out , <c:out value="${test}"></c:out></li>
<li>c:out , <c:out value="${param.age}"></c:out></li>
<li>c:if , <c:if test="${param.age > 18 && param.age < 40}">
young!!!
</c:if>
<c:if test="${param.age < 16}">
NoYoung!!!
</c:if>
<c:if test=""></c:if>
</li>
<li>
<c:choose>
<c:when test="${param.age < 18}">
age < 18
</c:when>
<c:when test="${param.age > 18 && param.age < 40}">
when age > 18 and age < 40
</c:when>
<c:otherwise>
otherwise
</c:otherwise>
</c:choose>
</li>
<%
//Java源代码
for(int x = 1; x <= 10; ++x){
out.println(x);
}
%>
<li>
c:forEach
<c:forEach begin="1" end="10" step="1" var="x">
${x},
</c:forEach>
</li>
<li>
c:forEach
<c:forEach begin="1" end="10" step="1" var="x" varStatus="s">
<c:if test="${s.last}">
${x}
</c:if>
<c:if test="${!s.last}">
${x},
</c:if>
</c:forEach>
</li>
<li>
c:forEach
<c:forEach begin="1" end="10" step="1" var="x" varStatus="s">
${x}
<c:if test="${!s.last}">
,
</c:if>
</c:forEach>
</li>
</ul>
<!-- 默认提交到本页 -->
<form action="" method="post">
<input type="checkbox" name="hobby" value="Reading">阅读<br/>
<input type="checkbox" name="hobby" value="Sporting">运动<br/>
<input type="checkbox" name="hobby" value="Drinking">喝酒<br/>
<input type="checkbox" name="hobby" value="Music">音乐<br/>
<input type="submit" value="提交">
</form>
<p>
通过EL表达式获得的参数:${paramValues.hobby[0]} ${paramValues.hobby[1]} ${paramValues.hobby[2]} ${paramValues.hobby[3]}
</p>
<p>
通过EL表达式获得的参数:${header.Referer}
</p>
<%
request.setCharacterEncoding("UTF-8");
if(null != request.getParameterValues("hobby")){
String[] values = request.getParameterValues("hobby");
for(String str : values){
out.println(str);
}
}
%>
<br>
<a href="jstl.jsp">jstl.jsp</a>
</body>
</html>
五 JSTL示例
<%@page import="com.test.entity.Address"%>
<%@page import="com.test.entity.Product"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'jstl.jsp' starting page</title>
</head>
<%
Product product = new Product();
product.setName("小白");
product.setPrice(123.4f);
Address addr2 = new Address();
addr2.setName("成都");
product.setAddr(addr2);
request.setAttribute("product", product);
session.setAttribute("product", product);
session.setAttribute("login", "aaa");
List<Product> lists = new ArrayList<Product>();
for(int i = 1; i <= 10; i++) {
Product p = new Product();
p.setId(i);
p.setName("p" + i);
p.setPrice(i);
lists.add(p);
Address addr = new Address();
addr.setName("addr" + i);
p.setAddr(addr);
}
session.setAttribute("lists", lists);
%>
<body>
<h4>JSTL(JSP Standard Tag library)</h4>
<ol>
<li>c:set设置一个变量 <c:set var="v1" value="小小" scope="session"></c:set></li>
<li>c:out输出变量的值:<c:out value="${v2 }" default="没有"></c:out>${v1 }</li>
<li>c:remove删除一个变量<c:remove var="v1"></c:remove></li>
<li>c:out再次输出变量的值(因为已经被删除了,所以显示默认值):<c:out value="${v1}" default="没有"></c:out></li>
<li><hr/></li>
<li>c:if判断参数age的大小:
<c:if test="${param.age<16 }">too young!</c:if>
<c:if test="${param.age>15 && param.age<25 }">yeah!</c:if>
</li>
<li>因为在jstl里没有else标签,所以多分枝判断里要使用choose,when,otherwise :
<c:choose>
<c:when test="${param.age<18 }">
too young!
</c:when>
<c:when test="${param.age>=18 && param.age<50}">
yeah!
</c:when>
<c:otherwise>
未成年或年纪大了
</c:otherwise>
</c:choose>
</li>
<li><hr/></li>
<li>c:forEach循环 : <br/>
<%
for(int x = 0; x <=10; x++) {
}
%>
<c:forEach var="x" begin="0" end="10" step="1" varStatus="s" >
x=${x}
<c:if test="${s.last != true }">
|
</c:if>
</c:forEach>
</li>
<li>c:forEach循环遍历集合或数组 :
<%--
for(Product p:(List<Product>)session.getAttribute("products")) {
out.println(p.getName());
}
--%>
<!-- varStatus -->
<c:forEach var="p" items="${sessionScope.lists}" varStatus="s" >
${p.name}
</c:forEach>
<br/>
<c:forEach var="p" items="${sessionScope.lists}" varStatus="s" >
${p.name},last:${s.last} first:${s.first} index:${s.index} <br/>
</c:forEach>
</li>
<%--<li>
<c:set var="numList" value="one,two,three,four,five"/>
forTockens标记的输出:
<c:forTokens var="num" items="${numList }" delims=",">
${num}
</c:forTokens>
</li>
--%></ol>
<h4>总结</h4>
<p>
1.javabean 特点:实现序列化接口,无参构造方法,get/set方法
<br/>2.EL(expression Language)${表达式 }取值
sessionScope / requestScope applicationScope.product.addr.name
3.JSTL & EL
Servlet(Controller) + Jsp(View) (MVC)
</p>
<br>
<a href="el.jsp">el.jsp</a>
</body>
</html>
@Wentasy 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。原创博文如需转载请注明出处,谢谢 :) [CSDN博客] |