使用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的服务方法的一部分被执行(即方法级别)。两者的主要区别在于它们定义的位置和作用范围。