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

来源:互联网 发布:云南省扶贫大数据平台 编辑:程序博客网 时间:2024/06/05 22:39

一、前言

最近在做某个项目时,使用到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-commond

三、原因分析

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
正常情况下是没有框中的两个JSF的jar包的。

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

4.2 手动添加相关jar包

可以手动下载适合版本的JSF的jar包,(上面所列)然后手动添加到Tomcat安装目录的lib目录下即可。
jsf2

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://stackoverflow.com/questions/15948598/classformaterror-absent-code-attribute-in-method-that-is-not-native-or-abstract
2.http://stackoverflow.com/questions/20504611/target-unreachable-identifier-resolved-to-null-in-jsf-2-2

0 0
原创粉丝点击