<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,  comments - 11,  trackbacks - 0
     
      1、安裝Tomcat
      參考Tomcat for window 的安裝向導,基本直接安裝即可,注意:安裝時會提示輸入管理用戶名和密碼,這是以后會用到的用戶名和密碼,切記。
      
      2、安裝MySql
      默認安裝即可。
      
      3、使用Tomcat的Web管理應用配置數據源
      啟動Tomcat服務器,打開瀏覽器,輸入http://localhost:8080/admin/(其中localhost可能是一臺機器的IP或是服務器名稱),進入管理界面的登陸頁面,這時候請輸入原來安裝時要求輸入的用戶名和密碼,登陸到管理界面,
      
      選擇Resources-Data sources進入配置數據源界面,選擇Data Source Actions ->選擇Create New Data Source,進入配置詳細信息界面,內容如下:
      
      JNDI Name:  jdbc/mysql
      Data Source URL: jdbc:mysql://192.168.0.16/SUBRDB
      JDBC Driver Class:  org.gjt.mm.mysql.Driver
      User Name:  root
      Password:   ********
      Max. Active Connections:  4

    字串9


      Max. Idle Connections:  2
      Max. Wait for Connection:  500
      Validation Query:
      
      要求輸入的JNDI Name等信息,其中除了JDBC DriverClass之外,其他的可以根據你的需要填寫。比如Data Source URL的內容可能是:jdbc:mysql:// IP或是名稱/DataBaseName,其中DataBaseName是你的數據庫名稱,IP是你的數據庫的所在的服務器的IP或是名稱。最后點擊Save->Commit Change.這樣你的數據源的基本資料配置一半了。
      
      4、web.xml和%TOMCAT_HOME%\conf\Catalina\localhost下對應你的引用的配置文件修改
      通過文件夾導航到%TOMCAT_HOME%\conf,打開web.xml,在</web-app>的前面添加以下內容:
      
      <resource-ref>
      
      <description>DB Connection</description>
      
      <res-ref-name>jdbc/mysql</res-ref-name>
      
      <res-type>javax.sql.DataSource</res-type>
      
      <res-auth>Container</res-auth>
      
      </resource-ref>
      
      注意res-ref-name填寫的內容要與在上文提到的JNDI Name名稱一致。

    字串8


      
      通過文件夾導航到%TOMCAT_HOME%\conf\Catalina\localhost下,找到你的web應用對應的.xml文件,如  ROOT.xml,并在此文件的下添入代碼:
      
      <ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.DataSourcer"/>
      
      到這里,配置工作就基本完成了。
      
      5、其他注意事項
      別忘了JDBC驅動程序mysql-connector-java-3.0.9-stable-bin.jar一定要放置到Tomcat的對應目錄,你的JDBC驅動可能版比筆者高,不過只要能與所使用的MySql對應就可以了,因為我發現版本太低的JDBC驅動不能支持4.0.*版本的MySQL數據庫,建議放置在%TOMCAT_HOME%\common\lib和應用的WEB-INF\lib下。兩者有什么不同呢?其實一看就明白了,common\li是所有的應用都可以使用的庫文件位置。
      
      重啟你的Tomcat服務。
      
      6、編寫測試代碼
      在應用的目錄下建立一個Test.jsp文件,代碼如下:
      
      <!doctype html public "-//w3c//dtd html 4.0 transitional//en"
      
      "http://www.w3.org/TR/REC-html40/strict.dtd">
    字串9

      
      <%@ page import="java.sql.*"%>
      
      <%@ page import="javax.sql.*"%>
      
      <%@ page import="javax.naming.*"%>
      
      <%@ page session="false" %>
      
      <html>
      
      <head>
      
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      
      <title></title>
      
      <%
      
      out.print("我的測試開始");
      
      DataSource ds = null;
      
      try{
      
      InitialContext ctx=new InitialContext();
      
      ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
      
      Connection conn = ds.getConnection();
      
      Statement stmt = conn.createStatement();
      
      //提示:users必須是數據庫已有的表,
      
      //這里的數據庫前文提及的Data Source URL配置里包含的數據庫。

    字串9


      
      String strSql = " select * from users";
      
      ResultSet rs = stmt.executeQuery(strSql);
      
      while(rs.next()){
      
      out.print(rs.getString(1));
      
      }
      
      out.print("我的測試結束");
      
      }
      
      catch(Exception ex){
      
      out.print(“出現例外,信息是:”+ex.getMessage());
      
      ex.printStackTrace();
      
      }
      
      %>
      
      </head>
      
      <body>
      
      </body>
      
      </html>
      
      運行結果:
      
      我的測試開始12345678我的測試結束,因為我的rs.getString(1) 在數據庫就是存放12345678
      
      7、總結
      配置過程及其簡單明了,這些配置免除了以往開發人員自己動手寫數據源連接池的痛苦,這也是對開發過程的有力支持。
    posted @ 2007-08-15 01:22 jadmin 閱讀(54) | 評論 (0)編輯 收藏
    終于解決了困擾多天的連接池的問題,寫下這編文章與大家一起分享。我是在tomcat5.5.9下配置的,tomcat5.5.X和以前的版本有一些差別,所以配置上也有差別。我就說一下在tomcat5.5.9配置的基本步驟:(確定你以安裝好tomcat5.5.9、sql2000)
      
      1、把數據庫JDBC驅動拷貝到%TOMCAT_HOME%/common/lib和%TOMCAT_HOME%/webapps/yourweb/WEB-INF/lib下(我的web文件夾名字叫quickstart)
      

      這一步大家都知道,不然tomcat無法與數據庫連接。
      
      2、修改%TOMCAT_HOME%/conf/server.xml文件,在 <GlobalNamingResources></GlobalNamingResources>之間
      

      添加以下內容:
      <Resource
      name="jdbc/quickstart"
      type="javax.sql.DataSource"
      password="123456"
      driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
      maxIdle="2"
      maxWait="5000"
      username="sa"
      url="jdbc:microsoft:sqlserver://localhost;DatabaseName=quickstart"   maxActive="4"/> 字串8
      
      以上內容根據大家的具體情況進行相應修改,比如:把name="jdbc/quickstart"中的quickstart改成和你web文件夾名稱一樣,把password="123456"中的“123456”改成你數據庫的密碼。
      
      3、在%TOMCAT_HOME%/conf/Catalina/localhost下新建一個與你web文件夾同名的xml文件(我的是quickstart.xml)
      

      這一步非常重要,如果沒有這步就會出錯,會出現org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
      
      這樣的錯誤,在文件中加入第2步的內容,如下:
      
      <?xml version="1.0" encoding="UTF-8"?><Context>
      <Resource
      name="jdbc/quickstart"
      type="javax.sql.DataSource"
      password="123456"
      driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
      maxIdle="2"
      maxWait="5000"
      username="sa"
      url="jdbc:microsoft:sqlserver://localhost;DatabaseName=quickstart" 字串8
      maxActive="4"/> </Context>
      
      根據個人具體情況進行相應修改。
      
      4、修改%TOMCAT_HOME%/webapps/yourweb/WEB-INF下的web.xml文件,在<web-app></web-app>之間添加以下內容
      

      <resource-ref>
      <description>sqlserverDB Connection</description>
      <res-ref-name>jdbc/quickstart</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
      </resource-ref>
      
      把<res-ref-name>jdbc/quickstart</res-ref-name>中的quickstart改成你的web文件夾名稱。
      
      5、測試,在quickstart下新建一個index.jsp文件
      

      <%@ page contentType="text/html; charset=utf-8" %><%@ page import="javax.naming.*" %><%@ page import="javax.sql.*" %><%@ page import="java.sql.*" %><html><head><title>JDBC Test</title></head><body><%

    字串8


      Connection conn=null;
      Statement stmt=null;
      ResultSet rs=null;
      ResultSetMetaData md=null;
      try
      {
      Context initCtx=new InitialContext();
      DataSource ds=(DataSource)initCtx.lookup("java:comp/env/jdbc/quickstart");
      if(ds!=null)
      {
      out.println("已經獲得DataSource");
      out.println(ds.toString());
      conn=ds.getConnection();
      stmt=conn.createStatement();
      out.println("aa");
      rs=stmt.executeQuery("select * from cat");
      md=rs.getMetaData();
      out.println("<table border=1>");
      out.println("<tr>");
      for(int i=0;i<md.getColumnCount();i++)
      {
      out.println("<td>"+md.getColumnName(i+1)+"</td>");
      }
      while(rs.next())
      {
      out.println("<tr>");
      out.println("<td>"+rs.getString(1)+"</td>");
    字串3

      out.println("<td>"+rs.getString(2)+"</td>");
      out.println("<td>"+rs.getString(3)+"</td>");
      out.println("<td>"+rs.getString(4)+"</td>");
      out.println("</tr>");
      }
      out.println("</table>");
      conn.close();
      }
      }
      catch(Exception e)
      {
      out.println(e.toString());
      System.out.println(e.toString());
      }%></body></html>
      
      運行tomcat服務器,在瀏覽器中輸入http://localhost:8080/quickstart/index.jsp看看成功了沒有。
    posted @ 2007-08-15 01:21 jadmin 閱讀(50) | 評論 (0)編輯 收藏
    一、準備安裝程序
    1、JDK 5.0 安裝程序下載
    下載地址: 字串5


    https://jsecom15b.sun.com/ECom/EComActionServlet
    /DownloadPage:~:com.sun.
    sunit.sdlc.content.DownloadPageInfo;
    jsessionid=502E87C71D77E3BC297C08B35
    DAC9AD4;jsessionid=502E87C71D77E3BC297C08B35DAC9AD4

    字串3

    同意協議后,可以下載jdk-1_5_0_05-windows-i586-p.exe。
    2、tomcat 5.5.9下載
    下載地址:http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi
    最新版本是5.5.11alpha版,由于是測試版,所以,可能存在不確定的因素,所以,我們這里下載5.5.9 exe。
    3、Sysdeo Eclipse Tomcat Launcher plugin 3.1beta版下載
    下載地址:http://www.sysdeo.com/eclipse/tomcatplugin
    這里下載tomcatPluginV31beta.zip。
    4、eclipse 3.1安裝程序下載
    下載地址:http://www.eclipse.org/downloads/index.php
    這里需要對應版本的JDT,如果下載的是Eclipse SDK版本就自帶了,如果沒有,同一個下載頁面的靠后部分有JDT的下載鏈接,下載后將對應的文件分別拷貝進eclipse安裝目錄下的對應的文件夾即可。
    這里我們下載eclipse-SDK-3.1-win32.zip 。
    5、GEF 3.1 安裝程序下載
    下載地址:
    http://download.eclipse.org/tools/gef/downloads/drops/R-3.1-200507071758/ 字串3
    index.php
    這里我們下載GEF-ALL-3.1.zip。
    6、Eclipse HTML Editor 1.6.7 安裝程序下載
    下載地址:https://sourceforge.jp/projects/amateras/files/?release_id=16537
    #16537
    這里我們下載:tk.eclipse.plugin.htmleditor_1.6.7.zip。
    7、StrutsIDE 1.1.7 安裝程序下載
    下載地址:https://sourceforge.jp/projects/amateras/files/?release_id=16537#16537
    這里我們下載:tk.eclipse.plugin.struts_1.1.7.zip。
    好了,到此我們準備好了所有的安裝包。
    二、安裝JDK并配置開發環境
    這里只需要雙擊JDK安裝包的exe文件,按照提示安裝即可。安裝完成后,將JDK安裝目錄下的bin文件夾設置進環境變量的path路徑中去。同時,將JRE的lib目錄下的rt.jar包設置進環境變量的classpath中去。
    這里我們把JDK安裝到了默認安裝路徑C:\Program Files\Java\jdk1.5.0_02下。這里就不多說了,網上可以搜索到很多JDK安裝配置的文章。
    三、安裝tomcat服務器
    只需要雙擊tomcat安裝包的exe文件,按照提示安裝即可,這里我們的安裝目錄為D:\Tomcat5.5,管理員密碼設置為12345678。 字串2
    四、安裝Eclipse開發工具
    只需要把eclipse-SDK-3.1-win32.zip安裝包解壓,然后把里面的eclipse文件夾剪切至想放置的目錄即可,這里我們把eclipse安裝到了D:\eclipse目錄下。
    在安裝目錄下雙擊eclipse.exe文件,即可啟動eclipse。中間會詢問默認的工作目錄,你可以按其默認設定的,也可以自己設定工作目錄,這里設置為E:\workspace目錄。請選中Use this as the default and do not ask again選項,這樣以后啟動就不會再詢問了。
    到此eclipse安裝成功。
    五、安裝tomcatPlugin插件
    安裝很簡單,解壓我們已經下載的安裝包tomcatPluginV31beta.zip,將解壓后的com.sysdeo.eclipse.tomcat_3.1.0.beta文件夾拷貝至D:\eclipse\plugins目錄下即可。我們關掉已經打開的eclipse,重新打開,OK,現在我們會發現工具欄上多了幾個雄貓的圖標,就是tomcat的啟動、停止和重啟動的按鈕。打開eclipse的window/preferences,我們在左邊的樹種也可以找到tomcat一項。
    點擊tomcat項,在右邊我們選擇version 5.x版本,然后設定tomcat home為D:\Tomcat5.5,Contexts directory為D:\Tomcat5.5\conf\Catalina\localhost。到此tomcat plugin設置完畢。
    六、安裝GEF插件
    同樣,將GEF-ALL-3.1.zip解壓縮,然后拷貝解壓后的eclipse目錄下的三個文件夾到D:\eclipse目錄下,覆蓋所有的現有文件夾。

    字串9


    好了,到此GEF安裝完成。
    八、創建測試工程
    如果已經完成了上面所有步驟,現在可以重新啟動eclipse,使新安裝的插件生效,開始正式開發了。
    1、使用Sysdeo Tomcat Plugin創建tomcat工程:
    File->new->others,打開新建向導對話框,在樹中找到java->tomcat projects,選中,點擊next按鈕。在projects name中輸入textweb,選中Use default,點擊next。在下一個對話頁面,保持默認設置,點擊finished。這時,我們在eclipse的package explorer中會看到新建的工程testweb,創建完成。
    2、加入struts框架
    File->new->others,打開新建向導對話框,找到Amateras->Struts->Add Struts Support,選中點擊next按鈕。
    保持默認設置,點擊Finish按鈕。這時,在eclipse的package explorer中會看到增加了很多struts的庫文件,在WEB-INF下也增加了很多struts的配置文件。到此我們已經在項目加入了Struts框架。
    3、編輯struts-config.xml文件
    在WEB-INF文件夾下可以找到,右鍵點擊菜單中選擇open with->Amateras XML Editer可以直接對xml文本進行編輯,選擇open with->struts-config.xml editor可以在圖形模式下對文件進行編輯。 字串2
    在右邊的outline中點擊相應的struts對象可以添加新的對象進去。這里我們只是說明這里有一個比較方便的struts-config.xml文件的編輯器,后面我們將開發一個簡單的小程序。
    4、新建一個頁面index.jsp
    File->new->others,打開新建向導對話框,找到Amateras->JSP File,點擊next按鈕,FileName改為index.jsp,點擊Finish。然后打開index.jsp文件進行編輯,內容如下:
    <%@page pageEncoding="GBK"
    contentType="text/html;
    charset=gb2312" %>
    <html>
    <head>
    <meta http-equiv="Content-Type"
    content="text/html;
    charset=gb2312"/>
    <title></title>
    </head>
    <body>
    <form name="form1" method="post"
    action="/testweb/logincheck.do">
    <table width="300" border="0"
    cellspacing="0" cellpadding="0">
    <tr align="center">
    <td colspan="2">用戶登錄信息</td>

    字串3


    </tr>
    <tr>
    <td>用戶名</td>
    <td>
    <input name="username"
    type="text" id="username"
    size="12">
    user????
    </td>
    </tr>
    <tr>
    <td>用戶密碼</td>
    <td>
    <input name="password"
    type="text" id="password"
    size="12">
    123456????
    </td>
    </tr>
    <tr align="center">
    <td colspan="2"><input
    type="submit" name="Submit"
    value="提交"></td>
    </tr>
    </table>
    </form>
    </body>
    </html> 字串9

    5、創建form數據對象
    打開File->new->package對話框,name中輸入com.is.form,點擊Finish按鈕。在右邊的Package Explorer樹中找到剛才創建的包,右鍵點擊com.is.form包,菜單中的new->others,找到Amateras->struts->Struts Action Form,點擊next,在對話框中name欄輸入LoginForm,點擊Finish按鈕。
    編輯LoginForm類的內容為:
    package com.is.form;
    import org.apache.struts.action.ActionForm;
    public class LoginForm extends ActionForm
    {
    private static final long
    serialVersionUID = 1L;
    private String username = "";
    private String password = "";
    /**
    * @return Returns the password.
    */
    public String getPassword()
    {
    return password;
    }

    /**

    * @param password The password to set.
    */
    public void setPassword(String password)
    {
    this.password = password;
    }
    /**
    * @return Returns the username.
    */
    public String getUsername()
    {

    字串6


    return username;
    }
    /**
    * @param username The username to set.
    */
    public void setUsername(String username)
    {
    this.username = username;
    }
    } 字串5

    注意,這里的兩個屬性分別對應我們jsp中form中的兩個輸入控件的名稱,為什么這樣做,可以去看struts的幫助文檔了,我就不詳細說了,還有form類再寫完屬性后,get和set方法可以通過eclipse的source中的命令來自動生成,在右鍵菜單中,也不詳細說了,去網上查資料吧,關于eclipse的使用有很多的文檔。
    七、安裝Eclipse HTML Editor插件
    解壓縮tk.eclipse.plugin.htmleditor_1.6.7.zip包,然后將plugins目錄拷貝至D:\eclipse目錄下覆蓋原文件夾即可。到此Eclipse HTML Editor插件安裝完成。
    八、安裝StrutsIDE插件
    解壓縮tk.eclipse.plugin.struts_1.1.7.zip包,然后將plugins目錄拷貝至D:\eclipse目錄下覆蓋原文件夾即可。
    好了,到此StrutsIDE插件安裝完成。
    6、創建action對象
    同創建form的過程相同,我們只是新建一個com.is.action包,同樣的過程,打開新建向導,只是選擇Struts Action,創建LoginAction.java類,均選默認值。我們編輯LoginAction為如下內容:
    package com.is.action;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.Action; 字串1
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;

    import com.is.form.LoginForm;

    public class LoginAction extends Action
    {
    private static final long serialVersionUID = 1L;

    public ActionForward execute
    (ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws Exception {

    // this line is here for when the
    input page is upload-utf8.jsp,

    // it sets the correct character
    encoding for the response

    String encoding = request.getCharacterEncoding();

    if ((encoding != null) &&
    (encoding.equalsIgnoreCase("GB2312")))
    {

    response.setContentType
    ("text/html; charset=GB2312");

    } else {

    response.setContentType

    字串8

    ("text/html; charset=GBK");

    }

    try {

    if (form instanceof LoginForm)
    {

    LoginForm theForm = (LoginForm) form;

    if(theForm.getUsername().equals("user") &&

    theForm.getPassword().equals("123456"))
    {

    return new ActionForward("/welcome.do?type=true");

    }


    else {???????????????????????????

    return new ActionForward("/welcome.do?type=false");

    }

    }
    } catch (Exception e)
    {

    }

    // this shouldn't happen in this example

    return null;
    ????????????????????????
    字串6

    ???????????????????????? }
    } 字串8

    注意這里是直接用ActionForward轉向的,你也可以按照struts中提供的空白例程struts-blank.war中的做法進行轉向,可以比較一下會有收獲的。
    7、創建登錄成功頁面
    同創建index.jsp頁面相同,我們創建welcome.jsp頁面,均使用默認設置。并編輯其內容如下:
    <%@page pageEncoding="GBK"
    contentType="text/html;
    charset=GBK" %>
    <html>
    <head>
    <meta http-equiv="Content-Type"
    content="text/html;
    charset=GBK"/>
    <title></title>
    </head>
    <body>
    <%
    String type = request.getParameter("type");
    if(type!=null&&type.equals("true")){
    out.print("歡迎您的光臨!");

    }
    else{
    out.print("對不起,你輸入的用戶名或者密碼錯誤!");
    }
    %>
    </body>
    </html>

    字串5

    8、增加Struts-config.xml中的配置
    添加formbean的配置,在和標簽之間加入:
    <form-bean
    name="loginForm"
    type="com.is.form.LoginForm"/>

    字串3

    添加jsp文件的映射,在和標簽之間加入:
    <action
    path="/index"
    forward="/index.jsp"/>
    <action
    path="/welcome"
    forward="/welcome.jsp"/>

    字串3

    添加action文件的映射,在和標簽之間加入:
    path="/logincheck"
    type="com.is.action.LoginAction"
    name="loginForm"
    scope="request"
    validate="true"/>

    字串1

    修改后的struts-config.xml大致如下形式:
    <?xml version="1.0"?>
    <!DOCTYPE struts-config PUBLIC "-
    //Apache Software Foundation
    //DTD Struts Configuration 1.2//EN"
    "http://struts.apache.org/dtds
    /struts-config_1_2.dtd">
    <struts-config>
    <data-sources>
    </data-sources>
    <form-beans>
    <form-bean
    name="loginForm"
    type="com.is.form.LoginForm"/>
    </form-beans>
    <global-exceptions>
    </global-exceptions>
    <global-forwards>
    </global-forwards>
    <action-mappings>
    <action
    path="/index"
    forward="/index.jsp"/>
    <action
    path="/welcome"
    forward="/welcome.jsp"/>????
    <action
    path="/logincheck"
    type="com.is.action.LoginAction"

    字串4

    name="loginForm"
    scope="request"
    validate="true"/>
    </action-mappings>
    <controller processorClass=
    "org.apache.struts.tiles.TilesRequestProcessor"/>
    <message-resources parameter="MessageResources"/>
    <plug-in className=
    "org.apache.struts.tiles.TilesPlugin">
    <set-property property="definitions-config"
    value="/WEB-INF/tiles-defs.xml"/>
    <set-property property="moduleAware" value="true"/>
    </plug-in>
    <plug-in className=
    "org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames"
    value="/WEB-INF/validator-rules.xml,
    /WEB-INF/validation.xml"/>
    </plug-in>
    </struts-config> 字串6

    到此我們可以運行測試程序了。
    9、運行測試程序
    右鍵點擊testweb工程根目錄,點擊菜單中的Tomcate project->update context definition,將工程部署進tomcat,成功后會提示操作成功。
    點擊菜單欄中的雄貓圖標啟動tomcat,然后在IE地址欄中輸入http://localhost:8080/testweb/index.do,我們會看到index.jsp的頁面內容

    posted @ 2007-08-15 01:07 jadmin 閱讀(64) | 評論 (0)編輯 收藏

    Attribute元素

    對于tag標簽的每個屬性,你必須定義它是否必須的,它的值是否可以用諸如<%= …%>的表達式來獲得,
    以及它的類型(可選),如果不指定它的類型,那就默認為是java.lang.String類型。如果rtexprvalue
    元素被定義為true或yes,那么在type元素中就定義了attribute的返回類型。

    <attribute>

    <name>attr1</name>

    <required>true|false|yes|no</required>

    <rtexprvalue>true|false|yes|no</rtexprvalue>

    <type>attribute的返回類型(只用當rtexprvalue為真是才有效)</type>

    </attribute>

    如果tag的某個屬性不是必須的,那tag處理類會自動提供一個缺省值。

    例如,在logic:present這個tag標簽中定義了一個屬性叫parameter,但它不是必須的,而且它可以
    被諸如<%= …%>的表達式來賦值。

    <tag>

    <name>present</name>

    <tag-class>org.apache.struts.taglib.logic.PresentTag</tag-class>

    <body-content>JSP</body-content>

    <attribute>

    <name>parameter</name>

    <required>false</required>

    <rtexprvalue>true</rtexprvalue>

    </attribute>

    </tag>


    屬性元素的校驗


    有關于tag標簽的有效值可以從tag庫的說明文檔中獲得,當JSP頁面被編譯時,jsp引擎會強制性地
    參照TLD中定義的規則進行檢查。

    還有一個方法也可以進行屬性元素的校驗,就是先繼承類TagExtraInfo,然后調用它的isValid方法。
    這個類同時也起到提供tag中定義的腳本變量信息的作用。

    IsValid方法通過TagData對象來傳遞屬性信息,它包括著tag的所有的屬性名-值的信息。
    由于校驗發生在運行時刻,因此這個屬性的值將被賦值為TagData.REQUEST_TIME_VALUE。

    例如tag標簽<tt:twa attr1=”value1” />在TLD中定義如下:

    <attribute>

    <name>attr1</name>

    <required>true</required>

    <rtexprvalue>true</rtexprvalue>

    </attribute>


    這個定義說明了attr1能在運行期間被賦值。

    以下的isValid方法檢查attr1屬性的值是否屬于Boolean類型。注意由于attr1能在運行刻被賦值,
    那么isValid方法必須檢查tag用戶是否對此tag進行了運行時刻賦值。


    Public class TwaTEI extends TagExtraInfo

    {

    public boolean isValid(Tagdata data)

    {

    Object o = data.getAttribute(“attr1”);

    If(o != null && o != TagData.REQUEST_TIME_VALUE)

    {

    if( ( (String)o).toLowerCase().equals(“true”) ||??

    ((String)o).toLowerCase().equals(“false”) )

    return true;

    else

    return false;

    }

    else

    return true;

    }

    }

    帶body的tag

    tag處理類


    如果tag標簽含有內容,那處理方式會略微有些不同,而且還要視tag處理類是否要與body交互的情況而定。
    如果要與body交互,那我們認為tag處理類要可能要對body進行操作。

    Tag處理類不與body交互

    如果tag處理類不與body交互,tag處理類應該實現Tag接口或從TagSupport中派生,如果body要被計算,
    那么doStartTag方法應返回 EVAL_BODY_INCLUDE,否則應返回SKIP_BODY。

    如果tag處理類要對body反復運算,則它應該實現IterationTag或從TagSupport中派生。如果tag處理類
    認為body還未計算完的話,那它的doStartTag方法和doAfterBody方法必須返回EVAL_BODY_AGAIN。

    Tag處理類與body交互

    如果tag處理類與body交互,那tag處理類應實現BodyTag接口或從BodyTagSupport中派生。這種tag處理類
    一般要實現doInitBody和doAfterBody方法。

    Body允許一些方法來讀寫它的內容。Tag處理類可以調用body內容的getString或getReader方法來從body中
    提取信息,也可用 writeOut(out) 方法來將body的內容寫入到out對象中。其中out對象通過tag處理類的
    getPreviousOut方法來獲得。

    如果body的內容需要被計算,那么doStartTag方法必須返回EVAL_BODY_BUFFERED,否則,它將返回SKIP_BODY。

    doInitBody 方法

    此方法在body內容已經設好,但未被計算之前被調用。你可以根據不同的body內容來制定初始化策略。

    doAfterBody方法

    此方法在body內容已被計算后進行調用。

    和doStartTag方法一樣,doAfterBody方法返回一個指示符指示是否要繼續計算body,如果要繼續計算,
    則doAfterBody應返回EVAL_BODY_BUFFERED,否則,它應返回SKIP_BODY。

    release 方法

    tag處理類調用此方法將它的狀態重置為初始狀態,并釋放所有的私有資源。


    以下的例子讀取body的內容(其中含有一條sql語句),然后將它傳遞給一個對象,讓它進行查詢。
    由于此處body不須重新計算,所以doAfterBody會返回SKIP_BODY。


    Public class QueryTag extends BodyTagSupport

    {

    public int doAfterBody() throws JspTagException

    {

    BodyContent bc = getBodyContent();

    //將body的內容以字符串的格式提取出來

    String query = bc.getString();

    //清除body

    bc.clearBody();

    try{

    Statement stmt = connection.createStatement();

    Result result = stmt.executeQuery(query);

    }catch(SQLException e){

    throw new JspTagException(“queryTag: “ + e.getMessage() );

    return SKIP_BODY;

    }

    }


    body-content元素


    由于tag可能會有body,你必須用body-content元素來指定body內容的類型:

    <body-content>JSP|tagdependent</body-content>


    如果body的內容是定制的或內部的tag、腳本元素、或HTML廣本,則歸類為JSP類型。其他的類型,
    比如上面代碼所述的?D?D將sql statement類傳給 query tag的這種類型應該標為tagdependent。

    注意:實際上body-content的值并不影響tag處理類對body內容的處理,它僅僅是被tag編輯工具
    用來描述此body的內容。


    用tags定義腳本變量

    tag處理類


    tag處理類負責創建或設置頁面中定義的腳本變量,用pageContext.setAttribute(name,value,scope)
    或pageContext.setAttribute(name,value)方法來實現。一般來說,tag處理類通過腳本變量的名稱來
    獲取它,腳本變量的名稱一般可用get方法來獲得。

    如果腳本變量的值依賴于tag處理類中的上下文中某一對象,那它可用pageContext.getAttribute(name,scope)
    方法來找到那個對象。一般的處理過程是tag處理類先找到腳本變量,再對其進行處理,
    然后用pageContext.setAttribute(name,object)的方法來設置它的新值。

    對象的生存周期(scope)如下表:

    對象的生存周期表

    名字
    可訪問范圍
    生存周期

    page
    當前頁面
    一直有效,除非頁面向客戶提交響應或重定向到一個新頁面

    request
    當前頁面或當前頁面重定向到的頁面
    一直有效,除非頁面向客戶提交響應

    session
    當前頁面或在同一瀏覽器窗口中的頁面
    一直有效,除非關閉當前瀏覽器、超時、網絡故障

    application
    整個web應用程序的所有請求
    一直有效,除非發生網絡故障、服務器故障

    提供關于腳本變量的信息

    以下示例定義了一個名為“book”的腳本變量,用來訪問程序中關于書的信息:

    <bean:define id=”book” name=”bookDB” property=”bookDetails” type=”database.BookDetails” />

    <font color=”red” size=”+2” >

    <%= messages.getString(“CartRemoved”) %>

    <strong><jsp:getProperty name=”book” property=”title” /></strong>

    </font>

    當包含此tag的JSP頁面被編譯時,jsp引擎會自動生成關于此book的同步的代碼
    (同步可以避免幾個客戶同時訪問此book時造成的沖突),要生成同步代碼,
    jsp引擎需要知道此腳本變量的如下信息:

    · 腳本變量名稱

    · 腳本變量所屬的類

    · 此腳本變量是否引用了一個新的或已存在的對象

    · 此腳本變量的有效性

    有兩種辦法可以向jsp引擎提供關于腳本變量的信息:在TLD中定義variable子元素,
    或用tei-class子元素定義一個額外tag信息類。用variable最簡單,但可能降低了一些靈活性。

    Variable元素

    Variable元素有如下子元素:

    · name-given ?D?D 給出的名字,是一個常量

    · name-from-attribute?D?D 屬性名,在編譯時給出的屬性名

    name-given或name-from-attribute兩者必須選一,但以下子元素是可選的:

    · variable-class?D?D變量的類型,缺省為java.lang.String。

    · declare?D?D此腳本變量是否引用了一個新對象,缺省為True。

    · scope?D?D腳本變量的范圍,缺省為NESTED。下表描述了scope的幾種類型:

    腳本變量的有效范圍


    有效性
    方法

    NESTED
    在tag標簽的開始和結束之間
    如果tag處理類實現BodyTag接口,則在doInitBody和doAfterBody中調用,否則在doStartTag中調用

    AT_BEGIN
    從tag標簽的開始一直到頁面結束
    如果tag處理類實現BodyTag接口,則在doInitBody、doAfterBody和doEndTag中調用,
    否則在doStartTag和doEndTag中調用

    AT_END
    從tag標簽的結束一直到頁面結束
    在doEndTag中調用

    以struts為例,它的bean:define標簽的實現遵循JSP1.1規范,此規范要求使用額外tag信息類來定義腳本變量。
    Variable元素是JSP1.2規范中加入的。以bean:define標簽為例,你可以定義如下variable元素:

    <tag>

    <variable>

    <name-from-attribute>id</name-from-attribute>

    <variable-class>database.BookDetails</variable-class>

    <declare>true</declare>

    <scope>AT_BEGIN</scope>

    </variable>

    </tag>

    額外tag信息類

    如果要定義一個額外tag信息類,你要繼承javax.servlet.jsp.TagExtraInfo類。
    一個TagExtraInfo類必須實現getVariableInfo方法,此方法返回一個叫VariableInfo的數組類,
    它包括如下信息:

    · 變量名

    · 變量所屬類名

    · 此變量是否引用了一個新對象

    · 此變量的有效范圍

    jsp引擎將一個名為data的參數傳給getVariableInfo方法,data中包括tag標簽中的所有“屬性名?D?D屬性值”對。
    它可以用來向VariableInfo對象提供腳本變量的名字和類名。

    以struts為例,它在bean:define標簽中定義了一個名為DefineTei的額外tag信息類,用來向腳本變量提供信息。
    由于腳本變量的名稱(book)和類名(database.BookDetails)是通過tag標簽的屬性來傳遞的,
    它們一般定義在VariableInfo的構建代碼中,并且可用data.getAttributeString方法來得到這些信息。
    如果要允許book腳本變量能在從tag開始直到整個JSP頁面結束的范圍內都可用的話,那它的范圍應設為AT_BEGIN。
    如下所示:


    public class DefineTei extends TagExtraInfo

    {

    public VariableInfo[] getVariableInfo(TagData data)

    {

    String type = data.getAttributeString(“type”);

    If( type == null)

    type = “java.lang.Object”;

    return new VariableInfo[] {

    new VariableInfo(data.getAttributeString(“id”),??

    type,

    true,

    VariableInfo.AT_BEGIN)

    };

    }

    }


    注意:關于額外tag信息類的類名必須要在TLD中的tag標簽下的tei-class子元素中定義。
    因此,DefineTei的tei-class中的定義看起來如下:
    <tei-class>
    org.apache.struts.taglib.bean.DefineTagTei
    </tei-class>


    具有協作關系的tag


    tag通過共享對象來進行協作,JSP技術支持2種方式的對象共享。

    第一種方法是使用pageContext對象進行對象的共享(可支持JSP頁面和tag處理類之間的共享),
    如果在一個tag處理類中要調用由另一個tag處理類創建的對象,可調用pageContext.getAttribute(name, scope)方法。

    第二各方式的共享是對于tag之間有嵌套關系而言的,外層的tag所創建的對象對于內層的tag來說是
    可以共用的。這種形式的共享的好處是減少了可能存在的重名沖突。

    要訪問一個嵌套tag創建的對象,tag處理類必須先找到此嵌套tag對象,可用TagSupport的靜態方法
    TagSupport.findAncestorWithClass(from, class)或TagSupport.getParent方法。前者在當不確定
    此tag是否為嵌套tag對象時使用。一旦它的父類被找到,它就能訪問其所有動態或靜態創建的對象。
    靜態創建的對象是父類的成員,而動態創建的對象可能是父類的私有對象。諸如此類的對象可以用tag處理類的setValue方法來保存,用getValue方法來獲得。

    下例闡述了以上兩種共享對象的方法。在這個例子當中,一個查詢tag檢查一個名為connection的屬性名
    是否在doStartTag中被設置。如果connection屬性被設置,tag處理類從pageContext中得到這個connection對象。
    否則,此tag處理類先找到它的父tag處理類,然后從它的父tag處理類中找到connection對象。


    public class QueryTag extends BodyTagSupport
    {
    ???? private String connectionId;
    ???? public int doStartTag() throws JspException
    ??? {
    ?????? String cid = getConnection();
    ?????? if(cid != null)
    ?????? {
    ?????????? //存在一個connection id,使用它。
    ?????????? connection = (Connection) pageContext.getAttribute(cid);
    ?????? }
    ?????? else
    ?????? {
    ?????????? ConnectionTag ancestorTag = (ConnectionTag)findAncestorWithClass(this,??
    ?????????? ConnectionTag.class);
    ?????????? if(ancestorTag == null)
    ?????????? {
    ????????????? throw new JspTagException(“一個沒有connection屬性的查詢標簽必須被一個connection標記嵌套。”);
    ?????????? }
    ?????????? connection = ancestorTag.getConnection();
    ?????? }
    ??? }
    }??

    此查詢標簽在JSP頁面中的調用形式可以從以下2種定義中任選一種:

    <tt:connection id=”con01” ...> ... </tt:connection>

    <tt:query id=”balances” connection=”con01” >

    SELECT account, balance FROM acct_table

    where customer_num = <%= request.getCustno() %>

    </tt:query>

    <tt:connection ...>

    <x:query id=”balances”>

    SELECT account, balance FROM acct_table

    where customer_num = <%= request.getCustno() %>

    </x:query>

    </tt:connection>

    與此同時,在TLD中必須指定connection屬性為可選的,定義如下:

    <tag>

    ...

    <attribute>

    <name>connection</name>

    <required>false</required>

    </attribute>

    </tag>

    posted @ 2007-08-14 23:51 jadmin 閱讀(84) | 評論 (0)編輯 收藏

    標準的JSP 標記可以調用JavaBeans組件或者執行客戶的請求,這大大降低了JSP開發的復雜度和維護量。
    JSP技術也允許你自定義taglib,其實換句話說,taglib可以看成是對JSP標記的一種擴展,正如xml是對
    html的一種擴展一樣。taglib通常定義在tag標簽庫中,這種標簽庫存放著你自己定義的tag標簽。

    簡而言之,如果使用taglib,那么你可以設計自己的JSP標記!

    一般來說,自定義tag標簽主要用于操作隱藏對象、處理html提交表單、訪問數據庫或其它企業級的服務,
    諸如郵件和目錄操作等等。自定義tag標簽的使用者一般都是那些對java編程語言非常精通,而且對數據
    訪問和企業級服務訪問都非常熟悉的程序員,對于HTML設計者來說,使得他可以不去關注那些較復雜的商
    業邏輯,而將精力放在網頁設計上。同時,它也將庫開發者和庫使用者進行合理分工,自定義tag標簽將
    那些重復工作進行封裝,從而大大提高了生產力,而且可以使得tag庫可用于不同的項目中,完美地體現
    了軟件復用的思想。

    在這篇文章中,我們主要討論:

    · 什么是自定義tag標簽?

    · 怎么使用tag標簽?

    o 聲明要使用的tag庫

    o 找到與之對應的tag處理類

    o tag標簽的類型

    · 自定義tag標簽

    o tag處理類

    o tag庫描述

    o tag標簽示例

    o 帶屬性的tag

    o 帶body的tag

    o 定義了腳本變量的tag

    o 具有協作關系的tag

    · 自定義tag標簽

    o 一個迭代tag的例子

    o 一個模板tag庫

    o tag處理類到底是怎樣被調用的?


    什么是自定義的tag?

    一個自定義的tag標簽是用戶定義的一種JSP標記。當一個含有自定義的tag標簽的JSP頁面被jsp引擎編譯
    成servlet時,tag標簽被轉化成了對一個稱為tag處理類的對象進行的操作。于是當JSP頁面被jsp引擎轉
    化為servlet后,實際上tag標簽被轉化成為了對tag處理類的操作。

    自定義tag標簽有很多特色,諸如:

    · 可以在JSP頁面中自定義tag標簽的屬性

    · 訪問JSP頁面中的所有對象

    · 可以動態地修改頁面輸出

    · 彼此這間可以相互通信。你可以先創建一個JavaBeans組件,然后在一個tag中調用此JavaBeans組件,
    同時可以在另一個tag中調用它。

    · tag允許相互嵌套,可以在一個JSP頁面中完成一些復雜的交互。


    使用tag標簽


    本節主要描述怎樣在JSP頁面中使用tag標簽,以及tag標簽的不同類型。

    要使用tag標簽,JSP程序員必須做2件事:

    · 聲明此tag標簽的tag庫

    · 實現此tag標簽

    聲明tag標簽所在的tag庫

    如果要使用tag標簽,則應用JSP的taglib指示符來指定其tag庫(注意:taglib要在在使用此tag標簽之前聲明)

    <%@ taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>

    uri屬性定義了唯一的標簽庫描述(以下簡稱TLD),它可以是直接是tld文件名或一個獨一無二的名字。
    prefix是用來區別其它TLD中和本TLD中有重名的tag的一種手段。

    TLD必須以.tld作為擴展名,并且存放在當前應用的WEB-INF目錄或其子目錄下。你可以通過它的文件名
    直接引用它,也可以通過別的方式間接地引用它。

    以下taglib指示符直接引用一個TLD:

    <%@ taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>

    以下的taglib指示符通過一個邏輯名稱間接地引用一個TLD:

    <%@ taglib uri=”/tutorial-template” prefix=”tt” %>

    如果是間接引用TLD的話,那你必須還要在web.xml中定義此邏輯名稱與tld文件之間的映射,具體做法
    是在web.xml中加入一個名為taglib的元素:

    <taglib>

    <taglib-uri>/tutorial-template</taglib-uri>

    <taglib-location>

    /WEB-INF/tutorial-template.tld

    </taglib-location>

    </taglib>


    實現此tag標簽


    為了實現tag標簽,你有2種方法來存放tag處理類。一、讓tag處理類以.class的方式存放于當前應用
    的WEB-INF/class子目錄下,二、如果tag處理類是以JAR包的形式存在的話,那可以放在當前應用的
    WEB-INF/lib目錄下,如果tag處理類要在多個應用中共享,那么它就應放在jsp服務器上的common/lib
    目錄下,對于tomcat來說,就是tomcat/common/lib目錄下。


    tag標簽類型


    自定義的tag標簽遵循XML語法。它有一個開始標記和一個結束標記,有的還有body(即文本節點):

    <tt:tag>

    body

    </tt:tag>


    一個不帶body的tag標簽如下:

    <tt:tag />


    簡單的tag標簽

    一個沒有body和屬性的tag標簽如下:

    <tt:simple />


    帶屬性的tag標簽


    自定義標簽可以有自己的屬性。屬性一般在開始標記中定義,語法為 attr=”value”。屬性的作用相當
    于自定義標簽的一個參數,它影響著tag處理類的行為。你可以在TLD中詳細定義它。

    你可以用一個String常量給一個屬性賦值,也可以通過表達式給它賦值,如<%= ...%>。以struts為例,
    它的logic:present標簽就是用的String常量來給屬性賦值:

    <loglic:present parameter = “Clear”>

    而另一個標簽logic:iterate是用表達式來給屬性賦值:

    <logci:iterate collection=”<%= bookDB.getBooks() %>”

    id=”book” type=”database.BookDetails”>


    帶body的tag標簽

    一個自定義標簽可以包含其它自定義標簽、腳本變量、HTML標記或其它內容。

    在下述例子中,此JSP頁面使用了struts的logic:present標簽,如果些標簽定義了parameter=”Clear”的
    屬性,則將清除購物車的內容,然后打印出一條信息:

    <logic:present parameter=”Clear”>

    <% cart.clear(); %>

    <font color=”#ff0000” size=”+2”><strong>

    你選擇了清除購物車!

    </strong></font>

    </logic:present>


    到底是用屬性還是用body來傳遞信息?

    如上所述,我們既可以通過屬性,也可以通過body來傳遞信息。但一般來說,比較簡單的類型,如字符串
    或簡單表達式最好采用屬性來傳遞信息。


    定義腳本變量的tag標簽

    所謂腳本變量,是指JSP中可以調用的變量或對象。它可由tag標簽產生。以下示例闡述了一個tag標簽定義
    了一個名為tx的由JNDI所定義的事務處理對象。腳本變量可以是ejb對象、事務、數據庫連接等等:

    <tt:lookup id=”tx” type=”UserTransaction” name=”java:comp/UserTransaction” />

    <% tx.begin(); %>

    ...


    具有協作關系的tag標簽

    自定義tag標簽之間可以通過共享對象來實現協作。在下述例子中,標簽tag1創建了一個名為obj1的對象,
    在標簽tag2仍可以重復使用obj。

    <tt:tag1 attr1=”obj1” value1=”value” />

    <tt:tag2 attr1=”obj1” />

    在以下這個例子當中,如果外層的tag標簽創建了一個對象,那么其內層的所有tag標簽都可以使用這個對象。
    由于這樣產生的對象沒有一個指定的名字,那么就可以將少重名的沖突。這個例子闡述了一系列協作的嵌套對象。

    <tt:outerTag>

    <tt:innerTag />

    </tt:outerTag>

    Tag處理類


    Tag處理類必須實現Tag接口或BodyTag接口,不過現在一般都流行從TagSupport或BodyTagSupport類中繼承,
    這些類或接口都可以在javax.servlet.jsp.tagext包中找到。

    當JSP引擎看到自己的JSP頁面中包含有tag標簽時,它會調用doStartTag方法來處理tag標簽的開頭,
    調用doEndTag方法來處理tag標簽的結束。

    下表說明不同類型的tag所需要不同的處理過程:

    Tag處理類的方法

    Tag標簽類型
    所調用的方法

    基本標簽
    doStartTag, doEndTag, release

    帶屬性的標簽
    doStartTag, doEndTag, set/getAttribute1...N, release

    帶內容的標簽
    doStartTag, doEndTag, release

    帶內容的標簽,且

    內容重復循環
    doStartTag, doAfterBody, doEndTag, release

    帶內容的標簽,且內容與JSP交互
    doStartTag, doEndTag, release, doInitBody, doAfterBody, release

    一個tag處理類可以通過javax.servlet.jsp.PageContext來與JSP交互,通過javax.servlet.jsp.PageContext類,
    tag處理類可以訪問JSP中的request、session和application對像。

    如果tag標簽是互相嵌套的,那內層的tag處理類可以通過它的parent屬性來訪問上層的tag處理類。

    一般情況都將所有的tag處理類打成了JAR的包,以便于發布。


    Tag庫描述(簡稱TLD)


    Tag庫是用xml語言描述的,TLD包括了tag庫中所有tag標簽的描述,它一般用來被jsp服務器用來校驗tag的語法
    正確性,或者被jsp開發者用來開發新的標簽。

    TLD的文件擴展名必須為.tld,而且必須放在當前WEB應用的WEB-INF目錄或其子目錄中。

    一個TLD的內容的開頭必須遵守標準的XML開頭,用于描述DTD和xml的版本,例如:

    <?xml version="1.0" encoding="ISO-8859-1" ?>

    <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" " TLD必須以<taglib>來作為它的根元素,<taglib>的子元素如下表:


    <taglib>的子元素

    Element
    Description

    tlib-version
    Tag庫的版本

    jsp-version
    Tag庫所需要的jsp的版本

    short-name
    助記符,tag的一個別名(可選)

    uri
    用于確定一個唯一的tag庫

    display-name
    被可視化工具(諸如Jbuilder)用來顯示的名稱(可選)

    small-icon
    被可視化工具(諸如Jbuilder)用來顯示的小圖標(可選)

    large-icon
    被可視化工具(諸如Jbuilder)用來顯示的大圖標(可選)

    description
    對tag庫的描述(可選)

    listener
    參見下面listener元素

    tag
    參見下面tag 元素

    Listener元素

    一個tag庫可能定義一些類做為它的事件偵聽類,這些類在TLD中被稱為listener 元素,
    jsp服務器將會實例化這些偵聽類,并且注冊它們。Listener元素中有一個叫listener-class的子元素,
    這個元素的值必須是該偵聽類的完整類名。

    Tag元素

    每個tag元素在tag庫中都要指出它的名字、類名、腳本變量、tag的屬性。其中腳本變量的值可以
    直接在TLD中定義或通過tag附加信息的類來取得。每個屬性描述了這個屬性是否可以省略,它的值
    是否可以通過<%= …%>這樣的JSP語法來獲得,以及屬性的類型。

    每一個tag在TLD中對應一個tag元素,下表是tag元素的子元素:

    Tag元素的子元素

    元素名稱
    描述

    name
    獨一無二的元素名

    tag-class
    Tag標簽對應的tag處理類

    tei-class
    javax.servlet.jsp.tagext.TagExtraInfo的子類,用于表達腳本變量(可選)

    body-content
    Tag標簽body的類型

    display-name
    被可視化工具(諸如Jbuilder)用來顯示的名稱(可選)

    small-icon
    被可視化工具(諸如Jbuilder)用來顯示的小圖標(可選)

    large-icon
    被可視化工具(諸如Jbuilder)用來顯示的大圖標(可選)

    description
    此tag標簽的描述

    variable
    提供腳本變量的信息(同tei-class)(可選)

    attribute
    Tag標簽的屬性名

    以下章節介紹對于不同類型的tag,如何具體地實現它們。


    簡單的tag


    tag處理類

    簡單的tag處理類必須實現Tag接口的doStartTag和doEndTag方法。當jsp引擎碰到tag標簽的開頭時,
    doStartTag被調用,因為簡單的tag沒有body,所以此方法將返回 SKIP_BODY。當jsp引擎碰到tag標簽的
    結尾時,doEndTag被調用,如果余下的頁面還要被計算,那它將返回EVAL_PAGE,否則將會返回SKIP_PAGE。

    以下是例子:對于標簽 <tt:simple /> ,它的tag處理類實現如下:


    public SimpleTag extends TagSupport

    {

    public int doStartTag() throws JspException

    {

    try{

    pageContext.getOut().print(“Hello.”);

    }catch(Exception e){

    throw new JspTagException(“SimpleTag: “ + e.getMessage());

    }

    return SKIP_BODY;

    }

    public int doEndTag()

    {

    return EVAL_PAGE;

    }

    }


    注意:如果tag標簽沒有內容的話,那必須定義body-content元素為空,例如

    <body-content>empty</body-content>


    帶屬性的tag標簽


    tag處理類

    對于tag標簽的每個屬性,你必須依照JavaBeans規范來定義其屬性,以及get和set方法。以struts的
    logic:present 標簽為例,

    <logic:present parameter=”Clear”>

    與此相應,此tag處理類應有如下方法和定義:


    protected String parameter = null;

    public String getParameter()

    {

    return this.parameter;

    }

    public void setParameter(String parameter)

    {

    this.parameter = parameter;

    }


    注意:如果你的屬性名為id,而且你的tag處理類是從TagSupport類繼承的,那你就不需要定義它的屬性
    和set和get方法,因為他們早已在TagSupport被定義過了。

    作用域 功能 快捷鍵
      全局 查找并替換 Ctrl+F
      文本編輯器 查找上一個 Ctrl+Shift+K
      文本編輯器 查找下一個 Ctrl+K
      全局 撤銷 Ctrl+Z
      全局 復制 Ctrl+C
      全局 恢復上一個選擇 Alt+Shift+↓
      全局 剪切 Ctrl+X
      全局 快速修正 Ctrl1+1
      全局 內容輔助 Alt+/
      全局 全部選中 Ctrl+A
      全局 刪除 Delete
      全局 上下文信息 Alt+?
      Alt+Shift+?
      Ctrl+Shift+Space
      Java編輯器 顯示工具提示描述 F2
      Java編輯器 選擇封裝元素 Alt+Shift+↑
      Java編輯器 選擇上一個元素 Alt+Shift+←
      Java編輯器 選擇下一個元素 Alt+Shift+→
      文本編輯器 增量查找 Ctrl+J
      文本編輯器 增量逆向查找 Ctrl+Shift+J
      全局 粘貼 Ctrl+V
      全局 重做 Ctrl+Y

      查看
      
    作用域 功能 快捷鍵
      全局 放大 Ctrl+=
      全局 縮小 Ctrl+-

      窗口
      作用域 功能 快捷鍵
      全局 激活編輯器 F12
      全局 切換編輯器 Ctrl+Shift+W
      全局 上一個編輯器 Ctrl+Shift+F6
      全局 上一個視圖 Ctrl+Shift+F7
      全局 上一個透視圖 Ctrl+Shift+F8
      全局 下一個編輯器 Ctrl+F6
      全局 下一個視圖 Ctrl+F7
      全局 下一個透視圖 Ctrl+F8
      文本編輯器 顯示標尺上下文菜單 Ctrl+W
      全局 顯示視圖菜單 Ctrl+F10
      全局 顯示系統菜單 Alt+-

      導航
      作用域 功能 快捷鍵
      Java編輯器 打開結構 Ctrl+F3
      全局 打開類型 Ctrl+Shift+T
      全局 打開類型層次結構 F4
      全局 打開聲明 F3
      全局 打開外部javadoc Shift+F2
      全局 打開資源 Ctrl+Shift+R
      全局 后退歷史記錄 Alt+←
      全局 前進歷史記錄 Alt+→
      全局 上一個 Ctrl+,
      全局 下一個 Ctrl+.
      Java編輯器 顯示大綱 Ctrl+O
      全局 在層次結構中打開類型 Ctrl+Shift+H
      全局 轉至匹配的括號 Ctrl+Shift+P
      全局 轉至上一個編輯位置 Ctrl+Q
      Java編輯器 轉至上一個成員 Ctrl+Shift+↑
      Java編輯器 轉至下一個成員 Ctrl+Shift+↓
      文本編輯器 轉至行 Ctrl+L

      搜索
      作用域 功能 快捷鍵
      全局 出現在文件中 Ctrl+Shift+U
      全局 打開搜索對話框 Ctrl+H
      全局 工作區中的聲明 Ctrl+G
      全局 工作區中的引用 Ctrl+Shift+G

      文本編輯
      
    作用域 功能 快捷鍵
      文本編輯器 改寫切換 Insert
      文本編輯器 上滾行 Ctrl+↑
      文本編輯器 下滾行 Ctrl+↓

      文件
      作用域 功能 快捷鍵
      全局 保存 Ctrl+X
      Ctrl+S
      全局 打印 Ctrl+P
      全局 關閉 Ctrl+F4
      全局 全部保存 Ctrl+Shift+S
      全局 全部關閉 Ctrl+Shift+F4
      全局 屬性 Alt+Enter
      全局 新建 Ctrl+N

      項目
      作用域 功能 快捷鍵
      全局 全部構建 Ctrl+B

      源代碼
      作用域 功能 快捷鍵
      Java編輯器 格式化 Ctrl+Shift+F
      Java編輯器 取消注釋 Ctrl+\
      Java編輯器 注釋 Ctrl+/
      Java編輯器 添加導入 Ctrl+Shift+M
      Java編輯器 組織導入 Ctrl+Shift+O
      Java編輯器 使用try/catch塊來包圍 未設置,太常用了,所以在這里列出,建議自己設置。
      也可以使用Ctrl+1自動修正。

      運行
      作用域 功能 快捷鍵
      全局 單步返回 F7
      全局 單步跳過 F6
      全局 單步跳入 F5
      全局 單步跳入選擇 Ctrl+F5
      全局 調試上次啟動 F11
      全局 繼續 F8
      全局 使用過濾器單步執行 Shift+F5
      全局 添加/去除斷點 Ctrl+Shift+B
      全局 顯示 Ctrl+D
      全局 運行上次啟動 Ctrl+F11
      全局 運行至行 Ctrl+R
      全局 執行 Ctrl+U

      重構
      
    作用域 功能 快捷鍵
      全局 撤銷重構 Alt+Shift+Z
      全局 抽取方法 Alt+Shift+M
      全局 抽取局部變量 Alt+Shift+L
      全局 內聯 Alt+Shift+I
      全局 移動 Alt+Shift+V
      全局 重命名 Alt+Shift+R
      全局 重做 Alt+Shift+Y

    ============================================================================

    Eclipse快捷鍵指南

    ??? 本文檔從Eclipse軟件上整理,是列出了標準的快捷鍵,未列出Emacs快捷鍵。
    編輯

    posted @ 2007-08-14 12:07 jadmin 閱讀(78) | 評論 (0)編輯 收藏
     
    posted @ 2007-08-14 10:10 jadmin 閱讀(85) | 評論 (0)編輯 收藏
     
    posted @ 2007-08-14 10:10 jadmin 閱讀(71) | 評論 (0)編輯 收藏
     
    posted @ 2007-08-14 10:09 jadmin 閱讀(93) | 評論 (0)編輯 收藏
     
    posted @ 2007-08-14 10:08 jadmin 閱讀(59) | 評論 (0)編輯 收藏
    僅列出標題
    共50頁: First 上一頁 32 33 34 35 36 37 38 39 40 下一頁 Last 
    主站蜘蛛池模板: 中文在线日本免费永久18近| 国产精品免费久久久久久久久| 久久亚洲免费视频| 国产亚洲精品资源在线26u| 久久性生大片免费观看性| 亚洲精品国产精品乱码视色 | 成年大片免费视频播放一级| 四虎永久在线精品视频免费观看| 久久亚洲精品无码网站| 又粗又黄又猛又爽大片免费| 猫咪免费人成在线网站| 中文字幕精品亚洲无线码二区| 中文在线免费视频| 亚洲日本香蕉视频| 四虎影视大全免费入口| 国产综合激情在线亚洲第一页| 国产日产亚洲系列最新| 午夜免费福利视频| 国产精品亚洲精品| 免费A级毛片无码久久版| 亚洲第一视频在线观看免费| 亚洲国产成人精品不卡青青草原| 久热中文字幕在线精品免费| 亚洲国产aⅴ成人精品无吗| 亚洲天堂中文字幕在线| 精品熟女少妇av免费久久| 国产AV旡码专区亚洲AV苍井空| 四虎影视永久免费观看网址| a级毛片免费全部播放无码| 亚洲日韩乱码久久久久久| 手机看片久久国产免费| 国产线视频精品免费观看视频| 久久亚洲精精品中文字幕| 18禁成年无码免费网站无遮挡 | 久久久久亚洲AV片无码下载蜜桃| 四虎永久在线观看免费网站网址| 国产成人亚洲综合无| 亚洲一区免费观看| 伊在人亚洲香蕉精品区麻豆| 99精品视频在线观看免费播放| 蜜桃传媒一区二区亚洲AV|