1、EL表达式
作用:向浏览器输出域对象中的变量值或表达式计算的结果!!!(使用EL表达式替换掉jsp表达式)
语法: ${变量或表达式}
输出基本数据类型变量
从四个域获取,默认顺序是pageScoep->requestScope -> sessionScope -> applicationScope
${name}
指定域获取。域范围: pageScoep / requestScope / sessionScope / applicationScope
${pageScope.name}
输出对象的属性值:背后原理依靠属性的标准get方法,如student对象的getName方法
${student.name}
2、jsp标签
1) jsp标签的作用
jsp标签作用:替换jsp脚本。例如:流程判断(if for循环),跳转页面(转发,重定向)
2)jsp标签的分类
- 内置标签(动作标签): 不需要在jsp页面导入标签
- jstl标签: 需要在jsp页面中导入标签
- 自定义标签 : 开发者自行定义,需要在jsp页面导入标签
3)内置标签(动作标签)
转发标签: <jsp:forward />
参数标签: <jsp:pararm/>
包含标签: <jsp:include/>
原理: 包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起。(先翻译再合并)
jsp指令中有个包含的命令属于静态包含,功能是相同的
区别如下
- 格式区别
静态包含语法:<%@inclue file="被包含的页面"%>
动态包含语法:<jsp:include page="被包含的页面">
- 传参区别
静态包含不能向被包含页面传递参数,动态包含可以向被包含页面传递参数
param传递的参数放在request域中(相当于get提交的?name=eric
) - 原理区别
静态包含: 先合并再翻译
动态包含: 先翻译再合并
<jsp:include page="/param.jsp">
<jsp:param value="123" name="name"/>
</jsp:include>
转发标签
<%--jsp页面转发标签 --%>
<jsp:forward page="/param.jsp">
<jsp:param value="eric" name="name"/>
</jsp:forward>
4)、JSTL标签
全称为Java标准标签库,jstl背后原理也是调用Java代码实现,主要目的是便于书写,一共有四大类库:
- 核心标签库(c标签库):主要使用的标签库
- 国际化标签(fmt标签)
- EL函数标签库(fn函数库)
- xml标签库(x标签库)
- sql标签库(sql标签库)
jstl核心标签库的使用
- 导入jstl支持的jar包(标签背后隐藏的java代码)
注意:使用javaee5.0的项目自动导入jstl支持jar包 - 使用taglib指令导入标签库
<%@taglib uri="tld文件的uri名称" prefix="简写" %>
tld文件的uri名称,可以在jstl的jar包下META-INF下的c.tld文件中寻找uri. - 在jsp中使用标签
核心标签库的重点标签:
保存数据: <c:set></c:set>
获取数据: <c:out value=""></c:out>
单条件判断 <c:if test=""></c:if>
多条件判断 <c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
循环数据 <c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
重定向 <c:redirect></c:redirect>
示例代码
set标签
<%--set标签:默认保存数据到page域中,也可以在scope中指定域 --%>
<c:set var="name" value="rose" ></c:set>
<c:set var="a" value="123" scope="request" ></c:set>
out标签
<%
String msg = null;
pageContext.setAttribute("msg", msg);
%>
${msg }
<br/>
<%--out标签可以设置默认值,而且还有escapeXml属性,可以选择value值是否转义,默认为true转义原样输出,false不转义 --%>
<c:out value="${msg}" default="<h3>默认值</h3>" escapeXml="false"></c:out>
<br/>
if标签
<%--if标签 --%>
<c:if test="${empty msg }">
条件成立<br/>
</c:if>
choose标签
<%--choose标签 --%>
<c:set var="score" value="29"></c:set>
<c:choose>
<c:when test="${score>=60 }">
及格<br/>
</c:when>
<c:when test="${score<60 }">
不及格<br/>
</c:when>
</c:choose>
forEach标签
<%--forEach标签遍历
begin="": 从哪个元素开始
end="": 到那个元素结束
step="": 步长(每次加的数)
items="": 需要遍历的数据(集合)
var="": 每个元素的名称
varStatus="": 当前正在遍历元素的状态对象(count 属性:当前位置,从1开始)
--%>
<%
List<Student> list = new ArrayList<Student>();
list.add(new Student("张三",15));
list.add(new Student("李四",38));
pageContext.setAttribute("list", list);
%>
<c:forEach begin="0" end="2" step="1" items="${list }" var="stu" varStatus="varSta">
序号:${varSta.count} - 姓名:${stu.name } - 年龄:${stu.age }<br/>
</c:forEach>
<hr/>
<%--forEach遍历Map集合 --%>
<%
Map<String,Student> map = new HashMap<String,Student>();
map.put("001", new Student("李四",30));
map.put("002", new Student("张三",20));
pageContext.setAttribute("map", map);
%>
<c:forEach items="${map }" var="entry">
${entry.key } - 姓名:${entry.value.name } - 年龄:${entry.value.age }<br/>
</c:forEach>
<hr/>
forToken标签
<%--forToken标签:循环特殊字符,切割字符串 --%>
<%
String str = "java-php-net-屏幕";
pageContext.setAttribute("str", str);
%>
${5*5}<br/>
<c:forTokens items="${str }" delims="-" var="s">
${s }<br/>
</c:forTokens>
<hr/>
重定向
<%--重定向 --%>
<c:redirect url="http://www.baidu.com"></c:redirect>