编程自学指南:java程序设计开发,JSP 高级特性详解,JSP 四大作用域与 EL 表达式的高级用法,JSP 与 Servlet 的协作模式

编程自学指南:java程序设计开发,JSP 高级特性详解

一、课程信息

学习目标

  1. 掌握 JSP 四大作用域与 EL 表达式的高级用法
  2. 学会开发自定义标签简化页面逻辑
  3. 理解 JSP 与 Servlet 的协作模式
  4. 实现文件上传 / 下载等复杂功能

二、课程导入:从基础到进阶

🌰 场景对比

  • 基础 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. 开发步骤

  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()
            );
        }
    }
    
  2. 编写标签库描述符(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>
    
  3. 在 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:作用域实验

任务

  1. 在 page.jsp 中向四个作用域存入相同键名的数据
  2. 在 forward.jsp 中通过 EL 输出各作用域的值

练习 2:自定义标签

任务

  1. 开发一个 <my:repeat> 标签,接受 times 属性
  2. 实现重复输出指定次数的文本

九、课程总结

知识图谱:

JSP 高级特性  
   ↳ 四大作用域:page/request/session/application  
   ↳ EL 表达式:简化数据访问与逻辑判断  
   ↳ 自定义标签:封装可复用的页面逻辑  
   ↳ 文件操作:上传下载的完整实现  

口诀记忆:

“作用域分四级,EL 表达式真便利,
自定义标签来助力,文件操作要牢记,
MVC 模式协作强,JSP 进阶没问题!”

十、课后作业

必做 1:购物车功能实现

要求

  1. 使用 session 作用域存储购物车商品
  2. 用 EL+JSTL 展示购物车列表
  3. 实现商品数量修改与清空功能

必做 2:开发分页标签

任务

  1. 创建 <my:page> 标签,接受总记录数、每页大小
  2. 输出分页导航条(如 首页 上一页 1 2 3 下一页 尾页)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zl515035644

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值