JSP(Java Server Pages)是由 SUN 公司在 1996 年 6 月发布的一种基于 Java 技术的服务器端编程技术,用于开发动态 Web 应用。
从本质上讲,它是一个简化的 Servlet 设计。在传统的 HTML(标准通用标记语言的子集)文件(.htm、.html)中插入 Java 程序段(Scriptlet)和 JSP 标记(tag),就形成了 JSP 文件,后缀名为.jsp。
JSP 具有以下特点:
JSP本质上也是Servlet,在tomcat服务器上,**当你访问一个.jsp页面后,**在tomcat目录下的work文件夹中,可以找到.jsp编译的.class和.java文件。源代码如下,可以看出其本质也是Servlet。
public final class luxiya_jsp extends org.apache.jasper.runtime.HttpJspBase
implements 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() {
}
//JSPService
public 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 格式的响应信息发送回客户端。
// 作用:用来将程序的输出,输出到客户端
// <%= 变量或者表达式%>
<%= new java.util.Date() %>
<%--jsp脚本片段--%>
//在<%与%>之间可编写任意合法 Java 代码
int sum = 0;
for (int i = 1; i <=100 ; i++) {
sum+=i;
}
out.println("<h1>Sum="+sum+"h1>");
%>
//用于在 JSP 页面中声明 Java 类的成员变量和方法
//当创建实例时,就会执行static模块,name,luxiya分别就是该实例的成员变量和方法
<%!
String name = "luxiya";
static {
System.out.println("static block");
}
public void luxiya(){
System.out.println("luxiya");
}
%>
<%
luxiya();
%>
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 file="filename.jsp" %>
。<%@ taglib uri="taglibURI" prefix="tagPrefix" %>
,其中 uri
是标签库的 URI,prefix
是标签库的前缀。<%--@include会将两个页面合二为一--%>
<%@include file="common/header.jsp"%>
网页主体
<%@include file="common/footer.jsp"%>
<%--jSP标签
jsp:include:拼接页面,本质还是三个
--%>
网页主体
config
(对应 ServletConfig
)对象用于获取 Servlet 的初始化参数信息,一般不用于存储数据。
<%
// 获取初始化参数
String initParam = config.getInitParameter("paramName");
%>
初始化参数的值: <%= initParam %>
--------------------------------------------------
paramName
paramValue
out
对象用于向客户端输出文本内容,不是用于存储数据的。
<%
// 输出文本内容
out.println("这是使用 out 对象输出的内容
");
%>
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");
%>
pageContext:<%=namepageContext%>
request:<%=namerequest%>
session:<%=namesession%>
application:<%=nameapplication%>
---------------------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");
%>
这里是demo4.jsp
pageContext:<%=namepageContext%>
request:<%=namerequest%>
session:<%=namesession%>
application:<%=nameapplication%>
EL 表达式: ${}
JSP 脚本片段(<% %>
)里定义的变量,默认情况下不能直接在 EL 表达式中使用。EL 表达式有自己的变量解析机制,通常从pageContext
、request
、session
、application
等作用域中查找变量。
作用:在运行时动态包含另一个资源(如 JSP 页面、HTML 页面等)。被包含的资源会在请求处理时被执行,并将结果插入到当前页面中。
作用:将当前请求转发到另一个资源,原请求的所有信息(如请求参数、请求头)都会被传递到目标资源。转发后,当前页面的处理会停止。
作用:通常与
或
一起使用,用于传递参数给被包含或转发的资源。类似url里使用?添加参数
---------------demo5.jsp------------
---------------demo6.jsp------------
<%= request.getParameter("param_name")%>
<%= request.getParameter("param_name2")%>
,,
用户名:
年龄:
JSTL标签库使用步骤
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
:无参数,作为条件判断的容器。
:test
为必填项,布尔类型的 EL 表达式,用于判断条件是否成立。
:无参数,当所有
的条件都不成立时执行其标签体内容。
:test
:必填项,一个布尔类型的 EL 表达式,用于判断条件是否成立。
value
:必填项,要输出的值,可以是 EL 表达式。default
:可选项,当 value
为 null
时显示的默认值。escapeXml
:可选项,布尔值,默认为 true
,表示对特殊字符进行转义;若设为 false
则不转义。
标签
var
:必填项,要设置的变量名。value
:必填项,变量的值,可以是 EL 表达式。scope
:可选项,指定变量的作用域,取值为 page
、request
、session
或 application
,默认为 page
。items
:可选项,要遍历的集合、数组或迭代器,通过 EL 表达式指定。
var
:必填项,用于存储当前遍历元素的变量名。
begin
:可选项,指定循环开始的索引,从 0 开始计数。
end
:可选项,指定循环结束的索引。
step
:可选项,指定循环的步长,默认为 1。
varStatus
:可选项,用于存储循环状态信息的变量名,通过该变量可获取当前索引、是否为第一个元素等信息。
<%
int i = 6;
request.setAttribute("i", i); // 将变量 i 存储到 request 作用域中
request.setAttribute("score", 80);
%>
正确
成绩优秀
成绩及格
成绩不及格
<%
ArrayList 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, 步长
--%>
<%-- 结果:李四,赵六--%>