JSP(Java Server Pages)类似于ASP技术,它是在传统的网页HTML文件(.htm,.html)中插入Java程序段(Scriptlet)JSP标记(tag),从而形成JSP文件,后缀名为(.jsp)。JSP本质上是一个简化的Servlet设计,JSP的实现过程: .jsp 文件会被JSP引擎(由服务器提供,如Tomcat的Jasper)译为 .java 文件,最终生成 .class 文件。

JSP语法

除了HTML语法,扩展的其他内容如下

嵌套Java代码的格式

  • 声明标签:<%! 变量声明或方法声明 %>
  • 表达式标签:<%= 表达式 %> 表达式的值将输出到JSP页面的相应位置
  • 代码标签: <% Java代码 %> 页面上动态显示的内容

JSP指令

用于声明 JSP 页面的属性,如编码方式、文档类型等等。一共有三种指令:page、include、taglib。

指令使用格式

<%@ directive attribute1="value1" attribute2="value2" ... %>

  • directive 指 page、include、taglib其中之一
  • attribute属性名
  • value属性值
  • ...这个不是语法哦,指其他未写出的 attribute="value"

page指令

属性名 属性值 描述
language java 解释JSP文件时采用的语言。默认为java
extends 类的全名 由该JSP文件生成的类继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等方法
import 包名/类名 import是唯一可以声明多次的page指令属性。一次可以导入多个类,中间用英文逗号隔开
session true/false 是否内置session对象。默认为true
autoFlush true/false true代表使用out.println()等方法输出的字符串暂时存到缓存里,当缓存满了或者程序行完毕或者执行out.flush()操作时才输出到客户端。默认为true
buffer none/nKB 指定缓存大小,例如 4KB
isThreadSafe true/false 是否线程安全。值为true时允许多线程执行该JSP,否则必须排队执行。默认为false
isErrorPage true/false 该 JSP页面是否为错误显示页面。为true时该JSP拥有内置exception对象,否则没有。默认为false
errorPage 某个JSP页面的相对路径 指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则将该异常传递给errorPage指定JSP页面并跳转至errorPage指定JSP页面
contentType 文档类型 客户端浏览器根据该属性判断文档类型。例如,HTML:text/html、纯文本:text/plain、JPG图像:image/jpeg、GIF图像:image/gif、WORD文档:application/msword
pageEncoding 字符集 指定该JSP页面的字符集,如UTF-8、ISO-8859-1等

include指令

将其他 JSP文件、HTML文件、文本包含到该 JSP中一并编译。这是一种静态包含,相当于直接复制粘贴进来,所以在编译该JSP文件的时候将会一并编译被包含的文件

  • 属性名:file
  • 属性值:URL相对路径
  • 例:<%@ include file="文件相对 url 地址" %>

taglib指令

JSP支持标签技术,后面会讲到标签的用法,JSTL标签库的使用等。

作用:用来指明JSP页面内使用的JSP标签库,taglib指令有两个属性,uri为类库的地址,prefix为标签的前缀

  • 例:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

JSP的9个内置对象

使用内置对象进行便捷的开发,大部分都是HttpServlet中使用的对象(除了pageContext和out),关于HttpServlet请看上一篇博文

对象 类型 简述
request HttpServletRequest 该对象是客户端的HTTP请求,作用域为一次请求,包含头信息、系统信息、请求方式等
response HttpServletResponse HTTP响应对象,作用域为该 JSP页面
session HttpSession 作用域为一次会话
application ServletContext 作用域为Servlet容器,直到服务器关闭前都有效
config ServletConfig 服务器的配置信息。config在上一篇博文的Servlet级始化参数中使用过。
page HttpServlet 指该 JSP编译为Java代码中的Servlet类的对象(Servlet是单实例的,所以这个指向是明确的),相当于this
exception Exception 只有当前页面是错误页面(<%@ page isErrorPage="true" %>)才能使用,若不是错误页面使用exception会导致编译报错。
out JspWriter 用于向页面输出(包括js代码),上面提到的page指令的autoFlush属性就是控制这个对象
pageContext PageContext 表示页面的上下文,可以获取request、response、session、application、config等

EL表达式

EL(Expression Language)表达式可以更方便的展示变量和对象,避免在HTML中嵌入Java代码(显的很混乱)

基本使用格式

${EL表达式} 变量名不用加引号

获取4个域(pageContext、request、session、application)中值

EL表达式只能获取域中的值,不能获取Java代码中的值!需要使用的变量一定要先存在域中。

