JSP学习

文章目录

  • 什么是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.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运行过程:

  1. 当 JSP 文件首次被请求时,JSP 容器将其转化成一个 Java 源文件(Java Servlet 源程序),若存在语法错误,中断转换并返回错误信息。(eg: Tomcat 支持JSP,它既是一个开源的 Servlet 容器,也是一个 JSP 容器)

  2. 转换成功后,JSP 容器使用 javac 将生成的 Java 源文件编译成字节码文件.class,这就是一个 Servlet。

    (javac是 Java 开发工具包(JDK)中的一个重要命令行工具,它主要用于将 Java 源代码文件(扩展名为 .java)编译成 Java 字节码文件,扩展名为 .class)

  3. 由Servlet容器加载转换后的Servlet类(.class文件)创建一个该Servlet(JSP页面的转换结果)实例,并执行 jspInit () 方法,该方法在 Servlet 生命周期中仅执行一次。

  4. 执行_jspService 方法处理客户端请求。

  5. 若 JSP 文件被修改,服务器按设置决定是否重新编译,若重新编译,使用新结果取代常驻内存的 Servlet 并继续后续处理。

  6. 首次调用时因转换和编译可能产生轻微延迟。此外,因系统资源不足等,JSP 容器可能以不确定方式将 Servlet 从内存移除,此时先调用 jspDestory () 方法。

  7. 接着 Servlet 实例被 “垃圾收集” 处理。

  8. 请求处理完成后,响应对象由 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 表达式有自己的变量解析机制,通常从pageContextrequestsessionapplication等作用域中查找变量。

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:可选项,当 valuenull 时显示的默认值。
    • escapeXml:可选项,布尔值,默认为 true,表示对特殊字符进行转义;若设为 false 则不转义。
  • <c:set> 标签

    • var:必填项,要设置的变量名。
    • value:必填项,变量的值,可以是 EL 表达式。
    • scope:可选项,指定变量的作用域,取值为 pagerequestsessionapplication,默认为 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>
<%-- 结果:李四,赵六--%>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值