目录
一、JSP概述
JSP(JavaServer Pages)是一种用于开发动态Web应用的技术。它允许将Java代码嵌入到HTML标记中,用于在服务器端生成动态页面内容。作为Java EE技术的一部分,JSP可以与Servlets、JavaBeans和Java Server Faces等组件结合使用,实现复杂的Web应用程序。
JSP最早于1998年发布,作为Java Servlet架构的进一步扩展被引入。它采用了类似于ASP(Active Server Pages)的模型,使得Java开发人员可以在Web页面上嵌入Java代码,以便在服务器端生成动态内容。
与静态HTML文件相比,JSP具有更高的可重用性和更大的灵活性。通过将Java代码嵌入到HTML标记中,可以在页面中包含非常复杂的逻辑和业务处理,从而提供更丰富的用户体验和更好的交互性。
JSP的核心思想是将Web应用程序中的三个不同层面进行分离:表示层、控制层和模型层。表示层负责显示数据和响应用户请求,控制层负责处理用户请求和调用模型层,而模型层则负责封装数据和业务逻辑。JSP允许将这三个层面分别实现,并将它们组合成一个完整的Web应用程序。
JSP技术本身并没有规定使用哪种数据库或Java框架。开发人员可以根据需要选择最适合自己项目需求和团队技术水平的技术栈。例如,可以使用JavaEE提供的JDBC API与关系型数据库交互,也可以使用Hibernate等ORM框架进行数据持久化。
在JSP中,所有的HTML代码都写在.jsp文件中。这些文件通常位于Web应用程序的WebContent目录下,并且可以通过Web服务器直接访问。当客户端请求一个包含JSP代码的页面时,服务器会首先将JSP文件编译成一个Servlet类,然后再将其实例化并执行。在执行过程中,JSP引擎会解析所有的HTML标记和嵌入其中的Java代码,从而生成动态页面内容。
JSP有一套自己的标签库(tag library),称为JSTL(JavaServer Pages Standard Tag Library)。JSTL提供了一些标准的标签,使JSP页面编写更加简单、轻松。例如:
- 格式化输出标签:格式化日期、数字、货币等内容;
- 条件判断标签:if、choose、when、otherwise等;
- 循环控制标签:forEach、forTokens等;
- 数据库操作标签:查询、更新等。
此外,JSP还支持EL表达式(Expression Language),允许在JSP页面中使用一种简洁的语法访问JavaBean属性和方法。EL表达式与JSTL标签组合在一起,可以大大简化JSP页面编写和维护工作。
总之,JSP技术为我们提供了一种快速、灵活地开发Web应用程序的方式。通过将Java代码嵌入到HTML标记中,可以实现高度动态个性的Web页面,JSP还支持JSTL和EL表达式等标准库,使得Web应用程序开发更加简单和方便。
二、JSP基本语法
JSP(JavaServer Pages)是一种动态网页技术,它允许在 HTML 页面中嵌入 Java 代码,以实现动态内容的显示和交互。本文将介绍 JSP 的基本语法和示例代码。
JSP 基本语法
- 注释
JSP 支持 HTML 和 Java 两种注释方式。HTML 注释可以使用 <!-- -->
标签,Java 注释则可以使用 //
或 /* */
标记。
<!-- HTML 注释 -->
<%-- JSP 注释 --%>
<% // 单行注释 %>
<% /* 多行注释 */ %>
- 指令
JSP 指令用于设置页面全局属性或引入外部资源,有三种类型:page、include 和 taglib。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.*"
session="false"
errorPage="/error.jsp"
isErrorPage="false" %>
<%@ include file="header.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 表达式
JSP 表达式用于将 Java 表达式的结果输出到 HTML 页面中。表达式以 <%= %>
标记包围。
<p>Hello <%= "World!" %></p>
- 脚本
JSP 脚本可用于执行任意有效的 Java 代码,并将结果输出到 HTML 页面中。脚本以 <% %>
或 <%! %>
标记包围,分别表示脚本和声明。
<%
int a = 1;
int b = 2;
out.print(a + "+" + b + "=" + (a+b));
%>
<%! int c = 3; %>
<p><%= "c=" + c %></p>
- 动作
JSP 动作是一些内置标签或自定义标签库的调用方式,可以用于实现更复杂的功能,比如条件语句、循环语句等。常见的动作有:<jsp:include>
、<jsp:forward>
、<c:if>
、<c:forEach>
等。
<jsp:include page="header.jsp" />
<c:if test="${user == null}">
<p>You are not logged in.</p>
</c:if>
<c:forEach items="${products}" var="product">
<p>${product.name}: ${product.price}</p>
</c:forEach>
JSP 示例代码
下面是一个简单的 JSP 页面示例,使用了上述的基本语法,实现了一个计算器的功能。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Calculator</title>
</head>
<body>
<center>
<h1>Calculator</h1>
<form method="post" action="">
<input type="text" name="num1" size="10" value="${param.num1}" />
<select name="operator">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" name="num2" size="10" value="${param.num2}" />
<input type="submit" value="=" />
<%
String num1 = request.getParameter("num1");
String num2 = request.getParameter("num2");
String operator = request.getParameter("operator");
double result = 0;
if (num1 != null && num2 != null) {
double n1 = Double.parseDouble(num1);
double n2 = Double.parseDouble(num2);
switch (operator) {
case "+":
result = n1 + n2;
break;
case "-":
result = n1 - n2;
break;
case "*":
result = n1 * n2;
break;
case "/":
result = n1 / n2;
三、JSP内置对象
JSP 内置对象是指在 JSP 页面中可以直接使用的一些 Java 对象,它们的作用是提供了方便快捷的方法来获取和处理请求、响应以及其他与 JSP 页面相关的信息。JSP 内置对象主要包括以下 9 种:
-
request:表示客户端发出的 HTTP 请求信息,并封装成一个对象。
-
response:表示服务器对客户端请求的响应信息,并封装成一个对象。
-
pageContext:表示 JSP 页面上下文信息,并封装成一个对象。
-
session:表示客户端与服务器之间的会话信息,并封装成一个对象。
-
application:表示 Servlet 上下文信息,并封装成一个对象。
-
out:表示 JSP 页面输出流,并封装成一个对象。
-
config:表示当前 Servlet 的配置信息,并封装成一个对象。
-
exception:表示页面抛出的异常信息,并封装成一个对象。
-
page:表示当前页面本身,并封装成一个对象。
以下是一个简单的 JSP 页面示例,演示如何使用 JSP 内置对象:
<%@ page language="java" %>
<html>
<head><title> JSP 内置对象示例</title></head>
<body>
<h1>JSP 内置对象示例</h1>
<%
// 使用 request 获取请求参数
String name = request.getParameter("name");
if(name != null && !name.isEmpty()) {
out.println("<p>欢迎您," + name + "!</p>");
}
// 使用 session 存储用户信息
session.setAttribute("username", "guest");
// 使用 application 存储全局信息
application.setAttribute("count", 0);
%>
<p>当前页面路径: <%= request.getRequestURI() %></p>
<p>当前时间: <%= new java.util.Date() %></p>
<p>当前 Servlet 版本号: <%= config.getServletContext().getMajorVersion() %>.<%= config.getServletContext().getMinorVersion() %></p>
<%
// 抛出一个异常,演示 exception 对象的使用
try {
int a = 1/0;
} catch (Exception ex) {
exception.printStackTrace(out);
}
%>
<br/>
<a href="${pageContext.request.contextPath}/index.jsp">返回首页</a>
</body>
</html>
该页面中主要演示了如何使用 JSP 内置对象来获取和处理请求、响应以及其他相关信息。其中,使用 <% ... %>
标签内部的 Java 代码段来访问和操作内置对象,同时使用 ${...}
EL 表达式来引用与 JSP 页面相关的属性和变量。
四、JSPEL表达式
JSPEL(JSP Expression Language)是一种用于简化 JSP 页面开发的表达式语言,它可以在 JSP 页面中直接使用,将 Java 代码与 HTML 代码进行解耦,更方便地对数据进行处理和展示。下面是 JSPEL 中常用的表达式类型及其样例代码:
-
值表达式(Value Expression),用于获取变量或属性的值。
${username}
-
方法表达式(Method Expression),用于调用 JavaBean 对象的方法。
${user.getName()}
-
数组表达式(Array Expression),用于获取数组元素的值。
${arr[0]}
-
集合表达式(Collection Expression),用于获取集合元素的值。
${list[0]}
-
对象属性表达式(Object Property Expression),用于获取对象的属性值。
${user.name}
-
空值表达式(Empty Expression),用于检查一个值是否为空。
${empty userList}
-
条件表达式(Conditional Expression),用于根据条件选择不同的值。
${isAdmin ? '管理员' : '普通用户'}
以上是 JSPEL 中常用的表达式类型及其样例代码,开发人员可以根据需求对表达式进行组合和嵌套,以实现复杂的数据处理和页面展示效果。需要注意的是,JSPEL 表达式只能在 JSP 页面中使用,在 Java 代码中不能使用。
五、JSP JSTL标签库
JSTL(JavaServer Pages Standard Tag Library)是一套标准的JSP标签库,提供了一系列常用的功能标签和模板标签,使得JSP页面的开发变得更加简单和高效。下面我们来介绍一些常见的JSTL标签及其使用方法:
- if标签:用于条件判断
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<c:if test="${score >= 60}">
<p>恭喜您,成绩及格!</p>
</c:if>
<c:if test="${score < 60}">
<p>很遗憾,成绩不及格!</p>
</c:if>
</body>
</html>
- forEach标签:用于循环控制
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<ul>
<c:forEach var="item" items="${fruitList}">
<li>${item}</li>
</c:forEach>
</ul>
</body>
</html>
- choose、when和otherwise标签:用于多重条件判断
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<c:choose>
<c:when test="${score >= 90}">
<p>您的成绩为A级</p>
</c:when>
<c:when test="${score >= 80}">
<p>您的成绩为B级</p>
</c:when>
<c:when test="${score >= 70}">
<p>您的成绩为C级</p>
</c:when>
<c:otherwise>
<p>您的成绩为D级,需要努力哦!</p>
</c:otherwise>
</c:choose>
</body>
</html>
- set标签:用于设置变量值
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<c:set var="name" value="Tom"/>
<p>欢迎您,${name}</p>
</body>
</html>
- url标签:用于生成URL链接地址
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<c:url var="url" value="/product?id=1"/>
<a href="${url}">查看详情</a>
</body>
</html>
- import标签:用于引入外部JSP页面
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<c:import url="/header.jsp"/>
<h1>主体内容</h1>
<c:import url="/footer.jsp"/>
</body>
</html>
- fn标签:用于字符串处理和格式化
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<body>
<p>字符串长度:${fn:length(str)}</p>
<p>字符串截取:${fn:substring(str, 1, 3)}</p>
<p>字符串转换为大写:${fn:toUpperCase(str)}</p>
</body>
</html>
以上是一些常见的JSTL标签及其使用方法,当然还有很多其他有用的标签和函数等。在开发JSP页面时,使用JSTL可以大大提高开发效率,减少代码量和重复劳动,使得页面更加简洁易读。同时,JSTL还具备跨平台、兼容性好等优点,是Web应用程序开发中不可或缺的工具之一。