三级网站在线,六十路在线观看,婷婷久久免费视频http://www.aygfsteel.com/TiGERTiAN/category/34900.html----TiGERTiANzh-cnSun, 27 Dec 2009 19:35:10 GMTSun, 27 Dec 2009 19:35:10 GMT60jQuery操作JSF中的Checkbox樹http://www.aygfsteel.com/TiGERTiAN/archive/2009/12/27/307463.htmlTiGERTiANTiGERTiANSun, 27 Dec 2009 14:52:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2009/12/27/307463.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/307463.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2009/12/27/307463.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/307463.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/307463.html閱讀全文

TiGERTiAN 2009-12-27 22:52 發(fā)表評論
]]>
MyFaces中SelectOneRadio的一個bughttp://www.aygfsteel.com/TiGERTiAN/archive/2009/12/03/304691.htmlTiGERTiANTiGERTiANThu, 03 Dec 2009 12:34:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2009/12/03/304691.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/304691.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2009/12/03/304691.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/304691.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/304691.html
Caused by: javax.faces.convert.ConverterException: java.lang.ClassCastException: org.apache.myfaces.shared_impl.renderkit.RendererUtils$1
cannot be cast to java.lang.Boolean
at javax.faces.convert.BooleanConverter.getAsString(BooleanConverter.java:91)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:630)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlRadioRendererBase.encodeEnd(HtmlRadioRendererBase.java:91)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:624)
... 110 more
Caused by: java.lang.ClassCastException: org.apache.myfaces.shared_impl.renderkit.RendererUtils$1
cannot be cast to java.lang.Boolean
at javax.faces.convert.BooleanConverter.getAsString(BooleanConverter.java:87)
... 113 more

后來在國外網(wǎng)站上面找到了問題所在:

Hello,

the problem still exists in MyFaces Core 1.2.6.

I have a selectOneMenu with a value binding to a boolean property.

In the boolean converter the ClassCastException still occurs.

...
Caused by: javax.faces.convert.ConverterException: java.lang.ClassCastException: org.apache.myfaces.shared_impl.renderkit.RendererUtils$1
cannot be cast to java.lang.Boolean
at javax.faces.convert.BooleanConverter.getAsString(BooleanConverter.java:91)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:630)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlRadioRendererBase.encodeEnd(HtmlRadioRendererBase.java:91)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:624)
... 110 more
Caused by: java.lang.ClassCastException: org.apache.myfaces.shared_impl.renderkit.RendererUtils$1
cannot be cast to java.lang.Boolean
at javax.faces.convert.BooleanConverter.getAsString(BooleanConverter.java:87)
... 113 more

In RendererUtils there are some tests that value equals NOTHING. However the equals method
of the NOTHING-Serializable isn't overriden. Therefore it has no effect.

Overriding the equals method as in the patch of paul works.


有些東西沒有實現(xiàn),導(dǎo)致了這個問題。這個可能需要你自己簡單實現(xiàn)一下源文件然后編譯成庫文件了,感覺麻煩就換成了SelectOneMenu了。
后面有時間再看了





TiGERTiAN 2009-12-03 20:34 發(fā)表評論
]]>
[JSF]手動初始化選擇控件 頁面所有action均失效的問題http://www.aygfsteel.com/TiGERTiAN/archive/2009/11/18/302754.htmlTiGERTiANTiGERTiANWed, 18 Nov 2009 01:02:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2009/11/18/302754.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/302754.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2009/11/18/302754.html#Feedback2http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/302754.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/302754.html
同事代碼:
 1 public void bignessDangeValueChangeListener(ActionEvent e) {
 2         //System.out.println(e.getComponent().getParent().getChildCount());
 3         org.ajax4jsf.component.html.HtmlAjaxSupport ajaxSupport = (org.ajax4jsf.component.html.HtmlAjaxSupport)e.getComponent();
 4         HtmlSelectOneMenu parent = (HtmlSelectOneMenu)ajaxSupport.getParent();
 5         Short value = (Short)parent.getValue();
 6         String[] idDetails = parent.getId().split("_");
 7         StringBuffer controlId = new StringBuffer();
 8         controlId.append(idDetails[0]);
 9         if (WebUtil.PROPS_FILE_NAME_TRASH_DISCHARGE.equals(idDetails[0])) {
10             idDetails[1]="hazardousSubstance"//配置文件中配置的二級聯(lián)動的二級控件的name字段
11         }
12         
13         for (int i = 1;i < idDetails.length;i++){
14             controlId.append("_").append(idDetails[i]);
15         }
16         
17         ajaxSupport.setReRender(controlId.toString());
18         
19         List<BignessDangerInfo> list = Common.getBignessDangerInfoByObjType(value);
20         List<String> labelList = new ArrayList<String>();
21         List<Integer> valueList = new ArrayList<Integer>();
22         for(BignessDangerInfo bdi : list) {
23             labelList.add(bdi.getObjectName());
24             valueList.add(String.valueOf(bdi.getRecuid()));
25         }
26         
27 
28         
29         if(value == 1 || value == 2 || value == 3 || value == 4) {
30             DynamicControlFactory.initSelectValues(e, idDetails[1], labelList, valueList);
31         }  else {
32             List<List<String>> listClear = new ArrayList<List<String>>();
33             List<String> temp1 = new ArrayList<String>();
34             List<String> temp2 = new ArrayList<String>();
35             temp1.add("-1");
36             temp2.add("--請選擇--");
37             listClear.add(temp1);
38             listClear.add(temp2);
39             DynamicControlFactory.initSelectValues(e, idDetails[1], listClear.get(1), listClear.get(0));
40         }
41     }

