当前位置: 首页 > backend >正文

使用JSP踩过的坑

虽然说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.xdnf.cn/news/8862.html

相关文章:

  • 《算法笔记》12.2小节——字符串专题->KMP算法 问题 C: 剪花布条
  • 事务操作语句
  • ModbusRTU转profibusDP网关与电动机保护器通讯案例
  • 【操作系统】-4.3.1文件的层次结构
  • Linux驱动学习笔记(九)
  • Vue 3 (2) 模块化开发入门教程(ESM方式)
  • 32-低功耗与钩子函数
  • 人工智能数学基础实验(四):最大似然估计的-AI 模型训练与参数优化
  • 电路图识图基础知识-回路编号及代号(四)
  • 微信小程序常用方法
  • QListWidgetItem的函数介绍
  • Leetcode刷题 | Day67_图论12_Floyd算法 / A*算法
  • Kafka Consumer工作流程
  • 大数据治理:大数据环境下协同办公系统的数据串联与深度分析
  • python打卡训练营打卡记录day36
  • Windows系统部署Redis
  • Spring Cloud项目登录认证从JWT切换到Redis + UUID Token方案
  • 阿里千问系列:Qwen3技术报告解读(上)
  • 力扣第451场周赛
  • Linux基本指令篇 —— cd指令
  • 练习实践--deepseek的使用环境搭建回顾--火山方舟
  • (每日一道算法题)实现 pow(x, n) 的快速幂解法
  • 本地处理 + GPU 加速 模糊视频秒变 4K/8K 修复视频老旧素材
  • 前端协同文档实现思路
  • LLaMA-Factory 微调模型与训练数据量对应关系
  • 【每日一题 | 2025年5.19 ~ 5.25】动态规划相关题
  • 篇章一 数据结构——前置知识(一)
  • Java 类加载机制详解
  • 【SCL编程案例】1-16整数的随机排列
  • leetcode hot100刷题日记——第一周没做好的题目总结