gpt4 book ai didi

java - JavaServer Faces 2.0 中的模板

转载 作者:太空宇宙 更新时间:2023-11-04 08:00:33 26 4
gpt4 key购买 nike

我第一次尝试在 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' resolved to null

也许模板文件中的 xmlns:h="http://java.sun.com/jsf/html" 行把事情弄乱了,但模板的整体思想是在模板文件中包含尽可能多的通用代码。

有人知道发生了什么事吗?解决方案是什么?

web.xmlfaces-config.xml 是标准的,不需要对它们做任何事情。

最佳答案

您关于模板应如何工作的想法似乎是正确的,但有一些要点我们应该澄清。也许这会对您有所帮助:

命名空间

关于命名空间,每当您在页面中使用标签库时,都应该声明它的命名空间。即使您正在使用模板并且已在模板中声明它们。如果有帮助的话,您可以认为命名空间声明不是继承的。

在本例中,我看到您的 index.xhtml 页面正在使用 h:commandButton 但尚未声明其命名空间。

bean 类

要让 EL 找到 Bean,您应该具有以下内容:

使用 @ManagedBean 注释的类,从 javax.faces.bean.ManagedBean 包导入,如下所示:

import javax.faces.bean.ManagedBean;

@ManagedBean
@ViewScoped
public class Login
{
// ...
}

在这种情况下,按照惯例,EL 应该通过名称 login 找到您的 Bean。 (将类(class)名称的第一个字母取消大写)

或者您可以给它一个名称:

import javax.faces.bean.ManagedBean;

@ManagedBean(name="login")
@ViewScoped
public class MyLoginBean
{
// ...
}

在本例中,按照惯例,它将被称为 myLoginBean,但我们给了它一个名称,在本例中为 login,因此 EL 应该通过名称 login 找到它。

如果您想使用 CDI 而不是普通的 JSF,您可以使用 @Named 注释来定义 EL 如何找到您的 bean,并遵循相同的命名约定。

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;

@Named(value="login")
@RequestScoped
public class MyLoginBean
{
// ...
}

请记住,您希望 EL 查找和更改的数据必须具有正确的 getter 和 setter。

提示

我建议您创建更简单的代码来测试功能。在这种情况下,您可以首先测试模板,然后测试 bean、操作等...

希望对您有所帮助。

关于java - JavaServer Faces 2.0 中的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12884244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com