- 调用静态方法:方法属于一个类,不需要创建实例。
- 调用实例方法:方法属于一个类的对象,需要先创建该类的实例。
下面我将详细讲解这两种情况,并提供最常用和推荐的最佳实践方法。

核心思想
JSP 的本质是一个 Servlet,它最终会被编译成 Java 代码,在 JSP 中调用 Java 方法,实际上是在 JSP 页面(编译后的 Servlet 类)中调用 Java 类的方法,参数传递遵循标准的 Java 方法调用规则。
使用脚本片段 (Scriptlet - <% ... %>) - 已不推荐
这是最传统、最直接的方法,直接在 JSP 页面中嵌入 Java 代码。
语法:
<%
// 1. 导入需要的类
// import com.example.utils.MathUtils;
// 2. 调用静态方法
int result1 = MathUtils.add(10, 20);
out.println("静态方法调用结果: " + result1);
// 3. 创建实例并调用实例方法
MyService service = new MyService();
String result2 = service.processData("Hello from JSP");
out.println("实例方法调用结果: " + result2);
%>
示例:

MyMathUtils.java (Java 类)
package com.example.utils;
public class MyMathUtils {
// 静态方法
public static int add(int a, int b) {
return a + b;
}
// 静态方法,接收 String 参数
public static String greet(String name) {
return "Hello, " + name + "!";
}
}
index.jsp (JSP 页面)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.example.utils.MyMathUtils" %>
<html>
<head>脚本片段示例</title>
</head>
<body>
<h1>使用脚本片段调用 Java 方法</h1>
<%
// 调用静态方法,传递 int 参数
int sum = MyMathUtils.add(5, 3);
out.println("<p>5 + 3 = " + sum + "</p>");
// 调用静态方法,传递 String 参数
String greeting = MyMathUtils.greet("World");
out.println("<p>" + greeting + "</p>");
%>
</body>
</html>
缺点:
- 维护困难:HTML 和 Java 代码混杂在一起,页面变得难以阅读和维护。
- 代码复用性差:业务逻辑写在 JSP 页面中,无法在其他地方复用。
- 违反 MVC 原则:Model(业务逻辑)、View(视图)、Controller(控制)没有分离,导致项目结构混乱。
虽然这种方法可行,但在现代 Web 开发中强烈不推荐使用。
使用 JSTL (JSP Standard Tag Library) - 推荐的最佳实践
这是目前最主流、最规范的方法,它通过自定义标签来调用 Java 代码,将 Java 逻辑从 JSP 页面中分离出去,使页面更加整洁。
步骤:
- 添加 JSTL 依赖:在你的
pom.xml(Maven) 或build.gradle(Gradle) 文件中添加 JSTL 依赖。<!-- Maven 依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> - 在 JSP 页面中引入 JSTL 核心标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- 创建一个 Java 类(通常称为 "Tag Handler" 或 "Helper Class"):这个类包含你想要调用的方法,并且方法必须是
public static的。 - 在 JSP 中使用
<c:set>和<c:out>标签来调用方法。
示例:
MyJstlUtils.java (Java 类)
package com.example.utils;
public class MyJstlUtils {
// 必须是 public static 方法
public static String formatMessage(String name, int count) {
return String.format("你好, %s! 你有 %d 条新消息。", name, count);
}
}
index.jsp (JSP 页面)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>JSTL 调用示例</title>
</head>
<body>
<h1>使用 JSTL 调用 Java 方法</h1>
<%--
1. 使用 <c:set> 调用静态方法,并将返回值存入变量 'formattedMsg'
2. var: 存储结果的变量名
3. value: 调用 Java 表达式,语法为 ${@包名.类名.方法名(参数)}
4. 参数可以是硬编码的值,也可以是其他变量
--%>
<c:set var="formattedMsg" value="${@com.example.utils.MyJstlUtils.formatMessage('张三', 10)}" />
<%-- 使用 <c:out> 输出变量值 --%>
<c:out value="${formattedMsg}" />
<hr>
<%-- 也可以将参数定义为变量 --%>
<c:set var="userName" value="李四" />
<c:set var="msgCount" value="5" />
<c:set var="anotherMsg" value="${@com.example.utils.MyJstlUtils.formatMessage(userName, msgCount)}" />
<p><c:out value="${anotherMsg}" /></p>
</body>
</html>
优点:
- 关注点分离:HTML 展示和 Java 业务逻辑完全分开。
- 代码清晰:JSP 页面只负责显示,非常易读。
- 可维护性高:修改业务逻辑只需改动 Java 类,不影响 JSP 页面。
- 符合 MVC 模式:是 MVC 架构中 V (View) 层的理想选择。
使用 EL (Expression Language) 表达式 - 配合 JSTL
EL 主要用于从作用域(request, session, application)中获取数据并显示,它本身不直接调用任意 Java 方法,但可以调用特定类型的对象方法(如 getters、toString() 等)。
当你需要在 JSP 中传递参数给一个对象的方法时,通常会这样做:
- 在 Servlet 中创建对象,并调用其方法,然后将结果存入作用域。
- 在 JSP 中使用 EL 表达式从作用域取出结果。
示例:
UserService.java (Java Bean/Model)
package com.example.model;
public class UserService {
public String getWelcomeMessage(String role) {
if ("admin".equals(role)) {
return "欢迎,管理员!";
} else {
return "欢迎,普通用户!";
}
}
}
MyServlet.java (Controller)
package com.example.controller;
import com.example.model.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/welcome")
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserService userService = new UserService();
// 1. 获取请求参数
String userRole = request.getParameter("role");
// 2. 调用 Java 方法,并传递参数
String message = userService.getWelcomeMessage(userRole);
// 3. 将结果存入 request 作用域
request.setAttribute("welcomeMsg", message);
// 4. 转发到 JSP 页面
request.getRequestDispatcher("/welcome.jsp").forward(request, response);
}
}
welcome.jsp (View)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>EL 表达式示例</title>
</head>
<body>
<h1>使用 EL 表达式显示数据</h1>
<%-- EL 会自动从作用域中查找 'welcomeMsg' 变量并显示 --%>
<p>${welcomeMsg}</p>
</body>
</html>
访问方式: http://your-app/welcome?role=admin
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
脚本片段<% ... %> |
简单直接,无需额外依赖 | 代码混乱,难以维护,违反 MVC | 快速原型、小型项目、学习阶段 |
| JSTL | 代码清晰,关注点分离,可维护性高,符合 MVC | 需要添加 JSTL 依赖,Java 方法必须是 public static |
所有生产环境项目的标准做法 |
| EL + Servlet | 真正的 MVC 分离,逻辑清晰 | 需要一个 Servlet 作为控制器 | 复杂应用,需要处理表单、请求、会话等 |
最终建议:
对于任何正式的 Java Web 项目开发,请优先使用 JSTL(方法二)来调用 Java 方法的参数,对于更复杂的业务流程,请采用 Servlet + EL + JSTL(方法三) 的组合,这才是最规范、最健壮、最易于扩展的架构。尽量避免使用脚本片段(方法一)。
