一、前言
最近在做某个项目时,使用到JSF2与tomcat9.0服务器,可是,JSF的很多标签(JSF组件)无法在浏览器中显示出来。tomcat服务器的后台提示信息太少,这个问题就托了很久,查询了好多资料,直到今天才解决。
二、问题描述
2.1 开发环境
JSF2.1 + Tomcat9.0 + maven
2.2 问题详述
- 如下面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标签。
如下图所示:
三、原因分析
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的jar包的。
- jsf-api-2.1.jar
- jsf-impl-2.1.jar
4.2 手动添加相关jar包
可以手动下载适合版本的JSF的jar包,(上面所列)然后手动添加到Tomcat安装目录的lib目录下即可。
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