initSelectValues的相關(guān)代碼:
 1public static void initSelectValues(ActionEvent e, String col, List<String> labels, List<String> values)
 2    {
 3        try {
 4
 5            String[] parms = e.getComponent().getParent().getId().split("_");
 6            DynamicControlObject dco = getControlObjects().get(parms[0]);
 7            
 8            List<String> colList = dco.getColNameList();
 9            String prefix = dco.getFormName() + ":" + parms[0];
10            
11            Map cos = new HashMap();
12            String rowIdx = parms[parms.length - 1];
13
14            initSelectOneComponent(findComponent(prefix + "_" + col + "_1" + "_"
15                    + rowIdx),  values, labels, true);
16        }
 catch (Exception ex) {
17            ex.printStackTrace();
18        }

19    }

 1public static void initSelectOneComponent(UIComponent component,
 2            List<String> values, List<String> labels, boolean clearBefore) {
 3        try {
 4
 5            if (component == null || values == null || labels == null
 6                    )
 7                return;
 8
 9            if (!isMultiValue(component))
10                return;
11
12            Object optionKey = null;
13            String optionLabel = null;
14            ArrayList optionsList = null;
15
16            UISelectItems items = new UISelectItems();
17            optionsList = new ArrayList(values.size());
18            for (int i = 0; i < values.size(); i++{
19                optionKey = values.get(i);
20                optionLabel = (String)labels.get(i);
21                SelectItem item = new SelectItem(optionKey, optionLabel);
22                optionsList.add(item);
23            }

24            items.setValue(optionsList);
25            if(clearBefore)
26            {
27                List list = component.getChildren();
28                Object obj = null;
29                for(int i = 0;i < list.size(); i ++)
30                {
31                    if(list.get(i) instanceof UISelectItems )
32                    {
33                        obj = list.get(i);
34                        break;
35                    }

36                }

37                if(obj != null)
38                    list.remove(obj);
39            }

40                
41            component.getChildren().add(items);
42        }
 catch (Exception e) {
43            e.printStackTrace();
44        }

45
46    }

檢查了半天,發(fā)現(xiàn)只要不執(zhí)行initSelectValues,都沒有問題,后來一步一步調(diào)試才發(fā)現(xiàn),原來是數(shù)據(jù)類型的問題,同事傳入的是List<Integer> values,而SelectItem構(gòu)造函數(shù)支持的是鍵值都為String的參數(shù),數(shù)據(jù)類型不對導(dǎo)致了這一個奇怪的現(xiàn)象,但后臺沒有異常和出錯信息讓人很納悶,解決方法就是只要改變值列表為List<String>就可以了。

TiGERTiAN 2009-11-18 09:02 發(fā)表評論
]]>
用jQuery給頁面中樹形的Checkbox默認(rèn)加上父子節(jié)點相關(guān)操作(JSF的Richfaces專用)http://www.aygfsteel.com/TiGERTiAN/archive/2009/11/12/302043.htmlTiGERTiANTiGERTiANThu, 12 Nov 2009 00:46:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2009/11/12/302043.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/302043.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2009/11/12/302043.html#Feedback4http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/302043.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/302043.htmljQuery.noConflict();//與JSF搭配需要這句話,不然會有沖突
        jQuery(document).ready(function() {
        
// Add click event listener to each checkbox in the tree page
        // Note! Using this simple selector assumes that there are no other 
        // checkboxes on the page, if there are other checkboxes then
        // selector should be changed    
            jQuery(":checkbox").click(function(){
                updateChildren(
this);
                updateParent(
this);
             }
);
        }
);
        
</script>
        
<script type="text/javascript">
        
function updateChildren(currentCheckBox)
        
{
            
// Get state of current checkbox (true or false)
            var state = currentCheckBox.checked;
            
            
// Get parent TABLE, where current checkbox is places
            var parentTables = jQuery(currentCheckBox).parents("table"); 
            
var parentTable = parentTables[0];    
        
            
// Get DIV where child nodes with checkboxes are situated
            // See http://docs.jquery.com/Traversing/ to get better uderstanding of
            // parents() and next()        
            var childDivs = jQuery(parentTable).next("div");    
            
if(    childDivs.length > 0 )
            
{
                
var childDiv = childDivs[0];        
            
                
// Iterate over all child nodes checkboxes and set same state as the 
                // current checkbox state
                jQuery(childDiv).contents().find(":checkbox").each(function() {
                    
this.checked = state;
                }
);
            }


        }

        
        
//更新父節(jié)點的方法,如果子節(jié)點全部選中則父節(jié)點選中,如果子節(jié)點中有一個未選中,則父節(jié)點也未選中
        function updateParent(currentCheckbox) {
            
var parentDivs = jQuery(currentCheckbox).parents("div");
            
var parentDiv = parentDivs[0];    

            
var hasSelected = false;
            
            jQuery(parentDiv).contents().find(
":checkbox").each(function() {
                
if(this.checked) {
                    hasSelected 
= true;
                }else{
                        hasSelected = false;
                        return;
                    }
            }
);
            
            
var parentTables = jQuery(parentDiv).prev("table");
            
if(parentTables.length > 0)
            
{
                
var parentTable = parentTables[0];
            
                
var parentCheckboxes = jQuery(parentTable).find(":checkbox");
                
var parentCheckbox = parentCheckboxes[0];
                
                parentCheckbox.checked 
= hasSelected ;
            }


        }
