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操作有助于实现页面模板化,常见于网站公共头部、尾部、菜单栏等重复性内容的复用场景,以及根据不同条件动态加载不同内容的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于OOA-LSSVM鱼鹰算法…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(下)

目录 沈阳市的空气质量 华夫图 柱状图 总结 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市&#xff0c;使用华夫图和柱状图分析各个城市的情况 沈阳市的空气质量 华夫图 import numpy as np import pandas as pd import matplotlib.pyplot as plt …

Servlet(java web基础篇)

Servlet&#xff08;java web基础篇&#xff09; Servlet是Java提供的一门动态web资源开发技术,不同的用户访问看到的效果不一样。Servlet是lavaEE规范之一&#xff0c;其实就是一个接口&#xff0c;将来我们需要定义Servlet类实现Servlet:接口&#xff0c;并由web服务器运行S…

TorchVision的使用方法、更改默认路径

TorchVision的使用 1. 转换和增强图像 torchvision.transforms.v2 参数作用Resize将输入调整为给定大小RandomShortestSize随机调整输入的大小RandomResize随机调整输入的大小RandomCrop在随机位置裁剪输入RandomResizedCrop裁剪输入的随机部分并将其调整为给定大小RandomIoU…

Java生成微信小程序二维码的方式有哪些?

大家好我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01;今天我们来谈一下如何使用Java生成微信小程序二维码&#xff0c;有哪些方式方法呢&#xff1f; 生成微信小程序二维码是开发微信小程序时的常见需求之一。在Java中&#xff0c;我们可以使用多种方式来生成微信小程…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-11-playwright操作iframe-上篇

1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了&#xff0c;因为前边的窗口切换就为这种网页处理提供了思路&#xff0c;另一个原因就是虽然iframe很强大&#xff0c;但是现在很少有网站用它了。但是还是有小伙伴或者童鞋们私下问这个问题&#xff0c;那么宏哥就…

【后端开发】正向代理与反向代理

正向代理 正向代理&#xff08;forward proxy&#xff09;&#xff1a;是一个位于客户端和目标服务器之间的服务器(代理服务器)&#xff0c;为了从目标服务器取得内容&#xff0c;客户端向代理服务器发送一个请求并指定目标&#xff0c;然后代理服务器向目标服务器转交请求并将…

【日志记录】——主MCU 通过私有协议更新从MCU程序固件

一&#xff1a;需求分析 在一些系统较为复杂的嵌入式设备中&#xff0c;往往不止一片MCU或者处理模块&#xff0c;通常为一片主MCU负责应用逻辑处理和对外网络通信&#xff0c;其他从MCU负责实时采集处理高频数据&#xff0c;在设备运营过程中&#xff0c;往往伴随新需求或者bu…

动态内容推荐系统PHP代码

这个系统旨在根据用户行为和偏好&#xff0c;动态地向用户推荐内容。这样的系统可以应用于新闻网站、社交媒体平台、电子商务网站等多种场景&#xff0c;以提升用户体验和参与度。 ### 功能概述 系统将基于用户的浏览历史、点击行为和时间花费等数据来评估用户的兴趣点&#…

BUUCTF-Real-[ThinkPHP]2-Rce1

任意代码执行漏洞 ThinkPHP 2.x版本中&#xff0c;使用preg_replace的/e模式匹配路由&#xff1a; $res preg_replace((\w).$depr.([^.$depr.\/])e, $var[\\\1\]"\\2";, implode($depr,$paths)); 导致用户的输入参数被插入双引号中执行&#xff0c;造成任意代码执行…

Open CASCADE学习|拓扑变换

目录 平移变换 旋转变换 组合变换 通用变换 平移变换 TopoDS_Shape out;gp_Trsf theTransformation;gp_Vec theVectorOfTranslation(0., 0.125 / 2, 0.);theTransformation.SetTranslation(theVectorOfTranslation);BRepBuilderAPI_Transform myBRepTransformation(out, th…

go 中的范型

泛型是随着Go 1.18版本发布的。它基本上意味着参数化的类型&#xff0c;也就是说&#xff0c;它允许程序员在写代码时&#xff0c;类型可以稍后指定&#xff0c;因为类型在当时并不相关。换句话说&#xff0c;在编写一些代码时&#xff0c;你不提供数值的类型。这些类型的值会在…

Leetcode刷题笔记题解(C++):36. 有效的数独

思路一&#xff1a;暴力破解&#xff0c;两个二维数组记录行、列对应的数字出现的次数&#xff0c;比如rows[i][index]表示的数字index在i行出现的次数&#xff0c;三维数组记录每个块中对应数字出现的次数&#xff0c;比如boxes[i/3][j/3][index]表示的数字index在[i/3][j/3]个…

校园墙表白墙系统uniapp微信小程序

配置文件 (自动编号、配置参数名称、配置参数值)&#xff1b; 前端开发:vue 语言&#xff1a;javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/thinkphp/springboot/springcloud均支持 数据库 mysql 数据库工具&#x…

定时器 Timer(超详细模拟实现)

目录 一、定时器 1.定时器概述 2.Java标准库提供的定时器类 3.定时器代码样例 二、实现 1.实现思路 2.代码实现 2.1纯享版 2.2注释版 3.代码解析(超详细) 3.1描述类MyTimerTask ①构造&#xff1a;MyTimerTask&#xff08;Runnable runnable, long delay&#xff…

如何使用本地私有NuGet服务器

写在前面 上一篇介绍了如何在本地搭建一个NuGet服务器&#xff0c; 本文将介绍如何使用本地私有NuGet服务器。 操作步骤 1.新建一个.Net类库项目 2.打包类库 操作后会生成一个.nupkg文件&#xff0c;当然也可以用dotnet pack命令来执行打包。 3.推送至本地NuGet服务器 打开命…

vue3 封装WebSocket(直接复制)

创建文件WebSocket.js 只有基本的功能 import { ref } from vue; import store from "/store";export default function useWebSocket(url) {const messagesData ref([]);// 创建WebSocket连接和相关方法const socket new WebSocket(url);socket.onopen () >…

《计算机网络简易速速上手小册》第6章:网络性能优化(2024 最新版)

文章目录 6.1 带宽管理与 QoS - 让你的网络不再拥堵6.1.1 基础知识6.1.2 重点案例&#xff1a;提高远程办公的视频会议质量实现步骤环境准备Python 脚本示例注意事项 6.1.3 拓展案例1&#xff1a;智能家居系统的网络优化实现思路Python 脚本示例 6.1.4 拓展案例2&#xff1a;提…

计算机网络_1.5 计算机网络的性能指标

1.5 计算机网络的性能指标 一、总览二、常用的八个计算机网络性能指标1、速率&#xff08;1&#xff09;数据量&#xff08;2&#xff09;速率&#xff08;3&#xff09;数据量与速率中K、M、G、T的数值辨析&#xff08;4&#xff09;【练习1】计算发送数据块的所需时间 2、带宽…

Unity引擎学习笔记之【角色动画器操作】

角色动画Character Animation 一、使用方法 1. 添加一个静态的角色模型&#xff0c;并确保这个角色模型绑定了Avatar 2. 创建一个动画器控制器 Animator Controller 3. 将动画器控制器拖动添加到Player的Animator控制器上 4. 双击即可打开控制器 5. 将带有动画的预设&#xf…