1、EL(Expression Language):为了使jsp写起来更加简单,提供了在Jsp中简化表达式的方法
2、JSTL:(JSP Standard Tag Library)jstl标准标签库,由apache实现
3、JSTL一般要配合EL表达式一起使用,因为在JSTL在赋值时会大量的使用EL,可以说EL是JSTL的一种辅助。
4、在使用时:JSTL需要引入:jstl.jar和Standart.jar到WEB_INF/lib目录下,但是只使用EL表达式不需要引用任何jar包,只要JSP/SERVLET容器实现了J2EE1.4/Servlet2.4、Jsp2.0规范就可以。
在之前学习jsp的时候也说过是为了将html代码和java代码分离,但是大部分时候如果不进行限制,在jsp中调用java逻辑类是很难避免的,所以我们有了JSTL来实现表示层与业务逻辑的分离,我们可以通过JSTL实现:与servlet数据的交互,操作xml,格式化数据显示和样式显示,Request中读取数据,循环,自定义函数等等
1、基本语法:${}:例:hello:${hello}<br>
2、内置对象:pageScope,requestScope,sessionScope,applicationScope(按默认搜索顺序排列)
3、指定搜索:${requestScope.hello}
4、简单实例:
其实EL很简单
首先我们要写的是servlet:servlet的代码如下:
package com.tgb.jstl; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 测试EL表达式 * @author YoungJong * */ public class JstlElServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub //super.doGet(req, resp); //普通字符串 req.setAttribute("hello", "Hello World"); //结构 Group group=new Group(); group.setName("陈丽娜好样的"); User user=new User(); user.setUsername("杨政"); user.setAge(29); user.setGroup(group); req.setAttribute("user", user); //map Map map=new HashMap(); map.put("k1", "v1"); map.put("k2", "v2"); req.setAttribute("map", map); //数组 String[] strArray=new String[]{"a","b","c"}; req.setAttribute("str_array", strArray); //对象数组 User[] users=new User[10]; for(int i=0;i<users.length;i++){ users[i]=new User(); users[i].setUsername("张三_"+i); } req.setAttribute("users", users); //list List userList=new ArrayList(); for(int i=0;i<10;i++){ User userl=new User(); userl.setUsername("李四_"+i); userList.add(userl); } req.setAttribute("userList",userList); req.getRequestDispatcher("/jstl_el.jsp").forward(req, resp); } }
下面是在jsp中获取的方法:
<body> <h1>测试EL表达式</h1> <hr> <li>普通字符串</li><br> hello(jsp脚本):<%=request.getAttribute("hello") %><br> hello(el表达式,语法:$和{}):${hello} <br> <p> <li>结构</li><br> 姓名:${user.username}<br> 年龄:${user.age }<br> 组名:${user.group.name}<br> <p> <li>取得map</li><br> map.k1:${map.k1 }<br> map.k2:${map.k2 }<br> <p> <li>字符串数组</li><br> strArray[1]:${str_array[1] }<br> <p> <li>对象数组</li><br> users[5].username:${users[5].username }<br> <p> <li>List</li><br> userList[6]:${userList[6].username }<br> <p> <li>表达式对运算符的支持</li><br> 1+1=${1+1 }<br> 10/5=${10/5 }<br> 10 % 3=${10 % 3 }<br> 10 mod 3=${10 mod 3 }<br> </body>
效果截图:
虽然EL很简单,但是他的功能有限,例如:针对返回空值EL没有办法控制,循环输出数组元素,如果结合JSTL就不用再担心这些问题了。
常用的JSTL标签有很多例如:<c:out><c:if><c:choose><c:forEach>等等
这里就不一一介绍,下面介绍一个EL与JSTL的结合带来的便利:
简单实例:首先是Servlet的代码:
package com.tgb.jstl; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class JstlCoreServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //普通字符串 request.setAttribute("hello", "Hello World"); //HTML字符串 request.setAttribute("welcome", "<font color='red'>欢迎你来到这个世界!</font>"); //结构 Group group = new Group(); group.setName("提高班"); List users = new ArrayList(); for (int i=0; i<10; i++) { User user = new User(); user.setUsername("陈丽娜_" + i); user.setAge(18 + i); user.setGroup(group); users.add(user); } request.setAttribute("users", users); //map Map map = new HashMap(); map.put("k1", "v1"); map.put("k2", "v2"); request.setAttribute("map", map); request.getRequestDispatcher("/jstl_core.jsp").forward(request, response); } }
JSP页面的代码:
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <h1>测试JSTL核心库</h1> <hr> <li>采用c:out标签</li><br> hello(使用标签):<c:out value="${hello}"/><br> hello(使用EL表达式):${hello }<br> hello(使用缺省值):<c:out value="${hello123}" default="没有值"/><br> welcome(使用EL表达式):${welcome}<br> welcome(使用标签,escapeXml=true):<c:out value="${welcome}" escapeXml="true"/><br> welcome(使用标签,escapeXml=false):<c:out value="${welcome}" escapeXml="false"/><br> <h3>采用forEach标签</h3> <table border="1"> <tr> <td>用户名称</td> <td>年龄</td> <td>所属组</td> </tr> <c:choose> <c:when test="${empty users}"> <tr> <td colspan="3">没有符合条件的数据</td> </tr> </c:when> <c:otherwise> <c:forEach items="${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> <p> <li>演示循环控制标签:forEach,输出map</li><br> <c:forEach items="${map}" var="entry"> ${entry.key },${entry.value }<br> </c:forEach> <p> </body> </html>
其中要注意的是要引入:
<%@ tagliburi="http://java.sun.com/jsp/jstl/core" prefix="c"%>
页面显示截图:
使用JSTL与EL的结合分离了页面与逻辑,使得分层更加明确,代码更加清晰。