<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大魚

    jsf幾個常用取值方法和技巧總結(jié)

    jsf幾個常用取值方法和技巧總結(jié)(持續(xù)更新)

    1、獲取managedbean或是解析表達(dá)式
    有三種方法

    (1)
    [code]
    FacesContext context =FacesContext.getCurrentInstance();
    ValueBinding binding =
    context.getApplication().createValueBinding("#{bean}");
    YourBean bean = (YourBean ) binding.getValue(context);
    [/code]

    (2)
    [code]
    FacesContext ctx = FacesContext.getCurrentInstance();
    VariableResolver variableResolver =ctx.getApplication().getVariableResolver();
    YourBean bean = (YourBean ) variableResolver.resolveVariable(ctx, "bean");
    [/code]

    (3)
    [code]
    Application application=context.getApplication();
    YourBean ManageBeanProperty=(YourBean )application.evaluateValueExpressionGet(context,"#{bean}",YourBean .class);
    [/code]

    第3種方法只對jsf1.2可用。(evaluateValueExpressionGet方法1.1種沒有)
    其實還有一種方法。后面會提到。


    2、對于已知范圍和名字的bean,可以
    externalContext.getRequestMap().get(beanName)
    externalContext.getSessionMap().get(beanName)
    externalContext.getApplicationMap().get(beanName)


    3、FacesContext
    組件實例相關(guān)

    facesContext.getViewRoot()
    可以獲取ViewRoot,然后遞歸循環(huán)其children得到整個組件樹,
    可以實現(xiàn):
    (1)根據(jù)組建id得到組件。
    (2)得到form,添加新的組件到此集合,或是改變form的屬性。
    (3)得到某個類型的所有組件,然后加上監(jiān)聽器。
    。。。。。
    從這個root入手,再加上事件,綁定和分析,幾乎可以完全控制整個組件樹。


    4、Application
    獲取方式Application application=facesContext.getApplication();
    用處可以見下面的代碼:
    (1)組件類型的注冊和組件集合的獲取
    (2)converter,validator的。。。
    (3)屬性分析器和變量分析器的。。。
    (4)NavigationHandler、ViewHandler....
    (5)添加一個listener
    (6)創(chuàng)建一個組件的實例
    (7)創(chuàng)建一個值綁定或方法綁定

    大部分全局性配置的東西都在這兒可以找到。而且?guī)缀醵际强梢詿崽鎿Q的。
    其中5、6比較常用。


    5、RuntimeConfig
    獲取方式RuntimeConfig runtimeConfig = RuntimeConfig.getCurrentInstance();

    兩個功能:
    (1)獲取配置文件中所有的導(dǎo)航規(guī)則,或者運行時添加新的導(dǎo)航規(guī)則。
    (2)獲取配置文件中所有的managedmean類型,或者運行時添加一個新的managedmean類型。

    第一條可以實現(xiàn)通過一個給定的url,動態(tài)添加一條規(guī)則,然后在action中return起outcome字符串。
    后一條可以獲取給定的bean的class全稱,實例化一個bean。或者動態(tài)配置一個bean。


    6、ExternalContext
    servlet相關(guān)操作和各種參數(shù)
    (1)獲取response和request、session、servletContext
    (2)redirect和dispacth
    (3)獲取resquest、session、application、servlet參數(shù)
    (4)獲取資源和url本地路徑
    (5)encode url

     
    7、綁定List和Map
    使用JSF開發(fā)時,經(jīng)常遇到要把MBean中的一個List或Map中的值通過EL顯示在頁面上,EL中訪問Map或List的方法如下:

    假設(shè)FacesConfig中配置一個bean的MBean,它的類中定義了一個List類型的list屬性和一個Map型的map屬性。

    首先是訪問List,頁面中引用bean中l(wèi)ist屬性的方法為:#{bean.list[index]}

    而對于Map,EL可以把Key作為一個屬性來讀取,因此對map的訪問可以寫為:#{bean.map.key},當(dāng)然這樣可以解決基本的問題,但是如果map中的key是一個包含了空格或特殊字符的String,那么很明顯,這個字符串不符合作為屬性名的條件,那么用上面的方法去訪問明顯是有問題的,所以我們很可以用另外一種方法訪問Map中的value,#{bean.map['key']}。同時可以看到,因為EL中的內(nèi)建對象基本都是用Map實現(xiàn)的,因此,EL中的訪問方法也是:#{sessionScope['key']}。


    8、JSF動態(tài)為DataTable添加列
    開發(fā)JSF的朋友可能會遇到這樣的問題,如果DataTable的列不固定,需要動態(tài)生成, 該如何實現(xiàn)呢。

    假設(shè)FacesConfig中配置一個名為bean的MBean,該MBean中需定義一個類型為javax.faces.component.html.HtmlDataTable類型的變量dt,頁面中的DataTable設(shè)置bingding="#{bean.dt}"。

    首先了解一下JSF中DataTable的渲染方式:

    DataTable

    --<Header> UIComponent

    --<Children>List<HtmlColumn>

    ----<HtmlColumn>

    ------<Header>UIComponent

    ----<Children>List<UIComponent>

    因此,要在后臺變更DataTable的狀態(tài),可以用dt.setHeader(UIComponent)設(shè)置DataTable的表頭,然后可以往dt.getChildren()中添加HtmlColumn類型的列,同樣,列中也可以由Header和Children組成。代碼實現(xiàn)如下:

    private void initialReportTable(List<ExcelReport> reportList) ...{
    dt.getChildren().clear();
    for (ExcelReport report : reportList) ...{
    HtmlColumn column = new HtmlColumn();
    HtmlOutputText header = new HtmlOutputText();
    header.setValueExpression("value",
    getValueExpression("#{rmaReport.captions.c"
    + report.getPosition() + "}"));
    column.setHeader(header);

    HtmlOutputText value = new HtmlOutputText();
    String ve = getVEString(report);
    System.out.println(report.getCaption() + " : " + ve);
    value.setValueExpression("value", getValueExpression(ve));
    column.getChildren().add(value);

    dt.getChildren().add(column);
    }
    }其中,動態(tài)建立控件的方法為直接創(chuàng)建一個控件,然后通過ValueExpression來設(shè)置控件在運行時顯示的值,如果是Column中的數(shù)據(jù),則可以使用#{tableVar.ColumnName}格式的EL表達(dá)式。

    9、 JSF動態(tài)生成組件

    用過Servlet和JSP的開發(fā)者對動態(tài)生成組件應(yīng)該是情有獨鐘了,可以根據(jù)數(shù)據(jù)的情況生成特定的組件,這樣增大了Form的靈活性,那么JSF中如何生成動態(tài)的窗體呢,其實非常簡單。主要邏輯就是通過FacesContext得到viewRoot對象,然后通過viewRoot對象的getChildren方法可以得到viewRoot下的所有第一級組件,然后分別對每個組件的getChildren方法進(jìn)行遞歸調(diào)用,就可以得到整個組件樹,當(dāng)然可以對某個組件的getChildren得到的List使用add方法添加組件了,代碼如下,頁面有兩個commandButton,其中一個可以添加一個TextBox控件,另外一個可以在console打印出當(dāng)前的組件列表。

    package net.moon;

    import java.util.List;

    import javax.faces.component.UIComponent;
    import javax.faces.component.UIViewRoot;
    import javax.faces.component.html.HtmlInputText;
    import javax.faces.context.FacesContext;

    public class DymaComponent ...{

    private UIViewRoot viewRoot;
    private static int inputIndex = 0;

    private List<UIComponent> getComponentChildren(UIComponent component)...{
    List<UIComponent> componentList = null;
    System.out.println(component.getId());
    if(component.getChildCount() > 0)...{
    for(UIComponent ui : component.getChildren())...{
    componentList = getComponentChildren(ui);
    }
    }
    return componentList;
    }

    public String getComponentsList()...{
    viewRoot = FacesContext.getCurrentInstance().getViewRoot();
    for(UIComponent component : viewRoot.getChildren())...{
    getComponentChildren(component);
    }
    return null;
    }

    public String addTextBox()...{
    viewRoot = FacesContext.getCurrentInstance().getViewRoot();
    UIComponent form1 = viewRoot.getChildren().get(0);
    HtmlInputText input = new HtmlInputText();
    input.setId("input" + (inputIndex++));
    input.setValue("Input 1");
    input.setRendered(true);
    form1.getChildren().add(input);
    return null;
    }

    }

    <%...@ page contentType="text/html; charset=UTF-8" %>
    <%...@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    <%...@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title></title>
    </head>
    <body>
    <f:view>
    <h:form id="form1">
    <h:commandButton id="commmand1" action="#{dymaComponent.getComponentsList}" value="Print ViewRoot"></h:commandButton>
    <h:commandButton action="#{dymaComponent.addTextBox}" value="Add TextBox"></h:commandButton>
    </h:form>
    </f:view>
    </body>
    </html>

    <?xml version="1.0" encoding="UTF-8"?>

    <faces-config
    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-facesconfig_1_2.xsd"
    version="1.2">
    <managed-bean>
    <managed-bean-name>
    dymaComponent</managed-bean-name>
    <managed-bean-class>
    net.moon.DymaComponent</managed-bean-class>
    <managed-bean-scope>
    session</managed-bean-scope>
    </managed-bean>

    </faces-config>

    posted on 2009-03-17 14:17 大魚 閱讀(304) 評論(0)  編輯  收藏 所屬分類: JSF

    主站蜘蛛池模板: 亚洲综合色婷婷在线观看| 日本激情猛烈在线看免费观看 | 亚洲国产精品免费视频| 伊人久久大香线蕉亚洲| 亚洲AV日韩AV高潮无码专区| 亚洲最大的成网4438| 国产精品免费AV片在线观看| 久久亚洲免费视频| 午夜免费福利小电影| 精品亚洲成a人片在线观看| 又大又硬又爽又粗又快的视频免费| 亚洲国产精品久久久久婷婷软件 | 亚洲免费日韩无码系列| 亚洲天堂在线视频| 中文字幕免费在线观看动作大片 | 亚洲国产精品自在拍在线播放 | 国产亚洲精品精品国产亚洲综合| 免费国产黄网站在线看| 中文字幕亚洲图片| 久久精品中文字幕免费| 亚洲国产精品xo在线观看| 久久久久国色AV免费看图片| 亚洲爆乳精品无码一区二区| 亚洲免费在线观看| 国产免费AV片在线观看| 亚洲丝袜中文字幕| 日本黄色动图免费在线观看| 亚洲自偷自拍另类图片二区| 在线免费播放一级毛片| 亚洲白嫩在线观看| 免费国产叼嘿视频大全网站| 亚洲国产成人va在线观看网址| 老司机永久免费网站在线观看| 久久久久久久国产免费看| 亚洲精品无码日韩国产不卡?V| a级毛片免费在线观看| 亚洲激情视频图片| 国产乱辈通伦影片在线播放亚洲 | 性色av免费观看| 亚洲免费视频一区二区三区| 亚洲国产成人久久综合一区|