JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Web Framework » JSF  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 JSF2.0 心得分享
yjy198410





發文: 27
積分: 0
於 2017-07-20 07:35 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
小弟分享點JSF2的使用心得,希望拋磚引玉了解大家的使用狀況,有錯誤請大家指教。

我從年初開始接觸JSF2.0到現在,發現JSF 2.0以上的資訊真的不多,就連國外網站資料也不是很齊全,倒是大陸翻譯了幾本JSF2.0的書,內容也比較像是工具書。 摸索了幾個月,慢慢嘗試不同情境狀態下JSF該如何使用,基本掌握各個功能的使用準備進入開發階段。JSF太靈活太複雜,複雜到必須搞懂太多東西到融會貫通,才有辦法開發。

JSF 2.0不普及的原因可能如下:
是因為JSF太新了?
還是現在大家的重心在用Java來寫Android?
還是缺少Sample資料?
學習歷程太久?
缺少策略引導指南

總的來說覺得JSP到JSF2.0,好比由asp進入asp .NET,學asp .net可以不用知道asp。但是學JSF必須知道Servlet及JSP(以下泛稱JSP),在JSF的相關文件中很少提及該有的觀念是在JSP中可以學到的。
1 要懂Http Request的get, post等傳送參數的概念,才知道怎麼使用JSF內EL變數header, headerValues, param, paramValues,request.
2 要懂Session觀念,才知道ManagementBean的SessionScope怎麼使用
3 要懂Context觀念,才知道ManagementBean的ApplicationScope怎麼使用
4. 要稍微接觸過Structs或其他Web Framework,才知道JSF ManagementBean腳色嚴格說是 "類" Controller,controller只有一個,由controller依照ManagementBean 建立controller "服務群",而且這服務群的生命週期布一樣,有ApplicationScope, SessionScope, RequestScope等,比Structs複雜。
...

以下提供個人觀點供大家參考,我以表單為單位,也就是一個網頁頁面檔案為討論觀點:
1.單一時間系統允許的操作人次採用的方案


2.網頁間傳送方式採用的方案


3.資料呈技術採用的方案


4.每個請求處理的進入點


總結以上4點排列組合後。JSF 2.0以上版本搞懂16種情境,就可以起頭開始開發了。


沒有整理這些表格出來做紀錄,說著的得花好多時間思考該採用哪一種生命週期,哪一種變數週期,老是鬼打牆般的不知道如何debug。

更不用說我們coding時初步還要考慮以下幾點,JSF該怎麼做:
1.程式進入點該尚在哪
2.參數檢查點
3.資料初始點
4.UI呈現點
5.輸入資料檢查點
6.任務執行點
7.結果呈現點
8.安全
9.執行緒問題
...等等等

還有假設我要用JSF架設有架構的系統,可能要使用的Design pattern很多方案,從哪裡起頭啊等問題

所以說JSF2.0以上真的有夠複雜,這跟去年玩JavaFX 2.0以上也是一樣複雜,但是熟悉後應該也是很好用。


yjy198410 edited on 2017-08-26 08:36
reply to postreply to post
十年磨一劍,我老是在磨劍。那怕磨劍不成,鐵杵磨成繡花針。
琢磨JSF, JavaFX, Design Pattern
作者 Re:JSF2.0太複雜?所以少人用嗎? [Re:yjy198410]
snowbean71





發文: 92
積分: 0
於 2017-07-27 03:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我用jsf 很久了,從primefaces 2.x ,開始學的,jsf 不會比 jsp難,jsp 你要寫後台,也要寫前台。

jsf 也是,只是少了點,因為元件幫你省了些寫前台的code ,至於session scope 、application scope、request scope 一樣,jsp 也有,只是jsp 預設是這三個,jsf 多了一些 view scope 、flash scope 、flow scope ...

當然如果你用 jsp+spring ,spring 也增加一些 scope

這點學習上也是一致的

元件上來說,jsf 目前比較多人用的還是primefaces ,而jsp 用的就多了,各種的 js lib,如 Angular .....
而 jsf 元件化了,所以省了一點學 js lib 的時間。

目前jsf 少的應該是 security 方面的支持,jsf 可以用realm 去設定 security 的存取,但是在 ui 上沒有lib tag 可以限制,比如說 使用者含有其中之一的role 可將 jsf 的元件秀出,而沒有的話,秀出另一個,當然能用其它的方式,做到相同的效果,但是個人覺的,若是有個 tab 能做,應該更好,我記得 spring 裏有的樣子,sorry , spring 架構我不熟

如果你的公司,就只有一人寫程式,我還是會建議用jsf 比較快點,當然這是在你沒有熟的


reply to postreply to post
javabean71.....snowbean71......JSF+JPA+Primefaces
作者 Re:JSF2.0太複雜?所以少人用嗎? [Re:snowbean71]
yjy198410





發文: 27
積分: 0
於 2017-07-27 07:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝點醒JSP也有用JavaBean,也有不同的scope。

