【问题标题】:Jsp servlets not able to load bootsfacesJsp servlet 无法加载 bootsfaces
【发布时间】:2017-03-16 12:07:39
【问题描述】:

我们正在尝试在 Jsf2.1/Jsp 1.3 上运行 Bootsfaces。我们正在努力将具有 1500 多个 Jsp 文件(JSF1.2)的旧版 jsp 应用程序迁移到 JSF2.1,迁移到 Facelets 将需要付出很多努力,因为我们必须将每个 .jsp 文件转换为 .xhtml 。

所以,我按照您的建议开始了一个演示 Web 应用程序,并创建了一个使用 bootsfaces 的 facelets 登录页面。 它工作正常,我能够看到 bootsfaces 内容渲染。 现在我想将 bootsfaces 与 Jsp servlets 一起使用,我创建了一个新的 Jsp 页面

当我尝试添加 bootsfaces 标签库时

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://bootsfaces.net/ui" prefix="b" %>

我在第 3 行遇到异常:

绝对 uri "http://bootsfaces.net/ui" 无法在 随应用程序加载的 web.xml 或 jar 文件

我在 bootsfaces jar 文件中查看 bootsfaces-b.taglib.xml 文件,我看到了

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://bootsfaces.net/ui</namespace>
<tag>
<tag-name>accordion</tag-name>
....

所以我发现问题可能是因为 bootsfaces jar 正在使用 faceless 标签库,而我正在尝试使用 servlet 标签库来使用它,但它无法找到它。所以我想对此进行试验并手动创建了一个具有 servlet 标记的 tld 文件

<?xml version="1.0" encoding="ISO-8859-1"?>

<taglib xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
   xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1">

我通过在.tld文件中添加一个标签(inputText)描述进行测试,我更改了格式以匹配servlet标签库格式,

<!--made changes like  replaced<tag-name> with <name>-->    
<tag>
<name>inputText</name>
<tag-class>net.bootsfaces.component.inputText.InputText</tag-class>
<attribute>
 <description><![CDATA[Access key to transfer focus to the input element.]]></description>
 <name>accesskey</name>
 <required>false</required>
 <type>java.lang.String</type>
</attribute>
<attribute>
 <description><![CDATA[Activates AJAX. The default value is false (no AJAX).]]></description>
 <name>ajax</name>
 <required>false</required>
 <type>java.lang.Boolean</type>
</attribute> 

login.jp 页面上没有显示编译时异常,但是当我尝试运行项目时出现此异常

PWC6197:jsp 中的第 28 行发生错误 文件:/jsp/login/login2.jsp PWC6199:生成的 servlet 错误:方法 进入类 org.apache.jasper.runtime.TagHandlerPool 不能 应用于给定类型;

我们在尝试运行此应用程序时收到此错误

必需:java.lang.Class 找到: java.lang.Class
原因:推断的类型不符合推断的上限: net.bootsfaces.component.inputText.InputText 上限: javax.servlet.jsp.tagext.JspTag PWC6197:第 28 行发生错误 在jsp文件中:/jsp/login/login2.jsp

PWC6199:生成的 servlet 错误:我们在尝试运行时收到此错误 这个应用程序 找不到符号符号:方法 setPageContext(javax.servlet.jsp.PageContext) 位置:变量 _jspx_th_b_inputText_0 类型为 net.bootsfaces.component.inputText.InputText

您能否建议任何其他让 bootsfaces 在 jsp 上工作的方法

【问题讨论】:

    标签: jsp jsf bootsfaces


    【解决方案1】:

    传统上,每个人都说不可能混合使用 JSP 和 JSF 代码。但我理解你为什么要这样做,我认为这是一个值得探索的有趣问题。所以让我试着给你一些提示 - 即使这是一种有点令人失望的回答方式。

    • 坏消息是 JSF 2 并不是要与 JSP 混合使用。该框架的创建者希望摆脱混合 Facelets、HTML 和 Java 代码所带来的无数痛点。所以我很确定在同一个文件中混合 JSF 2.x 代码和 JSP 代码是不可能的。

    • 起作用的是将页面的某些部分定义为 *.xhtml 文件并使用 URL 包含它。如果您想使用 AngularJS 的路由器,这会派上用场。不幸的是,这不是您的用例,我知道如何实现这一点的唯一方法是使用 iframe。也许这样行得通,但它很笨拙和尴尬。

    • *.xhtml 文件由 servlet (javax.faces.webapp.FacesServlet) 解析。这就是为什么您不能简单地以 JSP 方式添加名称空间。 JSF 根本就不是这样设计的。但是 servlet 和 JSP 页面是密切相关的技术,所以也许您可以找到一种方法来集成这两种技术。例如,您可以使用 FacesServlet 编写 JSP 标记来读取和解析 *.xhtml 文件。

    • 也许您也可以从 JSF 文件开始,将其用作模板,然后将 JSP 页面嵌入其中。

    • 2017 年 3 月 18 日更新:AngularFaces 提供了一种更灵活的方式来包含 servlet 和 JSF 片段。这个想法是编写一个微型 AngularJS 控制器来定义导航路线。这些片段可以由任意技术生成——JSF、JSP、PHP 等等。因此,您可以在同一页面上混合使用旧的 JSP 代码和新的 JSF 2.x 代码。如果前段时间在演示文稿中完成此操作(template JSF pageAngularJS routerexample JSF fragment)。

    【讨论】:

    • 感谢您的详细解释并为我提供了实现我们使命的替代方案,我很想尝试最后两个提示。
    • 我添加了另一个选项。 AngularFaces 也可能对您有所帮助。添加一个全新的技术堆栈有点难看,但是,尝试操纵 JSF 引擎更加复杂,甚至可能更加危险。
    • AngularFaces 对我们来说将是与我们计划的不同的堆栈,如果其他一切变得复杂,我们将尝试 AngularFaces。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多