引出
对于JSP中的程序控制和业务逻辑,通过嵌入java代码来实现,有种不伦不类的感觉,就像apsx中直接调用后台方法一样,在拨号项目中这样用过。
这样做,阅读性差,也不利于调试和维护。况且JSP只是视图,视图的任务就是显示响应,所以在JSP页面中应该尽可能少的、或者完全不出现Java代码。这样对于页面开发人员,也不用掌握过多的java知识。
而JSTL和EL的结合便很好的解决了这些问题。EL来显示数据,JSTL来实现网页逻辑判断和迭代显示等。这样基本可以取代java代码,而且更加简洁了,或者说封装得更好了,因为使用更少的代码完成了相同的工作,从而提高工作效率。
JSTL概要
JSTL的全称是JSPStandard Tag Library(JSP标准标签库),它是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的;提供五个标准标记库并支持EL。
JSTL标签的配置和使用:
配置:
将jstl.jar和standard.jar拷贝到WEB-INF/lib下
使用:
采用taglib指令引入标签库
<%@ tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>
<%@ tagliburi="http://java.sun.com/jsp/jstl/functions"prefix="fn"%>
<%@ tagliburi="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
Expression Language概要
- EL表达式不需要引入任何jar包,只要jsp/servlet容器实现了J2EE1.4/Servlet2.4、JSP2.0规范就可以
- 定义和设置一个变量,如果不设置范围,默认的是page
- 如果在获取变量值时,不使用作用域访问对象,系统就会按照page—>request—>session—>application的顺序来查找
- 在JSP页面中,经常会进行接收其他页面或者Servlet传递过来的参数;EL为什么提供参数访问对象来获取这些参数值,如:${param:name}
- JSP和EL有一个公共的对象:pageContext,EL可以通过pageContext来访问JSP中其他的隐式对象(request,session),如:${pageContext:request.requestURL}
例子
jsp
<%@taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%>
<html>
<head>
<title>Inserttitle here</title>
</head>
<body>
<h1>测试JSTL核心库</h1>
<li>测试c:set,c:remove</li><br>
<c:setvalue="root" var="userid"/>
userid:${userid}<br>
<c:removevar="userid"/>
userid:${userid}<br>
<p>
<li>条件控制标签:c:if</li><br>
<c:iftest="${v1 lt v2}">
v1小于v2<br>
</c:if>
<p>
<li>条件控制标签:c:choose,c:when,c:otherwise</li><br>
<c:choose>
<c:whentest="${v1 gt v2}">
v1大于v2<br>
</c:when>
<c:otherwise>
v1小于v2<br>
</c:otherwise>
</c:choose>
<c:choose>
<c:whentest="${empty userList}">
没有符合条件的数据<br>
</c:when>
<c:otherwise>
存在用户数据<br>
</c:otherwise>
</c:choose>
<p>
<li>演示循环控制标签:forEach</li><br>
<h3>采用forEach标签</h3>
<tableborder="1">
<tr>
<td>用户名称</td>
<td>年龄</td>
<td>所属组</td>
</tr>
<c:choose>
<c:whentest="${empty users}">
<tr>
<tdcolspan="3">没有符合条件的数据</td>
</tr>
</c:when>
<c:otherwise>
<c:forEachitems="${users}" var="user">
<tr>
<td>${user.username}</td>
<td>${user.age}</td>
<td>${user.group.name}</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
</body>
Servlet
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
//条件控制标签
request.setAttribute("v1",10);
request.setAttribute("v2",20);
request.setAttribute("userList",new ArrayList());
//结构
Groupgroup = new Group();
group.setName("动力节点603班");
Listusers = new ArrayList();
for(int i=0; i<10; i++) {
Useruser = new User();
user.setUsername("张三_"+ i);
user.setAge(23+ i);
user.setGroup(group);
users.add(user);
}
request.setAttribute("users",users);
request.getRequestDispatcher("/jstl_core.jsp").forward(request,response);
}
小结
JSTL也好,EL表达式也罢,实质都是后台的java代码,只是为了“名正言顺”的体现在jsp页面,以标签的形式展现。这倒和aspx控件类似,虽然是个类,却在页面使用标签表示。