EL+JSTL优化JSP代码消除JAVA代码混编

一、EL简述

EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。

脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。

它的形式如: < %=request.getParameter(“username”)% >    等价于    ${ param.username }可以非常方便的嵌入到html代码中

注意:

<%@ page isELIgnored="true" %> jsp文件头中,用该命令表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

1、语法结构
     ${expression}


2、[ ]与.运算符
     EL 提供“.“和“[ ]“两种运算符来存取数据。
     当要存取的属性名称中包含一些特殊字符,如.或?或- ,等并非字母或数字的符号时,就一定要使用“[ ]“。

     例如: ${user.My-Name}应当改为${user["My-Name"] } ,因为属性名中有"-"

     如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。

     例如:${sessionScope.user[data]}中data 是一个变量


3、变量
     EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
     因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
     假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。

     属性作用域范围,在EL中从上往下取。如果在page没取到${username}值,就会再找request中的值,最后都没取到就返回null
        1.Page              PageScope
        2.Request          RequestScope
        3.Session          SessionScope
        4.Application      ApplicationScope

      对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:

术语定义

pageScope

将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。

requestScope

将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。

sessionScope

将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:


$sessionScope.name} 

applicationScope

将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。

4、操作符

JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:

术语定义

算术型

+、-(二元)、*、/、div、%、mod、-(一元)

逻辑型

and、&&、or、||、!、not

关系型

==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。

空操作符是前缀操作,可用于确定值是否为空。

条件型A ?B :C。根据 A 赋值的结果来赋值 B 或 C。

5、表达示中的关键字

文字文字的值

Boolean

true 和 false

Integer

与 Java 类似。可以包含任何正数或负数,例如 24、-45、567

Floating Point

与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567

String

任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。必须注意,如果在字符串两端使用双引号,则单引号不需要转义。

Nullnull

6、隐式对象

JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:

pageContext

JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。

      此外,还提供几个隐式对象,允许对以下对象进行简易访问:

术语定义

param

将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。

paramValues

将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。

header

将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。

headerValues

将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。

cookie将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。
initParam将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。

7、代码示例


//先封装一个用户对象
package com.openbox.jspservlet;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class UserBean {
  
	private int uid;
    private String username;
    private String password;
}

 

//创建一个servlet对象,用于处理数据,然后通过forward方法跳转到jsp页面显示出来

package com.openbox.jspservlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@SuppressWarnings("all")
@WebServlet("/el")
public class ELjsp extends HttpServlet{

	private static UserBean userBean;

	@Override
	public void init() throws ServletException {
		super.init();

		//初始化一个用户对象
		userBean = new UserBean();
		userBean.setUsername("王宝强");
		userBean.setPassword("1122");
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		//forward方法传一个userBean对象到jsp页面中
		req.setAttribute("userBean", userBean);
		req.getRequestDispatcher("/jsp/el.jsp").forward(req, resp);
		
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>接收传过来的userBean对象:取对象中的属性可以用方法:${userBean.getUsername()},也可以用等同的在UserBean对象中定义的字段名</h3>

<form>
用户名:<input type="text" name="username" value="${userBean.username}">
<br>
密码:<input type="text" name="password" value="${userBean.password}">
</form>
</body>
</html>

EL表达式很好用,JSP默认就支持,它能保证HTML代码不混乱,但是没有语句、函数的支持。所以还要通过另外一个JSTL标签库来支持,在JSP中通过<%@ taglib %>来引入。

二、JSTL标签库

1.JSTL简介

JSTL全名为JavaServer Pages Standard Tag Library ,JSTL是由JCP(Java Community Process)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签函数库。

Web程序员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序的阅读性、维护性和方便性。

2.JSTL的引入

最简单的方式,是在tomcat中找到这两个包,引包就可以使用。

在以前的版本中tomcat一共有两个jar包:  (1)standard.jar ,(2) jstl.jar  复制过来,如下一样操作。

在TOMCAT 8.0版本中,在tomcat目录中找到webapps\examples\WEB-INF\lib 下有两个包:

taglibs-standard-impl-1.2.5.jar 和taglibs-standard-spec-1.2.5.jar  直接复制到你项目的lib中,添加到build path中就可以引用了。

然后,在jsp文件中用<%@ tablib %>引用

<!-- 引入jstl标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core_1_1" prefix="c" %>    

 

3.核心库使用

标签库中共有5个库:

标签库                  URI                                        前缀           使用模式
-------------------------------------------------------------------------------------------------
核心标签库              http://java.sun.com/jsp/jstl/core_1_1      c              <c:tagname…>
国际化标签(I18N)        http://java.sun.com/jsp/jstl/fmt           fmt            <fmt:tagname…>
SQL标签库               http://java.sun.com/jsp/jstl/sql           sql            <sql:tagname…>
XML标签库               http://java.sun.com/jsp/jstl/xml           x              <x:tagname…>
函数标签库              http://java.sun.com/jsp/jstl/functions     fn             <fn:tagname…>
 

一般只使用核心标签库和格式化标签库。

JSTL 核心标签库(C标签)标签共有13个,功能上分为4类:
1.表达式控制标签:out、set、remove、catch
2.流程控制标签:if、choose、when、otherwise
3.循环标签:forEach、forTokens
4.URL操作标签:import、url、redirect

3.1 c:forEach> 标签

为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。

 <c:forEach> 标签的 属性说明

<c:forEach> 标签的 属性 : varStatus属性: 它的提供另外四个属性:index,count,fist和last,它们个自的意义如下:

  1. 属性                   类型                                  意义   
  2. index                  number                    现在指到成员的索引   
  3. count                  number                    总共指到成员的总和   
  4. first                  boolean                   现在指到成员是否为第一个   
  5. last                   boolean                   现在指到成员是否为最后一个   

3.2代码示例

//java servlet代码

package com.openbox.jspservlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/jstl")
public class JSTLjsp extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		List<String> list=new ArrayList<>();
		list.add("王宝强");
		list.add("马上容");
		list.add("宋喆");
		list.add("潘金莲");
		
		for (String string : list) {
			System.out.println(string);		
		}
		//设置要共享的数据
		req.setAttribute("list",list);
		//forward跳转
		req.getRequestDispatcher("/jsp/jstl.jsp").forward(req, resp);
	}
   
}
//jsp代码,使用EL+JSTL 取值
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!-- 引入jstl标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core_1_1" prefix="c" %>    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>使用JSTL标签,循环取出list对象中的数据</h3>
<c:forEach items="${list}" var="li" >
名称:${li}
<c:if test="${li eq '宋喆'}" >-----${li}是小三 </c:if><br>
</c:forEach>


