我第一次尝试在 Eclipse 中使用带有 JSF 2.0 的模板,但我遇到了问题。
原始index.xhtml
页面工作正常,当我点击一个按钮时,一切正常。但是,如果我更改索引页面以使其使用模板文件,它将不再正常工作。修改后的index.xhtml
页面在这里:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/templates/main-template.xhtml">
<ui:define name="title">
Simulator using JSF 2.0 - Test Version 2
</ui:define>
<ui:define name="header">
Home Page of the Simulator using JSF 2.0 - Test Version 2
</ui:define>
<ui:define name="body">
Click on the button to select the required option
<h:outputText value="and login" rendered="#{!login.loggedIn}"/>
<h:form prependId="false">
<h:commandButton value="Option 1" action="#{login.option1}"/>
<h:commandButton value="Option 2" action="#{login.option2}"/>
<h:commandButton value="Option 3" action="#{login.option3}"/>
<h:commandButton value="Logout" disabled="#{!login.loggedIn}" action="#{login.logout}"/>
</h:form>
</ui:define>
</ui:composition>
模板文件 ,main.template.xhtml
位于子文件夹 templates 中,在这里:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>
<ui:insert name="title">Title</ui:insert>
</title>
</h:head>
<h:body>
<ui:insert name="header">Header</ui:insert>
<br/>
We are in template.xhtml
<br/>
<ui:insert name="body">Body</ui:insert>
</h:body>
</html>
如果我删除 index.xhtml 中带有“h”标签的所有代码,该文件会正确提取 templates/main-template.xhtml 中的代码,因此路径是正确的。但是,如果我在此处包含带有“h”标签的代码,Eclipse 会抱怨无法识别标签并且页面失败。
如果我xmlns:h="http://java.sun.com/jsf/html"
在顶部包含该行,则 Eclipse 识别出“h”标签并且页面正确呈现,但是当我单击按钮时应用程序失败,并返回错误:
javax.servlet.ServletException: javax.el.PropertyNotFoundException: /index.xhtml @15,68 action="#{login.option1}": Target Unreachable, identifier 'login' resolve to null
也许xmlns:h="http://java.sun.com/jsf/html"
模板文件中的那一行搞砸了,但模板的整个想法是在模板文件中包含尽可能多的通用代码。
有谁知道发生了什么,解决方案是什么?
web.xml
和是标准的faces-config.xml
,不要认为必须对它们做任何事情。