開始玩Struts - 加入 tag


index

  1. 建立 JDK 環境(請參照 入門級 說明)
  2. 建立 Tomcat 環境(請參照 入門級 說明)
  3. 下載 Struts(請參照 入門級 說明)
  4. 建立目錄結構
  5. 準備相關的 library 與 tag library
  6. 建立 web.xml 檔
  7. 建立 struts-config.xml 檔
  8. 建立 Bean 檔
  9. 建立 網頁訊息檔
  10. 建立 JSP 檔
  11. 測試
  12. 測試程式的Action流向圖
  13. 下載範例程式 tset2.zip

建立目錄結構

  1. 建立一個測試用的目錄 test2\ ,放置於 C:\Java\jakarta-tomcat-4.1.30\webapps\ ,其目錄結構如下:
    webapps\
      |
      +--- test2\
             |
             +--- WEB-INF\
                     |
                     +--- classes\
                     |
                     +--- lib\
                     |
                     +--- src\

準備相關的 library 與 tag library

  1. 複製以下 libs,放置於 C:\Java\jakarta-tomcat-4.1.30\webapps\test2\WEB-INF\lib\
    這些 libs 可以在 C:\Java\jakarta-struts-1.1\lib 或是 C:\Java\jakarta-struts-1.1\contrib\struts-el\lib 找到
    commons-beanutils.jar
    commons-collections.jar
    commons-digester.jar
    commons-fileupload.jar
    commons-lang.jar
    commons-logging.jar
    commons-validator.jar
    jakarta-oro.jar
    jstl.jar
    standard.jar
    struts-el.jar
    struts-legacy.jar
    struts.jar
  2. 複製以下 tag libs,放置於 C:\Java\jakarta-tomcat-4.1.30\webapps\test2\WEB-INF\
    這些 libs 應該在 C:\Java\jakarta-struts-1.1\lib 或是 C:\Java\jakarta-struts-1.1\contrib\struts-el\lib
    c.tld
    struts-bean-el.tld
    struts-html-el.tld
    

