16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web

简介: 16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web

在Java Web开发领域,JavaServer Pages(JSP)作为一种动态网页技术,在构建高效Web应用程序中发挥着核心作用。本文将详细介绍JSP的基础概念,包括其基本结构、注释方法、Scriptlet的使用、Page指令元素的功能以及Include包含操作,同时辅以代码示例和应用场景总结。

16.1 JSP简介

JavaServer Pages (JSP) 是Sun Microsystems(现Oracle公司)开发的一种用于构建动态Web内容的技术。JSP页面本质上是HTML或XML文档,其中嵌入了Java代码片段和JSP元素,这些元素在被Web容器处理时会被转换为Servlet源码并编译成Java类,以便响应客户端请求。

当用户向服务器发送请求时,Web容器会将JSP页面解析,执行其中的Java代码,然后生成包含动态内容的HTML或其他格式的响应。这种机制允许开发者使用Java的强大功能来创建动态网页,同时保持页面设计与业务逻辑分离的良好架构。

JSP的优点:

  1. 表现层与业务逻辑分离:通过JSP标准标签库(JSTL)和EL表达式等技术,可以更好地实现MVC模式。
  2. 跨平台性:由于基于Java语言,因此具有良好的跨平台特性,可在任何支持Java Servlet容器上运行。
  3. 可扩展性:可以方便地与其他Java技术集成,如EJB、Spring框架等。
  4. 易于维护:JSP页面中可以通过定制标签等方式封装常用功能,简化维护工作。

16.2 JSP注释

  • HTML注释:通常用于隐藏对浏览器有意义但不希望客户端看到的文本信息。
<!-- 这是一个HTML注释,在浏览器中不会显示 -->
  • JSP注释:这类注释只在服务器端起作用,编译期间就会被剔除,不会包含在生成的Servlet代码中,也不会传递给客户端。
<%-- 这是一个JSP注释,客户端无法看到 --%>

16.3 JSP Scriptlet

Scriptlet是一种直接在JSP页面中插入Java代码块的方式,它们以<% %>包裹,可以在其中定义变量、执行循环、条件判断以及调用方法等操作。

<%
    String userName = "User";
    out.println("Hello, " + userName);
%>

然而,过度使用Scriptlet违背了MVC设计理念,推荐尽量使用EL表达式和JSTL标签替代Scriptlet来减少Java代码在视图层中的暴露。

16.4 JSP Page指令元素

Page指令是用来控制JSP页面特定行为的关键元素,它以<%@ page ... %> 的形式出现,并且可以设置多种属性,例如:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
         import="java.util.*, com.example.MyClass" isErrorPage="false" %>

上述例子中:

  • language 指定了脚本语言类型,默认为Java。
  • contentType 定义了HTTP响应的MIME类型及其字符编码。
  • pageEncoding 设置了JSP页面本身的编码方式。
  • import 导入需要在当前JSP页面使用的Java类或包。
  • isErrorPage 标识当前JSP是否作为错误处理页面。

16.5 JSP Include操作

包括两种类型的include:

  1. 静态包含(Static Include):
    使用<%@ include file="relative/path/to/file.jsp" %>语句,静态包含会在编译阶段合并指定文件的内容到当前JSP文件中。这样就可以复用公共头部、尾部或者菜单等静态组件。
<%@ include file="/common/header.jsp" %>
   <!-- 页面主体内容 -->
   <%@ include file="/common/footer.jsp" %>
  1. 动态包含(Dynamic Include):
    使用<jsp:include page="relative/path/to/page.jsp" />动作,动态包含会在运行时根据URL动态加载并渲染另一个JSP页面,而且可以传入参数。
<jsp:include page="menu.jsp">
       <jsp:param name="section" value="main" />
   </jsp:include>

在此示例中,menu.jsp可以根据传入的section参数值动态展示不同的菜单项。

16.6 JSP内置对象

JSP提供了9种内置对象,它们由容器创建并自动注入到每个JSP页面中:

  • request: 表示HTTP请求信息。
  • response: 表示HTTP响应信息。
  • session: 表示用户会话。
  • application: 表示整个Web应用上下文。
  • out: 用于向客户端输出数据。
  • config: 包含Servlet配置信息。
  • pageContext: 提供对所有其他内置对象以及JSP页面的上下文访问。
  • page: JSP页面本身,作为一个Servlet实例。
  • exception: 只在错误处理页面中可用,表示异常信息。

16.7 JSP中的四种属性范围

  1. Page scope: 属性只在当前JSP页面有效。
<% 
       pageContext.setAttribute("message", "Hello from page scope");
   %>
  1. Request scope: 属性在一次HTTP请求过程中有效,可以跨越多个Servlet和JSP页面。
request.setAttribute("message", "Hello from request scope");
  1. Session scope: 属性在用户的一次会话期间有效。
session.setAttribute("message", "Hello from session scope");
  1. Application scope (也称作ServletContext scope): 属性在整个Web应用程序生命周期内有效。
application.setAttribute("message", "Hello from application scope");

16.8 区别总结与应用场景

下面是一个简单的JSP页面示例,它展示了如何使用基本的HTML结构、JSP注释、Scriptlet、EL表达式以及静态包含:

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- JSP注释 -->
<%-- This is a server-side comment and will not be visible to the client --%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <%-- 使用Page指令导入需要的包 --%>
    <%@ page import="java.util.Date" %>
    <title>JSP Page Example</title>
</head>
<body>
<h1>Welcome to My Application!</h1>
<!-- 静态包含公共头部 -->
<%@ include file="common/header.jsp" %>
<p>当前服务器时间是:</p>
<%
    // Scriptlet 示例:获取当前系统时间
    Date currentDate = new Date();
