虽然说jsp已经过时了,但是有时维护比较老的项目还是需要的。

下面说下,我使用jsp踩过的坑:

1.关于打印输出

在jsp中输出使用

out.println("hello");

而不是

System.out.println("hello");

如果在定义函数部分需要打印输出,需要注入JspWriter个对象。

<%! // 示例方法:模拟获取用户信息的方法String getUserInfo(String token, JspWriter out) {// 你的实际逻辑return "username";}
%>
<%String user = getUserInfo(token, out);
%>

2.关于页面跳转

response.sendRedirect(url);

如果使用该函数进行跳转,有个问题需要注意:就是现在很多应用都是单页面应用(SPA),如果遇到URL路径中有“#”的情况下,服务端会忽略掉“#”后面的片段再进行跳转,这样会导致无法跳转到正常的页面上。

这时候建议使用前端跳转,例如:

<!-- 统一由前端跳转 -->
<script>
window.location.href = '<%= redirectUrl %>';
</script>

3.关于return

在java代码部分,如果提前return,那么不止后面java代码的命令不会被执行了,连前端代码也不会被执行了。jsp页面会终止所有输出。

之前我一直以为只会终止java代码部分,不会终止前端代码部分。导致前端代码一直没被执行,排查了好久,才将问题排除出来。

4.参数获取

request.getParameter 方法可以 统一获取请求中的参数值,不论是通过 GET 还是 POST 方式提交的请求。

  • 对于 GET 请求:参数在 URL 的查询字符串中(即 ?name=value 那部分)。
  • 对于 POST 请求:如果是表单提交,参数通常在请求体中。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>获取参数示例</title>
</head>
<body>
<%// 获取名为paramName的参数值String paramValue = request.getParameter("paramName");if (paramValue != null && !paramValue.isEmpty()) {out.println("参数值为: " + paramValue);} else {out.println("没有提供参数或者参数为空。");}
%>
</body>
</html>

5.关于<%! %><% %>

之前我一直以为两个标签是一个意思,所以把代码放一起像js那样使用,把声明和调用按顺序排下来。后来发现代码不生效,才发现两者是两码事。

<%! %>:这个标签用于声明类级别的变量和方法。任何在<%! %>标签内定义的内容都会被插入到由JSP生成的Servlet类的主体中,但位于类的任意一个方法之外。这意味着你可以在<%! %>标签内声明实例变量、静态变量以及方法。

<% %>:这个标签被称为JSP Scriptlet,允许你在JSP页面中嵌入Java代码段。Scriptlet中的代码会被直接插入到由JSP生成的Servlet类的_jspService()方法中。这意味着任何在Scriptlet中声明的变量都是局部变量,仅在该Scriptlet的作用域内有效。

总结来说,<%! %>用于声明在整个JSP页面范围内都可以访问的方法或变量(即类级别),而<% %>则用于编写具体的Java代码块,这些代码块将作为Servlet的服务方法的一部分被执行(即方法级别)。两者的主要区别在于它们定义的位置和作用范围。

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

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

相关文章

redis集群创建时手动指定主从关系的方法

适用场景&#xff1a; 创建主从关系时默认参数 --cluster-replicas 1 会自动分配从节点。 为了能精确控制 Redis Cluster 的主从拓扑结构&#xff0c;我们通过 Redis Cluster 的手动分片功能来实现 一、手动指定主从关系的方法 使用 redis-cli --cluster-replicas 0 先创建纯…

ROS合集(七)SVIn2声呐模块分析

文章目录 一、整体思想二、具体误差建模流程三、总结明确&#xff08;预测值与观测值&#xff09;四、选点逻辑五、Sonar 数据处理流水线1. ROS Launch 配置&#xff08;imagenex831l.launch&#xff09;2. SonarNode 节点&#xff08;sonar_node.py&#xff09;3. Subscriber …

Python爬虫实战:研究PySpider框架相关技术

1. 引言 1.1 研究背景与意义 网络爬虫作为互联网数据采集的重要工具,在信息检索、舆情分析、市场调研等领域发挥着重要作用。随着互联网信息的爆炸式增长,如何高效、稳定地获取所需数据成为了一个关键挑战。PySpider 作为一款功能强大的 Python 爬虫框架,提供了丰富的功能…

《大模型开源与闭源的深度博弈:科技新生态下的权衡与抉择》

开源智能体大模型的核心魅力&#xff0c;在于它构建起了一个全球开发者共同参与的超级协作网络。想象一下&#xff0c;来自世界各个角落的开发者、研究者&#xff0c;无论身处繁华都市还是偏远小镇&#xff0c;只要心怀对技术的热爱与追求&#xff0c;就能加入到这场技术狂欢中…

大数据模型对陌生场景图像的识别能力研究 —— 以 DEEPSEEK 私有化部署模型为例

摘要 本研究聚焦于已训练的大数据模型能否识别未包含在样本数据集中的陌生场景图像这一问题&#xff0c;以 DEEPSEEK 私有化部署模型为研究对象&#xff0c;结合机器学习理论&#xff0c;分析模型识别陌生场景图像的影响因素&#xff0c;并通过理论探讨与实际应用场景分析&…

STM32——从点灯到传感器控制

STM32基础外设开发&#xff1a;从点灯到传感器控制 一、前言 本篇文章总结STM32F10x系列基础外设开发实例&#xff0c;涵盖GPIO控制、按键检测、传感器应用等。所有代码基于标准库开发&#xff0c;适合STM32初学者参考。 二、硬件准备 STM32F10x系列开发板LED模块有源蜂鸣器…

