JSP-07使用EL和JSTL简化JSP
时间:2022-10-11 18:30:01
JSP-07使用EL和JSTL简化JSP
文章目录
- JSP-07使用EL和JSTL简化JSP
-
- @[toc]
- 一、学习目标
- 二、EL表达式
-
- 2.1初识EL表达式
- 2.2EL表达式语法
- 2.3EL表达式使用算数运算符
- 2.4EL表达式使用关系运算符
- 2.5EL表达式使用逻辑运算符和Empty运算符
- 2.6EL表达式隐藏对象
-
- 2.6.1作用域访问对象
- 2.6.2参数访问对象
- 2.6.3JSP隐式对象
- 2.6.第四个访问对象
- 2.6.5初始参数访问对象
- 2.6.6使用EL表达式改造图书详细页面
- 三、JSTL
-
- 3.1什么是JSTL
- 3.2引入JSTL
- 3.2JSP中使用JSTL标准标签库
-
- 3.2.1通用标签库-out标签
- 3.2.2通用标签库-set标签
- 3.2.3通用标签库-remove标签
- 3.2.4条件标签库-if标签
- 3.2.5条件标签库-choose标签
- 3.2.6迭代标签库-forEach标签
- 四、JSTL使用自定义函数
- 总结
文章目录
- JSP-07使用EL和JSTL简化JSP
-
- @[toc]
- 一、学习目标
- 二、EL表达式
-
- 2.1初识EL表达式
- 2.2EL表达式语法
- 2.3EL表达式使用算数运算符
- 2.4EL表达式使用关系运算符
- 2.5EL表达式使用逻辑运算符和Empty运算符
- 2.6EL表达式隐藏对象
-
- 2.6.1作用域访问对象
- 2.6.2参数访问对象
- 2.6.3JSP隐式对象
- 2.6.第四个访问对象
- 2.6.5初始参数访问对象
- 2.6.6使用EL表达式改造图书详细页面
- 三、JSTL
-
- 3.1什么是JSTL
- 3.2引入JSTL
- 3.2JSP中使用JSTL标准标签库
-
- 3.2.1通用标签库-out标签
- 3.2.2通用标签库-set标签
- 3.2.3通用标签库-remove标签
- 3.2.4条件标签库-if标签
- 3.2.5条件标签库-choose标签
- 3.2.6迭代标签库-forEach标签
- 四、JSTL使用自定义函数
- 总结
一、学习目标
- 掌握EL使用表达式
- 掌握常用JSTL标签的使用
二、EL表达式
为什么要用?EL表达式?
在JSP中编写Java脚本的弊端
- 复杂的程序结构
- 可读性差
- 不易维护
书名:<%= book.getTitle() %>
图书类型:<%= book.category.getCategoryName() %>
出版社:<%= book.publisher.getPublisherName() %>
使用EL表达式可以大大简化JSP代码
<p>书名:${book.title}p> <p>图书类型:${book.category.name}p> <p>出版社:${book.publisher.name}p>
2.1初识EL表达式
什么是EL表达式
Expression Language(表达式语言)
EL的功能
1.替代JSP在页面中访问数据时的复杂编码 2.执行表达式
EL的特点
1.自动转换类型 2.使用简单
2.2EL表达式语法
前提:web.xml配置文件的头部必须是3.0或以上版本
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
语法:
${表达式}
通过变量名获取变量值
<% request.setAttribute("username","张三"); %>
用户名:${username}
用户名:${requestScope.username}
若省略作用域,将按照page → request → session → application
作用域的顺序依次查找,找到即返回,找不到返回null。
EL表达式对应JSP作用域的名称
属性范围 | EL表达式中的名称 | 属性范围 | EL表达式中的名称 |
---|---|---|---|
page | pageScope | session | sessionScope |
request | requestScope | application | applicationScope |
EL表达式中的对象元素和集合元素
通过操作符获取对象的属性值
点操作符
(推荐使用)
${user.name}
[ ]操作符
${user["name"]}
获取List集合中的值
${ listName[0] }
${ listName[1] }
获取Map集合中的值
${ map.keyName }
${ map["keyName"] }
使用EL表达式输出用户信息
使用EL表达式获取存储于Map中的用户信息示例:
<%
Map<String,String> map = new HashMap<String,String>();
map.put("name","张三");
map.put("hobby","打羽毛球");
request.setAttribute("user",map);
%>
<p>用户名:${user.name}p>
<p>用户爱好:${user["hobby"]}p>
运行效果
用户名:张三
用户爱好:打羽毛球
2.3EL表达式使用算数运算符
算术运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
+ | 加 | ${10+5} |
15 |
- | 减 | ${10-5} |
5 |
* | 乘 | ${10*5} |
50 |
/ 或 div | 除 | ${10/5}或${10 div 5} |
2 |
% 或 mod | 取模 | ${10%5}或${10 mod 5} |
0 |
注意事项:EL表达式中“+”运算符两侧的内容如果无法自动转化为数字类型,该表达式将会抛出异常
2.4EL表达式使用关系运算符
算数运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
== 或eq | 等于 | ${23==5}或${23 eq 5 ${"a"=="a"}或${"a" eq "a"} |
false true |
!= 或ne | 不等于 | ${23!=5}或${23 ne 5} |
true |
< 或lt | 小于 | ${23<5}或${23 lt 5} |
false |
> 或gt | 大于 | ${23>5}或${23 gt 5} |
true |
<= 或le | 小于等于 | ${23<=5}或${23 le 5} |
false |
>= 或ge | 大于等于 | ${23>=5}或${23 ge 5} |
true |
2.5EL表达式使用逻辑运算符和Empty运算符
算数运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
&& 或and | 逻辑与 | 如果A为true,B为false,则KaTeX parse error: Expected '}', got '&' at position 4: {A &̲& B}或{A and B} | false |
|| 或or | 逻辑或 | 如果A为true,B为false,则 A ∣ ∣ B 或 {A || B}或 A∣∣B或{A or B} | true |
! 或not | 逻辑非 | 如果A为true,则 ! A 或 {!A}或 !A或{not A} | false |
Empty运算符
Empty运算符是一个前缀操作符,用于检测一个变量是否为空 :
<% request.setAttribute("username","张明"); %>
${empty username} // 返回 false
${not empty username} // 返回 true
${! empty username} // 返回 true
2.6EL表达式的隐式对象
可以直接从不同作用域和请求中读取信息
2.6.1作用域访问对象
对象名称 | 说明 |
---|---|
pageScope | 与page作用域中的属性相关联的Map类 |
requestScope | 与request作用域中的属性相关联的Map类 |
sessionScope | 与session作用域中的属性相关联的Map类 |
applicationScope | 与application作用域中的属性相关联的Map类 |
如果指定作用域,EL表达式将在该作用域内查找变量值
如果不指定作用域,EL表达式将按page → request → session → application
的顺序依次查找变量值
2.6.2参数访问对象
对象名称 | 说明 |
---|---|
param | 按照参数名称访问单一请求值的Map对象 |
paramValues | 按照参数名称访问数组请求值的Map对象 |
2.6.3JSP隐式对象
对象名称 | 说明 |
---|---|
pageContext | 提供对页面信息和JSP内置对象的访问 |
2.6.4首部访问对象
对象名称 | 说明 |
---|---|
header | 按名称存储请求头主要值的Map类 |
headerValues | 将请求头的所有值作为String数组存储的Map类,返回指定请求头的所有值组成的字符串数组 |
cookie | 按名称存储请求附带的cookie的Map类 |
2.6.5初始化参数访问对象
对象名称 | 说明 |
---|---|
initParam | 按名称存储 Web 应用程序上下文初始化参数的Map类 |
2.6.6使用EL表达式改造图书详情页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<meta name="Robots" content="index,follow" />
<title>"第三波书店"-网上书店title>
<link href="css/global.css" rel="stylesheet" type="text/css" />
<link href="css/channel.css" rel="stylesheet" type="text/css" />
<link href="css/answer.css" rel="stylesheet" type="text/css" />
head>
<body>
<%@ include file="common/header.jsp"%>
<div id="container">
<%@ include file="common/leftMenu.jsp"%>
<div class="book_view">
<c:if test="${empty requestScope.book }">
<h1 class="b_title">暂无该书籍的详情信息!h1>
c:if>
<c:if test="${not empty requestScope.book}">
<h1 class="b_title">${requestScope.book.title}h1>
<div class="b_exa">
<span class="book_group">丛书名:${requestScope.book.title}span>
<span class="book_status">点击量:${requestScope.book.clicks} <span><a href="#">放入书架a>span> <a href="#">什么是书架?a>span>
div>
<dl class="put_book">
<dt>
<img src="images/BookCovers/${requestScope.book.isbn}.jpg" width="200" height="275" alt="${requestScope.book.title}" />
<div class="chakan"><img src="images/zoom.gif" /> <a class="gray878787a" href="#" name="bigpicture">点击查看大图a>div>
dt>
<dd>
<div id="book_editor">
作 者: ${requestScope.book.author} 著<br />
出 版 社: ${requestScope.book.publisher.name}
div>
<ul id="book_attribute">
<li>出版时间:${requestScope.book.publishDate}li>
<li>ISBN: ${requestScope.book.isbn}li>
<li>库存:(${requestScope.book.sumStock})本li>
ul>
<div id="book_categroy">
所属分类: <a href="javascript:void(0)" target="_blank" class="blue12a">图书a> >>
<a href="javascript:void(0)" target="_blank" class="blue12a"> ${requestScope.book.categorie.name}a>
<div id="book_price">
<span class="gray87">
定价:<span class="del">¥${requestScope.book.unitPrice}span>span>
<span class="red">
当当价:¥<b>
<fmt:formatNumber type="number" value="${requestScope.book.unitPrice * 0.6 }" pattern="0.00" maxFractionDigits="2"/>b>span>
折扣:<span class="redc30">6折span>
节省:¥<fmt:formatNumber type="number" value="${requestScope.book.unitPrice-(requestScope.book.unitPrice * 0.6) }" pattern="0.00" maxFractionDigits="2"/>
div>
<div id="book_point">
<span >送积分:<span id="pointsTag" >${requestScope.book.unitPrice}span>span> <a target="_blank" href="javascript:">积分说明a> <br />
<a href="javascript:void(0)" id="btn_addCart" cart-id="${requestScope.book.id}"><img src="images/btn_goumai.gif" onmouseover="this.src='images/btn_goumai_click.gif'" onmouseout="this.src='images/btn_goumai.gif'" />
a>
<a href="javascript:history.go(-1)">返回a>
div>
<div id="book_count">
顾客评分:<span id="book_id_15">5span> 共有商品评论0条 <a href="#">查看评论摘要a>
div>
dd>
dl>
<dl class="book_intro">
<dt>内容简介dt>
<dd>${requestScope.book.contentDescription}dd>
dl>
<dl class="book_intro">
<dt>目录dt>
<dd>${requestScope.book.toc}dd>
dl>
<div class="comm_answer">
<div id="div_product_reviews">
<div class="total_comm">
<div class="comm_title">
<h2>商品评论 共<em>814em>条
<span class="look_comm"> (<a href="javascript:" name='reviewList' target='_blank'>查看所有评论a>)span>h2>
div>
<div class="total_body">
<div class="people_average">
<div class="average_left"><p>购买过的顾客平均评分p><span class="a_red28b pd">4span><span class="red_bold">星半span><img src='images/star_red.gif' /><img src='images/star_red.gif' /><img src='images/star_red.gif' /><img src='images/star_red.gif' /><img src='images/star_redgray_big.gif' />
div>
<span class="span_jt" id="div_window_star"><input class="button_down1" value="" type