例如:<% session.setAttribute("score",99) %> ,此时可以读取score这个值${score}

另外一点,如果找不到值会返回空字符串"",而不是null

完全限定获取方式
  • 获取pageContext域的变量:${pageScope.key}
  • 获取request域的变量:${requestScope.key}
  • 获取session域的变量:${sessionScope.key}
  • 获取application域的变量:${applicationScope.key}
隐式获取

${key} 将会以pageContextrequestsessionapplication顺序读取,域的范围是从小到大

  • 关于集合的展示
<%
List list = new ArrayList();
list.add("one");
list.add("two");
list.add("three");
pageContext.setAttribute("aList",list);
Map map = new HashMap();
map.put("color","red");
map.put("shape","square");
pageContext.setAttribute("aMap",map);
%>
${aList}<br/> <!--直接输出数组-->
${aList[0]}<br/> <!--按下标读取数组-->
${aList[2]}<br/> <!--按下标读取数组-->
${aMap}<br/> <!--直接输出映射-->
${aMap.shape}<br/> <!--按键读取映射-->
  • 下面是在网页中输出的结果
[one, two, three]
one
three
{color=red, shape=square}
square
对象的展示
  • 测试
<%
class Student{
private final String name = "Tom";
private final String sex = "boy";
@Override
public String toString() {
return name+" is a "+sex;
}
}
Student student = new Student();
pageContext.setAttribute("aStudent",student);
%>
${aStudent}<br/>

下面是在网页中输出的结果

Tom is a boy

可以看出来EL对于对象的展示其实就是调用了toString()方法,包括集合也一样。如果这个对象没有重写toString()方法,那么机会调用父类toString()方法。比如父类是Object,那么就会输出hashcode。

对象的字段(属性)的获取
  • 获取方式: ${object.field} 即可获取对象的字段(属性)
  • 测试代码

com.java.webtest.Student

package com.java.webtest;

public class Student {
private String name = "Jack";
public String getName() {
return name;
}
}

myTest.jsp

<%@ page import="com.java.webtest.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>myTest</title>
</head>
<body>
<%
Student s1 = new Student();
pageContext.setAttribute("s1",s1);
%>
name = ${s1.name}<br/>
</body>
</html>
  • 运行结果
name = Jack

️ EL表达式获取对象字段(属性)是通过反射机制。${s1.name} 底层逻辑是将首字母"n"大写再在前面拼接一个"get",然后反射获取"getName"方法。所以对象必须提供字段的get方法,才能使用EL表达式 ${object.field} ,如果不写就会报错,或者你让get方法返回一个和相应字段无关的东西来证明确实是调用了get方法得到值的。

EL的运算

运算类型 描述
算术型 +-*/div 取余%mod
逻辑型 and&&or||!not
关系型 ==eq!=ne<lt>gt<=le>=ge
empty 判断一个值是否为null或者为empty,如${empty ""} 返回值为true
三目运算 expression ? valueA : valueB 若expression为true返回valueA否则返回valueB
  • 做一个测试
<%
class Person{
private int id;
private String sex;
public Person(int id,String sex){ this.id = id; this.sex = sex; }
@Override
public boolean equals(Object o) { return id == ((Person) o).id; }
}
Person p1 = new Person(777,"boy");
Person p2 = new Person(777,"girl");
Person p3 = new Person(666,"boy");
pageContext.setAttribute("p1",p1);
pageContext.setAttribute("p2",p2);
pageContext.setAttribute("p3",p3);
%> 1 + 2 = ${1 + 2}<br/>
1 - 2 = ${1 - 2}<br/>
3 * 3 = ${3 * 3}<br/>
10 / 3 = ${10 / 3}<br/>
10 div 3 = ${10 div 3}<br/>
10 % 3 = ${10 % 3}<br/>
10 mod 3 = ${10 mod 3}<br/>
true and false -> ${true and false}<br/>
true && false ->${true && false}<br/>
true or false -> ${true or false}<br/>
true || false -> ${true || false}<br/>
not true -> ${not true}<br/>
!true -> ${!true}<br/>
666 == 666 -> ${666 == 666}<br/>
p1 == p2 -> ${p1 == p2}<br/>
p1 == p3 -> ${p1 == p3}<br/>
"ABCDEFG" == "abcdefg" -> ${"ABCDEFG" == "abcdefg"}<br/>
"ABCDEFG" == "ABCDEFG" -> ${"ABCDEFG" == "ABCDEFG"}<br/>
"ABCDEFG" eq "abcdefg" -> ${"ABCDEFG" eq "abcdefg"}<br/>
"ABCDEFG" eq "ABCDEFG" -> ${"ABCDEFG" eq "ABCDEFG"}<br/>
"ABCDEFG" != "abcdefg" -> ${"ABCDEFG" != "abcdefg"}<br/>
"ABCDEFG" != "ABCDEFG" -> ${"ABCDEFG" != "ABCDEFG"}<br/>
"ABCDEFG" ne "abcdefg" -> ${"ABCDEFG" ne "abcdefg"}<br/>
"ABCDEFG" ne "ABCDEFG" -> ${"ABCDEFG" ne "ABCDEFG"}<br/>
10 < 3 -> ${10 < 3}<br/>
10 lt 3 -> ${10 lt 3}<br/>
10 > 3 -> ${10 > 3}<br/>
10 gt 3 -> ${10 gt 3}<br/>
10 <= 3 -> ${10 <= 3}<br/>
10 le 3 -> ${10 le 3}<br/>
10 >= 3 -> ${10 >= 3}<br/>
10 ge 3 -> ${10 ge 3}<br/>
empty "" -> ${empty ""}<br/>
empty null -> ${empty null}<br/>
empty 666 -> ${empty 666}<br/>
55 > 60 ? "you pass!" : "you fail..." -> ${55 > 60 ? "you pass!" : "you fail..."}<br/>
  • 页面的输出结果
