【EL与JSTL表达式】学习JSP之后,这是你不得不知道的技术

简介: 之前我们已经完成了对JSP的学习,但是还有一些其他的东西我们必须得知道,今天我们来学习EL与JSTL表达式。它们将简化JSP的书写并且使得JSP更加强大。但是如果你对JSP一无所知的话建议你先去看一下之前入门JSP的文章。

前言


之前我们已经完成了对JSP的学习,但是还有一些其他的东西我们必须得知道,今天我们来学习EL与JSTL表达式。它们将简化JSP的书写并且使得JSP更加强大。但是如果你对JSP一无所知的话建议你先去看一下之前入门JSP的博客。


传送门:【JSP入门】只知道HTML却不知道JSP?

传送门: 【JSP进阶】JSP九大内置对象,这你也不知道?


接下来我们正式开始学习EL与JSTL表达式!


EL表达式

初识EL

EL(Expression Language) 是为了使JSP写起来更加简单。它提供了在 JSP中简化表达式的方法,让JSP的代码更加简化。


EL表达式介绍:


(1)Expression Language表达式语言 。

(2)是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)。

(3)在JSP2.0开始引入概念。


EL表达式语法格式:


${表达式}


示例:在页面上输出grade


${grade}


EL的作用域对象

之前在学习JSP时候就学过,JSP有四大作用域同样的我们EL表达式也有四大作用域对象,它们与JSP中的四大作用域是相对应的。


只不过EL表达式的作用域是在对应的作用域里面查找对应的key(属性)。


(1)pageScope:从当前页面取值。

(2)requestScope:从当前请求中获取属性值。

(3)sessionScope:从当前会话中获取属性值。

(4)applicationScope:从当前应用获取全局属性值。


示例:在请求链中查找grade


${requestScope.grade}


如果这里不写作用域对象也是可以的,这时候EL会按照作用域从小到大一次尝试获取该属性。


EL输出

语法格式:


${[作用域.]属性名[.子属性]}


其中[]中的可有可无。


输出特点:


(1)EL表达式支持将运算结果进行输出。

(2)EL支持绝大多数对象输出,本质是执行toString()方法。


EL输出参数值

有时候我们在需要接受页面中输入的一些属性值然后进行输出,那么我们使用JSP如何进行实现呢?


这时候我们往往就需要借用Servlet了,在Servlet中设置变量来接受参数然后设置为新属性传到JSP中,在进行输出。这样是完全可行的但是太过于繁琐。其实我们使用EL表达式可以很轻松的完成。


在EL中我们可以使用内置对象param来参数的输出。


使用语法:


${param.参数名}


练习巩固

我们先设置一个Servlet用来设置数据,然后使用请求转发到JSP页面。

//设置一个学生类
public class Student {
  private String name;
  private String mobile;
  public String getName() {
  return name;
  }
  public void setName(String name) {
  this.name = name;
  }
  public String getMobile() {
  return mobile;
  }
  public void setMobile(String mobile) {
  this.mobile = mobile;
  }
  @Override
  public String toString() {
  return name + ":" + mobile;
  }
}
//写Servlet,进行数据初始化
@WebServlet("/student")//映射地址
public class StudentServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //从浏览器接收参数teacher
  //String teacher = request.getParameter("teacher");
  Student stu = new Student();
  stu.setName("白白");
  stu.setMobile(null);
  String grade = "A";
  //默认作用域从小到大进行输出,所以输出为B
  request.setAttribute("grade", "B");
  request.getServletContext().setAttribute("grade", "C");
  //创建Session范围属性
  HttpSession session = request.getSession();
  session.setAttribute("student", stu);
  session.setAttribute("grade", grade);
  //创建request范围属性
  //request.setAttribute("student", stu);
  //request.setAttribute("grade", grade);
  //请求转发到JSP页面
  request.getRequestDispatcher("/el_info.jsp").forward(request, response);
  }
}



