本週感想 -- 亞洲盃錦標賽 狂賀台灣前進 2004 雅典奧運
這幾天, 全台同胞討論的話題, 幾乎是亞錦賽, 第一天對韓國的比賽, 我看到九局下半, 心臟幾乎快要撞斷我的肋骨, 還好陳致遠 ( 這次 13 打席 11K 大概沒有人可以破紀錄 ) 揮出了二游之間的滾地安打, 讓我們得到打成平手, 十局下半, 我們靠著業餘好手高志剛擊出一個高彈跳的內野安打, 得到了最勝利的一分, 全國陷入了喜悅與興奮, 真是令人高興的一刻.....


但是第二天對日本的比賽, 卻是荒腔走板, 松版大埔壓制了我們的攻勢, 只有旅美好手陳金鋒可以發揮實力, 內野的防守出現了超級不協調... 失誤連連.. 讓我們的比數出現了慘敗的畫面. 真不知道該說些什麼
最後的結果, 我們藉著日本完封南韓贏得了雅典奧運棒球比賽的入場券, 但是, 如果以目前水準進入的世界的比賽, 我們如何和其他國家競爭, 到了 2004 的奧運比賽, 旅美及旅日好手是否可以回國為台灣效力..更是一個問題.. 無論如何, 我們已經進去了, 希望我們可以在這段日子中, 更加警惕自己, 贏得國際性的重要比賽讓台灣更加光芒璀璨.





jini(99% jakarta) 的部落格 -


簡體中文版 -


松凌科技 -





本週主題 -- struts 系列(III) -- Tomcat Admin Tree
SECTION 01 Tomcat Admin 簡介

. 目前版本 4.1.29, 由此下載 binary 及 source 檔案


Tomcat 是 jakarta 所提供的 JSP/Servlet Reference Implementation, 主要的開發者 Craig McClanahan 也是 Struts 的主要開發人員, 因此, 他利用了 struts 建立了 tomcat admin 這個專案, 作為管理 tomcat server 的環境, 當你安裝完成 tomcat 的時候, 只需要 http://localhost:8080/admin , 就可以連結到 administrator 的頁面, 它採用 Memory Realm 的身分驗證模式, 會出現一個登入頁面要求你登入,





可以登入的人員, 將根據你的 %CATALINA_HOME%\conf\ 之下的 tomcat-users.xml 所定義 admin 這個 role 的所有人員,
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="admin" password="" roles="admin,manager"/>
</tomcat-users>
這個範例中, 具有 admin ROLE 的身份的只有 admin 這個使用者, 他的密碼為空白, 所以我們就可以採用, Username="admin", Password="", 來登入這個系統. 那麼, 為何是採用 admin ROLE 呢, 而不是其他的 ROLE 呢 ? 就必須查看你的 %CATALINA_HOME%\server\webapps\admin\WEB-INF\web.xml,
<!-- Security is active on entire directory -->
  <security-constraint>
    <display-name>Tomcat Server Configuration Security Constraint</display-name>
    <web-resource-collection>
      <web-resource-name>Protected Area</web-resource-name>
      <!-- Define the context-relative URL(s) to be protected -->
      <url-pattern>*.jsp</url-pattern>
      <url-pattern>*.do</url-pattern>
      <url-pattern>*.html</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <!-- Anyone with one of the listed roles may access this area -->
      <role-name>admin</role-name>
    </auth-constraint>
  </security-constraint>

  <!-- Login configuration uses form-based authentication -->
  <login-config>
    <auth-method>FORM</auth-method>
    <realm-name>Tomcat Server Configuration Form-Based Authentication Area</realm-name>
    <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
  </login-config>

  <!-- Security roles referenced by this web application -->
  <security-role>
    <description>
      The role that is required to log in to the Administration Application
    </description>
    <role-name>admin</role-name>
  </security-role>