沒有仔細回想到JSP中,必須利用<jsp:useBean>作為JSP JavaBean的進入點,然後再用<jsp:setProperty>與<jsp:getProperty>操作JSP JavaBean。

在JSP中若要自資料庫取的JavaBean,DAO的呼叫點放在Servlet,JSP 內useBean。然後setProperty, getProperty。

在JSF中若要自資料庫取的JavaBean,DAO的呼叫點放在ManagedBean,JSF內UI元件的value直接EL物件呼叫ManagedBean內的JavaBean(我認為是JSF Navigation導航概念,不要我們再去寫Servlet了),期間自動呼叫getter, setter。

JSF自動呼叫getter, setter這點搞得我無法理解控制setter, getter的時間點,而且會重複呼叫多次。這好比JavaFX中的databinding是動態的。

另外JSF UI tag有rendered屬性, disable屬性, visible屬性等,

偏偏JSF UI 的render預設值為false會造成action EL失效,以及JSTL 的if, else是無法正常混用的。必須用<h:panelGroup rendered="${...}取代JSTL if, else。

以上有錯誤歡迎各位先進指正。


reply to postreply to post
十年磨一劍,我老是在磨劍。那怕磨劍不成,鐵杵磨成繡花針。
琢磨JSF, JavaFX, Design Pattern
作者 Re:JSF2.0太複雜?所以少人用嗎? [Re:yjy198410]
snowbean71





發文: 92
積分: 0
於 2017-07-31 02:53 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jsf 的life cycle 這些要學,您可以看一下這文章
http://www.softwareengineeringsolutions.com/thoughts/frameworks/JSF-lifecycle.htm

jsf render = false 時,整段的html都不會出現,都沒出現就沒action的事了

另外 jsf 使用的大多是用el 表示法,而非 jstl ,雖然 jstl 也能用在jsf 上
jsf 和 jsp 有一個常見的差別,一個用 #{....} ,一個用 ${....} ,其實jsf 兩個都可以用
差別在 http://docs.oracle.com/javaee/6/tutorial/doc/bnahr.html

其本上若用 jstl 的 if else ,我覺的更難看的懂,不過這完全是個人喜好問題


reply to postreply to post
javabean71.....snowbean71......JSF+JPA+Primefaces
作者 Re:JSF2.0太複雜?所以少人用嗎? [Re:snowbean71]
yjy198410





發文: 27
積分: 0
於 2017-08-14 04:10 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝分享JSF Life cycle的文章很詳細。

以下分享JSF不要搭配JSTL一起運作的嘗試修正過程。

說到JSTL,如果利用categoryListBean.doFirstService()載入資料的結果來顯示頁面結果,我會用下面程式碼。


情境1:
JSF 搭配JSTL的set, if等tag,判斷點是利用method回傳值。
####################
#JSF code !!!注意是JSF!!!
####################


1
2
3
4
5
6
7
8
9
10
11
12
<c:set var="loadResult" value="${categoryListBean.doFirstService()}"/>
<c:if test="#{loadResult == 'SUCCESS'}">
  <!--正常要顯示的內容-->
  <h:dataTable value="#{categoryListBean.categories}" var="obj">
    <h:column>
      <f:facet name="header">操作</f:facet>
      <h:form>
      ....
</c:if>
<c:if  test="#{loadResult == 'ERROR'}">
  <h2>系統發生錯誤,請聯絡系統管理員</h2>
</c:if>

####################
#畫面結果
####################


####################
#log
####################
1
2
[2017-08-04 15:54:27,617][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:98)] [End]doFirstService
[2017-08-04 15:54:27,617][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:98)] [End]doFirstService


情境1結果:偏偏categoryListBean.doFirstService()在JSTL會有執行兩次的問題,這太不合邏輯了。常理來說應該在<c:set>就應該執行categoryListBean.doFirstService()然後把結果存在loadResult這個變數。

接著試試在JSP是否有一樣的問題。

情境2:JSP 搭配JSTL的set, if等tag,判斷點是利用method回傳值。
####################
#JSP code !!!注意是JSP!!!
####################

1
2
3
4
5
6
7
8
9
10
11
12
<c:set var="loadResult" value="${categoryListBean.doFirstService()}"/>
<c:if test="${loadResult == 'SUCCESS'}">
  <!--正常要顯示的內容-->
  <h:dataTable value="#{categoryListBean.categories}" var="obj">
    <h:column>
      <f:facet name="header">操作</f:facet>
      <h:form>
      ....
</c:if>
<c:if test="${loadResult == 'ERROR'}">
  <h2>系統發生錯誤,請聯絡系統管理員</h2>
</c:if>

####################
#畫面結果
####################

####################
#log
####################    
1
[2017-08-04 15:46:02,068][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:98)] [End]doFirstService


情境2結果:JSP並沒有重複執行的問題。

