使用JSTL标签出现问题
HTTP状态 500 - 内部服务器错误 类型 异常报告 消息 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jstl/core] 描述 服务器遇到一个意外的情况,阻止它完成请求。 例外情况 org.apache.jasper.JasperException: 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jstl/core] org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:54) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:294) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:81) org.apache.jasper.compiler.TagLibraryInfoImpl.generateTldResourcePath(TagLibraryInfoImpl.java:251) org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:122) org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:435) org.apache.jasper.compiler.Parser.parseDirective(Parser.java:493) org.apache.jasper.compiler.Parser.parseElements(Parser.java:1450) org.apache.jasper.compiler.Parser.parse(Parser.java:144) org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244) org.apache.jasper.compiler.ParserController.parse(ParserController.java:105) org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:206) org.apache.jasper.compiler.Compiler.compile(Compiler.java:391) org.apache.jasper.compiler.Compiler.compile(Compiler.java:367) org.apache.jasper.compiler.Compiler.compile(Compiler.java:351) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:605) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) com.controller.ChoiceServlet.service(ChoiceServlet.java:64) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ):注意 主要问题的全部 stack 信息可以在 server logs 里查看 Apache Tomcat/9.0.56
阅读了以下资料,引用于博客园凝荷的文章
JSTL配置:
主要牵涉到两个jar包
standward.jar和jstl.jar包 (两个包1.0和1.2版本的下载以及TLD下载路径如下:下载路径)
加载方式包括两种
1,非自动加载
a,将tld文件copy到WEB-INFO下的tld目录下,没有就创建之
b,修改web.xml文件配置,添加配置如下
<jsp-config> <taglib> <taglib-uri>http://java.sun.com/jstl/core</taglib-uri> <taglib-location>/WEB-INF/tld/c.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri> <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/fn</taglib-uri> <taglib-location>/WEB-INF/tld/fn.tld</taglib-location> </taglib> </jsp-config>
复制代码
c,jsp中引用taglib
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
2,自动加载
Servlet2.4规范提供了对tld文件的自动加载,tld文件在standard.jar的META-INF文件夹中。
如:c.tld文件提供了对核心jstl标签的描述
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>JSTL 1.1 core library</description> <display-name>JSTL core</display-name> <tlib-version>1.1</tlib-version> <short-name>c</short-name> <uri>http://java.sun.com/jsp/jstl/core</uri>
可以看到其引用的uri为http://java.sun.com/jsp/jstl/core
则在jsp中引用taglib为:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
三,JSTL核心标签库的使用
JSTL 核心标签库标签共有13个,功能上分为4类:
1.表达式控制标签:out、set、remove、catch
2.流程控制标签:if、choose、when、otherwise
3.循环标签:forEach、forTokens
4.URL操作标签:import、url、redirect
使用标签时,一定要在jsp文件头加入以下代码:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
============================================================================
使用maven导入以下包
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies>
JSP也使用了taglib自动加载c.tld文件
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
鼠标放到标签上也能自动识别jar包
CTRL+鼠标左键会自动跳转到jar包WEB-INF的c.tld文件中
但是运行就是出错
查看自己的代码没有发现任何问题,并且根据另一篇文章所说方法修改
手动将
c.tld文件复制到webapp的WEB-INF目录下
此时可以正常运行
疑惑这个问题产生的原因,应该是自动加载到c.tld文件的却找不到c.tld文件,不知道是maven的问题还是IDEA的问题,不知道有没有更好的办法让程序自动找到正确的c.tld文件。