不論是 Authetication ( 身份驗證 ) 以及 Authorization ( 權限管控 ) 都只有設定相關的 admin ROLE, 當你想要新增或修改相關的 AA, 就必須修改這一個檔案, 來符合你的環境.


登入完成之後, 就會出現一個管理員介面, 至於他的功用就是在管理整個 tomcat 相關的設定檔案,





而這次我們要探討的不是怎麼使用整個 tomcat admin 的操作, 而是左方的控制樹狀選單.


SECTION 02 TreeControlNode 簡介

每一個樹狀節點都是一個 TreeControlNode, 主要可以設定


  • name: 這個節點的名稱
  • icon: 這個節點的圖案
  • label: 這個節點的說明
  • action: 是否具有連結
  • target: 點選後的目標位置 ( frame )
  • expanded: 是否展開
TreeBuilder , 就是產生 TreeControlNode 的集合, 我們可以查看產生 ROOT 的方法.
TreeControlNode root =
  new TreeControlNode("ROOT-NODE",null, 
rootnodeName,"setUpTree.do?select=ROOT-NODE","content", true, domain);
不難發現, 就是這麼產生每一個樹狀節點.


SECTION 03 TreeControl 簡介

org.apache.webapp.admin.SetUpTreeAction 是整個 Tree 初始化的重要 action, 第一次取得所有網頁資料, 將在這裡產生將所有的資料放入 session 之中 你會看到 servlet.getServletConfig().getInitParameter("...") 將會去採用 web.xml 中的 init-parameter 設定值, 接下來的動作就比較重要, 也牽扯比較廣泛, 我們會把 root 放到 TreeControl 之中,
TreeControl control = new TreeControl(root);
簡單來說, 先建立一個 Root 的 TreeNode, 我們將根據這個 Root 去設定 TreeControl, 就是整個樹狀結構的根. 請注意, 最後我們放入 session 的是 treeControl 但是這時候, treeControl 只有 root 這個根節點


接著, 我們將把整個樹狀結構放到 treeControl, 該怎麼辦, 怎麼處理 ?


我們利用到 TreeBuilder ( Builder Pattern ) 你會看到一些複雜的程式碼, 沒關係, 他將建立很多 tree 可以在 web.xml 的 treebuilders 之 init-param 中看到 -org.apache.webapp.admin.TomcatTreeBuilder, -org.apache.webapp.admin.resources.ResourcesTreeBuilder, -org.apache.webapp.admin.users.UsersTreeBuilder 這幾個 TreeBuilder, 不過我只說明 UsersTreeBuilder 就足夠讓大家了解了 基本上, 我們將 org.apache.webapp.admin.users.UsersTreeBuilder newInstance() 產生物件 接著使用 buildTree() 就能夠產生整個 樹狀結構 放到 treeControl 之中 ~


SECTION 04 TreeBuilder 簡介

TreeBuilder 是一個 interface, 我們前端的程式就是呼叫 TreeBuilder 來產生 Tree 放入 Session 之中,
public interface TreeBuilder {

    public void buildTree(TreeControl treeControl,
                          ApplicationServlet servlet,
                          HttpServletRequest request);
}

