JAVA学习之JSTL与EL

一、基础

1EL(Expression Language):为了使jsp写起来更加简单,提供了在Jsp中简化表达式的方法

2JSTL:(JSP Standard Tag Library)jstl标准标签库,由apache实现

3JSTL一般要配合EL表达式一起使用,因为在JSTL在赋值时会大量的使用EL,可以说ELJSTL的一种辅助。

4、在使用时:JSTL需要引入:jstl.jarStandart.jarWEB_INF/lib目录下,但是只使用EL表达式不需要引用任何jar包,只要JSP/SERVLET容器实现了J2EE1.4/Servlet2.4Jsp2.0规范就可以。

二、为什么

在之前学习jsp的时候也说过是为了将html代码和java代码分离,但是大部分时候如果不进行限制,在jsp中调用java逻辑类是很难避免的,所以我们有了JSTL来实现表示层与业务逻辑的分离,我们可以通过JSTL实现:与servlet数据的交互,操作xml,格式化数据显示和样式显示,Request中读取数据,循环,自定义函数等等

三、EL表达式:

1、基本语法:${}:例:hello:${hello}<br>

2、内置对象:pageScope,requestScope,sessionScope,applicationScope(按默认搜索顺序排列)

3、指定搜索:${requestScope.hello}

4、简单实例:

     其实EL很简单

      首先我们要写的是servletservlet的代码如下:

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>

        效果截图:

JAVA学习之JSTL与EL_第1张图片

四、JSTL核心库:

虽然EL很简单,但是他的功能有限,例如:针对返回空值EL没有办法控制,循环输出数组元素,如果结合JSTL就不用再担心这些问题了。

常用的JSTL标签有很多例如:<c:out><c:if><c:choose><c:forEach>等等

这里就不一一介绍,下面介绍一个ELJSTL的结合带来的便利:

简单实例:首先是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"%>   

页面显示截图:


使用JSTLEL的结合分离了页面与逻辑,使得分层更加明确,代码更加清晰。

你可能感兴趣的:(JAVA学习之JSTL与EL)