JSP页面优化:使用EL和JSTL减少Java代码,提升网页设计与维护效率
EL(表达式语言)和 JSTL(JSP 标准标记库)

JSP页面上可以使用Java代码来实现页面显示逻辑,但网页中混杂着HTML和Java代码,这给网页的设计和维护带来了困难。用户可以使用 EL 来访问和处理应用程序中的数据,也可以使用 JSTL 来替换网页中显示逻辑的 Java 代码,这样 JSP 页面可以最大限度地减少 Java 代码的使用,方便以后的维护。
表达式语言 (EL) 是 JSP2.0 中的新增内容。语法如下:${表达式}
EL 表达式与 JSP 表达式类似。 EL中的表达式会直接发送到浏览器进行显示。 page指令的isELIgnored属性指示是否支持EL表达式。当 isELIgnored 为 true 时,JSP 不能使用 EL 表达式。 isELIgnored 默认为 true。
EL 的语法使用起来很简单。 EL 使用“[]”和“.”操作员访问数据。 EL主要用于获取对象的属性,包括获取JavaBean的属性值、获取数组中的元素、获取集合对象的元素。 null值直接显示为空字符串而不是null,运行时不会出现空指针异常,因此使用EL访问对象的属性不需要判断该对象是否为空对象。
EL 表达式有 5 个算术运算符,即加法、减法、乘法、除法和余数。
关系运算符有6个,分别是等于、不等于、大于、大于等于、小于、小于等于。 3个逻辑运算符,逻辑与&&,逻辑或||,逻辑非!还有一个条件运算符,例如:${A?B:C}。如果A为真,则计算并返回B的结果。如果A为假,则计算并返回C的结果。还有一个空运算符${empty A},如果A不存在则返回true。
总共有 11 个 EL 隐式对象。我们只学习几个常用的,分别是pageScope、requestScope、sessionScope、applicationScope、param、paramValue。与范围相关的 EL 隐式对象包括 pageScope、requestScope、sessionScope 和 applica。 tionScope,可以分别获取JSP隐式对象的pageContext、request、session、application中的数据。如果EL中不使用隐式对象指定作用域,则会依次从页面、请求、会话、应用程序作用域中查找。如果找到就直接返回,如果没有找到则返回空字符串。
获取数据的格式如下:
${EL隐式对象.关键字对象.属性}
或者
${EL隐式对象.关键字对象}
与请求参数相关的对象包括param和paramValues。获取数据的格式如下:
${EL隐式对象.参数名称}
下面我们看一个小案例。编写一个控制器,在控制器类处理方法中使用request对象和Model对象存储数据,然后从处理方法转发到show.jsp页面,在show.jsp中显示request对象数据。
型号类别:
public class UserBean {
private String name ;
private int age ;
public UserBean(String name, int age){
this.name = name ;
this.age = age ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
控制器类:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.UserBean;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
@Controller
public class InputController {
@RequestMapping("/input")
public String input(HttpServletRequest request, Model model){
String [] name = {"章", "王", "李", "李"} ;
request.setAttribute("name", name);
String [] address = {"北京", "上海", "南京", "南昌"} ;
model.addAttribute("address", address) ;
ArrayList<UserBean> users = new ArrayList<>() ;
UserBean b1 = new UserBean("王", 23) ;
UserBean b2 = new UserBean("胡", 22) ;
UserBean b3 = new UserBean("刘", 21) ;
users.add(b1) ;
users.add(b2) ;
users.add(b3) ;
request.setAttribute("users", users);
return "show" ;
}
}
jsp显示页面:
<%--
Created by IntelliJ IDEA.
User: nuist__NJUPT
Date: 2021/10/1
Time: 17:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
head>
<body>
从Controller发过来的request内置对象的数据如下:<br>
${requestScope.name[0]}<br>
${requestScope.name[1]}<br>
${requestScope.name[2]}<br>
${requestScope.name[3]}<br>
${requestScope.users[0].name} ${requestScope.users[0].age} <br>
${requestScope.users[1].name} ${requestScope.users[1].age} <br>
${requestScope.users[2].name} ${requestScope.users[2].age} <br>
从Controller转发过来的Model对象的数据如下:<br>
${address[0]}<br>
${address[1]}<br>
${address[2]}<br>
${address[3]}<br>
body>
html>
JSTL标签库由5个不同的标签库组成,包括Core、I18N、XML、SQL和Functions。我们只研究JSLT的Core和Functions标签库中的几个常用标签。
JSTL 已经是 JavaEE5 的一个组成部分。如果您使用支持JavaEE5及以上版本的集成开发环境,则不再需要配置JSTL。
配置JSTL的步骤如下:
1-导入WEB-INF/lib目录下JSTL的标准实现。
2-使用taglib标签定义前缀和uri引用
核心标签库通用标签库
1-label用于显示数据内容,格式如下:
默认值
其中,value可以是EL表达式,也可以是字符串。默认是可选的。当value不存在时,输出defaultValue。
2- 标签可用于设置范围变量和 JavaBean 属性。
3-标签,如果你想删除某个变量,可以使用这个标签。
核心标签库过程控制标签
该标签实现了if语句的功能。具体语法格式如下:
主题内容
其中,条件表达式可以是EL表达式或JSP表达式。如果表达式为真,则将执行主要内容。否则,主要内容将不会被执行。
2-
相当于switch、case、default,和if else语句效果一样
具体语法格式如下:
主要内容1
主要内容2
表达式在正文中未正确执行
核心标签库迭代标签
1-标签可以实现程序中的for循环。语法格式如下:
循环体
items 属性可以是数组或 Collection 对象。循环每次读取对象中的一个元素并将其赋值给var属性指定的变量,然后在循环体中就可以使用var指定的变量来获取对象的元素。
例如Controller中有如下代码:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.UserBean;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
@Controller
public class ItemsController {
@RequestMapping("/save")
public String save(HttpServletRequest request, Model model) {
ArrayList<UserBean> users = new ArrayList<>();
UserBean b1 = new UserBean("张", 23);
UserBean b2 = new UserBean("刘", 22);
users.add(b1) ;
users.add(b2) ;
request.setAttribute("users", users);
return "result" ;
}
}
然后就可以使用语句遍历对应JSP页面中的数组元素了。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: nuist__NJUPT
Date: 2021/10/1
Time: 19:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
head>
<body>
<table>
<tr>
<th>姓名th>
<th>年龄th>
tr>
<c:forEach var = "user" items = "${requestScope.users}">
<tr>
<td>${user.name}td>
<td>${user.age}td>
tr>
c:forEach>
table>
body>
html>
在某些情况下,您需要指定标签的 begin、end、step 和 varStatus 属性。 begin 表示迭代的起始位置,默认为0。end 表示迭代的结束位置,默认为最后一个元素。 step 为迭代步长,默认为1。varStatus 表示迭代变量的状态,包括count 和index。第一个和最后一个
标签用于迭代由分隔符分隔的字符串的成员。
以下代码:
<c:forTokens items="王国栋1:王国栋2:王国栋3" delims=":" var = "name">
${name}<br>
c:forTokens>
将name用:分割并赋值给var,然后使用EL表达式依次提取name的值。
功能标签库
在JSP页面中调用JSTL中的函数时,需要使用EL表达式。调用的语法格式如下:
${fn: 函数名(参数1,参数2...)}
1-包含函数
该函数的作用是判断一个字符串中是否包含指定的字符串。如果是,则返回 true,否则返回 false。它的定义如下:
包含(字符串,子字符串)
调用该函数的示例代码如下:
${fn:contains(“我正在学习”, “是”)}
2-包含IgnoreCase函数
与 contains 类似,它不区分大小写。
3端带功能
该函数的作用是判断一个字符串是否以指定后缀结尾。
定义如下:
结束于(字符串,后缀)
该函数调用示例代码:
${fn:endsWith(“我正在学习”, “是”)}
4-indexOf函数
该函数返回指定字符串在某个字符串中第一次出现的索引。如果找不到,则返回-1。
5-连接函数
该函数的作用是将String数组中的所有元素组合成一个字符串,并用指定的分隔符分隔开。定义如下:
连接(数组,分隔符)
函数调用代码:
${fn:join(我的,“,”)}
6长度函数
该函数的作用是返回集合元素的个数或者字符串的字符个数。它的定义如下:
长度(输入)
函数调用代码示例:
${fn:length(“王国栋”)}
7-替换功能
该函数用 afterstring 替换字符串中所有出现的 beforestring 并返回替换结果。它的定义如下:
替换(字符串,前字符串,后字符串)
8分割功能
该函数的作用是使用指定的分隔符将一个字符串分割成一个字符串数组。其定义如下:
split(字符串, 分隔符)
该函数的调用示例如下:
<c:set var = "my" value = "${fn:split('I am studying', ' ')}"/>
<c:forEach var = "element" items = "${my}">
${element}<br>
c:forEach>
按照空格分割I正在学习并传递给my,使用forEach循环获取my中的值,并使用EL表达式将其取出。
9-启动带功能
该函数判断字符串是否以指定前缀开头,定义如下:
开始(字符串,前缀)
10-子串函数
该函数的作用是返回一个字符串的子串,其定义如下:
子字符串(字符串、开始、结束)
11-转小写函数
该函数的作用是将一个字符串转换为其小写版本。
12-toUpperCase 函数
该函数的作用是将一个字符串转换成它的大小版本
13-修剪功能
该函数的作用是去掉字符串首尾的空格
这次主要学习了EL表达式语言、JSTL核心标签库和JSTL函数标签库。 EL和JSTL的应用大大提高了编程效率,降低了难度。