先不使用EL表达式进行输出演示:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" import = "com.imooc.el.Student" %>
Insert title here
  <%
  Student stu = (Student)request.getAttribute("student");
  String grade = (String)request.getAttribute("grade");
  out.println("
姓名:" + stu.getName() + "
");
  out.println("
手机:" + stu.getMobile() + "
");
  out.println("
教师评级:" + grade + "
");
  %>
可见书写起来十分繁琐。
使用EL表达式之后:
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" %>
Insert title here
姓名:${student.name} 
手机:${student.mobile} 
评级:${grade}
讲师:${param.teacher}
概要:${student}



输出:

image.png

总结:


(1)EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分

(2)EL只能从四大域属性空间中获取数据(pageContext、request、session、application)

(3)EL不会抛出空指针异常,只会不显示

(4)EL不会抛出数组越界异常,只会不显示


JSTL标签库

初识JSTL

JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个JSP标签集合,它封装了JSP应用的通用核心功能。


JSTL标签库介绍:


(1)JSTL(JSP Standard Tag Library),JSP标准标签库。

(2)JSTL用于简化JSP开发,提高代码的可读性与可维护性。

(3)JSTL由SUN(Oracle)定义规范,由ApacheTomcat团队实现规范。


JSTL的下载与安装

与EL表达式不同的是,我们如果想要使用JSTL表达式就需要先去官网下载它的jar包配置到对应的Web环境中我们才能进行使用。


在下载好之后,我们就需要对JSTL进行安装了(将对应的jar配置到Web环境中去)。


JSTL有两种安装方式:

image.png

(1)将jar文件复制到对应的Web工程的/WEB-INF/lib目录中去。


这种安装方式就是你安装到哪个Web应用工程了我们就只能在这个Web应用工程中使用,其他的并不行。

(2)将jar文件复制到Tomcat的安装目录的lib目录。

image.png

这样安装的话,就是与这个Tomcat绑定的Java ee中所有的Web应用工程都能使用JSTL了。


JSTL的标签库种类

JSTL按功能划分可分为五类标签库:


标签库 缩写

核心标签库 core

格式化输出标签库 fmt

SQL操作标签库 sql

XML操作标签库 xml

函数标签库 functions

我们这里只介绍比较重要的核心标签库与格式化输出标签库。


核心标签库

核心标签库:缩写为Core,它包含了实现Web应用中通用操作的标签。例如:用于输出文本内容的标签、用于条件判断的标签、用于迭代循环的标签。


引用JSTL核心库:

image.png微信图片_20220522102846.png

(1)核心标签库(Core)是JSTL最重要的标签库,提供了JSTL的基础功能。

(2)使用这个标签库时候,要在对应JSP文件第二行处加上:<%@ tagliburi =

(3)JSTL核心标签库在taglibs-standard-impl.jar中,由META-INF/c.tld定义。



判断标签

判断标签就类似于Java中的if...else之类的。


在JSTL中JSTL核心库提供了两组判断标签:


(1)单分支判断,格式:

(2)多分分支判断,格式组成:、、


接下来演示一下它们的使用:


首先我们写一个Servlet来提供原始数据,然后使用请求转发到达JSP页面。

@WebServlet("/jstl")
public class JstlServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  request.setAttribute("grade", "B");
  request.setAttribute("score", 88);
  request.getRequestDispatcher("/core.jsp").forward(request, response);
  }
}



接下来我们来写一个JSP,在JSP里面要对我们之前写的属性grade与score进行判断,进而展现出不一样的页面。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
Insert title here${score}
恭喜,你已经通过测试
对不起,下次继续努力
${grade }
你很优秀
不错呦
水平一般,需要提高 
不要灰心,下次努力
一切随缘




输出:

image.png

此处注意看代码理解。


遍历集合

遍历一个集合中的每一个对象使用标签:


直接进行演示帮助理解,这里我们创建一个List,然后对其中数据进行遍历打印。


仍然先使用Servlet来建立原始数据,然后使用请求转发到达JSP页面。

@WebServlet("/jstl")
public class JstlServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  List list = new ArrayList();
  list.add(new Company("CSDN", "www.csdn.com"));
  list.add(new Company("腾讯", "www.tenxun.com"));
  list.add(new Company("百度", "www.baidu.com"));
  request.setAttribute("companies", list);
request.getRequestDispatcher("/core.jsp").forward(request, response);
  }
}


在JSP中我们需要对list属性进行获取然后,进行遍历打印。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
Insert title here
    ${idx.index+1}.${c.cname}-${c.url}



输出效果:

image.png

其实这里的遍历就相当于Java中的:

List companies = (List)request.getAttribute("companies");
for(Companies c : companies) {
  out.print("...");
}


其中它们分别表示:items:数据源, varStatus:迭代变量。


格式化标签库

格式化标签库:缩写为:fmt,是对输出数据进行格式化输出的一个标准库。


使用fmt格式化标签库:

image.png

使用格式化标签库需要在第二行加上:<%@ taglib uri = "http://java.sun.com/jsp/jstl/fmt" prefix = "fmt" %>



格式化日期标签

格式化日期标签格式为:


我们直接使用JSP对这个标签的使用进行演示。在Servlet中建立原始数据太过于繁琐,我们直接在JSP页面中进行创建与格式化。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/fmt" prefix = "fmt" %>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
Insert title here
  <%
    //Java代码块,进行初始化数据
  request.setAttribute("now", new java.util.Date());//获取当前系统时间
  %>
