当前位置: 首页 > 知识库问答 >
问题:

使用模板时在JSF中获取ViewID

葛胜泫
2023-03-14
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext exContext = context.getExternalContext();
    Map<String, String> x = exContext.getRequestHeaderMap();
    System.out.println(x.get("request"));
    System.out.println(context.getViewRoot().getViewId());
    System.out.println(exContext.getRequestContextPath());

但是我需要的是其中包含的XHTML,例如view1.XHTML(加载在home.XHTML中)。

这可能吗?我需要这个来保存我的小翻译应用程序的数据库中的请求视图。

编辑:我的WebApp应该跟踪哪个视图从我的资源包中调用了特殊的翻译标记,并将视图(view1.xthml,而不是home.xhtml)和标记写入数据库。也许也可以获得html元素ID(但这并不重要)?每个视图上都有多个包含!

<p:panel header="#{translations['titel']}">
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
    <title>example</title>
    <link rel="shortcut icon" type="image/x-icon"
          href="#{request.contextPath}/resources/images/logo/example.ico"/>
</h:head>

<h:body>
    <h:form id="menubar">
        <p:menubar>
            <p:submenu label="#{translations['language']}" icon="fa fa-language">
                <p:menuitem value="German" action="#{language.setLocale(de)}"/>
                <p:menuitem value="English" action="#{language.setLocale(en)}"/>
            </p:submenu>
        </p:menubar>
    </h:form>
</h:body>
<resource-bundle>
    <base-name>example.i18n.resourcebundle.DBResourceBundle</base-name>
    <var>translations</var>
</resource-bundle>
public String test() {
    FacesContext fCtx = FacesContext.getCurrentInstance();
    UIComponent currentComponent = UIComponent.getCurrentComponent(fCtx);
    if (null != currentComponent) {
        Location location = (Location) currentComponent.getAttributes().get(UIComponent.VIEW_LOCATION_KEY);
        if (null != location) {
            System.out.println(location);
            System.out.println(location.getPath());
            return location.getPath();
        }
    }
    return null;
}

现在,我想将label=“#{translations['language']}”的所有请求保存在一个映射中。这个映射应该以“language”作为键,以请求的XHTML(例如“login.XHTML”)作为值。翻译包含我需要的大部分翻译,如果它不在里面,我也想要一个条目。

在本例中,如果请求调用test()函数就足够了。

共有1个答案

惠翰藻
2023-03-14

在计算#{translations['titel']}时,您希望知道该表达式在XHTML文件中的物理位置。

经过深入研究,我发现了如何获取当前呈现的标记的位置:

有关相关API,请参见

javax.faces.view.Location
UIComponent.VIEW_LOCATION_KEY
javax.faces.component.UIComponent.getCurrentComponent(FacesContext)
public String getCurrentComponentPath() {
        FacesContext fCtx = FacesContext.getCurrentInstance();
        UIComponent currentComponent = UIComponent.getCurrentComponent(fCtx);
        if (null != currentComponent) {
            Location location = (Location) currentComponent.getAttributes().get(UIComponent.VIEW_LOCATION_KEY);
            if (null != location) {
                return location.getPath();
            }
        }
        return null;
    }
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition>

    #{translations['titel']}

</ui:composition>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition>

    <h:outputText value="#{translations['titel']}"/>

</ui:composition>
</html>
 类似资料:
  • 主要内容:模板标签,创建Facelets模板模板是提供实现用户界面的工具的工具。 模板化是一个有用的功能,允许您创建一个页面,作为应用程序中其他页面的基础。 通过使用模板,您可以重用代码,并避免重复类似的页面。模板化还有助于简化在具有大量页面的应用程序中维护标准外观和感觉。 下表包含用于创建模板的Facelets标签。 模板标签 标签 功能 它用于定义创建并添加到组件树的组件。 它用于定义可选地使用模板的页面组合,此标记之外的内容将被忽略。

  • 模板代表了 freemarker.template.Template 实例。典型的做法是从 Configuration 实例中获取一个 Template 实例。无论什么时候你需要一个模板实例, 都可以使用它的 getTemplate 方法来获取。在 之前 设置的目录中的 test.ftl 文件中存储 示例模板,那么就可以这样来做: Template temp = cfg.getTemplate("

  • 问题内容: 我的Django应用中有以下模型: 我已将MEDIA_ROOT设置为Apache网络根目录中的/ hmedia /目录,并将MEDIA_URL设置为’http://localhost/hmedia/'。这似乎奏效了-我已通过Django管理网站成功上传了几张图片,并且可以通过查看这些图片http://localhost/hmedia/images/[filename]。并且Django

  • 我用Django开发了一个Web应用。在View函数中,我将一个查询集列表呈现到前端。在我的例子中,标题表是书籍信息,材料是这本书的详细信息,附在哪个课程上,如果这个附加关系是“丢弃”。is_discard在材料表中,而不是这本书丢弃与否。在材料表中,一门课程附带几本书,丢弃状态不是按书而是按书-课对,因为有些书可能在一门课程中丢弃,但在其他课程中有效 看法py: 在前端,query\u resu

  • 问题内容: 我有一个使用RadioSelect小部件包含ModelChoiceField的ModelForm。 我要在单选按钮旁边显示MyBModel上的属性。我会在ModelChoiceField的子类上进行重写,但这不允许我做我想做的事情,因为我希望单选按钮出现在每个选择项都有一行的表中。 所以我在模板中的某处想要… 不幸的是,field.choices返回对象的ID和标签的元组,而不是que

  • 问题内容: 如何在支持JSF页面的bean中获得请求URL?我一直在浏览FacesContext文档,发现的最佳方法似乎很长: 编辑:功能要求 这里的要求是我们需要第三方javascript实用程序的完整URL。该实用程序的使用或体系结构不适用于JSF,但除此调用外的所有内容都适用。我发现的方法可以用,但是深入研究FacesContext感觉不对。另外,我希望可以使用JSF表达式语言调用此方法,因