Tomcat 9下JSTL标签无法使用及适配web.xml配置问题求助
问题根因&解决方案
1. 核心配置错误:web.xml重复定义根标签+版本不匹配
你当前的web.xml存在两处致命错误:
- 重复声明了
<web-app>根标签,容器无法正常解析配置,直接导致JSTL标签库、Servlet注册都不生效 - Tomcat 7 最高支持Servlet 3.0规范,你配置的web-app 4.0属于Servlet 4.0,仅Tomcat 9及以上版本支持,版本不兼容导致EL表达式、标签库解析异常
正确的Tomcat7 + JSTL1.2适配的web.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>Archetype Created Web Application</display-name> <!-- 注册你写的MovieList Servlet --> <servlet> <servlet-name>MovieList</servlet-name> <servlet-class>com.MovieList</servlet-class> </servlet> <servlet-mapping> <servlet-name>MovieList</servlet-name> <url-pattern>/movieList</url-pattern> </servlet-mapping> <!-- 原有Tester Servlet配置保留即可 --> <servlet> <servlet-name>Tester</servlet-name> <servlet-class>Tester</servlet-class> </servlet> <servlet-mapping> <servlet-name>Tester</servlet-name> <url-pattern>/Tester</url-pattern> </servlet-mapping> </web-app>
2. Servlet未注册+请求方式不匹配
你写的MovieList Servlet没有在web.xml中注册,请求根本无法进入该Servlet,自然无法传递movieList参数到页面。另外该Servlet仅实现了doPost方法,如果直接通过浏览器地址栏访问是GET请求,会返回405错误,建议补充doGet方法兼容:
public class MovieList extends HttpServlet { // 新增doGet方法,内部调用doPost,兼容GET/POST两种请求 public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{ doPost(request, response); } public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{ String [] movieList = {"movie 1","movie 2","movie 3"}; request.setAttribute("movieList", movieList); RequestDispatcher view = request.getRequestDispatcher("result.jsp"); view.forward(request,response); } }
3. JSTL依赖校验
确认以下两点即可解决JSTL uri无法解析的报错:
- 手动导包场景:确认
jstl-1.2.jar已经放到项目的WEB-INF/lib目录下,不要额外引入standard.jar,JSTL1.2已经内置了standard的所有内容,多引会出现包冲突 - Maven场景:你当前的pom.xml依赖配置正确,无需额外修改,执行
mvn clean package重新打war包部署即可
4. 验证步骤
部署项目后,访问http://{你的服务器地址}:{端口}/{项目名}/movieList,即可看到正常渲染的电影列表。
内容的提问来源于stack exchange,提问作者Arnold Schwartzkopf
相关产品推荐
相关产品推荐