回到JSF。嘗試不能把categoryListBean.doFirstService()放在JSTL if 的value內。必須直接呼叫${categoryListBean.doFirstService()},並在categoryListBean.doFirstService()內設定categoryListBean.resultFirstService。應該就可以就可以解決重複執行的問題。

情境3:JSF搭配JSTL 的if tag,但是執行進入點不放在set tag內,判斷點是利用物件的屬性,屬性在method內修改。
####################
#JSF code !!!注意是JSF!!!
####################

1
2
3
4
5
6
7
8
9
10
11
12
${categoryListBean.doFirstService()}
<c:if  test="${categoryListBean.resultFirstService == 'SUCCESS'}">
  <!--正常要顯示的內容-->
  <h:dataTable value="#{categoryListBean.categories}" var="obj">
    <h:column>
      <f:facet name="header">操作</f:facet>
      <h:form>
      ....
</c:if>
<c:if  test="${categoryListBean.resultFirstService == 'ERROR'}">
  <h2>系統發生錯誤,請聯絡系統管理員</h2>
</c:if>

####################
#畫面結果
####################

####################
#log
####################
1
[2017-08-04 15:57:27,502][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:98)] [End]doFirstService=失敗


情境3結果:從LOG中看起來是正常的,但結果沒有正常顯示。
再把JSTL控制顯示部分全部以panelGroup rendered取代。如下:


情境4:JSF搭配panelGroup的rendered控制顯是否,不使用JSTL,判斷點是利用物件的屬性,屬性在method內修改。
####################
#JSF code
####################

1
2
3
4
5
6
7
8
9
10
11
12
${categoryListBean.doFirstService()}
<h:panelGroup rendered="${categoryListBean.getResultFirstService() == 'SUCCESS'}">
  <!--正常要顯示的內容-->
  <h:dataTable value="#{categoryListBean.categories}" var="obj">
    <h:column>
      <f:facet name="header">操作</f:facet>
      <h:form>
      ....
</h:panelGroup>
<h:panelGroup rendered="${categoryListBean.getResultFirstService() == 'ERROR'}">
  <h2>系統發生錯誤,請聯絡系統管理員</h2>
</h:panelGroup>

####################
#畫面結果
####################

####################
#log
####################
1
[2017-08-04 15:58:16,181][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:98)] [End]doFirstService


情境4結果:一切正常執行了


######################################
#結論
######################################

不能在JSF中搭配使用JSTL,會出亂子。把區塊顯示與否的任務交給rendered來判斷處理,rendered的值來源必須在執行相關任務動作時修改。
JSTL是TagHandler不是JSF UI Component。參考:https://rogerkeays.com/jsf-c-foreach-vs-ui-repeat


reply to postreply to post
十年磨一劍,我老是在磨劍。那怕磨劍不成,鐵杵磨成繡花針。
琢磨JSF, JavaFX, Design Pattern
作者 Re:JSF2.0太複雜?所以少人用嗎? [Re:yjy198410]
yjy198410





發文: 27
積分: 0
於 2017-08-24 14:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list

情境5:
嘗試用ui:param方式存放呼叫結果
####################
#JSF code !!!注意是JSF!!!
####################


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<ui:param name="callResult" value="${categoryListBean.doFirstService()}"/>
<h:panelGroup rendered="${callResult == 'SUCCESS'}">
  <!--正常要顯示的內容-->
  <h:dataTable value="#{categoryListBean.categories}" var="obj">
    <h:column>
      <f:facet name="header">操作</f:facet>
      <h:form>
      ....
</h:panelGroup>
<h:panelGroup rendered="${callResult == 'FAIL'}">
  <h2>系統連線異常,請稍後嘗試</h2>
</h:panelGroup>
<h:panelGroup rendered="${callResult == 'ERROR'}">
  <h2>系統發生錯誤,請聯絡系統管理員</h2>
</h:panelGroup>


####################
#畫面結果
####################
[2017-08-24 22:00:35,678][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功
[2017-08-24 22:00:35,779][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功
[2017-08-24 22:00:35,848][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功
[2017-08-24 22:00:35,955][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功
[2017-08-24 22:00:36,015][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功
[2017-08-24 22:00:36,115][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功
[2017-08-24 22:00:36,163][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功
[2017-08-24 22:00:36,216][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功
[2017-08-24 22:00:36,281][INFO][yjy.api.base.mvc.BaseController.doFirstService(BaseController.java:99)] [End]doFirstService=成功

####################
#log
####################


情境5結果:結果正常執行,但是會重複執行多次。ui:param內value放呼叫method,並不會在ui:param當行執行一次並將結果存起來,而是呼叫變數幾次就會呼叫幾次就會執行幾次。


reply to postreply to post
十年磨一劍,我老是在磨劍。那怕磨劍不成,鐵杵磨成繡花針。
琢磨JSF, JavaFX, Design Pattern
» JWorld@TW »  Web Framework » JSF

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8