1 + 2 = 3
1 - 2 = -1
3 * 3 = 9
10 / 3 = 3.3333333333333335
10 div 3 = 3.3333333333333335
10 % 3 = 1
10 mod 3 = 1
true and false -> false
true && false ->false
true or false -> true
true || false -> true
not true -> false
!true -> false
666 == 666 -> true
p1 == p2 -> true
p1 == p3 -> false
"ABCDEFG" == "abcdefg" -> false
"ABCDEFG" == "ABCDEFG" -> true
"ABCDEFG" eq "abcdefg" -> false
"ABCDEFG" eq "ABCDEFG" -> true
"ABCDEFG" != "abcdefg" -> true
"ABCDEFG" != "ABCDEFG" -> false
"ABCDEFG" ne "abcdefg" -> true
"ABCDEFG" ne "ABCDEFG" -> false
10 < 3 -> false
10 lt 3 -> false
10 > 3 -> true
10 gt 3 -> true
10 <= 3 -> false
10 le 3 -> false
10 >= 3 -> true
10 ge 3 -> true
empty "" -> true
empty null -> true
empty 666 -> false
55 > 60 ? "you pass!" : "you fail..." -> you fail...
  • 我认为应该特别注意两点

    • 两个整数相除的结果并不是整数
    • p1 == p2 -> true"ABCDEFG" == "ABCDEFG" -> true显然不同于Java,EL表达式重载了 == ,对象之间使用 == 比较的时候,并不是比较对象的引用变量(也就是对象地址或指针),而是使用了 equals(Object o) 方法。!= 比较对象也是同理,可以自己测试一下。

JSTL标签库

JSTL(Java server pages standarded tag library)是一个JSP标准标签库,它封装了JSP应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。下文将阐述部分常用的JSTL标签。EL和JSTL核心标签库通常搭配使用效果最佳

使用前的准备

标签使用语法

<prefix:tag attribute="value" ... >
...
</prefix:tag>

重要标签

免责声明:以下标签属性总结并不全面,只讲比较常用的属性;并且由于uri不同属性不同。具体内容请查看你导入的standard.jar

<c:tag>标签

使用标签前不要忘记导入标签,不过IDEA也会自动导入。核心标签按照功能可以分为

  • 表达式操作: out、set、remove、catch
  • 流程控制: if、choose、when、otherwise
  • 迭代操作: forEach、forTokens
  • URL操作: import、param、url、redirect
<c:set>标签
属性 缺省 说明
value - 向域中存入的变量值
var - 向域中存入的变量名
scope page 指定存储在4个域中的哪一个
target - Java对象
property - Java对象的字段(属性)。因为使用的是反射技术,与前面EL表达式获取字段值同理:该字段必须有set方法
<c:out>标签
属性 缺省 说明
value - 需要显示出来的值
default - 如果value的值为null,则显示default的值
escapeXml true 是否转义xml字符。有些字符如&lt在xml中被认为是<,若要它的字面意思,就需要使用转移

案例

com.java.testclass.Person

package com.java.testclass;