例如 org.apache.webapp.admin.users.UsersTreeBuilder 中, 我們可以看到他實作 buildTree(), 最重要的是 addSubtree()中, 產生所有的子節點, 接著, 由 root 開始 add 所有的節點, 此時, 所有的樹狀資訊就是放在 treeControl 這個 session 之中.
protected void addSubtree(TreeControlNode root,
                      MessageResources resources) {

        String databaseName = URLEncoder.encode
          ("Users:type=UserDatabase,database=UserDatabase");
        
        TreeControlNode subtree = new TreeControlNode
            ("Global User and Group Administration",
             "folder_16_pad.gif",
             resources.getMessage("users.treeBuilder.subtreeNode"),
             null,
             "content",
             true);
        TreeControlNode groups = new TreeControlNode
            ("Global Administer Groups",
             "Groups.gif",
             resources.getMessage("users.treeBuilder.groupsNode"),
             "users/listGroups.do?databaseName=" +
             URLEncoder.encode(databaseName) +
             "&forward=" +
             URLEncoder.encode("Groups List Setup"),
             "content",
             false);
        TreeControlNode roles = new TreeControlNode
            ("Global Administer Roles",
             "Roles.gif",
             resources.getMessage("users.treeBuilder.rolesNode"),
             "users/listRoles.do?databaseName=" +
             URLEncoder.encode(databaseName) +
             "&forward=" +
             URLEncoder.encode("Roles List Setup"),
             "content",
             false);
        TreeControlNode users = new TreeControlNode
            ("Global Administer Users",
             "Users.gif",
             resources.getMessage("users.treeBuilder.usersNode"),
             "users/listUsers.do?databaseName=" +
             URLEncoder.encode(databaseName) +
             "&forward=" +
             URLEncoder.encode("Users List Setup"),
             "content",
             false);
        
        root.addChild(subtree);
        subtree.addChild(users);
        subtree.addChild(groups);
        subtree.addChild(roles);

}
很明顯的, 我們可以知道, 這個 UsersTreeBuilder 產生的就是 Tomcat Admin 的 User Definition. 下面具有 Users, Groups 以及 Roles 的子節點, 當你選擇任何一個 子節點的時候, 他將會有一個 action 的動作送到 server, 並且修改相關的樹狀設定產生應該顯示的樹狀模組, 及管理畫面.


SECTION 05 TreeControlTag 的簡介

在 org.apache.webapp.admin.TreeControlTag 之中, 最重要的就是從 Session 取得 TreeControl 並且根據裡面的內容產生相關的 HTML 代碼.
// 取得 TreeControl
protected TreeControl getTreeControl() throws JspException {
........ 
}

// 產生 HTML 代碼
protected void render(JspWriter out, TreeControlNode node,
                          int level, int width, boolean last)
	throws IOException {
.......
}
		
		
如果你對於 tablib 熟悉的話, 可以看一下這個程式 如果不熟悉, 你就當作是理所當然的程式碼 這個 taglib 也是整個樹狀結構的控制核心, 他會根據你的網頁操控, 更改你的樹狀結構的展現方式, 如果必要的時候, 例如增加 checkbox 的處理,可以修改這支程式的 render 部分, 讓它具有勾選的功能.


SECTION 06 tree-control-test.jsp 的簡介

你可以看到 SetUpTreeAction 最後就是 forward 到 Tree Control Test , 在 struts-config.xml 設定中 Tree Control Test 就是指到 tree-control-test.jsp 在這支 jsp 之中, 簡單的 taglib 呼叫
<controls:tree tree="treeControlTest"
               action="treeControlTest.do?tree=${name}"
                style="tree-control"
        styleSelected="tree-control-selected"
      styleUnselected="tree-control-unselected"
  />
就可以產生所有的樹狀結構了 但是, 你可以看到每個 Node 的 action 就是 treeControlTest.do 所以最後, 就是從 struts-config.xml 中檢查 treeControlTest 是指 org.apache.webapp.admin.TreeControlTest 這支程式 基本上你會傳入 tree 這個參數, 假設你現在是 expand = true 將會被設定為 false 還可以傳入 select 這個參數 代表現在是這個 treeControlNode 是被選取的


SECTION 07 結論

