JSP 简介

JavaServer Pages (JSP) 是一种基于 Java 的服务器端技术,用于开发动态网页。JSP 允许将 Java 代码嵌入 HTML 页面,通过 JSP 容器(如 Tomcat)编译为 Servlet 后执行。

JSP 工作原理

  1. 请求处理:客户端请求 JSP 页面时,服务器将 JSP 文件转换为 Servlet(Java 文件)。
  2. 编译执行:Servlet 被编译为字节码(.class 文件),由 JVM 执行并生成动态内容。
  3. 响应返回:生成的 HTML 内容返回给客户端浏览器。

JSP基础语法

JSP(JavaServer Pages)是一种动态网页技术,允许在HTML中嵌入Java代码。其核心语法包括脚本元素、指令、动作和内置对象。

JSP表达式

<%= new java.util.Date() %>

JSP脚本片段

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<html>
<head>
    <title>JSP示例</title>
</head>
<body>
    <%-- JSP注释(客户端不可见) --%>
    <!-- HTML注释(客户端可见) -->
    <% 
        // Java代码片段(Scriptlet)
        String message = "Hello, JSP!";
        out.println(message); // 输出到响应
    %>
    <%= "当前时间: " + new java.util.Date() %> <!-- 表达式(自动输出) -->
</body>
</html>
 

在代码中嵌入HTML元素

<% for(int i = 0; i < 5; i++) { %>
    <p>hello, world <%=i%></p>
<% } %>

JSP声明

在JSP中,声明用于定义变量或方法,这些变量或方法将在生成的Servlet类中作为成员变量或成员方法存在。声明语法如下:

<%! 
    // 变量或方法声明
    int count = 0;
    String getMessage() {
        return "Hello, World!";
    }
%>

EL表达式

${user.name}

JSP指令

通过page指令的errorPage属性可以指定当前页面发生异常时跳转的错误处理页面。错误处理页面需通过isErrorPage="true"声明。

<%@ page errorPage="error.jsp" %>
<%@ page isErrorPage="true" %>
<html>
<body>
    <h2>Error Occurred: <%= exception.getMessage() %></h2>
</body>
</html>

web.xml中可配置全局错误页面,根据异常类型或HTTP状态码跳转:

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.jsp</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/notFound.jsp</location>
</error-page>
JSP指令概述

JSP(JavaServer Pages)指令用于向JSP容器提供页面级别的配置信息,控制页面的整体行为。指令在编译阶段生效,不会直接生成输出内容。JSP指令通过<%@ %>标签声明。

常见JSP指令类型
page指令

语法:<%@ page 属性="值" %>
功能:定义页面依赖属性,如脚本语言、内容类型、错误页面等。
常用属性:

  • language:指定脚本语言(默认为Java)。
  • contentType:设置响应内容的MIME类型(如text/html;charset=UTF-8)。
  • import:导入Java包或类(多个类用逗号分隔)。
  • errorPage:指定当前页面发生异常时跳转的错误页面。
  • isErrorPage:标记当前页面是否为错误处理页面(默认为false)。

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*, java.io.*" %>
include指令


语法:<%@ include file="文件路径" %>
功能:在编译阶段静态包含其他文件(如JSP、HTML),合并内容后一起编译。
特点:

  • 适用于公共页眉、页脚等重复内容。
  • 文件路径为相对路径或绝对路径。

示例:

<%@ include file="header.jsp" %>
taglib指令


语法:<%@ taglib uri="标签库URI" prefix="前缀" %>
功能:引入自定义标签库(如JSTL)。
参数说明:

  • uri:标签库的唯一标识符或路径。
  • prefix:自定义标签的前缀(如c代表JSTL核心库)。

示例:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

注意事项

  1. 指令位置:通常放在JSP文件顶部,但除page指令外,其他指令可出现在任意位置。
  2. 重复属性page指令的import属性可重复,其他属性不可重复声明。
  3. 动态包含:若需运行时动态包含内容,应使用<jsp:include>动作标签而非include指令。

示例代码整合

以下是一个综合使用JSP指令的示例:

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.Date" %>
<%@ include file="header.jsp" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<body>
    <h1>当前时间:<%= new Date() %></h1>
    <c:out value="JSTL标签示例"/>
</body>
</html>

九大内置对象概述

在JSP(JavaServer Pages)中,九大内置对象是无需声明即可直接使用的对象,由JSP容器自动实例化和管理。这些对象简化了开发流程,提供了对请求、响应、会话等核心功能的便捷访问。

内置对象列表及功能

request对象
类型为javax.servlet.http.HttpServletRequest,封装客户端请求信息,如参数、头信息等。常用方法包括getParameter()getAttribute()

response对象
类型为javax.servlet.http.HttpServletResponse,用于向客户端发送响应。方法如setContentType()sendRedirect()

session对象
类型为javax.servlet.http.HttpSession,用于跟踪用户会话状态。支持setAttribute()getAttribute()等方法。

application对象
类型为javax.servlet.ServletContext,代表整个Web应用上下文。可共享全局数据,方法如getInitParameter()