public class Person {
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} @Override
public String toString() {
return name+" is "+age+" years old.";
} 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;
}
}

JSTL-test.jsp

<%@ page import="com.java.testclass.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>
<html>
<head>
<title>JSTL-test</title>
</head>
<body> <%
pageContext.setAttribute("person1",new Person("Tom",18));
pageContext.setAttribute("person2",null);
%> <h6>********** set & out Test **********</h6>
<%--向域中存值--%>
<c:set var="fruit" value="apple"></c:set>
<c:set var="fruit" value="banana" scope="session"></c:set>
<%--设置Java对象的字段--%>
<c:set value="David" target="${person1}" property="name"></c:set>
<c:set target="${person1}" property="age">18</c:set><br>
<%--输出--%>
<c:out value="${fruit} is fruit." default="fruit is null!"></c:out><br>
person1 : ${person1}<br>
person2 : <c:out value="${person2}" default="person2 is null!"></c:out><br>
<c:out value="&lt==when escapeXml is true==&gt"></c:out><br>
<c:out value="&lt==when escapeXml is false==&gt" escapeXml="false"></c:out><br> </body>
</html>

结果

********** set & out Test **********

apple is fruit.
person1 : David is 18 years old.
person2 : person2 is null!
&lt==when escapeXml is true==&gt
<==when escapeXml is false==>
<c:if>标签
属性 缺省 说明
test - if 的条件表达式
var - 定义一个变量存储if 条件表达式的结果
scope page var变量的JSP范围
<c:choose>标签
属性 缺省 说明
test 如果表达式的结果为true,则执行体内容,false则相反
<c:choose>
<c:when test="boolean表达式">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
<c:forEach>标签

用于遍历集合元素

属性 缺省 说明
var - 遍历用的循环变量
items - 被遍历的集合对象
varStatus - 存放本轮循环变量的相关参数
begin 0 遍历起点下标
end 最后元素下标 遍历终点下标
step 1 每次迭代的间隔数

直接看例子

<%
int[] arr = {100,200,300,400,500,600,700,800,900,1000};
pageContext.setAttribute("arr",arr);
%> <h6>********** process control Test **********</h6>
foreach arr
<c:forEach items="${arr}" var="it" begin="1" end="7" step="2" varStatus="status">
<c:if test="${status.count==1}">
from ${status.begin} to ${status.end} by step = ${status.step}<br>
</c:if>
arr[${status.index}] = ${it} , count = ${status.count}<br>
</c:forEach>

结果

********** process control Test **********

foreach arr from 1 to 7 by step = 2
arr[1] = 200 , count = 1
arr[3] = 400 , count = 2
arr[5] = 600 , count = 3
arr[7] = 800 , count = 4

从结果count属性并不是与index属性关联的值,index是数组的下标count仅作为循环的计数器

<fmt:tag>标签

<fmt:formatDate>标签

该标签用于格式化输出Date类型变量,比较常用

属性 缺省 说明
value - 用于指定被格式化对象
pattern - 格式化的模式,与SimpleDateFormat的参数设置一样
var - 指定产生的格式化字符串所存放的变量,若不指定则直接输出在页面中
scope page 指定var变量的存储域
type date 说明value对象包含时间或包含日期还是两者兼具。取值为date/time/both
fmt:parseDate标签

<fmt:formatDate>的逆向过程,用于将指定字符串转化为日期类型

属性 说明
value 用于指定被转化的字符串
pattern 指定解析字符串的格式
var 指定生成的时间对象所存放的变量

请看测试代码

<%
pageContext.setAttribute("now",new Date());
%> <h6>******************** fmt Test ********************</h6>
before formatting : ${now}. <br>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd" var="parse_date"></fmt:formatDate>
after formatting : ${parse_date}. <br>
<fmt:parseDate value="${parse_date}" var="gotten_date" pattern="yyyy-MM-dd"></fmt:parseDate>
date get from string : ${gotten_date}. <br>

结果

******************** fmt Test ********************

before formatting : Sat Mar 13 23:03:16 CST 2021.
after formatting : 2021-03-13.
date get from string : Sat Mar 13 00:00:00 CST 2021

注意第一个日期与第三个日期的差别,这是由于第一次转换的时候丢失了时间信息

<fmt:formatNumber>标签

主要用于控制数字的展示格式。还记得前面EL运算10/3的结果展示为3.3333333333333335,通常我们不想展示这么多小数位。

