[解决] Tomcat10+ 安装 JSTL 的正确姿势

1. 解决方案

1.1 pom.xml

现在是 2021年5月, 我在用 Tomcat 10.0.5,Idea 2021.1,Maven 的 pom.xml 这样写有效:

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>2.0.0</version>
</dependency>

<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-spec</artifactId>
    <version>1.2.5</version>
</dependency>

// 如果不够,再补充下面这个依赖
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-impl</artifactId>
    <version>1.2.5</version>
</dependency>

1.2 依赖包层级关系

依赖包层级关系
这套 web 方案包,已含 servlet-api , jspel, 在 “项目结构 - 库” , 可查看包依赖使用情况:未使用的,或冲突的,都可移除,简化管理。

1.3 效果演示

Source:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.amazm.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" %>

<html>
<head>
    <title>Java Server Page Tag Language</title>
</head>
<body>

<% 
    List<User> users = new ArrayList<>();
    users.add(new User("zhang", "123"));
    users.add(new User("li", "1234"));
    users.add(new User("wang", "12"));
    request.setAttribute("users", users);
%>

forEach:
<br>

<c:forEach items="${users}" var="user" varStatus="s">
    ${s.index} ${s.count} ${user} <br>
</c:forEach>

</body>
</html>

<%--
  Created by IntelliJ IDEA.
  User: amazm
  Date: 2021/5/2
  Time: 12:21 下午
--%>

Output:
Output

2.问题描述及分析

跟着教学视频用 8- 版本, 老师给你一套 jar 包, 少走好多弯路, 但时代在变, 新人探索新版本时,总会遇到这些坑, 而现有谷歌的搜索结果, 好多已落后于时代:

java - 无法加载或实例化TagLibraryValidator类: org. apache.taglibs.standard.tlv.JSTLCoreTLV

org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.jsp.jstl_jsp

2015年, Tomcat 8 开始支持 JavaEE8 , javax 项目由 太阳公司 (sun.com) 转给 玻璃鱼组织 (glassfish.org) 维护运营, 相应地, 它被拆分为 jakarta 多个项目。

而模仿 javax 的依赖包格式,套用 jakarta , 也不够完整。

3. 学会提问

遇到报错 ,我们会下意识直接复制一长串 Excpetion 扔进浏览器, 然后海选各种回答, 枚举式照改一通, 放弃了思考, 像病急乱投医。

看路人回复有效,自己实操无效, 不禁令人怀疑我们是否处在同个世界,甚至怀疑自己是不是当程序员的料。 🤔

你知道, 版本兼容问题, 至少包名不一样,那么,展开多个角度问自己:

prefix 语法的引用地址还有效吗?

你代码语法, 拼写错了吗?

项目 lib 目录里真的有这个 jar 包了吗?

你觉得多余的包, 删了 pom.xml 的依赖, 刷新后, 项目 lib 包下面它还在吗?

你搜到的答案过时了吗?还有必要试吗?

依赖的包找到了,但找全了吗?

瞎**乱改一通, 快要放弃时, 你想到, 既然是版本兼容问题, 那么反过来问:

版本兼容时, 应该是什么样子?

你知道, 关键词越少, 精准找到答案的概率越高, 于是打开谷歌浏览器, 敲下三个关键词

tomcat 10 jstl

敲回车

[ Stack overflow ] How to install JSTL? The absolute uri: http://java.sun.com/jstl/core cannot be resolved

10+ 9- 各种版本安装配置都有介绍,简直官网说明书。

搞定。

4.后记

代码跑起来, 一般人早就右上角关闭窗口了。

其实还有问题没有解决。🤔

为什么 JSTL 官方文档 这样简陋? 连基本的版本兼容问题都不提, 没人维护吗?

Maven 搜出一堆相似的 jar 包名称,该如何选择符合需求的包?

找到可能性高的 jar 包之后,如何找全相关依赖?

如何正确使用一个陌生的 jar 包? 官方文档写全了吗?

我要实现一个功能, 为了避免重复造轮子, 去哪找现成的轮子? Github? API 文档?

如果不是老师,你从哪了解到,世界上有 JSTL 这种技术呢?

还有比 JSTL 更简洁易用的解决方案吗?

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值