Java JSP详解
什么是JSP
JSP(Java Server Pages)是一种动态网页技术,允许在HTML中嵌入Java代码来生成动态内容。
JSP基本语法
脚本元素
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP基础示例</title>
</head>
<body>
<h1>欢迎访问JSP页面</h1>
<%-- 声明 --%>
<%!
private String greeting = "Hello JSP";
public String getGreeting() {
return greeting;
}
%>
<%-- 脚本 --%>
<%
String name = "张三";
out.println("<p>脚本代码: " + name + "</p>");
%>
<%-- 表达式 --%>
<p>当前时间: <%= new java.util.Date() %></p>
<p>问候语: <%= getGreeting() %></p>
</body>
</html>
指令
<%@ page contentType="text/html;charset=UTF-8"
language="java"
import="java.util.*"
session="true"
errorPage="error.jsp" %>
<%@ page import="java.text.SimpleDateFormat" %>
<html>
<body>
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = sdf.format(new Date());
%>
<p>当前时间: <%= now %></p>
</body>
</html>
注释
<html>
<body>
<%-- 这是JSP注释,不会发送到客户端 --%>
<!-- 这是HTML注释,会发送到客户端 -->
<%
// 这是Java单行注释
/* 这是Java多行注释 */
%>
</body>
</html>
表达式语言(EL)
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.*" %>
<html>
<body>
<%
request.setAttribute("name", "李四");
request.setAttribute("age", 25);
List<String> books = Arrays.asList("Java", "Python", "C++");
request.setAttribute("books", books);
Map<String, Integer> scores = new HashMap<>();
scores.put("语文", 90);
scores.put("数学", 95);
request.setAttribute("scores", scores);
%>
<h2>EL表达式示例</h2>
<p>姓名: ${name}</p>
<p>年龄: ${age}</p>
<p>第一个书籍: ${books[0]}</p>
<p>数学成绩: ${scores["数学"]}</p>
<p>空值处理: ${empty name ? "无" : name}</p>
<p>运算: ${age > 18 ? "成年" : "未成年"}</p>
</body>
</html>
JSTL核心标签库
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<h2>JSTL核心标签</h2>
<c:set var="message" value="Hello JSTL" />
<p>消息: ${message}</p>
<c:if test="${not empty message}">
<p>消息不为空</p>
</c:if>
<c:choose>
<c:when test="${age >= 18}">
<p>成年人</p>
</c:when>
<c:otherwise>
<p>未成年人</p>
</c:otherwise>
</c:choose>
<c:forEach items="${books}" var="book" varStatus="status">
<p>${status.index + 1}. ${book}</p>
</c:forEach>
<c:forEach begin="1" end="5" step="1" var="i">
<p>数字: ${i}</p>
</c:forEach>
</body>
</html>
JSTL格式化标签
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<body>
<%
request.setAttribute("price", 12345.678);
request.setAttribute("date", new java.util.Date());
%>
<h2>格式化标签示例</h2>
<p>货币格式: <fmt:formatNumber value="${price}" type="currency" /></p>
<p>百分比: <fmt:formatNumber value="0.856" type="percent" /></p>
<p>日期格式: <fmt:formatDate value="${date}" pattern="yyyy-MM-dd" /></p>
<p>日期时间: <fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss" /></p>
</body>
</html>
JSP自定义标签
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class HelloTag extends SimpleTagSupport {
private String name;
@Override
public void doTag() throws JspException, IOException {
getJspContext().getOut().write("<h3>Hello, " + name + "!</h3>");
}
public void setName(String name) {
this.name = name;
}
}
<%@ taglib prefix="my" uri="/WEB-INF/tags.tld" %>
<html>
<body>
<my:hello name="World" />
</body>
</html>
MVC模式
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.List;
@WebServlet("/users")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
List<String> users = List.of("张三", "李四", "王五");
req.setAttribute("users", users);
req.getRequestDispatcher("/WEB-INF/views/userList.jsp").forward(req, resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<h2>用户列表</h2>
<c:forEach items="${users}" var="user">
<p>${user}</p>
</c:forEach>
</body>
</html>
JSP最佳实践
- 尽量使用EL表达式代替脚本代码
- 使用JSTL标签库简化页面逻辑
- 遵循MVC模式,JSP只负责显示
- 使用Filter处理编码问题
- 避免在JSP中编写复杂业务逻辑
总结
JSP是Java Web开发的重要技术。掌握JSP语法、EL表达式和JSTL标签库,能帮助你构建动态Web页面。