注意引入jQuery包。
此js代碼加到頁面中,將會給頁面中的樹形菜單的Checkbox默認(rèn)加上一些功能:當(dāng)選擇父節(jié)點時全選子節(jié)點;當(dāng)子節(jié)點全選時,父節(jié)點也會被自動選擇上。同時不會影響其他Checkbox。

TiGERTiAN 2009-11-12 08:46 發(fā)表評論
]]>
JSF中DataTable和SelectOneRadio搭配,每條記錄每一行一個radio進(jìn)行單選的解決辦法http://www.aygfsteel.com/TiGERTiAN/archive/2009/01/11/250866.htmlTiGERTiANTiGERTiANSun, 11 Jan 2009 08:36:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2009/01/11/250866.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/250866.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2009/01/11/250866.html#Feedback5http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/250866.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/250866.html 首先,在頁面中datatable的column中加入
                                            <h:selectOneRadio id="xx" value="#{entrance.test}">
                                                
<f:selectItem itemValue="#{obj.corpOutInfo.coiId}" itemLabel="#{obj.corpOutInfo.corpName}"/>
                                            
</h:selectOneRadio>
然后加入一段jquery的代碼用于在用戶切換選擇的時候,先將所有radio的checked狀態(tài)都置為false。
<script type="text/javascript">
        jQuery.noConflict();
//與JSF搭配需要這句話,不然會有沖突
        jQuery(document).ready(function() {

            jQuery(
":radio").click(function(){
                update(
this);

             }
);
        }
);
        
</script>
        
<script type="text/javascript">
        
function update(currentRadio)
        
{

            
var parentTables = jQuery(currentRadio).parents("table"); 
            
var parentTable = parentTables[0];    

            
var childDivs = jQuery(parentTable).next("div");        
            
var childDiv = childDivs[0];        

            jQuery(childDiv).contents().find(
":radio").each(function() {
                
this.checked = false;
            }
);
            
            currentRadio.checked 
= true;
        }


        
</script>

后臺綁定一個屬性,但這個屬性的set方法會被調(diào)用多次,但只有一次是有值的,所以用戶選擇了哪一行也好獲得。
    private String test;
    
    
public String getTest() {
        
return test;
    }


    
public void setTest(String test) {
        System.out.println(
"=========================" + test);
    }


    
問題算是解決了,實現(xiàn)很簡單,但并不太完美。因為后臺的那個set方法會觸發(fā)很多次,次數(shù)跟當(dāng)前的radio數(shù)量一致,雖然不怎么影響性能,但用著總覺得不爽,后面再完善下。


TiGERTiAN 2009-01-11 16:36 發(fā)表評論
]]>
JSF直接使用字符數(shù)組(byte[])提供文件下載的解決辦法http://www.aygfsteel.com/TiGERTiAN/archive/2008/12/23/247872.htmlTiGERTiANTiGERTiANTue, 23 Dec 2008 02:13:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/12/23/247872.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/247872.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/12/23/247872.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/247872.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/247872.html項目中所有的文檔全部壓縮之后存儲到數(shù)據(jù)庫,所以需要我們每次從數(shù)據(jù)庫讀取二進(jìn)制然后發(fā)送到客戶端進(jìn)行下載。如何在JSF里面這樣做呢?
首先對外的方法這樣寫,我設(shè)置了按鈕的actionListener的屬性

    public void viewContent(ActionEvent event)
    
{
        
try
        
{
            ParkLawDTO obj 
= this.getEnterpriseEnterInBODelegate().getParkLawById(((ParkLawDTO)this.getParkLawDataModel().getRowData()).getParkLaw().getPlId());
            Common.downloadFile(FacesContext.getCurrentInstance(), ZipHelper.unzip(obj.getParkLaw().getLawContent()), obj.getParkLaw().getLawName()
+".doc""application/msword;charset=utf-8");
        }
catch(Exception e){
            info(
"下載文件出錯", e);
        }

        
    }
第一句是從WebService獲得對象的實例,第二句是將所有相應(yīng)信息傳輸給下載的公共方法,同時解壓縮了相應(yīng)的二進(jìn)制。

下面是下載的公共方法
/**
     * 向客戶端發(fā)送需要下載的文件
     * 
@param faces 當(dāng)前FacesContext
     * 
@param content 文件的字節(jié)數(shù)組
     * 
@param fileName 客戶端接收的文件名
     * 
@param contentType http的content-type
     
*/

    
public static void downloadFile(FacesContext faces, byte[] content, String fileName, String contentType)
    
{
        
try
        
{
            HttpServletResponse response 
= (HttpServletResponse) faces.getExternalContext().getResponse();    
            response.setHeader(
"Content-disposition""filename="+ URLEncoder.encode(fileName, "utf-8"));
            response.setContentType(contentType);
            response.setContentLength(content.length);
            ServletOutputStream sos 
= response.getOutputStream();
            sos.write(content);
            sos.flush();
            sos.close();
            
//需要呼叫Complete
            faces.responseComplete();
           
        }
catch(Exception e){
            e.printStackTrace();
        }

    }

Content-disposition中一定不可以加attachment,經(jīng)過測試,在IE6下(其他瀏覽器沒測試過),會導(dǎo)致無法打開臨時文件(我的是word文檔),而且經(jīng)常出現(xiàn)無法下載文件。

TiGERTiAN 2008-12-23 10:13 發(fā)表評論
]]>
JSF中動態(tài)生成HtmlMessage控件出錯的解決辦法http://www.aygfsteel.com/TiGERTiAN/archive/2008/12/19/247296.htmlTiGERTiANTiGERTiANFri, 19 Dec 2008 03:41:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/12/19/247296.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/247296.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/12/19/247296.html#Feedback7http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/247296.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/247296.html最近搭配Richfaces用Ajax動態(tài)生成控件的HtmlMessage的時候,會報錯,而且有點摸不著頭腦。