建立 web.xml 檔

  1. 用文書編輯軟體,建立 C:\Java\jakarta-tomcat-4.1.30\webapps\test2\WEB-INF\web.xml ,其內容如下:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app PUBLIC
          "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    <web-app>
       <display-name>My Struts</display-name>
    
       <servlet>
          <servlet-name>action</servlet-name>
          <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
          <init-param>
             <param-name>application</param-name>
             <param-value>MyMessage</param-value>
          </init-param>
          <init-param>
             <param-name>config</param-name>
             <param-value>/WEB-INF/struts-config.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
       </servlet>
    
       <servlet-mapping>
          <servlet-name>action</servlet-name>
          <url-pattern>/do/*</url-pattern>
       </servlet-mapping>
    
       <taglib>
          <taglib-uri>struts/bean-el</taglib-uri>
          <taglib-location>/WEB-INF/struts-bean-el.tld</taglib-location>
       </taglib>
       <taglib>
          <taglib-uri>struts/html-el</taglib-uri>
          <taglib-location>/WEB-INF/struts-html-el.tld</taglib-location>
       </taglib>
       <taglib>
          <taglib-uri>jstl/c</taglib-uri>
          <taglib-location>/WEB-INF/c.tld</taglib-location>
       </taglib>
    </web-app>
  2. 主要設定值,說明如下:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app PUBLIC
          "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    <web-app>
       <display-name>My Struts</display-name>
    
       <servlet>
          <servlet-name>action</servlet-name>
          <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  <!-- 定義 Action Servlet -->
          <init-param>
             <param-name>application</param-name> <!-- 定義網頁中的 Message 檔,對應到 .properties 檔 -->
             <param-value>MyMessage</param-value> <!-- 例如 WEB-INF\classes\MyMessage.properties -->
          </init-param>
          <init-param>
             <param-name>config</param-name> <!-- 定義 Struts Config 檔 -->
             <param-value>/WEB-INF/struts-config.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
       </servlet>
    
       <servlet-mapping>
          <servlet-name>action</servlet-name> <!-- 定義網頁中 action 的使用 -->
          <url-pattern>/do/*</url-pattern> <!-- 由於定義了 /do/* ,因此不能自己使用一個名為 do\ 的子目錄 -->
       </servlet-mapping>
    
       <!-- 定義網頁中所有使用的 tag -->
       <taglib>
          <taglib-uri>struts/bean-el</taglib-uri> <!-- 網頁上的 tag 名稱 -->
          <taglib-location>/WEB-INF/struts-bean-el.tld</taglib-location> <!-- 對應的 tag 檔 -->
       </taglib>
       <taglib>
          <taglib-uri>struts/html-el</taglib-uri>
          <taglib-location>/WEB-INF/struts-html-el.tld</taglib-location>
       </taglib>
       <taglib>
          <taglib-uri>jstl/c</taglib-uri>
          <taglib-location>;/WEB-INF/c.tld</taglib-location>
       </taglib>
    </web-app>

建立 struts-config.xml 檔

  1. 用文書編輯軟體,建立 C:\Java\jakarta-tomcat-4.1.30\webapps\test2\WEB-INF\struts-config.xml ,其內容如下:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
    
    <struts-config>
       <form-beans>
            <form-bean name="MyForm" type="MyFormClass"/>
       </form-beans>
    
       <action-mappings>
          <action
              path="/a_page2"
              type="MyClass"
              name="MyForm"
              scope="request">
             <forward
                 name="proccess_finish"
                 path="/page2.jsp"/>
          </action>
       </action-mappings>
    </struts-config>
  2. 主要設定值,說明如下:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
    
    <struts-config>
       <-- 定義網頁中所有使用的 form-bean -->
       <form-beans>
            <form-bean
                name="MyForm"  <!-- 網頁上Form的名稱,例如 <form name="MyForm"> -->
                type="MyFormClass"/> <!-- form的值,要存在那個bean檔內,例如 MyFormClass.class -->
       </form-beans>
    
       <!-- 定義網頁中所有使用的 action -->
       <action-mappings>
          <action
              path="/a_page2" <!-- 對應到網頁的連結動作,例如 <a href="do/a_page2"> 或 <form action="do/a_page2"> -->
              type="MyClass" <!-- 對應bean檔,例如 WEB-INF\classes\MyClass.class -->
              name="MyForm" <!-- 網頁上Form的名稱,例如 <form name="MyForm"> -->
              scope="request"> <!-- 網頁上Form的各Field,送到那個物件,例如常用的 request, 或 session, application, page -->
             <forward
                 name="proccess_finish" <!-- forward動作的名稱,一般是由bean的forward物件送來,例如 mapping.findForward("proccess_finish") -->
                 path="/page2.jsp"/> <!-- forward要連結的地方 -->
          </action>
       </action-mappings>
    </struts-config>

建立 Bean 檔

  1. 用文書編輯軟體,建立 C:\Java\jakarta-tomcat-4.1.30\webapps\test2\WEB-INF\src\MyFormClass.java ,其內容如下:
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionMapping;
    
    import javax.servlet.http.HttpServletRequest;
    
    public class MyFormClass extends ActionForm  {
       /* 宣告網頁上 Form 對應有一個名為 account 的欄位 */
       private String account = null;
    
       /* 必然存在 setXXX() 和 getXXX() 兩個function */
       public void setAccount(String account) { this.account = account; }
       public String getAccount() { return account; }
    }
  2. 用文書編輯軟體,建立 C:\Java\jakarta-tomcat-4.1.30\webapps\test2\WEB-INF\src\MyClass.java ,其內容如下:
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.apache.commons.beanutils.BeanUtils;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public final class MyClass extends Action {
       public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
          /*-- 將網頁Form物件的值,塞在一個名為 MyObj 物件中 */
          request.setAttribute("MyObj", form);
    
          /*-- forward的名稱,對應到 struts-config.xml 中名為 forward name="proccess_finish" 的設定 */
          return (mapping.findForward("proccess_finish"));
       }
    }
  3. 使用 javac MyClass.java 得到 MyClass.class,並放置於 C:\Java\jakarta-tomcat-4.1.30\webapps\test2\WEB-INF\classes\

建立 網頁訊息檔

  1. 用文書編輯軟體,建立 C:\Java\jakarta-tomcat-4.1.30\webapps\WEB-INF\classes\MyMessage.properties ,其內容如下:
    #-- titles --
    title.page1=My Struts: page1
    title.page2=My Struts: page2
    
    #-- buttons --
    btn.submit=Click Me!
    btn.reset=Clear All~
    
    #-- messages --
    msg.copyright=copyright(c) 2004
    

