java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar

目录

实验七  JSTL与标签文件

一、实验目的

二、实验原理

三、实验内容与步骤

jstl.jar和standard.jar在哪里下载?

如果说出现了如下的报错信息:java.lang.NoClassDefFoundError:javax/servlet/jsp/tagext/TagLibraryValidator 

四、思考题


实验七  JSTL与标签文件

一、实验目的

1. 了解什么是JSTL?

2. 掌握JSTL的核心库标签的使用。

3. 掌握标签文件的开发和使用。

二、实验原理

JSP标准标签库(JSP Standard Tag Library,简称JSTL)是一个为实现Web应用程序的常用功能而开发的标签库集合。功能包括基本输入输出、流程控制、XML文件解析、数据库查询、国际化和文本格式化等。JSTL主要由下面几个库组成:

  • 核心标签库;XML标签库;格式化/国际化标签库;数据库标签库;函数标签库。

这些库都很有用,但我们这里只学习核心库的使用。核心库的标签又可以分成四类,如表12.1所示:

表12.1  按功能分类的核心库的标签

JSTL标签类别

JSTL标签

标签说明

通用目的

在页面中显示内容

捕获异常

变量支持

设置一个EL变量值

清除一个EL变量

流程控制

根据一个属性等于一个值改变处理

根据一个属性等于一组值改变处理

对集合中的每个对象作重复处理

对给定一个文本域中的每个子串执行处理

URL处理

重写URL并对它们的参数编码

访问web应用程序外部的内容

告诉客户浏览器访问另一个URL

标签文件(tag file)也是JSP 2.0新增的功能,它的目的是使JSP页面开发人员仅使用JSP语法就能开发标签库而无须编写Java程序。所谓标签文件就是直接使用JSP语法编写的标签。标签文件的扩展名一般为.tag或.tagx,如果标签文件包含其他完整的或片段的标签文件,JSP 2.0建议其扩展名为.tagf。

在JSP页面中使用标签文件,需要在taglib动作中使用tagdir属性指定标签文件所在的目录,例如:

<%@ taglib prefix="mytag" tagdir="/WEB-INF/tags"%>

三、实验内容与步骤

(一)JSTL的安装和测试

【步骤1】要在JSP页面中使用JSTL标签,首先必须安装JSTL库。可以到Jakarta网站下载最新版本的JSTL,网址为http://jakarta.apache.org/,目前最新版本为1.1.2版,它支持JSP 2.0和Servlet 2.4。

如果安装了Tomcat,可以在示例应用程序中获得JSTL,它位于\webapps\ examples\WEB-INF\lib目录中,共有两个文件:jstl.jar和standard.jar。将这两个文件复制到你的Web应用程序的WEB-INF\lib目录中,就安装了JSTL。

jstl.jar和standard.jar在哪里下载?

当找不到的情况下,可以从如下链接下载:

百度网盘

链接:https://pan.baidu.com/s/14LfHseLQ4g1n8jRrHtxaVA?pwd=bear 
提取码:bear

将 jakarta-taglibs-standard/jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。

如果说出现了如下的报错信息:java.lang.NoClassDefFoundError:javax/servlet/jsp/tagext/TagLibraryValidator 

HTTP状态 500 - 内部服务器错误
________________________________________
类型 异常报告
消息 java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator
描述 服务器遇到一个意外的情况,阻止它完成请求。
例外情况
jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
根本原因。
java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator
	java.base/java.lang.ClassLoader.defineClass1(Native Method)
	java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
	java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2352)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:800)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1317)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
	java.base/java.lang.ClassLoader.defineClass1(Native Method)
	java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
	java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2352)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:800)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1317)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
	org.apache.jasper.compiler.TagLibraryInfoImpl.createValidator(TagLibraryInfoImpl.java:355)
	org.apache.jasper.compiler.TagLibraryInfoImpl.(TagLibraryInfoImpl.java:195)
	org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:429)
	org.apache.jasper.compiler.Parser.parseDirective(Parser.java:487)
	org.apache.jasper.compiler.Parser.parseElements(Parser.java:1444)
	org.apache.jasper.compiler.Parser.parse(Parser.java:138)
	org.apache.jasper.compiler.ParserController.doParse(ParserController.java:245)
	org.apache.jasper.compiler.ParserController.parse(ParserController.java:106)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:211)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:396)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:372)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:396)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
