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文件首先import
了CourseWelcome
类,然后在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>
动作按预期工作。
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配合使用时表现符合预期。
5. 总结
本文介绍了在JSP中调用Java类的两种方式:从基础脚本片段到结构化的<jsp:useBean>
。随着应用复杂度增加,分离逻辑和视图层很重要,但这些知识在处理遗留系统或快速原型时仍很有价值。
完整示例代码可在GitHub获取。