2014年9月18日 星期四

jsf 備忘

雖然討厭jsf...討厭要用後端寫前端的鬼...不過碰到的系統是這種鬼就沒辦法~_~|||
原架構完全不能寫javascript(js)的!!改個小function也要重起server, 真的很想翻桌!!

為了寫連動,動態即時顯示,就看他一直在轉圈圈...轉圈圈...轉圈圈...
還常常是browser cache還是反應不來內容,丟舊的值或是沒反應又以為寫錯~總之就是很難用拉T___T....
後端也得配合寫一堆method...明明用js的this之類的就可以解決一串T^T....

### jsf 的空白
就像html裡的  
jsf裡用  

### jsf 傳值的方式~
這篇真的寫得太好~來查了好幾次XD
http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/

我都用setPropertyActionListener  直接把值注到bean裡來用~
<h:commandButton action="#{user.editAction}" >
    <f:setPropertyActionListener target="#{user.action}" value="delete" />
</h:commandButton>

### jsf if, if else
在jsf裡的奇怪世界,如果是要實現 if 的情況~ 可以用容易懂的
<c:if test="#{bean.aa == '1'}"> ............ </c:if>

但是如果是要 if else 的話,就要改用 choose....
<c:choose>
    <c:when test="#{not empty bean.aa}">
        BALA               
    </c:when>
    <c:otherwise>
        BALA2
    </c:otherwise>
</c:choose>

但是如果想要用 if else if else if else...這種的話呢?~
目前看起來沒有~就只能給他一路if下去....
<c:if test="#{ not empty bean.aa }"> OOO </c:if>
<c:if test="#{ bean.aa  == '1' }"> XXX </c:if>
<c:if test="#{ bean.aa  == '2' }"> ZZZ </c:if>

然後更妙的是,在UI元件上,想要顯示或不顯示~不可以用 c:if 之類的要不要show...常常會出問題......div block之類的好像還可以就是....
就要用html/component元件 裡的 rendered 來表示~
<h:graphicImage url="/images/xxxx.gif" rendered="#{fn:trim(bean.aa) eq '1'}" />

講到trim這個function...只能說~jsf 的function不是到處想用就能用Orz..
僅量在後端model就trim好丟出來,省得碰到某些地方不給trim就GG了....
(討厭資訊庫開CHAR欄位的東東,沒事自己補空白都會造成很大的困擾...VARCHAR不是很好嗎>.<b)

### jsf number format
inputText 記得要 partialSubmit 才會動
<ice:inputText value="#{bean.aaa}" id="aaa"  partialSubmit="true">
            <f:convertNumber pattern="######.####"/>
</ice:inputText>

<ice:outputText value="#{bean.aaa}" >
            <f:convertNumber pattern="######.####"/>
</ice:outputText>

### iceface 小日曆寬度
小日曆佔的位置太大~可以改寫CSS變小
<style>
.iceSelInpDatePopup {
    min-width: 120px;
}
</style>

### iceface  selectOneMenu(下拉選單)
若需要在其送出時多送其他的值給在ValueChangeEvent抓到,可以參考以下用法
其實我是用在datatable裡,所以f:attribute 是傳那個row的 key
jsp:
<ice:selectOneMenu value="#{bean.dealType[row.key]}" valueChangeListener="#{bean.changeIdDealType}" partialSubmit="true">
        <f:attribute name="more" value="#{row.key}" />
        <f:selectItems value="#{ctrl.lstId}" />
</ice:selectOneMenu>
java:
String more = ((UIInput)event.getSource()).getAttributes().get("more").toString();
String newId = (String)event.getNewValue();