JSP介绍
什么是JSP
- jsp (Java Server Page) 是Java EE规范中的Web组件,用来编写动态页面。
- JSP文件以
.jsp
为后缀,通常存放在 Eclipse 的工程目录中的WebContent
目录下,与静态资源使用方式非常相似。 - 内容构成:JSP 文件中的内容是 HTML 和 Java 代码的结合,静态部分使用 HTML 和文本,动态部分使用 Java 代码。
Web容器处理JSP文件请求的三个阶段
- 翻译阶段:
- Web 服务器找到
xxx.jsp
文件,对其进行翻译,生成xxx_jsp.java
文件。 - 查看路径:工作空间
work\Catalina\localhost
。
- Web 服务器找到
- 编译阶段:
- 服务器将
xxx_jsp.java
编译成类文件(.class
),翻译和编译过程遵守 Servlet 规范。
- 服务器将
- 执行阶段:
- 实例化并提供服务,服务器实例化类,调用类中的
_javaService
方法提供服务。
- 实例化并提供服务,服务器实例化类,调用类中的
总结
- 与Servlet比较:使用 Servlet 生成动态网页比较繁琐,而使用 JSP 生成动态网页则比较便捷,因为其中的静态内容可以直接使用 HTML 生成。
- 执行过程:JSP 的执行过程是:翻译 -> 编译 -> 实例化 -> 提供服务。
- 本质:JSP 的本质是 Servlet,只不过是服务器将 JSP 文件进行了翻译和编译;可以说 JSP 也是 Java 的一个类。
JSP语法格式
Page指令
<%@ page 属性1="属性值1" 属性2="属性值2, 属性值3" ... 属性n="属性值n" %>
Include命令
<%@ include file="xxx.jsp" %>
小脚本
<%
// 这里可以写 Java 代码
%>
输出信息到页面
<%= 表达式 %>
声明
<%!
// 这里可以定义方法和变量
%>
注释
<%-- 注释内容 --%>
JSP内置对象及4种作用域
什么是内置对象
在 JSP 开发中会频繁使用到一些对象,如果每次在 JSP 页面中使用这些对象都要手动创建就会特别繁琐。为此,Sun 公司在设计 JSP 时,自动帮开发者创建好了这些对象,开发者只需要使用相应的对象调用相应的方法即可。这些系统创建好的对象就叫做内置对象。
9种内置对象
-
request对象
request
对象是javax.servlet.http.HttpServletRequest
类型的对象,该对象代表了客户端的请求信息,主要用于接收通过 HTTP 协议传送到服务器的数据,包括头信息、系统信息、请求方式及请求参数等。request
对象的作用域是一次请求。
-
response对象
response
代表的是对客户端的响应,主要是将 JSP 容器处理过的数据传回到客户端。response
对象也具有作用域,它只在 JSP 页面内有效。
-
session对象
session
对象是由服务器自动创建的与客户请求相关的对象,服务器为每个用户都生成一个session
对象,用于保护该用户的信息,追踪用户的操作状态。session
对象内部使用 Map 类来保存数据,因此保存数据的格式为"key/value"。session
对象的 value 可以使用复杂的对象类型,而不仅仅局限于字符串类型。
-
application对象
application
对象可将信息保存在服务器中,直到服务器关闭,否则application
对象中保存的信息会在整个应用中都有效。- 与
session
对象相比,application
对象生命周期更长,类似于系统的“全局变量”。
-
out对象
out
对象用于在 Web 浏览器中输出信息,并且管理应用服务器上的输出缓冲区。- 在使用
out
对象输出数据时,可以对数据缓冲区进行操作,及时清理数据缓冲区中的残余数据,为其他输出让出缓冲空间。 - 数据输出完毕后,要及时关闭输出流。
-
pageContext对象
pageContext
对象的作用是取得任何范围的参数,通过它可以获得 JSP 页面中的out
、request
、response
、session
、application
等对象。pageContext
对象的创建和初始化都是由容器来完成的,在 JSP 页面中可以直接使用pageContext
对象。
-
config对象
config
对象的主要作用是取得服务器的配置信息,通过pageContext
对象的getServletConfig()
方法可以获取一个config
对象。- 当一个 Servlet 初始化时,容器把某些信息通过
config
对象传递给 Servlet,开发者可以在web.xml
文件中为应用程序环境中的 Servlet 程序和 JSP 页面提供初始化参数。
-
page对象
page
对象代表 JSP 本身,只有在 JSP 页面内才是合法的。page
隐含对象本质上包含当前 Servlet 接口引用的变量,类似于 Java 编程中的this
。
-
exception对象
exception
对象的作用是显示异常信息,只有在包含isErrorPage="true"
的页面才可以被使用。- 在一般 JSP 页面中使用该对象无法编译 JSP 文件。
exception
对象和 Java 的所有对象一样,都具有系统提供的继承结构。exception
对象几乎定义了所有的异常情况,在 Java 程序中可以使用try/catch
关键字来处理异常情况。- 在 JSP 页面中出现没有捕获到的异常,就会生成
exception
对象,并把exception
对象传送给page
指令中设置的错误页面中,然后再错误页面中处理相应的exception
对象。
4种作用域
- ServletContext:application域
- HttpServletRequest:request域
- HttpSession:session域
- PageContext:page域
JSP与Servlet配合使用
JSP与Servlet的分工
Servlet 和 JSP 本质上是一个东西,但是写法上各有优势。Servlet 中写 Java 代码更方便,JSP 编写页面内容更方便。所以一般会由 Servlet 来负责代码调用,由 JSP 负责数据显示。因此需要将 Servlet 中处理的数据传递到 JSP 上。
跳转方式
响应重定向
- 响应重定向通过
response
对象调用,让浏览器向重定向的地址重新发送一次请求。response.sendRedirect("xxx.jsp");
- 注意:因为是重定向发送新的请求,会导致第一次请求的相关数据在第二次请求中读取不到。如果需要这些数据可以使用请求转发的跳转方式。
请求转发
- 请求转发通过
request
对象调用,把请求对象和响应对象与跳转地址共享。request.getRequestDispatcher("xxx.jsp").forward(request, response);
两者区别
-
转发(常用,效率高)
- 浏览器URL不变。
- 服务器行为(服务器内部)。
- 浏览器只做了一次请求访问。
- 两次跳转之间传输的信息不会丢失。
-
重定向
- 浏览器URL的地址栏改变。
- 客户端行为。
- 浏览器做了至少两次访问请求。
- 两次跳转之间传输的信息会丢失(request范围)。
EL表达式
EL表达式的作用
- EL 即 Expression Language(表达式语言)。
- 页面中嵌入 Java 代码容易造成结构混乱,不易阅读和调试。可以使用一些其他技术来提高可阅读性并对原始方法进行优化,如 EL 表达式和 JSTL 标签。
- EL 表达式的主要作用是从域对象或参数中取值并输出到页面中。
EL表达式特点
- 自动转换类型:EL 获取某个数据时可以自动转换类型,对于类型的限制更加宽松。
- 使用简单:相较于在 JSP 页面中嵌套 Java 代码,EL 引用更简单。
EL语法
- 基本语法:
${表达式}
EL表达式示例
- 在 request 域中存储对象
request.setAttribute("testuser", myuser);
- 使用 EL 表达式获取域中 user 对象的 username 属性,并输出到页面
${testuser.username}
EL操作符
- “.”:获取对象的属性
${news.title}
- “[]”:获取集合中的对象
${newList[0]}
EL表达式中允许使用运算符
- 数学运算符:
+
,-
,*
,/
,%
- 逻辑运算符:
and
,or
,not
- 比较运算符:
==
,!=
,<
,>
,<=
,>=
- 其他运算符:
empty
(判断是否为空)
EL表达式隐式对象
EL 表达式包含一些隐式对象。
作用域访问对象
可以用来指定某个域中取值。默认从上到下取值。
-
pageScope:
<% pageContext.setAttribute("name", "a") %> ${pageScope.name} <!-- pageScope 代表 page 域中用于保存属性的 Map 对象 -->
-
requestScope:
<% request.setAttribute("name", "b") %> ${requestScope.name} <!-- requestScope 代表 request 域中用于保存属性的 Map 对象 -->
-
sessionScope:
<% session.setAttribute("name", "c") %> ${sessionScope.name} <!-- sessionScope 代表 session 域中用于保存属性的 Map 对象 -->
-
applicationScope:
<% application.setAttribute("name", "d") %> ${applicationScope.name} <!-- applicationScope 代表 application 域中用于保存属性的 Map 对象 -->
参数访问对象
可指定从 request 的参数部分取值。
-
param:
<!-- param 表示一个保存了所有请求参数的 Map 对象 --> ${param.xxx} <!-- 此表达式常用于数据回显 -->
<!-- 以下模拟应用场景为表达提交到后台后校验未通过,回到注册表数据回显 --> <!-- ${pageContext.request.contextPath} 取出部署项目名 --> <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post"> <input type="text" name="username" value="${param.username}"> <input type="submit" value="注册"> </form>
-
paramValues:
<!-- paramValues 表示一个保存了所有请求参数的 Map 对象,对于某个请求参数,返回的是一个 string[] --> ${paramValues.like[0]} ${paramValues.like[1]}
JSP配置对象
- pageContext:
<!-- pageContext 对应 JSP 页面中的 pageContext 对象 --> ${pageContext} <!-- pageContext.findAttribute("name") -->
JSTL标签
JSTL标签的作用
- EL 表达式主要用于取值和输出功能,需配合 JSTL 标签来完成逻辑控制(条件判断、循环)。
- JSTL(JavaServer Page Standard Tag Library)是 JSP 基本标签库,主要用来替换页面中逻辑判断相关的代码,常与 EL 表达式配合使用。
JSTL使用
- 需要的 Jar 包:
- 下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
- 下载
jstl.jar
和standard.jar
包。
- 在使用 JSTL 的页面中,需要加入 taglib 指令,导入核心标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL标签分类
通用标签
-
set:设置指定范围内的变量值
<c:set var="example" value="${100+1}" scope="session"/>
-
out:计算表达式并将结果输出显示
<c:out value="${example}"/>
-
remove:删除指定范围内的变量
<c:remove var="example" scope="session"/>
条件标签
- if:条件判断语句
<c:if test="${empty loginUser}" var="islogin" scope="session"> <!-- test:判断条件,可以将结果保存在域中,var 是 key,scope 是域 --> <c:redirect url="testEL.jsp"></c:redirect> <!-- 配合跳转标签使用 --> </c:if> <c:if test="${not islogin}"> <!-- 对之前保存的判断结果取反,完成 else 结构 --> 已登录 </c:if>
迭代标签
- forEach:遍历集合中的元素时使用
<c:forEach items="${listEntity}" var="myentity"> <!-- items 是遍历的集合,var 是每次遍历到的对象,每次会存在域中 --> <tr> <td>${myentity.ename}</td> <td>${myentity.eage}</td> <td>${myentity.eaddr}</td> </tr> <!-- 遍历中取值直接使用遍历到并存在域中的 key,通过 EL 表达式取值 --> </c:forEach>
时间格式化标签
- fmt:formatDate:显示格式化标签
<!-- 导入格式化标签库 --> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!-- 使用格式化标签 --> <fmt:formatDate value="${时间对象}" pattern="yyyy-MM-dd HH:mm:ss"/>