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

使用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.dtcms.com/a/212436.html

相关文章:

  • Double使用注意事项
  • 【编程实践】利用open3d对点云进行聚类并可视化
  • Kotlin IR编译器插件开发指南
  • 互联网大厂Java求职面试:短视频平台大规模实时互动系统架构设计
  • Eigen 库实现最小二乘算法(Least Squares)
  • Unity基础学习(九)Resources资源同步与异步加载
  • 如何在 Linux 系统中永久禁用交换分区 ?
  • 实验绘图参考-0525版(自用)
  • PostgreSQL 与 MongoDB:为您的数据项目选择合适的数据库
  • 记录第一次正式收到SCI期刊论文的审稿
  • Ubantu22.04离线安装、卸载mysql8.0.39并设置开机自启
  • 深入理解 Linux 的 set、env 和 printenv 命令
  • 使用粘滞键修改windows密码
  • 医学写作供应商管理全流程优化
  • 前端课设Web2
  • 微服务——网关
  • 第九章 云平台开发
  • 测试工程师如何通俗理解和入门RAG:从“查资料”到“写答案”的智能升级
  • 如何使用Webpack实现异步加载?
  • OC语言学习——Foundation框架回顾及考核补缺
  • Three.js 海量模型加载性能优化指南
  • 页表:从虚拟内存到物理内存的转换
  • 11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南
  • 资源-又在网上淘到金了-三维模型下载
  • 【AI论文】QuickVideo:通过系统算法协同设计实现实时长视频理解
  • window 显示驱动开发-Direct3D 呈现性能改进(四)
  • 11|省下钱买显卡,如何利用开源模型节约成本?
  • 分库分表深度解析
  • 基于RedisBloom的JWT黑名单管理方案
  • ISO 20000体系:需求管理与容量管理含义与解释