← 返回首页

Java JSP详解

📂 java ⏱ 3 min 413 words

什么是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最佳实践

  1. 尽量使用EL表达式代替脚本代码
  2. 使用JSTL标签库简化页面逻辑
  3. 遵循MVC模式,JSP只负责显示
  4. 使用Filter处理编码问题
  5. 避免在JSP中编写复杂业务逻辑

总结

JSP是Java Web开发的重要技术。掌握JSP语法、EL表达式和JSTL标签库,能帮助你构建动态Web页面。