后來看了下,問題原因在于沒有給HtmlMessage控件設(shè)置ID,設(shè)置一下ID就可以了。

這里有個問題,為什么JSF沒有給HtmlMessage控件動態(tài)生成ID呢?我懷疑是一個bug,為什么。。
因為如果我單純的生成一個HtmlMessage實例,不設(shè)置任何屬性,并動態(tài)的添加到頁面中,沒有任何錯,但如果我設(shè)置了For屬性,如果不設(shè)置HtmlMessage控件的ID,就會出錯,大家試試就知道了。。很奇怪的一個問題。



TiGERTiAN 2008-12-19 11:41 發(fā)表評論
]]>
JSF獲得表單提交值的方法http://www.aygfsteel.com/TiGERTiAN/archive/2008/12/12/245961.htmlTiGERTiANTiGERTiANFri, 12 Dec 2008 07:11:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/12/12/245961.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/245961.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/12/12/245961.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/245961.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/245961.html第一種:

1.如在你的頁面中有 <input   type= "hidden "   name= "classid "   value= "1 ">
注意要寫在form中,并且要用name而不是id.
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( "classid ")可以得到。   

2.
<h:form   id= "f ">
<input   type= "hidden "   id= "classid "   value= "1 ">
</h:form>
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( "f:classid ")可以得到。

3.使用JSF自帶的控件,則和2是一樣的訪問方法

以上方法就可以了,寫id的時候,jsf會把form的id加進(jìn)去 變成 formId:componentId 的格式

第二種:

就是通過findComponent方法獲得控件實例,然后通過getValue方法獲得值
HtmlInputText    text = (HtmlInputText) this.findComponent(this.FORM + ":"+ ENERGY_COMSUPTION_PREFIX + id);
String value = text.getValue().toString();

 public UIComponent findComponent(String name) {

  // 不能使用靜態(tài)變量view保持當(dāng)前的viewroot,因為每次操作之后的viewroot都是不一樣的
  ViewRoot view = FacesContext.getCurrentInstance().getViewRoot();

  return view.findComponent(name);
 }

需要注意的是 不能使用靜態(tài)變量view保持當(dāng)前的viewroot,因為每次操作之后的viewroot都是不一樣的。

對比以上兩種方法,第一種簡單方便,但只適合于取值操作。第二種可操控的范圍和能力更大,不僅可以取值還可以設(shè)置和獲得所有屬性。



TiGERTiAN 2008-12-12 15:11 發(fā)表評論
]]>
探討JSF Backing bean生成控件的問題http://www.aygfsteel.com/TiGERTiAN/archive/2008/11/27/243040.htmlTiGERTiANTiGERTiANThu, 27 Nov 2008 09:18:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/27/243040.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/243040.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/27/243040.html#Feedback9http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/243040.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/243040.html  這里,我們?yōu)榱颂岣哂脩舻捏w驗性,使用了Ajax技術(shù),后臺生成一個HtmlInputText控件實例添加到指定的panel中,然后刷新表格那一部分顯示出來。

一上來,我用了這個方法(添加到監(jiān)聽器中):
HtmlInputText text = new HtmlInputText();
panel.getChildren().add(text);
然后當(dāng)填寫了值之后調(diào)用了text.getValue()方法,發(fā)現(xiàn)打印出來的是null,以為JSF無法捕獲Ajax生成控件的值,又嘗試設(shè)定了Action來生成控件,發(fā)現(xiàn)還是不行。

最后只好使用了這個辦法:
HtmlInputText text = new HtmlInputText();
text.setId(
"text_1");
panel.getChildren().add(text);
獲取方法使用了:
public void sendMessage(ActionEvent e)
{
FacesContext context 
= FacesContext.getCurrentInstance();
UIViewRoot view 
= context.getViewRoot();
HtmlInputText output 
=
(HtmlInputText)view.findComponent(
"messageForm:text_1");
System.out.println(output.getValue());
}
不管是用Ajax方式還是表單提交的方式都可以使用這個方法獲得。所以我就在想,這個是什么原因,直接設(shè)置實例反而沒有辦法操作,還要重新獲取才可以。
但是如果你在初始化控件的時候進(jìn)行text.setValue("111");操作還是可以的,這樣輸入框就會默認(rèn)出現(xiàn)值111。

大家有什么看法,盡管發(fā)表,如果對這個需求有更好的解決方案,也請?zhí)岢鰜恚x謝了。

TiGERTiAN 2008-11-27 17:18 發(fā)表評論
]]>
JSF生成控件ID重復(fù)的解決辦法http://www.aygfsteel.com/TiGERTiAN/archive/2008/11/26/242793.htmlTiGERTiANTiGERTiANWed, 26 Nov 2008 07:31:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/26/242793.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/242793.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/26/242793.html#Feedback4http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/242793.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/242793.html         我們嘗試了給每個控件都設(shè)定一個id,還是報錯,如果去掉另一個跟它有沖突的選擇控件,就沒問題,但是不可能去掉的,因為那一項需要去選擇。后來想了很多辦法,都不是很好,最后同事找到了一個辦法,在我封裝的底層BaseBean中,給程序生成的選擇項控件手動添加id:
            items = new UISelectItems();
            items.setId(
"j_id_"+String.valueOf(System.nanoTime()));
這樣,每個控件都有了一個唯一的ID,問題解決了。
提示:不可以用純數(shù)字做ID,會出現(xiàn)錯誤的。