%>
<p><%= currentDate %> (使用Scriptlet插入动态内容)</p>
<!-- 使用EL表达式显示相同的时间 -->
<p>当前服务器时间也是:${currentDate.time}</p>
<!-- 假设我们有一个Bean类,并且已经通过Servlet或者框架将其设置到request作用域 -->
<jsp:useBean id="user" class="com.example.User" scope="request"/>
<p>欢迎用户:${user.name}!</p>
<!-- 静态包含公共尾部 -->
<%@ include file="common/footer.jsp" %>
</body>
</html>

在这个例子中:

  • @page 指令用于定义JSP页面的一些属性。
  • 使用了JSP注释来隐藏对客户端无意义的服务器端信息。
  • Scriptlet 用于在服务器端生成并输出当前日期。
  • EL表达式(${currentDate.time})同样用于显示当前日期,但更推荐这种做法,因为它遵循MVC原则,使视图与业务逻辑分离。
  • jsp:useBean 标签用于查找或创建一个JavaBean对象,并绑定到指定的作用域。
  • 静态包含 (<%@ include file="...">) 用于整合页面中的公共部分。

请注意,在实际开发中,现代最佳实践通常建议避免直接使用Scriptlet和尽可能减少Java代码在JSP中的占比,转而采用JSTL标签和EL表达式进行视图层的数据展示。

区别总结

  • JSP注释主要用于程序员自己阅读和调试代码,而HTML注释是为了在客户端隐藏文本内容。
  • Scriptlet虽然可以直接书写Java代码,但过度使用会导致MVC分离度降低,不利于维护。
  • Page指令元素是JSP页面的重要配置部分,影响整个页面的行为和环境设定。
  • 包含操作能够提高代码重用率,静态包含更适合共享静态布局和组件,动态包含则可适应动态变化的内容。

应用场景总结

  • JSP注释常用于标记待修改的部分、记录开发说明或临时禁用某段代码。
  • Scriptlet在早期JSP应用中广泛用于执行简单计算或访问数据库,但在现代实践中推荐使用EL表达式和JSTL标签替代。
  • Page指令元素在每个JSP页面开始处用来配置全局属性,如设置字符集、引入自定义标签库等。
  • Include操作有助于实现页面模板化,常见于网站公共头部、尾部、菜单栏等重复性内容的复用场景,以及根据不同条件动态加载不同内容的情况。


目录
相关文章
|
4月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
165 24
|
4月前
|
人工智能 Java
java中static关键字简介
`static`关键字用于修饰类的成员变量和方法,使其属于类而非对象。静态成员可通过类名直接访问,无需实例化对象。静态方法只能访问静态成员,不能直接访问非静态成员或使用`this`关键字。此外,静态代码块在类首次加载时执行且仅执行一次,适用于初始化操作。
179 0
|
8月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
395 29
JVM简介—1.Java内存区域
|
8月前
|
Java Linux API
课时3:Java简介(Java主要特点)
本文介绍了Java的主要特点及其运行机制。Java结合了编译型和解释型语言的优点,通过Java虚拟机(JVM)实现跨平台移植,简化了不同操作系统间的开发流程。Java的特点包括可移植性、简单易用、支持多线程编程、自动垃圾收集和面向对象编程。随着硬件技术的发展,Java的性能问题已大大改善,成为行业标准之一,广泛应用于各种商用平台开发。
282 1
|
8月前
|
开发框架 移动开发 Java
课时2:Java简介(Java发展概述)
课时2:Java简介(Java发展概述) 摘要: 1. Java基础知识:介绍Java作为编程语言及其思想。 2. Java的发展历史:从1991年GREEN项目到1995年正式推出,历经网景公司、HotJava浏览器等关键节点。 3. Java的版本信息:涵盖从JDK 1.0到JDK 1.8的主要版本及特性,如Lambda表达式和模块化支持。
177 0
|
8月前
|
存储 Java C语言
课时11:Java数据类型简介
本文介绍了Java中的数据类型划分,主要分为基本数据类型和引用数据类型。基本数据类型包括数值型(整型、浮点型)、布尔型和字符型,每种类型有固定的默认值和存储范围。引用数据类型涉及内存使用,如数组、类和接口,默认值为Null。文中还提供了不同类型的选择原则,帮助开发者在实际编程中合理选用数据类型。
119 0
|
8月前
|
Oracle Java Unix
课时1:认识Java(Java发展简介)
课时1:认识Java(Java发展简介)。主讲人李兴华介绍了Java的起源、发展历程及其广泛应用。Java由Sun公司开发,最初为嵌入式系统设计,后演变为三大方向:Java SE、Java ME和Java EE。尽管面临版权争议等挑战,Java仍是最流行的编程语言之一,广泛应用于大型企业及互联网平台开发。
118 0
|
10月前
|
自然语言处理 Java 关系型数据库
Java mysql根据很长的富文本如何自动获取简介
通过使用Jsoup解析富文本并提取纯文本,然后根据需要生成简介,可以有效地处理和展示长文本内容。该方法简单高效,适用于各种应用场景。希望本文对您在Java中处理富文本并生成简介的需求提供实用的指导和帮助。
188 9
|
11月前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
178 2
Java 中的 String Pool 简介
编写一个jsp页面,利用Scriptlet编写一段计算代码,要求用零作为除数,并使用page指令将错误信息显示在另外一个jsp页面,产生的错误信息为“错误,不能用0做除数”
该文章展示了如何创建一个JSP页面,使用Scriptlet编写包含除零操作的计算代码,并配置page指令将错误信息重定向至另一个JSP页面进行显示。
编写一个jsp页面,利用Scriptlet编写一段计算代码,要求用零作为除数,并使用page指令将错误信息显示在另外一个jsp页面,产生的错误信息为“错误,不能用0做除数”