建立 JSP 檔

  1. 用文書編輯軟體,建立 C:\Java\jakarta-tomcat-4.1.30\webapps\page1.jsp ,其內容如下:
    <%@ taglib uri="struts/bean-el" prefix="bean" %>
    <%@ taglib uri="struts/html-el" prefix="html" %>
    <html>
    <body>
    <script langauge="javascript">
    function doCheck(form) {
       if (form.account.value == "") {
          alert("[My Account] is missing!");
          form.account.focus();
          return false;
       } else {
          return true;
       }
    }
    </script>
    
    <h1><bean:message key="title.page1"/></h1>
    <html:form action="a_page2" focus="account">
       My Account: <html:text property="account" size="3"/>
       <html:submit onclick="return doCheck(this.form)"><bean:message key="btn.submit"/></html:submit>
       <html:reset><bean:message key="btn.reset"/></html:reset>
    </html:form>
    
    </body>
    </html>
  2. page1.jsp 所執行的結果如下,可發覺出其中 tag 的變化:
    <html>
    <body>
    <script langauge="javascript">
    function doCheck(form) {
       if (form.account.value == "") {
          alert("[My Account] is missing!");
          form.account.focus();
          return false;
       } else {
          return true;
       }
    }
    </script>
    
    <h1>My Struts: page1</h1>
    <form name="MyForm" method="post" action="/test2/do/a_page2">
       My Account: <input type="text" name="account" size="3" value="">
       <input type="submit" value="Click Me!" onclick="return doCheck(this.form)">
       <input type="reset" value="Clear All~">
    </form>
    <script type="text/javascript" language="JavaScript">
      <!--
      var focusControl = document.forms["MyForm"].elements["account"];
    
      if (focusControl.type != "hidden") {
         focusControl.focus();
      }
      // -->
    </script>
    
    
    </body>
    </html>
    
  3. 用文書編輯軟體,建立 C:\Java\jakarta-tomcat-4.1.30\webapps\page2.jsp ,其內容如下:
    <%@ taglib uri="struts/bean-el" prefix="bean" %>
    <%@ taglib uri="jstl/c" prefix="c" %>
    <html>
    <body>
    <h1><bean:message key="title.page2"/></h1>
    My Account:<font color="#FF0000"><c:out value="${MyObj.account}"/></font>
    <br>
    <bean:message key="msg.copyright"/>
    </body>
    </html>
  4. page2.jsp 所執行的結果如下,可發覺出其中 tag 的變化:
    <html>
    <body>
    <h1>My Struts: page2</h1>
    My Account:<font color="#FF0000">輸入的值</font>
    <br>
    copyright(c) 2004
    </body>
    </html>

測試

  1. 點擊 C:\Java\Tomcat.bat 以啟動 Tomcat,此時會蹦出一個 Tomcat 服務視窗。

  2. 開啟瀏覽器,並輸入 http://localhost:8080/test2/page1.jsp 進行網址測試。

  3. 點擊 page1.jsp 上的按鈕,若能順利連結 page2.jsp ,且顯示所輸入的結果,即表示測試成功。

  4. 若有異動 WEB-INF\ 目錄下的檔案,包含 *.xml, *.class, *.properties 等檔案,則必須關閉 Tomcat 服務視窗,再點擊 C:\Java\Tomcat.bat 重啟 Tomcat 。


測試程式的Action流向圖

  1. 以下圖案表示 page1.jsp 中,按鈕中 Action: /a_page2 的流向:

    表示 page1.jsp 中,按鈕中 Action: /a_page2 的流向


下載範例程式 tset2.zip

  1. 本 test2.zip 含上述 *.jsp, *.class, *.xml, *.properties 等檔案,並已收錄成一個名為 test2\ 目錄。
  2. 因 jar 檔眾多且檔案大,因此本 test2.zip 不含 test2\WEB-INF\lib\ 目錄下的 library,請自行從 jakarta-struts-1.1.zip 中取得。
  3. Download: test2.zip

作者:Dana(Dana), cowwu@ms15.hinet.net, 2004/02/27
本文章公開於個人網站 http://www.dana.idv.tw
Home Copyright © Shu-Chen Wu