根本原因。
java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.TagLibraryValidator
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1353)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
	java.base/java.lang.ClassLoader.defineClass1(Native Method)
	java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
	java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2352)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:800)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1317)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
	java.base/java.lang.ClassLoader.defineClass1(Native Method)
	java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
	java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2352)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:800)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1317)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
	org.apache.jasper.compiler.TagLibraryInfoImpl.createValidator(TagLibraryInfoImpl.java:355)
	org.apache.jasper.compiler.TagLibraryInfoImpl.(TagLibraryInfoImpl.java:195)
	org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:429)
	org.apache.jasper.compiler.Parser.parseDirective(Parser.java:487)
	org.apache.jasper.compiler.Parser.parseElements(Parser.java:1444)
	org.apache.jasper.compiler.Parser.parse(Parser.java:138)
	org.apache.jasper.compiler.ParserController.doParse(ParserController.java:245)
	org.apache.jasper.compiler.ParserController.parse(ParserController.java:106)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:211)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:396)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:372)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:396)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

查看Tomcat的版本,Tomcat10版本需要用:
jakarta.servlet.jsp.jstl-2.0.0.jar
jakarta.servlet.jsp.jstl-api-2.0.0.jar
注:lib下只能有这两个jstl包,不能有其他的jstl包,不然依旧会报错

以上两个jar包依然在通过百度网盘下载链接下载的文件中,在jakarta-taglibs-standard/

【步骤2】一个简单的测试JSP页面jstl_test.jsp

<%@ page contentType="text/html;charset=gb2312" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>



Using JSTL






Request Method:${pageContext.request.method}
Remote Address:${pageContext.request.remoteAddr}

如果页面运行产生下面结果,说明JSTL安装正确,可以使用。

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第1张图片

图12.1 jstl_test.jsp 页面的运行结果

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第2张图片

说明:使用JSTL我们不用建立标签库描述文件,因为该文件已经包含在standard.jar文件中了,JSP容器可以找到该文件。另外,也可以不用配置web.xml文件,因为JSP容器使用隐含映射的方式可以将标准的URI映射到适当的标签库上。

(二)表达式相关标签的使用

下面的core_expression.jsp演示了标签的使用,代码如下:

<%@ page contentType="text/html;charset=GB2312" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>





  表达式相关的标签





使用的例子


  
  
   不同作用域的number变量的初始值

pageScope.number =
requestScope.number =
sessionScope.number =

pageScope.number =
requestScope.number =
sessionScope.number =

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第3张图片

(三)流程控制标签的使用。本实验包括2个页面,一个是flowControl.html,一个是flowControl.jsp。

【步骤1】flowControl.html的代码如下:





  JSTL中用于流程控制的标签





使用JSTL流程控制标签

请选择一个填入文本框中:Tom\Jerry\Mike\Ben
 

姓名:

     

           

【步骤2】flowControl.jsp的代码如下:

<%@ page contentType="text/html;charset=GB2312" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>





  JSTL中用于流程控制的标签



 

  

标签c:if的使用

         您好,Tom            您好,Jerry            您好,Mike            您好,Ben    

标签c:choose c:when c:otherwise使用

            您好,Tom               您好,Jerry              您好,Mike               您好,Ben                

执行flowControl.jsp的结果如下图所示:

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第4张图片

图12.2 flowControl.html页面的运行结果

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第5张图片

在文本框中输入Tom后,点击“传送”按钮,则出现下面的结果:

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第6张图片

图12.3 flowControl.jsp页面的运行结果

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第7张图片

HTML网页出现乱码问题:

在header标签中加入:

