1. 概述

在处理JSP(JavaServer Pages)时,我们经常需要直接从JSP文件调用后端逻辑。无论是访问业务逻辑、执行计算还是从服务层获取数据,掌握在JSP中调用Java类的方法都至关重要。

本教程将探讨两种干净有效的实现方式。

2. 问题背景

在深入代码前,我们先理解动机。

由于JSP专注于表示层(MVC中的View层),有时调用Java类是必要的,尤其是在小型项目或遗留系统中。例如,在JSP文件中我们可能需要:

  • 执行后端计算
  • 复用工具方法
  • 访问Bean或业务逻辑
  • 避免在JSP中直接编写过多Java代码

本教程将学习两种实现方式。下面开始详解。

3. 使用JSP脚本片段

先看一个简单的Java类:

public class CourseWelcome {
    public String greeting(String username) {
        return String.format("Hi %s, how are you doing?", username);
    }

    public static String staticWelcome(String courseName) {
        return String.format("Welcome to Baeldung's %s course", courseName);
    }
}

CourseWelcome类中有两个方法:

  • greeting() - 实例方法,返回问候字符串
  • staticWelcome() - 静态方法,返回欢迎字符串

接下来看如何在JSP页面调用这两个方法。

本教程使用Spring Boot导航JSP页面。例如创建控制器和HTTP映射:

@Controller
@RequestMapping("/course")
public class WelcomeController {
    @GetMapping("/welcome")
    public String greetingAndWelcome() {
        return "course/welcome";
    }
}

为简化,省略Spring MVC配置部分。

现在在course/welcome.jsp中使用JSP脚本片段调用CourseWelcome的方法:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.baeldung.boot.jsp.coursewelcome.CourseWelcome" %>
<html>
<head>
    <title>Welcome to Course</title>
</head>
<body>
    <%
        CourseWelcome courseWelcomeObj = new CourseWelcome();
    %>
    <div><%= courseWelcomeObj.greeting("Kai")%></div>
    <div><%= CourseWelcome.staticWelcome("Spring Boot")%></div>
</body>
</html>

上述JSP文件首先importCourseWelcome类,然后在JSP脚本片段标签<%%>之间包裹Java代码创建对象。

通过JSP表达式标签(<%= ... %>)调用实例和静态方法并显示结果。

启动Spring Boot应用,浏览器访问页面:

使用脚本片段

页面正确显示了预期结果。

4. 使用<jsp:useBean>动作

另一种方式是使用<jsp:useBean>动作调用Java类。

4.1 调用CourseWelcome类

创建新JSP文件course/welcome-usebean.jsp调用CourseWelcome的方法:

<html>
<head>
    <title>Welcome to Course</title>
</head>
<body>
    <p>Using jsp:useBean action</p>
    <jsp:useBean id="welcomeBean" class="com.baeldung.boot.jsp.coursewelcome.CourseWelcome"/>
    <div>
        <%= welcomeBean.greeting("Kevin")%>
    </div>
    <div>
        <%= com.baeldung.boot.jsp.coursewelcome.CourseWelcome.staticWelcome("Java Collections")%>
    </div>
</body>
</html>

如代码所示,在<jsp:useBean>标签中:

  • 定义id作为JavaBean实例的引用(本例为welcomeBean
  • 指定Bean类的完整类名

可通过id调用CourseWelcome的实例方法(如welcomeBean.greeting()

⚠️ 注意:无法使用<jsp:useBean>调用类的静态方法,仍需在脚本片段或表达式标签中访问静态资源。

WelcomeController添加映射方法:

@Controller
@RequestMapping("/course")
public class WelcomeController {
    // ... 其他代码省略
    @GetMapping("/welcome-usebean")
    public String greetingAndWelcomeUseBean() {
        return "course/welcome-usebean";
    }
}

启动应用验证JSP文件:

使用jsp:usebean动作

截图显示<jsp:useBean>动作按预期工作。

4.2 使用JavaBean

顾名思义,<jsp:useBean>通常与JavaBean配合使用。典型的JavaBean包含属性、对应的getter/setter方法和默认构造函数

创建JavaBean类:

public class CourseWelcomeBean {
    private String username;
    private String courseName;

    //... getter和setter方法省略

    public String greetingUser() {
        return String.format("Hi %s, how do you do?", username);
    }

    public String welcomeMsg() {
        return String.format("Welcome to Baeldung's %s course!", courseName);
    }
}

CourseWelcomeBean包含两个属性和两个实例方法。

创建新JSP文件course/welcome-by-javabean.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Welcome to Course</title>
</head>
<body>
    <p>Using jsp:useBean action with a JavaBean</p>
    <jsp:useBean id="courseWelcomeBean" class="com.baeldung.boot.jsp.coursewelcome.CourseWelcomeBean"/>
    <jsp:setProperty name="courseWelcomeBean" property="username" value="Eric"/>
    <jsp:setProperty name="courseWelcomeBean" property="courseName" value="Spring Security"/>
    <div><%= courseWelcomeBean.greetingUser()%></div>
    <div><%= courseWelcomeBean.welcomeMsg()%></div>
</body>
</html>

代码说明:

  • 使用<jsp:useBean>声明JavaBean后
  • 通过<jsp:setProperty>设置Bean属性
  • 像往常一样调用Bean的实例方法

最后在控制器添加映射方法测试:

@Controller
@RequestMapping("/course")
public class WelcomeController {
    // ... 其他代码省略
    @GetMapping("/welcome-by-javabean")
    public String greetingAndWelcomeByJavaBean() {
        return "course/welcome-by-javabean";
    }
}

jsp:usebean与JavaBean配合使用

<jsp:useBean>动作与JavaBean配合使用时表现符合预期。

5. 总结

本文介绍了在JSP中调用Java类的两种方式:从基础脚本片段到结构化的<jsp:useBean>。随着应用复杂度增加,分离逻辑和视图层很重要,但这些知识在处理遗留系统或快速原型时仍很有价值。

完整示例代码可在GitHub获取。