這里使用了納秒來生成編號,因為毫秒還是經(jīng)常會出現(xiàn)id重復(fù)。

不知道為什么會有這個問題,其他頁面調(diào)用相同的底層都沒有任何問題,只有這個頁面會有,可以確定跟我們寫的代碼沒有關(guān)系,因為頁面重新做過的,一個控件一個控件添加的試的,就是那兩個控件同時出現(xiàn)時報錯,所以我想是不是底層生成控件ID那有bug,自己手動生成控件ID就沒有任何問題。以后有機會,再研究下源碼。

注意一下,大部分控件ID重復(fù)都是出現(xiàn)在選擇之類的控件上面。

TiGERTiAN 2008-11-26 15:31 發(fā)表評論
]]>
【JSF】Richfaces復(fù)選框樹(Checkbox tree)的權(quán)限分配的解決方案http://www.aygfsteel.com/TiGERTiAN/archive/2008/11/19/241278.htmlTiGERTiANTiGERTiANWed, 19 Nov 2008 01:22:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/19/241278.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/241278.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/19/241278.html#Feedback66http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/241278.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/241278.html閱讀全文

TiGERTiAN 2008-11-19 09:22 發(fā)表評論
]]>
JSF類的繼承關(guān)系和體系結(jié)構(gòu)http://www.aygfsteel.com/TiGERTiAN/archive/2008/11/16/240871.htmlTiGERTiANTiGERTiANSun, 16 Nov 2008 14:12:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/16/240871.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/240871.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/16/240871.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/240871.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/240871.html

TiGERTiAN 2008-11-16 22:12 發(fā)表評論
]]>
JSF的幾種布局方式介紹和比較http://www.aygfsteel.com/TiGERTiAN/archive/2008/11/09/239546.htmlTiGERTiANTiGERTiANSun, 09 Nov 2008 12:10:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/09/239546.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/239546.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/09/239546.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/239546.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/239546.html 2.facelets

TiGERTiAN 2008-11-09 20:10 發(fā)表評論
]]>
JSF和Richfaces中使用框架頁(Frameset),包括了PanelMenuhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/08/239358.htmlTiGERTiANTiGERTiANFri, 07 Nov 2008 17:05:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/08/239358.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/239358.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/08/239358.html#Feedback1http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/239358.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/239358.html
想在JSF控件中操作框架頁Frameset,可以在左框架頁(任一框架頁)里聲明一個Form,設(shè)定好它的target="mainFrame"(任一框架頁的id),這樣當(dāng)點擊這個Form里面的CommandButton或者CommandLink的時候,JSF處理好業(yè)務(wù)邏輯后,就可以將To-View-ID指定的頁面轉(zhuǎn)到主框架頁里面去顯示了。

<h:form target="mainFrame">
<h:commandButton action="index">
</h:form

mainFrame

點擊左邊的commandButton之后,index處理之后的To-View-ID指定的頁面就會顯示在mainFrame里面了

第二種方法:
        <script>
                
function forward(p) {
                     window.parent.mainFrame.location.href
="usermanagement/" + p + ".faces";
                 }

        
</script>
添加一個跳轉(zhuǎn)函數(shù),然后分情況添加跳轉(zhuǎn):
當(dāng)不需要Action的時候
<rich:panelMenuItem label="角色信息維護(hù)" onclick="forward('rolelist')" />
這樣就可以跳轉(zhuǎn)了

當(dāng)需要先進(jìn)行Action操作再跳轉(zhuǎn)的時候
<rich:panelMenuItem label="新建角色"
                                action
="#{user.addRoleMain}" oncomplete="forward('roledetail')" />
    public String addRoleMain()
    
{
        ClearRole();
        
return null;
    }

這樣,在Action完成后,菜單頁不會變,主框架頁會跳轉(zhuǎn)到指定頁面。

OK,上面兩種方法基本能滿足開發(fā)需要了。

TiGERTiAN 2008-11-08 01:05 發(fā)表評論
]]>
JSF(Java Server Faces)的StateHolder的作用和使用方法http://www.aygfsteel.com/TiGERTiAN/archive/2008/11/05/238813.htmlTiGERTiANTiGERTiANWed, 05 Nov 2008 06:15:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/05/238813.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/238813.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/05/238813.html#Feedback2http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/238813.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/238813.html閱讀全文

TiGERTiAN 2008-11-05 14:15 發(fā)表評論
]]>
【第三版】RichFaces中使用datatable和datascroller進(jìn)行分頁(使用數(shù)據(jù)庫分頁,改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) http://www.aygfsteel.com/TiGERTiAN/archive/2008/11/04/238692.htmlTiGERTiANTiGERTiANTue, 04 Nov 2008 11:57:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/04/238692.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/238692.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/04/238692.html#Feedback4http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/238692.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/238692.html閱讀全文

TiGERTiAN 2008-11-04 19:57 發(fā)表評論
]]>
【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(使用數(shù)據(jù)庫分頁,改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) http://www.aygfsteel.com/TiGERTiAN/archive/2008/11/01/237953.htmlTiGERTiANTiGERTiANSat, 01 Nov 2008 01:42:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/01/237953.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/237953.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/11/01/237953.html#Feedback11http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/237953.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/237953.html閱讀全文

TiGERTiAN 2008-11-01 09:42 發(fā)表評論
]]>
RichFaces中使用datatable和datascroller進(jìn)行分頁(使用數(shù)據(jù)庫分頁,改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) http://www.aygfsteel.com/TiGERTiAN/archive/2008/10/29/237409.htmlTiGERTiANTiGERTiANWed, 29 Oct 2008 08:52:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/29/237409.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/237409.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/29/237409.html#Feedback1http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/237409.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/237409.html閱讀全文

