0

我们正在尝试在 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:在 jsp 文件中的第 28 行发生错误:/jsp/login/login2.jsp

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

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

4

1 回答 1

0

传统上,每个人都说不可能混合 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 代码。如果前段时间在演示文稿中完成此操作(模板 JSF 页面AngularJS 路由器示例 JSF 片段)。

于 2017-03-16T20:21:51.087 回答