属性 说明
maxIntegerDigits 整数部分最多的位数
minIntegerDigits 整数部分最少的位数
maxFrctionDigits 小数部分最多的位数
minFrctionDigits 小数部分最少的位数
var 指定存储格式化结果的变量
scope 指定var属性的作用域

JSP、EL表达式、JSTL标签库干货(建议收藏)的更多相关文章

  1. JavaWeb基础Day17 (JSP EL表达式 jstl标签库 beanutil工具类)

    JSP jsp的实质就是指在html界面中嵌入Java代码 jsp脚本 <%  Java代码  %>  相当于写在service方法中. <%=java 变量或者表达式 %> ...

  2. jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门

    一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...

  3. 2.EL表达式&JSTL标签库常用方法

    1.EL表达式 Expression Language表达式语言,主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出. 格式为${表达式} EL表达式输出Bean的普通属性.数组属性.Li ...

  4. 重温JSP学习笔记--JSTL标签库

    以前写jsp的时候对jstl标签库是有些抵触的,因为我觉得嵌入java代码的方式几乎无往不利,没有必要使用标签库,不过这次复习还是好好地学习了一下,发现这个还是很有用处的,用得好能省不少事,JSTL是 ...

  5. jsp之el表达式jstl标签

    不管是el表达式还是jstl标签最终的目的都是要消除jsp中的java代码,当然是消除显式的java代码 el表达式的出现是为了简化jsp中读取数据并写入页面的操作. el表达式的功能不多,也很好记 ...

  6. JSP总结(jsp/EL表达式/核心标签)

    1.概念 jsp,即java Server Pages,java服务器页面. 2.简单介绍 小示例 <%@ page language="java" contentType= ...

  7. el和jstl标签库讲解视频

    https://www.bilibili.com/video/av22415283/?p=1

  8. EL表达式与标签库

    https://blog.csdn.net/panhaigang123/article/details/78428567

  9. 在JSP页面中导入jstl标签库

    1 在工程中引用JSTL的两个jar包和标签库描述文件. (1)在项目上右击,从弹出的快捷键菜单中选择Properties命令,在出现的项目属性对话框上,选择DeploymentAssembly. ( ...

随机推荐

  1. JavaScript中的对象引用和复制

    在JavaScript分为两种原始值和引用值类型,原始值之间的复制是值对值得复制,而引用类型则是引用对引用的复制: // 原始值的复制: let num1 = 1; let num2 = num1; ...

  2. npm config set registry

    npm config set registry $ npm config set registry $ npm config set registry https://registry.your-re ...

  3. 英语能力考试 All In One

    英语能力考试 All In One 托福,雅思,托业 TOEIC 托业考试 Test of English for International Communication (TOEIC) 国际交流英语 ...

  4. js currying function All In One

    js currying function All In One js 实现 (5).add(3).minus(2) 功能 例: 5 + 3 - 2,结果为 6 https://stackoverflo ...

  5. @bind decorator

    @bind decorator https://www.npmjs.com/package/bind-decorator https://github.com/NoHomey/bind-decorat ...

  6. c++ winapi 让目标程序(target)调用当前程序(local)的函数

    GameCheat 如果你的目标程序是x86/x64, 那么当前程序也需要编译为x84/x64 #include <iostream> #include <string> #i ...

  7. SPC空投价值高达310万美金,生态建设者直呼真香!

    市场上面有句名言:"人赚不到自己认知以外的财富",这在数字加密上也是共通的.早在本月12日,也就是前天,NGK官方发行的第N波利好---SPC侧链代币空投已经陆续发放了,NGK以及 ...

  8. NGK公链:去中心化交易+挖矿生态体系共舞

    NGK生态公链是一个安全.透明.专业的去中心化商业应用平台.作为一条具有技术信任甚至是公众信任的公链,NGK以区块链技术为支撑,利用区块链透明.公正.公开.数据不可篡改.分布式存储.可追溯等技术优势, ...

  9. django学习-22.admi管理后台页面的文案展示等相关配置

    目录结果 1.前言 2.完整的操作步骤 2.1.第一步:对[settings.py]里的相关常量的值做如下修改 2.2.第二步:重启django项目[helloworld]的服务 2.3.第三步:重新 ...

  10. (1)MySQL进阶篇在linux环境下安装

    1.概述 对于mysql二进制安装,优点是可以安装到任何路径下,灵活性好,一台服务器可以安装多个mysql.缺点是已经编译过,性能不如源码编译得好,不能灵活定制编译参数.如果用户即不想安装最简单却不够 ...