TiGERTiAN 2008-10-29 16:52 發(fā)表評論
]]>
RichFaces中使用datatable和datascroller進(jìn)行分頁(使用數(shù)據(jù)庫分頁)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) http://www.aygfsteel.com/TiGERTiAN/archive/2008/10/29/237329.htmlTiGERTiANTiGERTiANWed, 29 Oct 2008 02:58:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/29/237329.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/237329.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/29/237329.html#Feedback3http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/237329.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/237329.html閱讀全文

TiGERTiAN 2008-10-29 10:58 發(fā)表評論
]]>
RichFaces中使用datatable和datascroller進(jìn)行分頁(JSF 1.2,RichFaces 3.2.1GA)http://www.aygfsteel.com/TiGERTiAN/archive/2008/10/28/237225.htmlTiGERTiANTiGERTiANTue, 28 Oct 2008 13:50:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/28/237225.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/237225.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/28/237225.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/237225.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/237225.html
    <f:view>
        
<h:form>
            
<rich:dataTable id="carList" width="483" rows="10" columnClasses="col"
                value
="#{user.allCars}" var="car">
                
<f:facet name="header">
                    
<rich:columnGroup>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="Name" />
                        
</h:column>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="Decription" />
                        
</h:column>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="Base Price" />
                        
</h:column>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="Time" />
                        
</h:column>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="操作操作" />
                        
</h:column>                        
                    
</rich:columnGroup>
                
</f:facet>
    
                
<h:column>
                    
<h:outputText value="#{car.name}" />
                
</h:column>
                
<h:column>
                    
<h:outputText value="#{car.description}" />
                
</h:column>
                
<h:column>
                    
<h:outputText value="#{car.baseprice}" />
                
</h:column>
                
<h:column>
                    
<h:outputText value="#{car.timestamp}" />
                
</h:column>
                
<h:column>
                    
<h:commandLink action="#{user.delete}" value="刪除" >
                        
<f:param name="id" value="#{car.id}"/>
                    
</h:commandLink>
                
</h:column>                
            
</rich:dataTable>
            
<rich:datascroller for="carList" id="dc1" 
            style
="width:483px" page="#{user.scrollerPage}"/>                        
        
</h:form>
    
</f:view>
后臺User類的代碼:
public class User
{

    
private int scrollerPage = 1;
    
    
private List<CarBean> allCars; 
    
    
public User()
    
{

    }

    
    
public int getScrollerPage()
    
{
        
return scrollerPage;
    }


    
public void setScrollerPage(int scrollerPage)
    
{
        
this.scrollerPage = scrollerPage;
        System.out.println(
"current page = " + scrollerPage);
    }


    
public List<CarBean> getAllCars()
    
{
        CarBeanDAO dao 
= new CarBeanDAO();
        Query q 
= EntityManagerHelper.createQuery("from CarBean cars order by cars.id desc");

        
return q.getResultList();
    }

    
    
public void setAllCars(List<CarBean> allCars)
    
{
        
this.allCars = allCars;
    }

    
    
public String delete()
    
{
        FacesContext ctx 
= FacesContext.getCurrentInstance();
        
int id = Integer.parseInt(ctx.getExternalContext().getRequestParameterMap().get("id"));
        EntityManagerHelper.beginTransaction();
        CarBeanDAO dao 
= new CarBeanDAO();
        CarBean bean 
= dao.findById(id);
        
if(bean != null)
            dao.delete(bean);
        EntityManagerHelper.commit();
        
return null;
    }

}

datatable+datascroller使用的是偽分頁的方式,也就是說在數(shù)據(jù)庫層那并沒有分頁,只是程序一次讀出所有數(shù)據(jù)然后進(jìn)行程序分頁操作,這樣適合數(shù)據(jù)量不太大的分頁操作,數(shù)據(jù)量過大的話就需要自己寫數(shù)據(jù)模型進(jìn)行操作了。本分頁代碼加入了刪除記錄的功能,delete結(jié)果返回null會使刪除操作完成后返回當(dāng)前頁面,這樣就會發(fā)現(xiàn)剛才被刪除數(shù)據(jù)消失了,后面數(shù)據(jù)都上來一條。

TiGERTiAN 2008-10-28 21:50 發(fā)表評論
]]>
在JSF控件中操作框架頁Framesethttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/27/236914.htmlTiGERTiANTiGERTiANMon, 27 Oct 2008 09:05:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/27/236914.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/236914.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/27/236914.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/236914.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/236914.html想在JSF控件中操作框架頁Frameset,可以在左框架頁(任一框架頁)里聲明一個Form,設(shè)定好它的target="mainFrame"(任一框架頁的id),這樣當(dāng)點擊這個Form里面的CommandButton或者CommandLink的時候,JSF處理好業(yè)務(wù)邏輯后,就可以將To-View-ID指定的頁面轉(zhuǎn)到主框架頁里面去顯示了。

<h:form target="mainFrame">
<h:commandButton action="index">
</h:form

mainFrame

點擊左邊的commandButton之后,index處理之后的To-View-ID指定的頁面就會顯示在mainFrame里面了

