Jsp servlet无法加载bootsface

时间:2017-03-16 12:07:40

标签: jsp jsf bootsfaces

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

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

当我尝试添加bootsfaces标签lib

时   
<%@ 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正在使用无面标记库,我试图使用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标记lib格式,

<!--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行发生错误   file:/jsp/login/login2.jsp PWC6199:生成的servlet错误:方法   得到类org.apache.jasper.runtime.TagHandlerPool不能   适用于给定类型;

尝试运行此应用程序时出现此错误

  

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

     

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

你能不能建议任何让你的靴子在jsp上工作的替代方法

1 个答案:

答案 0 :(得分: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代码混合使用。如果在一段时间之前在演示文稿中完成此操作(template JSF pageAngularJS routerexample JSF fragment)。