编程自学指南:java程序设计开发,JSP 高级特性详解
一、课程信息
学习目标
- 掌握 JSP 四大作用域与 EL 表达式的高级用法
- 学会开发自定义标签简化页面逻辑
- 理解 JSP 与 Servlet 的协作模式
- 实现文件上传 / 下载等复杂功能
二、课程导入:从基础到进阶
🌰 场景对比
- 基础 JSP:在页面中嵌入 Java 代码实现计数器
- 高级 JSP:使用 EL+JSTL + 自定义标签实现可复用的计数器
三、JSP 四大作用域
🔍 1. 作用域分类
作用域 | 范围 | 生命周期 |
---|---|---|
page | 当前页面 | 页面响应结束后销毁 |
request | 一次请求内的所有资源 | 请求处理完成后销毁 |
session | 同一个用户会话 | 用户会话超时或关闭浏览器时销毁 |
application | 整个 Web 应用 | 服务器重启时销毁 |
🔧 2. 案例:作用域对比
存储数据
<%-- page.jsp --%>
<%
pageContext.setAttribute("msg", "PAGE");
request.setAttribute("msg", "REQUEST");
session.setAttribute("msg", "SESSION");
application.setAttribute("msg", "APPLICATION");
%>
<jsp:forward page="show.jsp"/>
读取数据(show.jsp)
${pageScope.msg}<br> <%-- 输出:PAGE --%>
${requestScope.msg}<br> <%-- 输出:REQUEST --%>
${sessionScope.msg}<br> <%-- 输出:SESSION --%>
${applicationScope.msg} <%-- 输出:APPLICATION --%>
四、EL 表达式高级用法
🔥 1. 运算符扩展
三元运算符
${score >= 60 ? "及格" : "不及格"}
集合操作
<%-- 假设有 List<User> users --%>
<c:forEach items="${users[0].address}" var="addr">
${addr}
</c:forEach>
🔥 2. 隐含对象
param 与 paramValues
<%-- 获取单个参数 --%>
${param.username}
<%-- 获取多个参数(如多选框)--%>
<c:forEach items="${paramValues.hobbies}" var="hobby">
${hobby}
</c:forEach>
🔥 3. 案例:用户信息展示
<%-- user.jsp --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
姓名:${user.name}<br>
年龄:${user.age}<br>
是否成年:${user.age >= 18 ? "是" : "否"}<br>
兴趣爱好:
<c:forEach items="${user.hobbies}" var="hobby" separator=",">
${hobby}
</c:forEach>
五、自定义标签开发
🔨 1. 开发步骤
-
创建标签处理器类
import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; public class CurrentTimeTag extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { getJspContext().getOut().write( new java.util.Date().toLocaleString() ); } }
-
编写标签库描述符(tld 文件)
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>mytags</short-name> <tag> <name>currentTime</name> <tag-class>com.example.CurrentTimeTag</tag-class> </tag> </taglib>
-
在 JSP 中使用
<%@ taglib uri="/WEB-INF/tags/mytags.tld" prefix="my" %> 当前时间:<my:currentTime/>
🔧 2. 带属性的标签
public class GreetingTag extends SimpleTagSupport {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void doTag() throws JspException, IOException {
getJspContext().getOut().write(
"你好," + name + "!"
);
}
}
<my:greeting name="${user.name}"/>
六、JSP 与 Servlet 协作
🔄 1. MVC 模式实践
Servlet(控制器)
@WebServlet("/user")
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
User user = userService.getUser(1);
req.setAttribute("user", user);
req.getRequestDispatcher("/user.jsp").forward(req, resp);
}
}
JSP(视图)
<h1>${user.name} 的信息</h1>
<p>年龄:${user.age}</p>
七、文件上传与下载
🔧 1. 文件上传(Apache Commons FileUpload)
JSP 表单
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
Servlet处理
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(req);
for (FileItem item : items) {
if (!item.isFormField()) {
String filename = item.getName();
item.write(new File("d:/uploads/" + filename));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
🔧 2. 文件下载
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String filename = "report.pdf";
File file = new File("d:/uploads/" + filename);
resp.setContentType("application/pdf");
resp.setHeader("Content-Disposition",
"attachment; filename=\"" + filename + "\"");
Files.copy(file.toPath(), resp.getOutputStream());
}
}
八、课堂练习
练习 1:作用域实验
任务:
- 在
page.jsp
中向四个作用域存入相同键名的数据 - 在
forward.jsp
中通过EL
输出各作用域的值
练习 2:自定义标签
任务:
- 开发一个
<my:repeat>
标签,接受times
属性 - 实现重复输出指定次数的文本
九、课程总结
知识图谱:
JSP 高级特性
↳ 四大作用域:page/request/session/application
↳ EL 表达式:简化数据访问与逻辑判断
↳ 自定义标签:封装可复用的页面逻辑
↳ 文件操作:上传下载的完整实现
口诀记忆:
“作用域分四级,EL 表达式真便利,
自定义标签来助力,文件操作要牢记,
MVC 模式协作强,JSP 进阶没问题!”
十、课后作业
必做 1:购物车功能实现
要求:
- 使用 session 作用域存储购物车商品
- 用 EL+JSTL 展示购物车列表
- 实现商品数量修改与清空功能
必做 2:开发分页标签
任务:
- 创建
<my:page>
标签,接受总记录数、每页大小 - 输出分页导航条(如 首页 上一页 1 2 3 下一页 尾页)