大魚

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

          jsf幾個(gè)常用取值方法和技巧總結(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種方法只對(duì)jsf1.2可用。(evaluateValueExpressionGet方法1.1種沒有)
          其實(shí)還有一種方法。后面會(huì)提到。


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


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

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


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

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


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

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

          第一條可以實(shí)現(xiàn)通過一個(gè)給定的url,動(dòng)態(tài)添加一條規(guī)則,然后在action中return起outcome字符串。
          后一條可以獲取給定的bean的class全稱,實(shí)例化一個(gè)bean。或者動(dòng)態(tài)配置一個(gè)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ā)時(shí),經(jīng)常遇到要把MBean中的一個(gè)List或Map中的值通過EL顯示在頁(yè)面上,EL中訪問Map或List的方法如下:

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

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

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


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

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

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

          DataTable

          --<Header> UIComponent

          --<Children>List<HtmlColumn>

          ----<HtmlColumn>

          ------<Header>UIComponent

          ----<Children>List<UIComponent>

          因此,要在后臺(tái)變更DataTable的狀態(tài),可以用dt.setHeader(UIComponent)設(shè)置DataTable的表頭,然后可以往dt.getChildren()中添加HtmlColumn類型的列,同樣,列中也可以由Header和Children組成。代碼實(shí)現(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);
          }
          }其中,動(dòng)態(tài)建立控件的方法為直接創(chuàng)建一個(gè)控件,然后通過ValueExpression來設(shè)置控件在運(yùn)行時(shí)顯示的值,如果是Column中的數(shù)據(jù),則可以使用#{tableVar.ColumnName}格式的EL表達(dá)式。

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

          用過Servlet和JSP的開發(fā)者對(duì)動(dòng)態(tài)生成組件應(yīng)該是情有獨(dú)鐘了,可以根據(jù)數(shù)據(jù)的情況生成特定的組件,這樣增大了Form的靈活性,那么JSF中如何生成動(dòng)態(tài)的窗體呢,其實(shí)非常簡(jiǎn)單。主要邏輯就是通過FacesContext得到viewRoot對(duì)象,然后通過viewRoot對(duì)象的getChildren方法可以得到viewRoot下的所有第一級(jí)組件,然后分別對(duì)每個(gè)組件的getChildren方法進(jìn)行遞歸調(diào)用,就可以得到整個(gè)組件樹,當(dāng)然可以對(duì)某個(gè)組件的getChildren得到的List使用add方法添加組件了,代碼如下,頁(yè)面有兩個(gè)commandButton,其中一個(gè)可以添加一個(gè)TextBox控件,另外一個(gè)可以在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 大魚 閱讀(308) 評(píng)論(0)  編輯  收藏 所屬分類: JSF

          主站蜘蛛池模板: 九台市| 兴安盟| 比如县| 兰西县| 龙海市| 福泉市| 饶平县| 高平市| 平阴县| 瓮安县| 裕民县| 漯河市| 民乐县| 太仆寺旗| 广宁县| 文昌市| 石阡县| 蓬安县| 梁平县| 华蓥市| 始兴县| 台前县| 巴南区| 尤溪县| 中阳县| 乃东县| 宜川县| 安宁市| 太康县| 南和县| 宜宾市| 云和县| 叶城县| 利川市| 石楼县| 鲁山县| 绥滨县| 景洪市| 英吉沙县| 顺昌县| 张家界市|