[特殊字符] 使用增量同步+MQ机制将用户数据同步到Elasticsearch

在开发用户搜索功能时&#xff0c;我们通常会将用户信息存储到 Elasticsearch&#xff08;简称 ES&#xff09; 中&#xff0c;以提高搜索效率。本篇文章将详细介绍我们是如何实现 MySQL 到 Elasticsearch 的增量同步&#xff0c;以及如何通过 MQ 消息队列实现用户信息实时更新…

MyBatis缓存机制全解析

在MyBatis中&#xff0c;缓存分为一级缓存和二级缓存&#xff0c;它们的主要目的是减少数据库的访问次数&#xff0c;提高查询效率。下面简述这两种缓存的工作原理&#xff1a; 一、 一级缓存&#xff08;SqlSession级别的缓存&#xff09; 一级缓存是MyBatis默认开启的缓存机…

【短距离通信】【WiFi】WiFi7关键技术之4096-QAM、MRU

目录 3. 4096-QAM 3.1 4096-QAM 3.2 QAM 的阶数越高越好吗&#xff1f; 4. MRU 4.1 OFDMA 和 RU 4.2 MRU 资源分配 3. 4096-QAM 摘要 本章主要介绍了Wi-Fi 7引入的4096-QAM对数据传输速率的提升。 3.1 4096-QAM 对速率的提升 Wi-Fi 标准一直致力于提升数据传输速率&a…

【二刷力扣】【力扣热题100】今天的题目是:283.移动零

题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输…

机器学习中的多GPU训练模式

文章目录 一、数据并行&#xff08;Data Parallelism&#xff09;二、模型并行&#xff08;Model Parallelism&#xff09;1. 模型并行2. 张量并行&#xff08;Tensor Parallelism&#xff09; 三、流水线并行&#xff08;Pipeline Parallelism&#xff09;四、混合并行&#x…

《JavaScript 性能优化:从原理到实战的全面指南》

《JavaScript 性能优化&#xff1a;从原理到实战的全面指南》 一、JavaScript 性能优化基础理论 在深入探讨 JavaScript 性能优化技术之前&#xff0c;我们需要明白JavaScript 的执行机制和性能瓶颈产生的根本原因。JavaScript 是一种单线程、非阻塞的脚本语言&#xff0c;其…

选择合适的Azure数据库监控工具

Azure云为组织提供了众多服务&#xff0c;使其能够无缝运行应用程序、Web服务和服务器部署&#xff0c;其中包括云端数据库部署。Azure数据库能够与云应用程序实现无缝集成&#xff0c;具备可靠、易扩展和易管理的特性&#xff0c;不仅能提升数据库可用性与性能&#xff0c;同时…

9.4在 VS Code 中配置 Maven

在 VS Code 中配置 Maven 需要完成 Maven 环境安装 一、安装 Maven&#xff08;如果未安装&#xff09; 下载 Maven 访问 Apache Maven 官网&#xff0c;下载最新版本的 Maven&#xff08;如apache-maven-3.9.9-bin.zip&#xff09;。 解压文件 将下载的 ZIP 文件解压到本地目…

影刀自动化流程复用技巧:流程复用

草莓时刻会创建一个新的空白流程。但是很多时候需要复用过往基础流程&#xff0c;在此基础上进行修改即可。而而不是重新创建基础流程。 为了解决这个问题&#xff0c;我们需要了解一下影刀流程的基础结构。 影刀流程基础结构概览 影刀自动化流程的基础结构主要包括几个关键组…

理论篇六:如何在Webpack中实现持久化缓存?

在 Webpack 中实现持久化缓存可以显著提升构建速度,尤其是在大型项目中。以下是 7 种核心策略 及其详细配置方法: 一、文件哈希命名(Content Hash) 确保文件内容变化时哈希值才改变,利用浏览器缓存。 // webpack.config.js output: {filename: [name].[contenthash:8].j…

C++单例模式与线程安全

C单例模式的线程安全实践与优化-CSDN博客 https://www.zhihu.com/question/56527586/answer/2344903391 C11中的单例模式 在C11及更高版本中&#xff0c;可以使用std::call_once和std::once_flag来确保单例实例的线程安全初始化。这种方法不需要显式地使用互斥锁&#xff0c…

UE5 图片导入,拖到UI上变色

UE5会自动把蓝色的图片当成法线贴图处理&#xff0c;非常傻逼 双击出问题的图片&#xff0c;右侧面板将压缩设置从法线改回默认

服务器安装xfce桌面环境并通过浏览器操控

最近需要运行某个浏览器的脚本&#xff0c;但是服务器没有桌面环境&#xff0c;无法使用&#xff0c;遂找到了KasmVNC&#xff0c;并配合xfce实现低占用的桌面环境&#xff0c;可以直接使用浏览器进行操作 本文基于雨云——新一代云服务提供商的Debian11服务器操作&#xff0c;…

Python函数全面解析:从基础到高级特性

文章目录 Python函数全面解析&#xff1a;从基础到高级特性一、函数基础概念1. 什么是函数&#xff1f;2. 函数的组成部分 二、函数的参数传递1. 参数类型对比2. 参数传递示例 三、函数的作用域作用域示例global和nonlocal关键字 四、函数的属性和方法1. 函数的特殊属性2. 函数…