文章目录
- 什么是JSP
- 运行原理
- JSP基础语法
- JSP 表达式
- JSP 脚本片段
- JSP 声明
- jsp指令
- 九大内置对象&四大域对象
- 内置对象
- 四大域对象
- 代码
- JSP标签、JSTL标签、EL表达式
- EL表达式
- JSP标签
- JSTL标签
什么是JSP
JSP(Java Server Pages)是由 SUN 公司在 1996 年 6 月发布的一种基于 Java 技术的服务器端编程技术,用于开发动态 Web 应用。
从本质上讲,它是一个简化的 Servlet 设计。在传统的 HTML(标准通用标记语言的子集)文件(.htm、.html)中插入 Java 程序段(Scriptlet)和 JSP 标记(tag),就形成了 JSP 文件,后缀名为.jsp。
JSP 具有以下特点:
- 跨平台性:可在 Windows、Unix、Linux 等多种操作系统上运行。
- 易于维护:代码与 HTML 代码分离,修改网页时只需修改对应的 JSP 文件。
- 动态生成网页:将 Java 代码嵌入 HTML 页面,能实时更新网页内容。
- 数据库访问便捷:方便地实现对数据库数据的增删改查等操作。
- 集成性强:可与 Servlet、JavaBean 等技术无缝集成,构建完整的 Web 应用系统。
JSP本质上也是Servlet,在tomcat服务器上,**当你访问一个.jsp页面后,**在tomcat目录下的work文件夹中,可以找到.jsp编译的.class和.java文件。源代码如下,可以看出其本质也是Servlet。
public final class luxiya_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements org.apache.jasper.runtime.JspSourceDependent,org.apache.jasper.runtime.JspSourceImports {......}
---------------------------------------------------------
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
......
}
运行原理
JSP 页面转换为 Servlet 后(.java文件)
//初始化public void _jspInit() {}
//销毁public void _jspDestroy() {}
//JSPServicepublic void _jspService(.HttpServletRequest request,HttpServletResponse response)-----------------------内置对象-------------------------
final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session = null; //session
final javax.servlet.ServletContext application; //applicationContext
final javax.servlet.ServletConfig config; //config
javax.servlet.jsp.JspWriter out = null; //out
final java.lang.Object page = this; //page:当前
HttpServletRequest request //请求
HttpServletResponse response //响应
- 作用:
_jspService()
方法是 JSP 页面处理客户端请求的核心方法。每次客户端向服务器发送对该 JSP 页面的请求时,容器都会调用这个方法。它接收HttpServletRequest
对象(封装了客户端的请求信息)和HttpServletResponse
对象(用于向客户端发送响应),并根据请求的类型(如 GET、POST)执行相应的处理逻辑,生成动态内容并返回给客户端。 - 作用:
_jspDestroy()
方法用于 JSP 页面销毁时的资源释放操作。当 JSP 容器决定销毁该 Servlet 实例时,会调用此方法。通常在此方法中释放那些在_jspInit()
方法中初始化或在 JSP 页面处理过程中使用的资源,如关闭数据库连接、释放文件句柄等。 - 作用:
_jspInit()
方法用于 JSP 页面初始化操作。当 JSP 页面第一次被请求并转换为 Servlet 后,容器在实例化该 Servlet 时会调用这个方法。此方法在整个 Servlet 生命周期中仅执行一次,适合进行一些只需要执行一次的初始化工作,例如加载配置文件、初始化数据库连接池等。
JSP运行过程:
-
当 JSP 文件首次被请求时,JSP 容器将其转化成一个 Java 源文件(Java Servlet 源程序),若存在语法错误,中断转换并返回错误信息。(eg: Tomcat 支持JSP,它既是一个开源的 Servlet 容器,也是一个 JSP 容器)
-
转换成功后,JSP 容器使用 javac 将生成的 Java 源文件编译成字节码文件.class,这就是一个 Servlet。
(javac是 Java 开发工具包(JDK)中的一个重要命令行工具,它主要用于将 Java 源代码文件(扩展名为 .java)编译成 Java 字节码文件,扩展名为 .class)
-
由Servlet容器加载转换后的Servlet类(.class文件)创建一个该Servlet(JSP页面的转换结果)实例,并执行 jspInit () 方法,该方法在 Servlet 生命周期中仅执行一次。
-
执行_jspService 方法处理客户端请求。
-
若 JSP 文件被修改,服务器按设置决定是否重新编译,若重新编译,使用新结果取代常驻内存的 Servlet 并继续后续处理。
-
首次调用时因转换和编译可能产生轻微延迟。此外,因系统资源不足等,JSP 容器可能以不确定方式将 Servlet 从内存移除,此时先调用 jspDestory () 方法。
-
接着 Servlet 实例被 “垃圾收集” 处理。
-
请求处理完成后,响应对象由 JSP 容器接收,并将 HTML 格式的响应信息发送回客户端。
JSP基础语法
JSP 表达式
// 作用:用来将程序的输出,输出到客户端
// <%= 变量或者表达式%><%= new java.util.Date() %>
JSP 脚本片段
<%--jsp脚本片段--%>//在<%与%>之间可编写任意合法 Java 代码int sum = 0;for (int i = 1; i <=100 ; i++) {sum+=i;}out.println("<h1>Sum="+sum+"</h1>");%>
JSP 声明
//用于在 JSP 页面中声明 Java 类的成员变量和方法
//当创建实例时,就会执行static模块,name,luxiya分别就是该实例的成员变量和方法
<%!String name = "luxiya";static {System.out.println("static block");}public void luxiya(){System.out.println("luxiya");}
%>
<%luxiya();
%>
jsp指令
-
page 指令
用于定义 JSP 页面的各种属性,如页面的编码、语言、导入的包等。常见属性如下:
language
:指定 JSP 页面使用的脚本语言,一般为java
。contentType
:设置响应的 MIME 类型和字符编码。import
:导入 Java 包。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %>
- include 指令:用于在 JSP 页面中静态包含另一个文件。在编译时,被包含文件的内容会直接插入到当前 JSP 页面中。语法为
<%@ include file="filename.jsp" %>
。 - taglib 指令:用于引入自定义标签库。当使用 JSTL 等标签库时会用到。语法是
<%@ taglib uri="taglibURI" prefix="tagPrefix" %>
,其中uri
是标签库的 URI,prefix
是标签库的前缀。
<%--@include会将两个页面合二为一--%>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1><%@include file="common/footer.jsp"%><hr><%--jSP标签jsp:include:拼接页面,本质还是三个--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
九大内置对象&四大域对象
内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application 【ServletContext】 存东西
- config 【ServletConfig】
- out
- page(几乎不用)
- exception
config
(对应 ServletConfig
)对象用于获取 Servlet 的初始化参数信息,一般不用于存储数据。
<%// 获取初始化参数String initParam = config.getInitParameter("paramName");%><p>初始化参数的值: <%= initParam %></p>
--------------------------------------------------<init-param><param-name>paramName</param-name><param-value>paramValue</param-value></init-param>
out
对象用于向客户端输出文本内容,不是用于存储数据的。
<%// 输出文本内容out.println("<h1>这是使用 out 对象输出的内容</h1>");%>
四大域对象
PageContext :保存的数据只在一个页面中有效
Request :保存的数据只在一次请求中有效,请求转发会携带这个数据
Session :保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器(会话级别)
Application :保存的数据只在服务器中有效,从打开服务器到关闭服务器(应用级别)
代码
---------------------demo3.jsp-----------------------
<%
pageContext.setAttribute("namepageContext","luxiyapageContext");
request.setAttribute("namerequest","luxiyarequest");
session.setAttribute("namesession","luxiyasession");
application.setAttribute("nameapplication","luxiyaapplication");
%>
<%String namepageContext = (String) pageContext.findAttribute("namepageContext");String namerequest = (String) pageContext.findAttribute("namerequest");String namesession = (String) pageContext.findAttribute("namesession");String nameapplication = (String) pageContext.findAttribute("nameapplication");
%>
<%pageContext.forward("/demo4.jsp");
%>
<p>pageContext:<%=namepageContext%></p>
<p>request:<%=namerequest%></p>
<p>session:<%=namesession%></p>
<p>application:<%=nameapplication%></p>
---------------------demo4.jsp-----------------------
<%String namepageContext = (String) pageContext.findAttribute("namepageContext");String namerequest = (String) pageContext.findAttribute("namerequest");String namesession = (String) pageContext.findAttribute("namesession");String nameapplication = (String) pageContext.findAttribute("nameapplication");
%><p>这里是demo4.jsp</p>
<p>pageContext:<%=namepageContext%></p>
<p>request:<%=namerequest%></p>
<p>session:<%=namesession%></p>
<p>application:<%=nameapplication%></p>
JSP标签、JSTL标签、EL表达式
EL表达式
EL 表达式: ${}
- 获取数据
- 执行运算
- 获取 Web 开发的常用对象
JSP 脚本片段(<% %>
)里定义的变量,默认情况下不能直接在 EL 表达式中使用。EL 表达式有自己的变量解析机制,通常从pageContext
、request
、session
、application
等作用域中查找变量。
JSP标签
-
<jsp:include>
作用:在运行时动态包含另一个资源(如 JSP 页面、HTML 页面等)。被包含的资源会在请求处理时被执行,并将结果插入到当前页面中。
<jsp:include page="header.jsp" />
-
<jsp:forward>
作用:将当前请求转发到另一个资源,原请求的所有信息(如请求参数、请求头)都会被传递到目标资源。转发后,当前页面的处理会停止。
<jsp:forward page="success.jsp" />
-
<jsp:param>
作用:通常与
<jsp:include>
或<jsp:forward>
一起使用,用于传递参数给被包含或转发的资源。类似url里使用?添加参数
---------------demo5.jsp------------
<jsp:forward page="demo6.jsp"><jsp:param name="param_name" value="luxiya"/><jsp:param name="param_name2" value="123456"/>
</jsp:forward>
---------------demo6.jsp------------
<%= request.getParameter("param_name")%>
<%= request.getParameter("param_name2")%>
<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>
<!-- 使用 <jsp:useBean> 创建或查找 User 对象,作用域为 session --><jsp:useBean id="user" class="com.example.User" scope="session" /><!-- 使用 <jsp:setProperty> 设置 User 对象的属性值 --><jsp:setProperty name="user" property="username" value="John" /><jsp:setProperty name="user" property="age" value="25" /><!-- 使用 <jsp:getProperty> 获取 User 对象的属性值并输出到页面 --><p>用户名: <jsp:getProperty name="user" property="username" /></p><p>年龄: <jsp:getProperty name="user" property="age" /></p>
JSTL标签
JSTL标签库使用步骤
- 引入对应的 taglib
- 使用其中的方法
- 在 Tomcat 也需要引入 JSTL 的包,否则会报错:JSTL 解析错误
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
<c:choose>
:无参数,作为条件判断的容器。 -
<c:when>
:test
为必填项,布尔类型的 EL 表达式,用于判断条件是否成立。 -
<c:otherwise>
:无参数,当所有<c:when>
的条件都不成立时执行其标签体内容。 -
<c:if>
:test
:必填项,一个布尔类型的 EL 表达式,用于判断条件是否成立。 -
<c:out>
value
:必填项,要输出的值,可以是 EL 表达式。default
:可选项,当value
为null
时显示的默认值。escapeXml
:可选项,布尔值,默认为true
,表示对特殊字符进行转义;若设为false
则不转义。
-
<c:set>
标签var
:必填项,要设置的变量名。value
:必填项,变量的值,可以是 EL 表达式。scope
:可选项,指定变量的作用域,取值为page
、request
、session
或application
,默认为page
。
-
<c:forEach>
-
items
:可选项,要遍历的集合、数组或迭代器,通过 EL 表达式指定。 -
var
:必填项,用于存储当前遍历元素的变量名。 -
begin
:可选项,指定循环开始的索引,从 0 开始计数。 -
end
:可选项,指定循环结束的索引。 -
step
:可选项,指定循环的步长,默认为 1。 -
varStatus
:可选项,用于存储循环状态信息的变量名,通过该变量可获取当前索引、是否为第一个元素等信息。
<c:out value="nihoa"/>
<%int i = 6;request.setAttribute("i", i); // 将变量 i 存储到 request 作用域中request.setAttribute("score", 80);
%>
<c:if test="${i > 0}"><p>正确</p>
</c:if><c:out value="<%=i%>" default="未知姓名" escapeXml="true"/><c:set var="name" value="luxiya" scope="page"></c:set>
<c:out value="${name}" default="未知姓名" escapeXml="false"/><c:choose><c:when test="${score >= 90}"><p>成绩优秀</p></c:when><c:when test="${score >= 60}"><p>成绩及格</p></c:when><c:otherwise><p>成绩不及格</p></c:otherwise>
</c:choose><%ArrayList<String> people = new ArrayList<>();people.add(0,"张三");people.add(1,"李四");people.add(2,"王五");people.add(3,"赵六");people.add(4,"田六");request.setAttribute("list",people);
%><%--
var , 每一次遍历出来的变量
items, 要遍历的对象
begin, 哪里开始
end, 到哪里
step, 步长
--%>
<c:forEach var="people" items="${list}"><c:out value="${people}"/> <br>
</c:forEach><hr><c:forEach var="people" items="${list}" begin="1" end="4" step="2" ><c:out value="${people}"/> <br>
</c:forEach>
<%-- 结果:李四,赵六--%>