${now}


输出:

image.png

大家也许注意到了pattern = "yyyy年MM月dd日HH时mm分ss秒SSS毫秒",这里就是我们要求输出的数据格式具体意义如下:


输出时间格式 表达含义

yyyy 四位年

MM 两位月

dd 两位日

HH 24小时制

hh 12小时制

mm 分钟

ss 秒数

SSS 毫秒

格式化数字标签

格式化数字标签格式为:


继续使用JSP来对这个标签的使用进行演示。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/fmt" prefix = "fmt" %>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
Insert title here
  <%
  request.setAttribute("amt", 1987654.326);
  request.setAttribute("html", "index");
  request.setAttribute("nothing", null);
  %>${amt}
    ¥元
null默认值:${nothing}
    null默认值:
${html }


 

输出:

image.png


结语

到此位置我们EL表达式与JSTL标签库的学习也已经完成了,这些都是操作性的知识想要彻底掌握还得自己动手去练习巩固。




相关文章
|
22天前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
15 3
|
3月前
|
存储 设计模式 搜索推荐
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
23 1
|
3月前
|
存储 Java
JSP 教程 之 JSP 表达式语言 8
**JSP EL简化了JavaBean数据访问,支持算术和逻辑表达式,允许使用数字、字符串及布尔值。示例展示如何获取HTTP头信息:`${header[&quot;user-agent&quot;]}`显示&quot;user-agent&quot;头信息。`header`单值,`headerValues`为数组。**
20 0
|
3月前
|
存储 Java
JSP 教程 之 JSP 表达式语言 7
**JSP EL简化了JavaBean数据访问,支持算术和逻辑表达式,允许使用数字、字符串及布尔值。示例展示如何获取请求参数:`${param.order}`或`${param[&quot;order&quot;]}`代表`order`参数,`${param[&quot;username&quot;]}`用于获取`username`。`param`对象返回单个字符串,`paramValues`返回字符串数组。**
22 0
|
3月前
|
存储 Java
JSP 教程 之 JSP 表达式语言 6
**JSP EL简化了JavaBean数据访问,支持算术和逻辑表达式,以及整数、浮点数等类型。隐含对象如pageScope、requestScope等代表不同作用域,便于访问请求参数、HTTP头信息和Cookie等。通过scope对象,如applicationScope,可直接在表达式中访问不同层次的变量,如`applicationScope.box`。**
21 0
|
3月前
|
存储 Java
JSP 教程 之 JSP 表达式语言 5
**JSP EL简化了JavaBean数据访问,支持数学和逻辑表达式,以及类型如整数、浮点数、字符串和布尔值。它有9个隐含对象,包括不同作用域的对象、请求参数、HTTP头、初始化参数和Cookie等。例如,使用`pageContext.request.queryString`可获取请求的查询字符串。**
16 0
|
3月前
|
存储 Java
JSP 教程 之 JSP 表达式语言 4
**JSP EL简化了JavaBean数据访问,支持算术和逻辑表达式,包含整数、浮点数等类型。核心特性是隐含对象,如** `pageScope` **、** `requestScope` **到** `applicationScope` **,以及** `param` **、** `cookie` **和** `pageContext` **等,它们可在表达式中作为变量使用。实例演示有助于深入理解。
21 0
|
3月前
|
存储 Java
JSP 教程 之 JSP 表达式语言 3
**JSP表达式语言(EL)**简化了JavaBean数据访问,支持算术和逻辑表达式,允许使用整数、浮点数、字符串及布尔值。**EL函数**通过命名空间引用,如 `${ns:func(param1, param2)}`,例如`fn:length`用于计算字符串长度。要使用函数,需先在服务器安装相关标签库,并在JSP中用`&lt;taglib&gt;`导入。
16 0
|
3月前
|
存储 Java
JSP 教程 之 JSP 表达式语言 2
**JSP表达式语言(EL)简化了JavaBean数据访问,支持算术和逻辑运算,如加(+), 减(-), 乘(*), 除(/), 模(%), 等于(==), 不等于(!=), 以及逻辑操作符(and, or, not)。EL还允许使用点(.), 方括号([])来访问属性和数组,以及测试空值(empty)。**
15 0
|
3月前
|
存储 Java 编译器
JSP 教程 之 JSP 表达式语言 1
**JSP EL**简化了JavaBean数据访问,用于创建算术和逻辑表达式。它支持整数、浮点数、字符串及布尔值。`${expr}`是表达式语法,`.`和`{}`用于访问属性。例如,设置JavaBean属性值:`&lt;jsp:setProperty name=&quot;box&quot; property=&quot;perimeter&quot; value=&quot;${2*box.width+2*box.height}&quot; /&gt;`。
24 0