JSF学习--JSF2组件与Tomcat9.*容器兼容的配置问题

时间:2022-06-22 20:03:38

一、前言

最近在做某个项目时,使用到JSF2与tomcat9.0服务器,可是,JSF的很多标签(JSF组件)无法在浏览器中显示出来。tomcat服务器的后台提示信息太少,这个问题就托了很久,查询了好多资料,直到今天才解决。

二、问题描述

2.1 开发环境

JSF2.1 + Tomcat9.0 + maven

2.2 问题详述

  1. 如下面index.xhtml的代码:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">


<h:head>
</h:head>
<h:body>
<h1>DBConnection Demo</h1>
<h:form>
<h:commandButton value="TESTConnect" action="#{controller.connectDB}" />
</h:form>
</h:body>
</html>

2.选择JSF映射.jsf,可是在浏览器中访问该页面时无法显示command这个JSF标签。
如下图所示:
JSF学习--JSF2组件与Tomcat9.*容器兼容的配置问题

三、原因分析

3.1 JSF与容器

首先需要明确一点:JSF,JavaServer Faces,它是以组件为中心来开发 Java Web 用户界面的方法。因此,在使用JSF进行开发时需要建立一种组件的概念,在这种开发中,所有的JSF组件是由容器来负责管理的,包括组件的创建、管理、维护、使用以及销毁。常用的容器有Tomcat、Wildfly 、Glassfish等。

3.2 JSF与tomcat

在以前的学习中我们知道,wildfly1.0是默认支持JSF2.0的。可是在这里的Tomcat9.0中,没有默认支持JSF2.0,所以,我们需要手动添加JSF2.0的Tomcat9.0的支持。

四、问题解决

4.1 查看$tomcat/lib目录下是否有JSF的jar包

如下图:
JSF学习--JSF2组件与Tomcat9.*容器兼容的配置问题
正常情况下是没有框中的两个JSF的jar包的。

  • jsf-api-2.1.jar
  • jsf-impl-2.1.jar

4.2 手动添加相关jar包

可以手动下载适合版本的JSF的jar包,(上面所列)然后手动添加到Tomcat安装目录的lib目录下即可。
JSF学习--JSF2组件与Tomcat9.*容器兼容的配置问题

4.3 在pom文件中添加jsf-api和jsf-impl依赖

然后需要在maven的pom文件中添加相关依赖。

<!-- jsf2 api -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.13</version>
</dependency>
<!-- jsf2 impl -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.13</version>
</dependency>

五、问题解决过程中遇到的问题及解决方法

5.1 问题1: java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/faces/webapp/FacesServlet

解决方法

将pom文件中的关于javaee的依赖配置全都替换为javaee-api并将scope设置为provided。

 <!-- javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>

5.2 问题2:Target Unreachable, identifier resolved to null in JSF 2.2

解决方法

在pom中添加以下两个依赖:

<!-- jsf2 api -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.13</version>
</dependency>
<!-- jsf2 impl -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.13</version>
</dependency>

六、参考资料

1.http://*.com/questions/15948598/classformaterror-absent-code-attribute-in-method-that-is-not-native-or-abstract
2.http://*.com/questions/20504611/target-unreachable-identifier-resolved-to-null-in-jsf-2-2