JSP第三章知识点总结——JSTL EL
一.使用JSP EL
二.EL运算符
三.标准标记库JSTL
四 EL示例
五 JSTL示例
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表达式中使用隐式变量
a) EL运算符可以分为四类
i. 属性和集合访问运算符
ii. 算术运算符
iii. 关系运算符
iv. 逻辑运算符
b) 访问属性和集合的EL运算符:
访问属性和集合的EL运算符:
a.b:返回a的属性b的值。
a[b]:返回a的键或索引为b的值。
需要两个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>
<%@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>
<%@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博客] |