使用JSP踩过的坑

发布于:2025-05-29 ⋅ 阅读:(63) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到