(四)URL相关标签的使用

【步骤1】included.jsp是被包含的页面,代码如下:

<%@ page contentType="text/html;charset=gb2312" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>





Included Page



这是被包含页面中的内容

用户名:

【步骤2】import_test.jsp是包含页面,代码如下:

<%@ page contentType="text/html;charset=gb2312" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>





Using URL JSTL



这是包含页面中的内容

  

运行该页面,结果如下图所示:

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第8张图片

图12.4 import_test.jsp页面的运行结果

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第9张图片

【步骤3】redirect_test.jsp测试了重定向标签的使用,其代码如下:

<%@ page contentType="text/html;charset=gb2312" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>



Using Redirect Tag



使用redirect标签

  >

该页面的执行结果与前面的图一样。

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第10张图片

(五)创建简单的标签文件

   【步骤1】创建一个名为example.tag的简单的标签文件,代码如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>





注意:将该文件存放在Web应用程序的WEB-INF/tags目录中。

   【步骤2】创建一个名为example.jsp的页面,代码如下:

<%@ taglib prefix="ex" tagdir="/WEB-INF/tags" %>



The first six numbers in the Fibonacci sequence are:



执行该JSP页面,结果如下:

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第11张图片

  图12.5 example.jsp页面的运行结果

(六)使用标签文件指令控制标签

    【步骤1】下面的标签文件使用了tag指令的dynamic-attributes属性。dynatt.tag文件的代码如下:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ tag dynamic-attributes="attrib" %>



${att.value}

    【步骤2】使用该标签文件的JSP文件dynatt_test.jsp代码如下:

<%@ taglib prefix="dyn" tagdir="/WEB-INF/tags" %>





该JSP页面的运行结果为:

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第12张图片

  图12.6 dynatt_test.jsp页面的运行结果

java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator jstl.jar和standard.jar_第13张图片

四、思考题

1. JSTL的核心库有哪几类标签,各类中有哪些标签?

(1)核心标签(Core Tags):

:输出表达式或值。

:设置变量的值。

:移除指定的变量。

:捕获异常并处理。

:条件判断。

:多分支选择。

:迭代集合或数组。

(2)格式化标签(Formatting Tags):

:格式化日期。

:解析日期。

:格式化数字。

:解析数字。

:加载资源包。

(3)SQL标签(SQL Tags):

:设置数据源。

:执行查询操作。

:执行更新操作。

:设置参数。

(4)XML标签(XML Tags):

:输出XML内容。

:解析XML文档。

这些标签提供了在JSP页面中进行逻辑控制、数据格式化、数据库操作和XML处理等常见功能的便捷方式。

2.使用标签文件有什么好处?标签文件与JSP 文件的主要区别有哪些?

(1)标签文件(Tag Files)是一种可重用的、自定义的JSP标签,可以帮助简化JSP页面的开发和维护。使用标签文件有以下几个主要好处:

模块化和重用:标签文件允许将特定功能或组件封装为一个标签,以便在多个JSP页面中重复使用,从而提高代码的重用性和可维护性。

降低耦合度:通过将特定功能封装在标签文件中,可以降低JSP页面的复杂度,减少不同部分之间的耦合度,使代码更易于理解和维护。

提高可读性:标签文件可以提高JSP页面的可读性,使页面结构更清晰,易于理解,同时也便于团队协作和代码管理。

(2)标签文件与普通的JSP文件相比,主要区别在于:

语法:标签文件使用.tag作为文件扩展名,而JSP文件使用.jsp扩展名。

用途:标签文件用于定义自定义标签,而JSP文件用于渲染页面内容。

结构:标签文件通常包含标签处理器和标签体,用于定义自定义标签的行为和展示内容,而JSP文件主要包含HTML和Java代码混合的内容,用于生成页面。

总的来说,标签文件的使用可以帮助开发者更好地组织和重用代码,使JSP页面的开发更加模块化和可维护。

你可能感兴趣的:(Java,Web,java,servlet,开发语言)