上一篇
在JSP中可通过JavaBean、脚本片段或自定义标签调用Java程序,常用方式:使用`
声明Java类,
设置属性,
表达式或`脚本执行方法,推荐将业务逻辑封装在Servlet中,JSP仅负责显示。
在JSP中调用Java程序是Java Web开发的核心操作,遵循MVC设计模式和分层理念能确保代码的可维护性和安全性,以下是详细方法及最佳实践:
核心方法(推荐)
通过JavaBean调用(标准做法)
<%@ page import="com.example.Calculator" %> <jsp:useBean id="calc" class="com.example.Calculator" scope="request" /> <jsp:setProperty name="calc" property="*" /> <% int result = calc.add(5, 3); // 调用Java类方法 %> 结果:<%= result %>
- Java类示例:
package com.example; public class Calculator { public int add(int a, int b) { return a + b; } } - 关键点:
jsp:useBean:实例化Java类(自动匹配无参构造方法)。jsp:setProperty:自动将表单参数映射到Bean属性(需setter方法)。- 作用域:
request(请求级)、session(会话级)、application(全局)。
Servlet预处理 + JSP显示(MVC模式)
// Servlet中处理逻辑
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
UserService userService = new UserService();
List<User> users = userService.getAllUsers(); // 调用Java程序
request.setAttribute("userList", users); // 传递数据到JSP
request.getRequestDispatcher("/users.jsp").forward(request, response);
}
<!-- JSP仅负责显示 -->
<c:forEach items="${userList}" var="user">
${user.name}
</c:forEach>
- 优势:业务逻辑与视图分离,符合安全规范。
EL表达式 + JSTL调用静态方法
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
${fn:toUpperCase('hello')} <!-- 调用JSTL内置函数 -->
<!-- 调用自定义静态方法(需配置) -->
${my:MyStringUtils.reverse('abc')}
- 配置步骤:
- 创建TLD标签库描述文件。
- 在
web.xml中声明标签库。
传统方法(不推荐,仅作了解)
Scriptlet嵌入Java代码(过时)
<%
// 直接编写Java代码
String name = request.getParameter("name");
MyClass obj = new MyClass();
obj.process(name);
%>
- 缺点:导致JSP臃肿、难以维护,存在安全风险(如XSS攻击)。
JSP声明方法
<%!
// 在JSP中定义Java方法
public String formatDate(Date date) {
return new SimpleDateFormat("yyyy-MM-dd").format(date);
}
%>
<%= formatDate(new Date()) %>
- 风险:破坏MVC结构,仅适用于极简单场景。
安全与最佳实践
-
避免Scriptlet:

- 使用JSP 2.0+的EL和JSTL替代
<%%>代码。 - 在
web.xml中禁用Scriptlet:<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> </jsp-property-group> </jsp-config>
- 使用JSP 2.0+的EL和JSTL替代
-
输入验证与防注入:
// Servlet中过滤参数 String input = request.getParameter("input"); if (!isValid(input)) { // 自定义验证逻辑 throw new IllegalArgumentException("非规输入"); } -
依赖管理:

- 通过Maven/Gradle引入Java类:
<!-- pom.xml --> <dependency> <groupId>com.example</groupId> <artifactId>my-java-lib</artifactId> <version>1.0</version> </dependency>
- 通过Maven/Gradle引入Java类:
-
异常处理:
<%@ page errorPage="error.jsp" %> <!-- 或 --> <c:catch var="exception"> ${myBean.dangerousOperation()} </c:catch> <c:if test="${not empty exception}"> 错误信息:${exception.message} </c:if>
常见问题解决
- 类找不到(ClassNotFoundException):
- 检查类是否在
WEB-INF/classes(源码)或WEB-INF/lib/*.jar(依赖包)中。
- 检查类是否在
- 方法调用失败:
- 确保方法为
public,非静态方法需先实例化对象。
- 确保方法为
- 性能优化:
- 频繁调用的Java对象存储在
application作用域。 - 耗时操作异步处理(如Java线程池)。
- 频繁调用的Java对象存储在
推荐路径:
Servlet处理业务逻辑 → Java类封装核心功能 → JSP通过EL/JSTL/JavaBean显示结果。
此方案符合J2EE规范、易于维护,并通过分层设计提升安全性(如避免XSS/CSRF攻击),传统Scriptlet仅适用于遗留系统改造,新项目应严格遵循MVC。
引用说明基于Oracle官方JSP 2.3规范、OWASP Web安全指南及《Head First Servlets and JSP》最佳实践,技术细节参考自Apache Tomcat文档及Java EE教程。

