0

确实,使用标签<label>而不是<h:outputLabel>允许我改善页面的加载时间并减少保留的内存(因为 HTML 组件不是在 ViewRoot 中创建的)?它们是否也是要替换的其他标签?为了实现这些想法,我在一个简单的项目上做了一个测试:Hello world 项目 我把 hello.html 改成了两页页面: Hello.html

>       <?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">
>
>      <h:head>
>        <title>JSF 2.0 Hello World</title>
>      </h:head>
       <h:body>
           <h3>JSF 2.0 Hello World Example - hello.xhtml</h3>
                  <h:form id="idfrm">
            <label id="idlbl1">I'm a label 1</label> 
            <br/>
            <label id="idlbl2">I'm a label 2</label> 
            <br/>
            <label id="idlbl3" >I'm a label 3</label>
            <br/>
            <h:inputText value="#{helloBean.name}"></h:inputText>
        <h:commandButton value="Welcome Me" action="#{helloBean.tester}"/>           
    </h:form>
      </h:body>
    </html>

和页面 Hello2.html

  <?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">

   <h:head>
<title>JSF 2.0 Hello World</title>
   </h:head>
   <h:body>
<h3>JSF 2.0 Hello World Example - hello.xhtml</h3>
<h:form id="idfrm">
    <h:outputLabel id="idlbl1" value="I'm an HtmlOUtputLabel 1"/>
    <br/>
    <h:outputLabel id="idlbl2" value="I'm an HtmlOUtputLabel 2"/>
    <br/>
    <h:outputLabel id="idlbl3" value="I'm an HtmlOUtputLabel 3"/>
    <br/>
    <h:inputText value="#{helloBean.name}"></h:inputText>
    <h:commandButton value="Welcome Me" action="#{helloBean.tester}"/>
</h:form>
    </h:body>

和 HelloBean.java

> package com.mkyong.common;

> import java.io.Serializable;
> import java.util.List;

> import javax.faces.bean.ManagedBean;

> import javax.faces.component.UIComponent;

> import javax.faces.component.html.HtmlOutputLabel;

> import javax.faces.context.FacesContext;

> @ManagedBean

> public class HelloBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    public HelloBean(){

    }

    private void traceAttrs (UIComponent c){
            System.out.println("id="+c.getClientId());
    }

    public String tester(){
        UIComponent frm  =FacesContext.getCurrentInstance().
            getViewRoot().findComponent("idfrm");
        List<UIComponent> componentList = frm.getChildren();
        for (UIComponent c:componentList){
            if (c instanceof HtmlOutputLabel ){
                traceAttrs(c);
            }
        }
        return null;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

第一个测试操作(在 Hello.html 中)在控制台上提供此输出

id=idfrm:idlbl1
id=idfrm:idlbl2
id=idfrm:idlbl3
id=idfrm:j_idt11

第二个给出

id=idfrm:j_idt9

所以我可以假设对象不再在 Viewtree 中。在 Web 应用程序中,有很多标签,所以这种方法可能很有趣?

非常感谢您的回复

4

0 回答 0