out对象
类型为javax.servlet.jsp.JspWriter,用于向客户端输出内容。类似System.out,常用方法为print()println()

pageContext对象
类型为javax.servlet.jsp.PageContext,提供对页面所有对象及命名空间的访问。支持findAttribute()forward()

config对象
类型为javax.servlet.ServletConfig,封装JSP页面的配置信息。可通过getInitParameter()获取初始化参数。

page对象
类型为java.lang.Object,代表当前JSP页面实例,实际很少直接使用。

exception对象
类型为java.lang.Throwable,仅在错误页面(isErrorPage="true")中可用,用于捕获异常信息。

典型应用场景

数据传递
通过request.setAttribute()session.setAttribute()在不同作用域共享数据。

页面跳转
使用response.sendRedirect()pageContext.forward()实现页面重定向或转发。

日志记录
通过application.log()记录应用级日志信息。

异常处理
在错误页面中通过exception.printStackTrace()输出异常堆栈。

注意事项
  • 内置对象作用域不同:request仅限单个请求,session跨请求,application全局有效。
  • 避免滥用session,可能引发内存问题。
  • out对象与标准输出流性能不同,适合少量输出。

以上对象为JSP开发的核心工具,合理使用可显著提升开发效率。

JSP标签

JSP(JavaServer Pages)标签是一种嵌入在HTML中的特殊标记,用于简化Java代码在网页中的动态生成。JSP标签分为三类:指令标签脚本标签动作标签,每种标签有特定的语法和功能。

指令标签

指令标签以<%@开头,用于全局设置JSP页面的属性:

  • page指令:定义页面属性,如编码、会话控制等。
    <%@ page language="java" contentType="text/html; charset=UTF-8" %>
    
  • include指令:静态包含其他文件内容。
    <%@ include file="header.jsp" %>
    

  • taglib指令:引入自定义标签库。
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
脚本标签

脚本标签允许直接在JSP中嵌入Java代码:

  • 声明标签 <%! %>:定义成员变量或方法。
    <%! int count = 0; %>
    
  • 脚本片段 <% %>:插入Java逻辑代码。
    <% for(int i=0; i<5; i++) { %>
        <p>Iteration <%= i %></p>
    <% } %>
    
  • 表达式标签 <%= %>:输出变量或表达式结果。
    <p>Current time: <%= new java.util.Date() %></p>
    
动作标签

动作标签以<jsp:开头,用于动态行为控制:

  • include动作:运行时动态包含其他页面。
    <jsp:include page="footer.jsp" />
    
  • forward动作:将请求转发到其他页面。
    <jsp:forward page="error.jsp" />
    
  • useBean动作:创建或访问JavaBean对象。
    <jsp:useBean id="user" class="com.example.User" scope="session" />
    
JSTL与EL表达式
  • JSTL(JSP Standard Tag Library):通过<c:if><c:forEach>等标签简化逻辑控制。
    <c:forEach items="${users}" var="user">
        <p>${user.name}</p>
    </c:forEach>
    
  • EL(Expression Language)${}语法直接访问数据。
    <p>Welcome, ${sessionScope.user.name}</p>
    
自定义标签

通过继承TagSupportSimpleTagSupport实现自定义标签:

  1. 创建标签处理器类。
  2. 定义TLD(Tag Library Descriptor)文件。
  3. 在JSP中通过taglib指令引入并使用。
注意事项
  • 避免过度使用脚本标签,优先选择JSTL和EL。
  • 指令标签在编译阶段处理,动作标签在运行时处理。
  • 自定义标签需注意作用域(pagerequestsessionapplication)。

JSTL表达式基础概念

JSTL(JavaServer Pages Standard Tag Library)是一组标准标签库,用于简化JSP页面的开发。它提供了常见的功能标签,如循环、条件判断、格式化等,避免在JSP中直接编写Java代码。

核心标签库(Core Tags)

核心标签库是最常用的JSTL标签,需通过以下指令引入:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

常用标签示例:

  • 变量设置:
<c:set var="name" value="John" />
  • 条件判断:
<c:if test="${age > 18}">
   Adult
</c:if>
  • 循环遍历:
<c:forEach items="${userList}" var="user">
   ${user.name}
</c:forEach>
格式化标签库(Formatting Tags)

格式化标签库用于处理日期、数字和国际化,引入方式:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

示例:

  • 日期格式化:
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd" />
  • 数字格式化:
<fmt:formatNumber value="${price}" type="currency" />
函数标签库(Function Tags)

函数标签库提供字符串处理功能,引入方式:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

示例:

  • 字符串长度:
${fn:length(text)}
  • 字符串截取:
${fn:substring(text, 0, 5)}
EL表达式与JSTL结合

JSTL常与EL(Expression Language)表达式结合使用。EL用于访问数据,JSTL用于控制逻辑。

示例:

<c:set var="total" value="${price * quantity}" />

注意事项

  • JSTL标签需依赖正确的URI和库文件。
  • 避免在JSTL中嵌套过多逻辑,保持代码简洁。
  • 格式化标签需注意本地化设置。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