目录
一、JSP页面里的page指令
JSP页面中page指令是必须的:
language属性:定义服务器的脚本语言类型。
import属性:JSP程序需要导入的类和接口。
pageEncoding属性:页面的字符编码。
例如:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
二、JSP脚本元素
1、全局声明<%!……%>
<%! 声明变量或方法%>
2、表达式<%=……%>
<%=变量或返回值的方法名%>
3、脚本程序段<%……%>
<%java语言%>
三、文件包含指令include
<%@ include file="文件名.jsp"%>
注意:
1、页面包含指令可以出现在<body>标签内的任何位置
2、避免JSP文件与当前页面定义相同的变量
四、引入标签库指令taglib
taglib的使用格式如下:
<%@ taglib prefix="标签前缀" uri="标签库描述符"%>
五、JSP动作标签
1、包含文件动作标签<jsp:include>
用于在当前JSP页面中嵌入另一个页面,基本格式如下(flush="true"表示清除保存在缓冲区的数据):
<jsp:include page="页面" flush=true/>
示例:
header.jsp
此文件用于定义网站的头部内容。
<!-- 文件路径:WEB-INF/pages/header.jsp --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>网站头部</title> </head> <body> <h1>这是网站的头部</h1> <hr> </body> </html>
footer.jsp
该文件用于定义网站的底部内容。
<!-- 文件路径:WEB-INF/pages/footer.jsp --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>网站底部</title> </head> <body> <hr> <p>版权所有 © 2024</p> </body> </html>
index.jsp
此文件为主页,使用
<jsp:include>
标签包含header.jsp
和footer.jsp
。<!-- 文件路径:index.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>主页</title> </head> <body> <!-- 包含头部页面 --> <jsp:include page="WEB-INF/pages/header.jsp" /> <h2>欢迎访问我的网站</h2> <p>这是网站的主要内容。</p> <!-- 包含底部页面 --> <jsp:include page="WEB-INF/pages/footer.jsp" /> </body> </html>
2、请求转发动作标签<jsp:forward>
用于转发请求,基本格式如下:
<jsp: forward page="页面"/>
向转发的JSP页面传递参数时,格式如下:
<jsp forward page="JSP页面"/>
<jsp:param name="user" value="hello">
……
</jsp:forward>
示例:
source.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>源页面</title> </head> <body> <h2>这是源页面,即将转发请求...</h2> <jsp:forward page="target.jsp"> <jsp:param name="username" value="John"/> <jsp:param name="age" value="25"/> </jsp:forward> <!-- 下面的内容不会被显示,因为请求已经被转发 --> <p>这部分内容不会显示。</p> </body> </html>
target.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>目标页面</title> </head> <body> <h2>这是目标页面,接收到转发的请求。</h2> <p>用户名: <%= request.getParameter("username") %></p> <p>年龄: <%= request.getParameter("age") %></p> </body> </html>
3、JavaBean动作标签
示例:
创建一个名为
User.java
的 JavaBean 类,放在com.example.beans
包下。package com.example.beans; public class User { private String username; private int age; // 无参构造函数 public User() {} // Getter 和 Setter 方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
创建一个名为
userInfo.jsp
的 JSP 页面,使用 JavaBean 动作标签操作User
对象。<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaBean 示例</title> </head> <body> <!-- 使用 <jsp:useBean> 标签创建或查找 User 对象。 - id 属性:为创建或查找的 JavaBean 对象指定一个唯一的标识符,在后续代码中可通过该标识符引用此对象。 - class 属性:指定 JavaBean 类的全限定名,即包含包名和类名,这里是 com.example.beans.User。 - scope 属性:指定 JavaBean 对象的作用域,request 表示该对象仅在当前请求范围内有效。 如果在当前请求作用域中已经存在具有相同 id 的 User 对象,则直接使用;若不存在,则创建一个新的 User 对象。 --> <jsp:useBean id="user" class="com.example.beans.User" scope="request" /> <!-- 使用 <jsp:setProperty> 标签设置 User 对象的属性 --> <jsp:setProperty name="user" property="username" value="Alice" /> <jsp:setProperty name="user" property="age" value="20" /> <h2>用户信息</h2> <!-- 使用 <jsp:getProperty> 标签获取 User 对象的属性 --> <p>用户名: <jsp:getProperty name="user" property="username" /></p> <p>年龄: <jsp:getProperty name="user" property="age" /></p> </body> </html>
4、Java插件动作标签<jsp:plugin>
示例:
以下是
ParamApplet.java
文件的代码:import java.applet.Applet; import java.awt.Graphics; // 继承 Applet 类创建一个能接收参数的 Applet public class ParamApplet extends Applet { private String message; // 重写 init 方法,在 Applet 初始化时获取传递的参数 public void init() { // 获取名为 "message" 的参数值,如果参数不存在则使用默认值 "No message provided" message = getParameter("message"); if (message == null) { message = "No message provided"; } } // 重写 paint 方法,用于在 Applet 窗口中绘制文本 public void paint(Graphics g) { g.drawString("Received message: " + message, 20, 20); } }
将上述代码保存为
ParamApplet.java
,然后使用javac
命令进行编译:javac ParamApplet.java
下面是
paramApplet.jsp
文件的代码:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>使用 <jsp:plugin> 传递参数给 Java Applet</title> </head> <body> <h2>这是一个使用 <jsp:plugin> 标签传递参数给 Java Applet 的示例</h2> <!-- <jsp:plugin> 标签用于嵌入 Java Applet - type 属性:指定嵌入的类型为 "applet" - code 属性:指定 Applet 类的名称,这里是 ParamApplet.class --> <jsp:plugin type="applet" code="ParamApplet.class" width="300" height="100"> <jsp:params> <jsp:param name="message" value="Hello from JSP!"> </jsp:params> <!-- <jsp:fallback> 标签用于在 Applet 无法正常显示时提供替代内容 --> <jsp:fallback> <p>无法加载 Java Applet,请确保你的浏览器支持 Java 插件。</p> </jsp:fallback> </jsp:plugin> </body> </html>
六、向客户端输出信息对象out
JSP内置对象out,不仅可以输出对象内容,还可以管理页面中的缓冲区,它的常用方法如下:
out.println(exp) // 其中exp可以是普通文本、含有变量的表达式,甚至是作为特殊字符串的JS脚本
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>out.println 示例</title>
</head>
<body>
<%
// 1. 输出普通文本
out.println("<h2>普通文本输出</h2>");
out.println("这是一段普通的文本。<br>");
// 2. 输出含有变量的表达式
String name = "John";
int age = 25;
out.println("<h2>含有变量的表达式输出</h2>");
out.println("姓名: " + name + "<br>");
out.println("年龄: " + age + "<br>");
// 3. 输出作为特殊字符串的 JS 脚本
out.println("<script>alert('这是一个来自 JSP 的 JavaScript 弹窗!');</script>");
%>
</body>
</html>
七、响应对象response
response代表服务器对客户端请求进行响应的对象。
示例 1:设置响应状态码和响应头
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>设置响应状态码和响应头</title> </head> <body> <% // 设置响应状态码为 200,表示请求成功 response.setStatus(200); // 设置响应头,指定内容类型为 HTML,字符编码为 UTF-8 response.setContentType("text/html; charset=UTF-8"); // 设置自定义响应头 response.setHeader("Custom-Header", "This is a custom header"); // 输出响应内容 out.println("<h2>响应状态码和响应头已设置</h2>"); %> </body> </html>
代码解释:
response.setStatus(200)
:将响应的状态码设置为 200,代表请求成功处理。
response.setContentType("text/html; charset=UTF-8")
:设置响应的内容类型为 HTML,字符编码为 UTF - 8,避免中文等字符显示乱码。
response.setHeader("Custom - Header", "This is a custom header")
:添加一个自定义的响应头,客户端可以通过查看响应信息获取该自定义值。示例 2:重定向到另一个页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>重定向示例</title> </head> <body> <% // 立即重定向到百度页面 response.sendRedirect("https://www.baidu.com"); %> </body> </html>
示例 3:设置响应体并输出文本信息
<%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>设置响应体示例</title> </head> <body> <% // 设置响应的内容类型为纯文本,字符编码为 UTF-8 response.setContentType("text/plain; charset=UTF-8"); // 通过输出流输出响应内容 response.getWriter().println("这是一个简单的文本响应示例。"); %> </body> </html>
八、请求对象request
request主要封装了表单提交的数据、超链接时传递的参数、客户端的IP地址和Cookie等信息。
示例 1:获取表单提交的数据
创建两个 JSP 文件,一个用于提供表单让用户输入信息,另一个用于接收并处理表单数据。
创建表单页面
form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>表单提交示例</title> </head> <body> <h2>请输入你的信息</h2> <form action="processForm.jsp" method="post"> <label for="name">姓名:</label> <input type="text" id="name" name="name" required><br><br> <label for="email">邮箱:</label> <input type="email" id="email" name="email" required><br><br> <input type="submit" value="提交"> </form> </body> </html>
创建处理表单数据的页面
processForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>处理表单数据</title> </head> <body> <% // 使用 request 对象获取表单提交的姓名和邮箱 String name = request.getParameter("name"); String email = request.getParameter("email"); out.println("<h2>你提交的信息如下:</h2>"); out.println("<p>姓名: " + name + "</p>"); out.println("<p>邮箱: " + email + "</p>"); %> </body> </html>
代码解释
request.getParameter("name")
和request.getParameter("email")
:通过request
对象的getParameter
方法获取表单中name
和
示例2:获取 URL 参数
创建一个 JSP 文件,用于接收 URL 中传递的参数并显示。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>获取 URL 参数</title> </head> <body> <% // 使用 request 对象获取 URL 中的参数 String param = request.getParameter("param"); if (param != null) { out.println("<h2>你传递的参数值是: " + param + "</h2>"); } else { out.println("<h2>未传递参数。</h2>"); } %> </body> </html>
九、会话对象session
session是存储与服务端的、用于记录和保持某些状态的一种会话跟踪机制。从而实现一个会话期间多个页面间的数据共享。
示例:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>登录</title> </head> <body> <form action="welcome.jsp" method="post"> <label for="username">用户名:</label> <input type="text" id="username" name="username" required> <input type="submit" value="登录"> </form> </body> </html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="javax.servlet.http.HttpSession" %> <!DOCTYPE html> <html> <head> <title>欢迎</title> </head> <body> <% // 获取当前请求的 session 对象 HttpSession session = request.getSession(); String username = request.getParameter("username"); if (username != null && !username.isEmpty()) { session.setAttribute("username", username); } // 从 session 中获取用户名 username = (String) session.getAttribute("username"); if (username != null) { out.println("欢迎, " + username); out.println("<a href='logout.jsp'>注销</a>"); } else { response.sendRedirect("login.jsp"); } %> </body> </html>
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="javax.servlet.http.HttpSession" %> <% // 获取当前请求的 session 对象,如果不存在则返回 null HttpSession session = request.getSession(false); if (session != null) { // 使 session 失效,销毁其中存储的所有信息 session.invalidate(); } response.sendRedirect("login.jsp"); %>
十、全局对象application
定义:application
对象代表整个 Web 应用程序,在服务器启动时创建,服务器关闭时销毁。
作用范围:整个 Web 应用程序,所有用户和所有请求都能共享这个对象。
常用方法:
setAttribute(String name, Object value)
:向application
对象中存储数据,name
是键,value
是值。
getAttribute(String name)
:根据键name
从application
对象中获取存储的数据。
removeAttribute(String name)
:根据键name
从application
对象中移除存储的数据。
getInitParameter(String name)
:获取在web.xml
中配置的初始化参数。
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Application 对象示例</title>
</head>
<body>
<%
// 存储数据到 application 对象
application.setAttribute("message", "这是一个全局消息");
// 从 application 对象中获取数据
String message = (String) application.getAttribute("message");
// 输出数据
out.println("从 application 对象中获取的消息: " + message);
%>
</body>
</html>
十一、上下文对象pageContext
虽然 pageContext
和 application
都是用于在 Web 应用中存储和共享数据的对象,但不能简单地将 pageContext
理解为作用域小一点的 application
。二者在作用域、功能、生命周期等方面存在明显差异。
十二、Cookie信息的建立与使用
Cookie 是在客户端(通常是浏览器)存储数据的一种机制,由服务器发送到用户浏览器并保存在本地,下次向同一服务器再发起请求时,浏览器会自动携带这些 Cookie 信息。
示例:
deleteCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 创建一个名为 visitCount 的 Cookie javax.servlet.http.Cookie deleteCookie = new javax.servlet.http.Cookie("visitCount", ""); // 将 Cookie 的有效期设置为 0 以删除它 deleteCookie.setMaxAge(0); response.addCookie(deleteCookie); // 重定向到显示 Cookie 信息的页面 response.sendRedirect("showCookie.jsp"); %>
showCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>显示 Cookie</title> </head> <body> <% int count = 0; // 从请求中获取所有的 Cookie javax.servlet.http.Cookie[] cookies = request.getCookies(); // 检查请求中是否包含 Cookie if (cookies != null) { // 遍历所有的 Cookie for (javax.servlet.http.Cookie c : cookies) { // 查找名为 "count" 的 Cookie if ("count".equals(c.getName())) { // 将找到的 Cookie 的值转换为整数并赋值给 count count = Integer.parseInt(c.getValue()); break; } } } count++; // 创建一个新的 Cookie,名称为 "count",值为更新后的访问次数 javax.servlet.http.Cookie newCookie = new javax.servlet.http.Cookie("count", String.valueOf(count)); // 设置该 Cookie 的有效期为 3600 秒(即 1 小时) newCookie.setMaxAge(3600); // 将新创建的 Cookie 添加到响应中,以便发送给客户端浏览器 response.addCookie(newCookie); %> <!-- 显示当前的访问次数 --> <h2>你访问此页面的次数为: <%= count %></h2> <!-- 提供一个链接,点击后跳转到 deleteCookie.jsp 页面以删除 Cookie --> <a href="deleteCookie.jsp">删除 Cookie</a> </body> </html>
十三、表达式语言EL
使用EL表达式时,会从指定域对象读取关键字对应的内容,并写入响应体,其用法格式如下:
${域对象.关键字}
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>EL 表达式示例</title>
</head>
<body>
<%
// 在 page 作用域中设置属性
pageContext.setAttribute("pageMessage", "这是 page 作用域的消息");
// 在 request 作用域中设置属性
request.setAttribute("requestMessage", "这是 request 作用域的消息");
// 在 session 作用域中设置属性
session.setAttribute("sessionMessage", "这是 session 作用域的消息");
// 在 application 作用域中设置属性
application.setAttribute("applicationMessage", "这是 application 作用域的消息");
%>
<!-- 使用 EL 表达式读取 page 作用域的数据 -->
page 作用域的消息: ${pageScope.pageMessage}<br>
<!-- 使用 EL 表达式读取 request 作用域的数据 -->
request 作用域的消息: ${requestScope.requestMessage}<br>
<!-- 使用 EL 表达式读取 session 作用域的数据 -->
session 作用域的消息: ${sessionScope.sessionMessage}<br>
<!-- 使用 EL 表达式读取 application 作用域的数据 -->
application 作用域的消息: ${applicationScope.applicationMessage}<br>
<!-- 省略域对象,EL 表达式会按顺序查找 -->
省略域对象时查找的消息: ${pageMessage}<br>
</body>
</html>
十四、JSP标准标签库JSTL
<c:out>
:用于在页面上输出数据,同时可以对特殊字符进行转义,防止 XSS 攻击。例如:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:out value="${message}" />
<c:set>
:用于在不同作用域中设置变量。比如在 session 作用域中设置变量:<c:set var="userName" value="John" scope="session" />
<c:if>
:实现条件判断。根据条件的真假来决定是否执行标签体内容:<c:if test="${user.role == 'admin'}"> <p>欢迎管理员!</p> </c:if>
<c:forEach>
:用于遍历集合或数组。可以迭代输出列表中的元素:<c:forEach var="product" items="${productList}"> <p>${product.name}</p> </c:forEach>