<h3>数组循环</h3>
<c:forEach var="num" begin="0" end="10" step="1">
${num}
</c:forEach>
<br>
这是的el \${} 能取到num的值是,因为内部做了pageCentext.setAttribute("num",num);这项工作,
所以el能取到值


</body>
</html>

3.3 <c:set> 标签

主要用来将变量储存至JSP范围中或是JavaBean的属性中。
<c:set> 标签的语法 说明 :

语法1:将value的值储存至范围为scope的 varName 变量之中
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>  

语法2:将本体内容的数据储存至范围为scope的 varName 变量之中
<c:set var="varName" [scope="{ page|request|session|application }"]>  
… 本体内容   
</c:set>  

语法3:将 value的值储存至 target 对象的属性中
<c:set value="value" target="target" property="propertyName" /> 

语法4:将本体内容的数据储存至target 对象的属性中
<c:set target="target" property="propertyName">
… 本体内容
</c:set> 

<c:set> 标签的 属性说明 :

3.4 <c:remove> 标签 
主要用来移除变量。

<c:remove> 标签的语法 说明 :
<c:remove var="varName" [scope="{ age|request|session|application }"] /> 

3.5 <c:if> 标签 
用途就和我们一般在程序中用的if一样。

<c:if> 标签的语法 说明 :
语法1:没有本体内容(body) 
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/> 

语法2:有本体内容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
本体内容
</c:if>
 
<c:if test="${item['domain']!=null}">  
内容   
</c:if>  
  
<c:if test="${!empty permissionMap}">    
内容   
</c:if>  

3.6  <c:choose>标签 

<c:choose when otherwise> 标签的语法 说明 :
<c:set var="score">85</c:set>  

<c:choose>  
    <c:when test="${score>=90}"> 你的成绩为优秀!</c:when>  
    <c:when test="${score>=70&&score<90}">您的成绩为良好! </c:when>  
    <c:when test="${score>60&&score<70}"> 您的成绩为及格 </c:when>  
    <c:otherwise>  对不起,您没有通过考试!</c:otherwise>  
</c:choose>  

4.格式化标签库

JSTL格式化标签又称为I18N标签库,主要用来编写国际化的WEB应用,使用此功能可以对一个特定的语言请求做出合适的处理。

例如:中国内地用户将显示简体中文,台湾地区则显示繁体中文,使用I18N格式化标签库还可以格式化数字和日期,例如同一数字或日趋,在不同国家可能有不同的格式,使用I18N格式标签库可以将数字和日期格式为当地的格式。

在JSP页面中要使用到格式化标签,需要引入下面的语句:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"% > 只介绍日期格式化标签:<fmt:formatDate />

4.1:<fmt:formatDate />

     value 用来格式化的时间或日期
     type 指定格式化的是日期还是时间,或者两者都是取值范围:date,time,both
     pattern 自定义格式化样式
     dateStyle 日期的格式化样式
     timeStyle 时间的格式化样式
     timeZone 指定使用的时区
     var 存储格式化后的结果
     scope 指定存储的范围

<!--自定义日期时间显示格式--> 
<fmt:setLocale value="zh_cn" />   
<fmt:formatDate value="<%=new Date()%>" pattern="yyyy/MM/dd hh:mm:ss" /><br>   
<fmt:formatDate value="<%=new Date()%>" pattern="yyyy-MM-dd HH:mm:ss" /><br>   
<fmt:formatDate value="<%=new Date()%>" pattern="yyyy年MM月dd日 hh小时mm分钟ss秒"/><br>   
<fmt:formatDate value="<%=new Date()%>" pattern="yy/MM/dd hh:mm:ss" /><br>  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值