在 BEA Workshop 8.1 的 netui:tree 這個元件, 也是採用同樣的解決方式來產生 Tree. 這是屬於動態的樹狀選單產生的方法, 和 一次匯入到 client 端的 javascript Tree 來相比, 每一次打開關上節點的動作都必須和 Server 端做溝通, 是比較耗費資源的. 當 client 端的 browser 版本不確定的時候, 使用 DHTML ( html+javascript ) 有時候會產生錯誤, 有時候更會因為 javascript 資料量過大會導致 client 端的記憶體不足, 另外, Jdon 的 wys1978 提供了 http://webfx.eae.net/dhtml/xloadtree/xloadtree.html 這個 javascript Tree, 雖然屬於 javascript, 但是不同的是, 每次動作都去呼叫 server 取得資料, 所以, 當你使用比較小型的系統可以採用 struts-menu 一次匯入的方式就可以完成你的 tree 選單, 當資料量過大或變化頻繁的時候, 我不建議一次匯入所有的資料到 client 端, 所以, 不論是 taglib 解決方法或 xloadtree 都是比較好的選擇.
參考 -- 相關書目或相關文章

  1. struts
    http://jakarta.apache.org/struts/
  2. tomcat
    http://jakarta.apache.org/tomcat/
贊助 -- 如果你覺得這個電子報對你有幫助, 可以匯款贊助, 如果需要刊登廣告, 也可聯絡 !
匯款帳號 : 第一銀行 板橋分行 201-10-071238

帳戶名稱 : 松凌科技股份有限公司

聯絡電話 : (02)8951-9554 # 121 王先生

聯絡Email: johnny@softleader.com.tw

人才招募 -- 松凌科技 徵才



>>徵求 Java 工程師 1 名<<



徵求有心向學的 Java 工程師加入我們的行列, 本公司的 Framework 採用 Struts 為基礎, 主要著重於 J2EE 相關系統開發 及 金融資訊的資訊整合應用, 目前的產品涵蓋了證券/期貨/基金 及 EIP/CMS 等, 工作內容以 WEB-Based J2EE 程式設計為主, 歡迎大家的加入.


應徵職稱: Java 軟體工程師

員工福利: 享有勞健保, 保障 14 個月年薪, 股票分紅等福利.

工作年資: 不拘, 也歡迎剛退伍或畢業的新鮮人加入

性別: 不拘, 只要能夠吃苦耐勞即可

人格特質: 聰明, 外向, 肯拼, 肯學

學經歷需求: 大專學校資訊相關科系畢業尤佳, 或具有 SCJP 認證, 有 SCWCD 將優先錄用

基本技能: JSP, MVC 概念, 了解 Struts 者優先錄用

聯絡電話: (02)8951-9554 #9 陳小姐

聯絡Email: yvonne@softleader.com.tw

履歷格式: http://www.softleader.com.tw/resume/resume.doc

廣告 -- 松凌科技 獨家贊助



>>軟體生產力提升計畫 -- 企業包班方案<<



如果你們公司正在想要轉型成為 java 的軟體公司,

或是已經採用 java 卻發現不得其門而入,

甚至工程師一直無法突破瓶頸,

松凌科技技術顧問團隊將帶領你們技術人員在五天的課程中,

了解整個 j2ee 的概觀以及標準的開發流程.



課程名稱: 建立 J2EE 標準的開發流程

課程編號: SLJ-021

課程時數: 40 小時

課程規劃:
  • J2EE 架構與概觀
  • 使用 Struts 建立一套完善的 MVC Framework
  • 建立自己的設計模組 Design Pattern
  • 使用 Hibernate 建立 O/R Mapping 的環境
  • 透過 JSTL 處理頁面端邏輯
  • 實作教育
基本開班人數: 10 人

收費標準: 每人 30,000 元, 超過一人酌收 5,000 元 ( 含稅, 大台北地區外需加上車馬費 )

聯絡電話: (02)8951-9554 # 111 陳先生

聯絡Email: kevin@softleader.com.tw

政府補助: 短中期輔導課程, 可申請軟體策進協會補助約 50% 的教育訓練費用

快速訂閱 -- 覺得好就訂閱吧~~~~
目前訂戶數: ; 目前發報數: ;
欣賞之前發行電子報 ;
投票區 ~ 覺得好就投票吧 !
有夠讚 不錯啦 普普說 蠻爛的 爛到最高點