TiGERTiAN 2008-10-27 17:05 發(fā)表評論
]]>
JSF的某些東西在IE和MyEclipse自帶瀏覽器中顯示的不一樣http://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234979.htmlTiGERTiANTiGERTiANFri, 17 Oct 2008 09:13:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234979.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/234979.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234979.html#Feedback3http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/234979.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/234979.html 比如說輸出瀏覽器參數(shù)result=333,頁面中加入<h:outputText value="#{param.result}"/>,在IE中打印出來的是333,而在MyEclipse瀏覽器中打印出啦的是類似于[Ljava.lang.String;@786119的玩意兒。狂暈,不知道誰知道怎么回事。。請賜教。謝謝了。

TiGERTiAN 2008-10-17 17:13 發(fā)表評論
]]>
JSF頁面中支持的Expression Language(EL)http://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234952.htmlTiGERTiANTiGERTiANFri, 17 Oct 2008 07:22:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234952.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/234952.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234952.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/234952.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/234952.html以下是可使用的EL常量的列表:



TiGERTiAN 2008-10-17 15:22 發(fā)表評論
]]>
后來程序控制前臺UI控件的方法http://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234882.htmlTiGERTiANTiGERTiANFri, 17 Oct 2008 05:51:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234882.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/234882.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/17/234882.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/234882.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/234882.html JSF頁面中的代碼:
<h:form id="messageForm">
<h:outputText id="outputMessage"/>
<h:commandButton value="Get Message"
actionListener
="#{testForm.sendMessage}"/>
</h:form>
后臺程序:
public void sendMessage(ActionEvent e)
{
FacesContext context 
= FacesContext.getCurrentInstance();
UIViewRoot view 
= context.getViewRoot();
HtmlOutputText output 
=
(HtmlOutputText)view.findComponent(
"messageForm:outputMessage");
output.setStyle(
"color:blue");
output.setValue(
"Who's the Mann?");
}
之后,當(dāng)點擊Get Message的時候頁面就會在outputMessage的地方輸出 Who's the Mann?
第二種方法:
<h:inputText value="#{registrationForm.comments}"
binding
="#{registrationForm.commentsInput}"/>
commentsInput是RegistrationForm中的一個HtmlInputText類型的一個變量,通過binding屬性將前臺UI控件和后臺同類型的變量綁定,就可以在后臺直接操作了。

TiGERTiAN 2008-10-17 13:51 發(fā)表評論
]]>
Java Server Faces Events And Listeners (JSF中的事件與監(jiān)聽器)http://www.aygfsteel.com/TiGERTiAN/archive/2008/10/14/234179.htmlTiGERTiANTiGERTiANTue, 14 Oct 2008 02:49:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/14/234179.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/234179.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/10/14/234179.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/234179.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/234179.html 1、Value-change events(值改變事件)
<h:inputText valueChangeListener="#{myForm.processValueChanged}"/>
<h:panelGrid binding="#{myForm.changePanel}" rendered="false">

</h:panelGrid>

public void processValueChanged(ValueChangeEvent event)
{
HtmlInputText sender 
= (HtmlInputText)event.getComponent();
sender.setReadonly(
true);
changePanel.setRendered(
true);
}
當(dāng)inputText的值改變的時候會觸發(fā)processValueChanged事件,此事情內(nèi)部通過參數(shù),獲取HtmlInputText的控件,然后設(shè)定readonly,同時設(shè)定panelGrid的模型changePanel的屬性,因為panelGrid綁定了changePanel這個模型。

2、Action events(動作事件)
<h:commandButton type="submit" value="Login" action="success"
immediate
="true"/>
上面這個是靜態(tài)outcome事件,在faces-config.xml中配置相應(yīng)的屬性后,點擊該按鈕會轉(zhuǎn)向相應(yīng)的方法。

<h:commandButton value = "Test Action Listener" actionListener = "#{testActionListener.doSomeAction}" />
如果添加了actionListener屬性的話,點擊之后,在轉(zhuǎn)向其他頁面之前,會觸發(fā)指定的事件,處理之后再轉(zhuǎn)向。
這里的doSomeAction方法的聲明是void doSomeAction(ActionEvent actionEvent)。

<h:commandButton type="submit" value="Login"
action
="#{loginForm.login}"/>
上面這個是動態(tài)outcome事件,當(dāng)點擊該按鈕之后會直接觸發(fā)loginForm中的login事件,login事件返回的是一個字符串,在login處理完相應(yīng)操作之后需要返回一個屬性中已經(jīng)配置過的字符串,例如success,然后JSF根據(jù)faces-config.xml中的配置,跳轉(zhuǎn)到相應(yīng)的頁面。login的聲明一般是String login();

當(dāng)然也可以通過程序來添加監(jiān)聽器,不過監(jiān)聽器類需要實現(xiàn)ActionListener接口:
UIComponent myComponent = new UIComponent();
myComponent.addActionListener(
new TestActionListener());
myComponent.addActionListener(
new CustomActionListener());


3、Data model events(數(shù)據(jù)模型事件)
FacesContext facesContext = FacesContext.getCurrentInstance();
dataTable 
= (HtmlDataTable)facesContext.getApplication().createComponent(
HtmlDataTable.COMPONENT_TYPE);
DataModel myDataModel 
= new ResultSetDataModel(myResultSet);
myDataModel.addDataModelListener(
new DataModelListener()
{
public void rowSelected(DataModelEvent e)
{
FacesContext.getCurrentInstance().getExternalContext().
log(
"row selected:" + e.getRowIndex());
}

}
);
dataTable.setValue(myDataModel);
將上面的代碼放入初始化程序中,當(dāng)行的選擇改變的時候就會觸發(fā)相應(yīng)的日志打印。
這是因為這段代碼給dataTable控件定義了一個數(shù)據(jù)模型,數(shù)據(jù)和相應(yīng)的事件全部存在這個數(shù)據(jù)模型里面,然后將dataTable與這個模型進(jìn)行綁定即可使用它所有的數(shù)據(jù)和事件。點擊dataTable上面的一行自然也就會出發(fā)相應(yīng)的行選擇事件。

