杰瑞科技汇

JSP如何调用带参Java方法?参数如何传递?

  1. 调用静态方法:方法属于一个类,不需要创建实例。
  2. 调用实例方法:方法属于一个类的对象,需要先创建该类的实例。

下面我将详细讲解这两种情况,并提供最常用和推荐的最佳实践方法。

JSP如何调用带参Java方法?参数如何传递?-图1
(图片来源网络,侵删)

核心思想

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);
%>

示例:

JSP如何调用带参Java方法?参数如何传递?-图2
(图片来源网络,侵删)

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 页面中分离出去,使页面更加整洁。

步骤:

  1. 添加 JSTL 依赖:在你的 pom.xml (Maven) 或 build.gradle (Gradle) 文件中添加 JSTL 依赖。
    <!-- Maven 依赖 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
  2. 在 JSP 页面中引入 JSTL 核心标签库
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. 创建一个 Java 类(通常称为 "Tag Handler" 或 "Helper Class"):这个类包含你想要调用的方法,并且方法必须是 public static 的。
  4. 在 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 方法,但可以调用特定类型的对象方法(如 getterstoString() 等)。

当你需要在 JSP 中传递参数给一个对象的方法时,通常会这样做:

  1. 在 Servlet 中创建对象,并调用其方法,然后将结果存入作用域。
  2. 在 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(方法三) 的组合,这才是最规范、最健壮、最易于扩展的架构。尽量避免使用脚本片段(方法一)

分享:
扫描分享到社交APP
上一篇
下一篇