1 JSP是什么
JSP全名为Java Server Pages ,中文名 Java服务器页面,其本质是一个简化的Servlet设计,是由Sun Microsystems公司倡导,许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。
*.html 静态页面(包含固定的页面内容)
*.jsp 动态页面(页面数据可以动态更新,支持嵌套java代码和html代码)
2. JSP出现原因
JSP出现的原因是为了解决传统的静态HTML页面无法满足动态内容需求的问题。在早期的Web开发中,使用CGI(Common Gateway Interface)等技术来实现动态网页生成,但这些技术存在性能问题和代码维护困难的挑战。
JSP的出现提供了一种更简单、更灵活的动态网页生成方式。它将Java代码嵌入HTML页面中,通过特殊的标签(如<%= %>
)将Java代码与HTML页面的静态内容相结合。这使得开发人员可以利用Java的强大功能和丰富的类库来处理动态数据、业务逻辑和用户交互等方面的需求。
JSP的优势包括:
- 简单易学:JSP基于标准的HTML语法,并且可以直接嵌入Java代码,使得Web开发人员可以快速上手并进行开发。
- 高性能:与传统的CGI相比,JSP具有更好的性能,因为它在第一次访问时被编译成Java Servlet,并且可以被服务器缓存和重用。
- 可维护性:JSP的代码可以与Java代码进行分离,从而实现可维护性和复用性。开发人员可以将不同的逻辑和功能模块封装到Java类中,然后在JSP页面中调用这些类。
- 强大的Java生态系统:JSP可以直接访问和利用Java的丰富类库和框架,以满足各种复杂的业务需求。
3. jsp中嵌入Java代码
使用小脚本(<% Java代码 %>)
声明标签 <%! 变量或者方法声明 %>
表达式标签 <%= 表达式 %> 在页面上显示的效果
程序代码标签 <% java代码 %> 页面上动态展示内容
引入依赖
index.jsp
<%@ page import="java.time.LocalDateTime" %>
<%@ page import="java.time.LocalDate" %>
<%@ page import="java.time.LocalTime" %>
<%--
Created by IntelliJ IDEA.
com.User: hjc
Date: 2023/9/14 0014
Time: 16:52:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--小脚本--%>
<%
LocalDateTime ldt = LocalDateTime.now();
out.print("<hr>");
out.print(ldt);
%>
<hr>
<%--脚本表达式--%>
<%=LocalDate.now()%>
<br>
<%--脚本声明--%>
<%!LocalTime localTime = LocalTime.now();%>
<%=localTime%>
</body>
</html>
JSP中的注释
<!-- html注释内容,查看源代码时能看到 -->
<%-- jsp注释,控制台查看页面源代码时看不到 --%>
4. JSP的原理
第一次执行
- index.jsp翻译为/work/…/index_jsp.java,也就是servlet类
- 编译index_jsp.java为index_jsp.class文件
- 执行类中的service()方法
第二次执行
- 执行service()
- 小脚本翻译成service中的一段代码,使用out.print打印变量到浏览器页面
5. JSP内置对象
JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、
pagecontext、config、page、exception
1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。所属类型:HttpServletResponse
3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。HttpSession
4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量” ServletContext
区别:
-
request:单次请求
-
session:浏览器访问期间(会话期间)
-
application:服务器启动期间,所存的数据可以跨浏览器
5、out对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
示例:
6、pageContext对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
7、config对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过config对象传递给这个Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
8、page对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
9、exception对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
(1) 先在可能发生错误的页面中添加errorPage属性:
<%@ page pageEncoding="utf-8" errorPage="error.jsp" contentType="text/html;charset=UTF-8" language="java" %>
(2) 在error.jsp页面中设置isErrorPage=“true” 的属性
(使用exception对象之前,需要先将当前页面设置成错误页面)
<%@ page language="java" isErrorPage="true" import="java.util.*"pageEncoding="UTF-8"%>
JSP作用域
6. JSP的指令
jsp指令用来设置整个jsp页面相关的属性,如页面的编码方式和脚本语言
语法格式:
<%@ directive attribute="value" %>
directive:指令名称 attribute 属性名 value:属性值
指令名称 | 描述 |
---|---|
page | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等 |
include | 包含其他文件 |
taglib | 引入标签库的定义 |
(1)Page指令
Page指令为容器提供当前页面的使用说明一个JSP页面可以包含多个page指令
Page指令的语法格式:
<%@ page attribute=“value” %>
(2) Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
(3)Taglib指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
uri属性确定标签库的位置,prefix属性指定标签库的前缀(可自定义)。
7. JSP出现的状态码
8. EL表达式
- 什么是Expression Language表达式语言
最初定义于JSTL1.0部分
在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的一部分
在JSP中使用EL表达式,可以简化对象和变量的访问是EL表达式
- EL表达式语法
EL(Expression Language)是一种在JSP、JavaServer Faces(JSF)和其他Java EE应用中用于简化Java表达式的语言。EL允许开发者在Java代码中使用简洁的语法来访问和操作对象属性、集合和常量。EL表达式语法主要包含以下几个部分:
1. 基本语法
EL表达式的基本语法是 ${expression}
,其中 expression
是一个可以被解析的表达式。
2. 访问属性
访问对象的属性可以使用点符号或方括号:
- 使用点符号:
person.name
,适用于属性名是字符串的场景。 - 使用方括号:
person["name"]
,适用于属性名是变量或需要特殊字符的场景。
3. 访问集合元素
访问集合的元素可以使用索引或键:
- 使用索引:
list[0]
或list[index]
。 - 使用键:
map["key"]
。
4. 运算符
EL支持基本的算术运算符、比较运算符和逻辑运算符:
- 算术运算符:
+
(加)、-
(减)、*
(乘)、/
(除)、%
(取模)。 - 比较运算符:
==
(等于)、!=
(不等于)、>
(大于)、<
(小于)、>=
(大于等于)、<=
(小于等于)。 - 逻辑运算符:
&&
(逻辑与)、||
(逻辑或)、!
(逻辑非)。
5. 控制结构
EL表达式可以嵌套条件语句:
if
结构:<c:if test="${expression}">表达式代码</c:if>
。for
循环:<c:forEach items="${collection}" var="item">循环代码</c:forEach>
。
6. 特殊函数
EL提供了一些内置函数来处理字符串、日期、数字等:
trim
:去除字符串两端的空白。lowerCase
:将字符串转换为小写。upperCase
:将字符串转换为大写。indexOf
:查找字符串中某个子字符串的位置。substring
:获取字符串的一部分。formatDate
:格式化日期。
7. 示例
下面是一个简单的EL表达式示例:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL Example</title>
</head>
<body>
<c:out value="${person.name}"/>
<c:if test="${person.age > 18}">
<p>这个人是成年人。</p>
</c:if>
<c:forEach items="${fruits}" var="fruit">
<p>${fruit}</p>
</c:forEach>
</body>
</html>
这个示例展示了如何使用EL访问对象属性、执行条件判断和遍历集合。
结论
EL提供了一种简洁的方式来处理Java EE应用中的数据访问和控制逻辑,简化了JSP和JSF的开发过程。通过上述语法和功能的了解,开发者可以更高效地编写和维护Java EE应用。