4.Phase events(階段事件)

這個事件是為了捕捉一些階段和過程而設(shè)定的,有以下幾個階段可以捕捉:

ANY_PHASE 任一階段
APPLY_REQUEST_VALUES  請求處理階段的應(yīng)用請求值階段
INVOKE_APPLICATION 請求處理階段的調(diào)用程序階段
PROCESS_VALIDATIONS 請求處理階段的處理驗證階段
RENDER_RESPONSE  請求處理階段的描述響應(yīng)階段
RESTORE_VIEW 請求處理階段的恢復(fù)視圖階段
UPDATE_MODEL_VALUES 請求處理階段的更新模型值階段

具體可以參考http://java.sun.com/javaee/javaserverfaces/1.1_01/docs/api/javax/faces/event/PhaseId.html

通過設(shè)定在實現(xiàn)類中設(shè)定相應(yīng)的PhaseId以及添加到faces-config.xml中就可以捕捉相應(yīng)階段事件并添加響應(yīng)的代碼

實現(xiàn)類

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class CustomPhaseListener implements PhaseListener
{    
    
public CustomPhaseListener()
    
{
    }


    
public void afterPhase(PhaseEvent event)
    
{
        System.out.println(
"After Phase->" + event.getPhaseId());    
    }


    
public void beforePhase(PhaseEvent event)
    
{
        System.out.println(
"Before Phase->" + event.getPhaseId());
    }


    
public PhaseId getPhaseId()
    
{
        
return PhaseId.ANY_PHASE;//選擇事件標(biāo)識的常量,此為任一階段
    }
    
}

在faces-config.xml中添加
<lifecycle>
    
<phase-listener>
        net.javabeat.articles.jsf.events.actions.TestActionListener
    
</phase-listener>
</lifecycle>

當(dāng)然可以添加無限個的監(jiān)聽器
<lifecycle>
    
<phase-listener>PhaseListener1</phase-listener>
    
<phase-listener>PhaseListener2</phase-listener>
</lifecycle>

下面是請求處理的生命周期,大家可以直觀的看一下各個階段執(zhí)行順序:
 
各個階段的說明以及所能觸發(fā)的事件


TiGERTiAN 2008-10-14 10:49 發(fā)表評論
]]>
JSF與后臺程序的交互http://www.aygfsteel.com/TiGERTiAN/archive/2008/09/28/231687.htmlTiGERTiANTiGERTiANSun, 28 Sep 2008 07:20:00 GMThttp://www.aygfsteel.com/TiGERTiAN/archive/2008/09/28/231687.htmlhttp://www.aygfsteel.com/TiGERTiAN/comments/231687.htmlhttp://www.aygfsteel.com/TiGERTiAN/archive/2008/09/28/231687.html#Feedback0http://www.aygfsteel.com/TiGERTiAN/comments/commentRss/231687.htmlhttp://www.aygfsteel.com/TiGERTiAN/services/trackbacks/231687.html
org.test.TestBean x = (org.test.TestBean) request.getSession().getAttribute("testBean");


如果不存在,則需要先訪問一下Managed-Bean,讓他被觸發(fā)而創(chuàng)建
org.test.TestBean x = (org.test.TestBean) Util.getBean("testBean"); 

//In Util.java:
public static Object getBean(String expr){
FacesContext context 
= FacesContext.getCurrentInstance();    
Application app 
= context.getApplication(); 
ValueBinding binding 
= app.createValueBinding("#{" + expr + "}");
Object value 
= binding.getValue(context);  
return value;
}


為JSF指定Action,可以這樣寫:
             <h:commandButton action="#{user.verify}" value="Say Hello!">                 
             
</h:commandButton>
User類中的代碼:
    public String verify()
    
{
        
return "hello";
    }
faces-config.xml中:
 <managed-bean>
  
<description>User Name Bean</description>
  
<managed-bean-name>user</managed-bean-name>
  
<managed-bean-class>demo.User</managed-bean-class>
  
<managed-bean-scope>session</managed-bean-scope>
 
</managed-bean>
 
<navigation-rule>
  
<from-view-id>/pages/inputUserName.jsp</from-view-id>
  
<navigation-case>
   
<from-outcome>hello</from-outcome>
   
<to-view-id>/pages/hello.jsp</to-view-id>
  
</navigation-case>
 
</navigation-rule>
這樣,點擊按鈕,就會轉(zhuǎn)到verify方法中進(jìn)行驗證,然后返回相應(yīng)結(jié)果的字符串,jsf根據(jù)返回的結(jié)果進(jìn)行相應(yīng)的頁面跳轉(zhuǎn)。





TiGERTiAN 2008-09-28 15:20 發(fā)表評論
]]>
主站蜘蛛池模板: 抚州市| 五华县| 祁东县| 建阳市| 资中县| 黄浦区| 庄浪县| 吉木萨尔县| 泰兴市| 黄石市| 建湖县| 凤山市| 新绛县| 丁青县| 普陀区| 丰都县| 得荣县| 北碚区| 白银市| 辽宁省| 三门县| 绥中县| 郎溪县| 达拉特旗| 仪征市| 黄骅市| 专栏| 恩平市| 乌拉特前旗| 浮山县| 安多县| 武冈市| 安国市| 盐源县| 建平县| 方城县| 景洪市| 新巴尔虎左旗| 渑池县| 昭觉县| 尉犁县|