posts - 495,  comments - 11,  trackbacks - 0
           
            1、安裝Tomcat
            參考Tomcat for window 的安裝向?qū)В局苯影惭b即可,注意:安裝時(shí)會(huì)提示輸入管理用戶名和密碼,這是以后會(huì)用到的用戶名和密碼,切記。
            
            2、安裝MySql
            默認(rèn)安裝即可。
            
            3、使用Tomcat的Web管理應(yīng)用配置數(shù)據(jù)源
            啟動(dòng)Tomcat服務(wù)器,打開(kāi)瀏覽器,輸入http://localhost:8080/admin/(其中l(wèi)ocalhost可能是一臺(tái)機(jī)器的IP或是服務(wù)器名稱),進(jìn)入管理界面的登陸頁(yè)面,這時(shí)候請(qǐng)輸入原來(lái)安裝時(shí)要求輸入的用戶名和密碼,登陸到管理界面,
            
            選擇Resources-Data sources進(jìn)入配置數(shù)據(jù)源界面,選擇Data Source Actions ->選擇Create New Data Source,進(jìn)入配置詳細(xì)信息界面,內(nèi)容如下:
            
            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之外,其他的可以根據(jù)你的需要填寫。比如Data Source URL的內(nèi)容可能是:jdbc:mysql:// IP或是名稱/DataBaseName,其中DataBaseName是你的數(shù)據(jù)庫(kù)名稱,IP是你的數(shù)據(jù)庫(kù)的所在的服務(wù)器的IP或是名稱。最后點(diǎn)擊Save->Commit Change.這樣你的數(shù)據(jù)源的基本資料配置一半了。
            
            4、web.xml和%TOMCAT_HOME%\conf\Catalina\localhost下對(duì)應(yīng)你的引用的配置文件修改
            通過(guò)文件夾導(dǎo)航到%TOMCAT_HOME%\conf,打開(kāi)web.xml,在</web-app>的前面添加以下內(nèi)容:
            
            <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填寫的內(nèi)容要與在上文提到的JNDI Name名稱一致。

          字串8


            
            通過(guò)文件夾導(dǎo)航到%TOMCAT_HOME%\conf\Catalina\localhost下,找到你的web應(yīng)用對(duì)應(yīng)的.xml文件,如  ROOT.xml,并在此文件的下添入代碼:
            
            <ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.DataSourcer"/>
            
            到這里,配置工作就基本完成了。
            
            5、其他注意事項(xiàng)
            別忘了JDBC驅(qū)動(dòng)程序mysql-connector-java-3.0.9-stable-bin.jar一定要放置到Tomcat的對(duì)應(yīng)目錄,你的JDBC驅(qū)動(dòng)可能版比筆者高,不過(guò)只要能與所使用的MySql對(duì)應(yīng)就可以了,因?yàn)槲野l(fā)現(xiàn)版本太低的JDBC驅(qū)動(dòng)不能支持4.0.*版本的MySQL數(shù)據(jù)庫(kù),建議放置在%TOMCAT_HOME%\common\lib和應(yīng)用的WEB-INF\lib下。兩者有什么不同呢?其實(shí)一看就明白了,common\li是所有的應(yīng)用都可以使用的庫(kù)文件位置。
            
            重啟你的Tomcat服務(wù)。
            
            6、編寫測(cè)試代碼
            在應(yīng)用的目錄下建立一個(gè)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("我的測(cè)試開(kāi)始");
            
            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必須是數(shù)據(jù)庫(kù)已有的表,
            
            //這里的數(shù)據(jù)庫(kù)前文提及的Data Source URL配置里包含的數(shù)據(jù)庫(kù)。

          字串9


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

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

            添加以下內(nèi)容:
            <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
            
            以上內(nèi)容根據(jù)大家的具體情況進(jìn)行相應(yīng)修改,比如:把name="jdbc/quickstart"中的quickstart改成和你web文件夾名稱一樣,把password="123456"中的“123456”改成你數(shù)據(jù)庫(kù)的密碼。
            
            3、在%TOMCAT_HOME%/conf/Catalina/localhost下新建一個(gè)與你web文件夾同名的xml文件(我的是quickstart.xml)
            

            這一步非常重要,如果沒(méi)有這步就會(huì)出錯(cuò),會(huì)出現(xiàn)org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
            
            這樣的錯(cuò)誤,在文件中加入第2步的內(nèi)容,如下:
            
            <?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>
            
            根據(jù)個(gè)人具體情況進(jìn)行相應(yīng)修改。
            
            4、修改%TOMCAT_HOME%/webapps/yourweb/WEB-INF下的web.xml文件,在<web-app></web-app>之間添加以下內(nèi)容
            

            <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、測(cè)試,在quickstart下新建一個(gè)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("已經(jīng)獲得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>
            
            運(yùn)行tomcat服務(wù)器,在瀏覽器中輸入http://localhost:8080/quickstart/index.jsp看看成功了沒(méi)有。
          posted @ 2007-08-15 01:21 jadmin 閱讀(53) | 評(píng)論 (0)編輯 收藏
          一、準(zhǔn)備安裝程序
          1、JDK 5.0 安裝程序下載
          下載地址: 字串5


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

          字串3

          同意協(xié)議后,可以下載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版,由于是測(cè)試版,所以,可能存在不確定的因素,所以,我們這里下載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
          這里需要對(duì)應(yīng)版本的JDT,如果下載的是Eclipse SDK版本就自帶了,如果沒(méi)有,同一個(gè)下載頁(yè)面的靠后部分有JDT的下載鏈接,下載后將對(duì)應(yīng)的文件分別拷貝進(jìn)eclipse安裝目錄下的對(duì)應(yīng)的文件夾即可。
          這里我們下載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。
          好了,到此我們準(zhǔn)備好了所有的安裝包。
          二、安裝JDK并配置開(kāi)發(fā)環(huán)境
          這里只需要雙擊JDK安裝包的exe文件,按照提示安裝即可。安裝完成后,將JDK安裝目錄下的bin文件夾設(shè)置進(jìn)環(huán)境變量的path路徑中去。同時(shí),將JRE的lib目錄下的rt.jar包設(shè)置進(jìn)環(huán)境變量的classpath中去。
          這里我們把JDK安裝到了默認(rèn)安裝路徑C:\Program Files\Java\jdk1.5.0_02下。這里就不多說(shuō)了,網(wǎng)上可以搜索到很多JDK安裝配置的文章。
          三、安裝tomcat服務(wù)器
          只需要雙擊tomcat安裝包的exe文件,按照提示安裝即可,這里我們的安裝目錄為D:\Tomcat5.5,管理員密碼設(shè)置為12345678。 字串2
          四、安裝Eclipse開(kāi)發(fā)工具
          只需要把eclipse-SDK-3.1-win32.zip安裝包解壓,然后把里面的eclipse文件夾剪切至想放置的目錄即可,這里我們把eclipse安裝到了D:\eclipse目錄下。
          在安裝目錄下雙擊eclipse.exe文件,即可啟動(dòng)eclipse。中間會(huì)詢問(wèn)默認(rèn)的工作目錄,你可以按其默認(rèn)設(shè)定的,也可以自己設(shè)定工作目錄,這里設(shè)置為E:\workspace目錄。請(qǐng)選中Use this as the default and do not ask again選項(xiàng),這樣以后啟動(dòng)就不會(huì)再詢問(wèn)了。
          到此eclipse安裝成功。
          五、安裝tomcatPlugin插件
          安裝很簡(jiǎn)單,解壓我們已經(jīng)下載的安裝包tomcatPluginV31beta.zip,將解壓后的com.sysdeo.eclipse.tomcat_3.1.0.beta文件夾拷貝至D:\eclipse\plugins目錄下即可。我們關(guān)掉已經(jīng)打開(kāi)的eclipse,重新打開(kāi),OK,現(xiàn)在我們會(huì)發(fā)現(xiàn)工具欄上多了幾個(gè)雄貓的圖標(biāo),就是tomcat的啟動(dòng)、停止和重啟動(dòng)的按鈕。打開(kāi)eclipse的window/preferences,我們?cè)谧筮叺臉?shù)種也可以找到tomcat一項(xiàng)。
          點(diǎn)擊tomcat項(xiàng),在右邊我們選擇version 5.x版本,然后設(shè)定tomcat home為D:\Tomcat5.5,Contexts directory為D:\Tomcat5.5\conf\Catalina\localhost。到此tomcat plugin設(shè)置完畢。
          六、安裝GEF插件
          同樣,將GEF-ALL-3.1.zip解壓縮,然后拷貝解壓后的eclipse目錄下的三個(gè)文件夾到D:\eclipse目錄下,覆蓋所有的現(xiàn)有文件夾。

          字串9


          好了,到此GEF安裝完成。
          八、創(chuàng)建測(cè)試工程
          如果已經(jīng)完成了上面所有步驟,現(xiàn)在可以重新啟動(dòng)eclipse,使新安裝的插件生效,開(kāi)始正式開(kāi)發(fā)了。
          1、使用Sysdeo Tomcat Plugin創(chuàng)建tomcat工程:
          File->new->others,打開(kāi)新建向?qū)?duì)話框,在樹(shù)中找到j(luò)ava->tomcat projects,選中,點(diǎn)擊next按鈕。在projects name中輸入textweb,選中Use default,點(diǎn)擊next。在下一個(gè)對(duì)話頁(yè)面,保持默認(rèn)設(shè)置,點(diǎn)擊finished。這時(shí),我們?cè)趀clipse的package explorer中會(huì)看到新建的工程testweb,創(chuàng)建完成。
          2、加入struts框架
          File->new->others,打開(kāi)新建向?qū)?duì)話框,找到Amateras->Struts->Add Struts Support,選中點(diǎn)擊next按鈕。
          保持默認(rèn)設(shè)置,點(diǎn)擊Finish按鈕。這時(shí),在eclipse的package explorer中會(huì)看到增加了很多struts的庫(kù)文件,在WEB-INF下也增加了很多struts的配置文件。到此我們已經(jīng)在項(xiàng)目加入了Struts框架。
          3、編輯struts-config.xml文件
          在WEB-INF文件夾下可以找到,右鍵點(diǎn)擊菜單中選擇open with->Amateras XML Editer可以直接對(duì)xml文本進(jìn)行編輯,選擇open with->struts-config.xml editor可以在圖形模式下對(duì)文件進(jìn)行編輯。 字串2
          在右邊的outline中點(diǎn)擊相應(yīng)的struts對(duì)象可以添加新的對(duì)象進(jìn)去。這里我們只是說(shuō)明這里有一個(gè)比較方便的struts-config.xml文件的編輯器,后面我們將開(kāi)發(fā)一個(gè)簡(jiǎn)單的小程序。
          4、新建一個(gè)頁(yè)面index.jsp
          File->new->others,打開(kāi)新建向?qū)?duì)話框,找到Amateras->JSP File,點(diǎn)擊next按鈕,F(xiàn)ileName改為index.jsp,點(diǎn)擊Finish。然后打開(kāi)index.jsp文件進(jìn)行編輯,內(nèi)容如下:
          <%@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、創(chuàng)建form數(shù)據(jù)對(duì)象
          打開(kāi)File->new->package對(duì)話框,name中輸入com.is.form,點(diǎn)擊Finish按鈕。在右邊的Package Explorer樹(shù)中找到剛才創(chuàng)建的包,右鍵點(diǎn)擊com.is.form包,菜單中的new->others,找到Amateras->struts->Struts Action Form,點(diǎn)擊next,在對(duì)話框中name欄輸入LoginForm,點(diǎn)擊Finish按鈕。
          編輯LoginForm類的內(nèi)容為:
          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

          注意,這里的兩個(gè)屬性分別對(duì)應(yīng)我們jsp中form中的兩個(gè)輸入控件的名稱,為什么這樣做,可以去看struts的幫助文檔了,我就不詳細(xì)說(shuō)了,還有form類再寫完屬性后,get和set方法可以通過(guò)eclipse的source中的命令來(lái)自動(dòng)生成,在右鍵菜單中,也不詳細(xì)說(shuō)了,去網(wǎng)上查資料吧,關(guān)于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、創(chuàng)建action對(duì)象
          同創(chuàng)建form的過(guò)程相同,我們只是新建一個(gè)com.is.action包,同樣的過(guò)程,打開(kāi)新建向?qū)?,只是選擇Struts Action,創(chuàng)建LoginAction.java類,均選默認(rèn)值。我們編輯LoginAction為如下內(nèi)容:
          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轉(zhuǎn)向的,你也可以按照struts中提供的空白例程struts-blank.war中的做法進(jìn)行轉(zhuǎn)向,可以比較一下會(huì)有收獲的。
          7、創(chuàng)建登錄成功頁(yè)面
          同創(chuàng)建index.jsp頁(yè)面相同,我們創(chuàng)建welcome.jsp頁(yè)面,均使用默認(rèn)設(shè)置。并編輯其內(nèi)容如下:
          <%@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("對(duì)不起,你輸入的用戶名或者密碼錯(cuò)誤!");
          }
          %>
          </body>
          </html>

          字串5

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

          字串3

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

          字串3

          添加action文件的映射,在和標(biāo)簽之間加入:
          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

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

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

          Attribute元素

          對(duì)于tag標(biāo)簽的每個(gè)屬性,你必須定義它是否必須的,它的值是否可以用諸如<%= …%>的表達(dá)式來(lái)獲得,
          以及它的類型(可選),如果不指定它的類型,那就默認(rèn)為是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的返回類型(只用當(dāng)rtexprvalue為真是才有效)</type>

          </attribute>

          如果tag的某個(gè)屬性不是必須的,那tag處理類會(huì)自動(dòng)提供一個(gè)缺省值。

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

          <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>


          屬性元素的校驗(yàn)


          有關(guān)于tag標(biāo)簽的有效值可以從tag庫(kù)的說(shuō)明文檔中獲得,當(dāng)JSP頁(yè)面被編譯時(shí),jsp引擎會(huì)強(qiáng)制性地
          參照TLD中定義的規(guī)則進(jìn)行檢查。

          還有一個(gè)方法也可以進(jìn)行屬性元素的校驗(yàn),就是先繼承類TagExtraInfo,然后調(diào)用它的isValid方法。
          這個(gè)類同時(shí)也起到提供tag中定義的腳本變量信息的作用。

          IsValid方法通過(guò)TagData對(duì)象來(lái)傳遞屬性信息,它包括著tag的所有的屬性名-值的信息。
          由于校驗(yàn)發(fā)生在運(yùn)行時(shí)刻,因此這個(gè)屬性的值將被賦值為TagData.REQUEST_TIME_VALUE。

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

          <attribute>

          <name>attr1</name>

          <required>true</required>

          <rtexprvalue>true</rtexprvalue>

          </attribute>


          這個(gè)定義說(shuō)明了attr1能在運(yùn)行期間被賦值。

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


          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標(biāo)簽含有內(nèi)容,那處理方式會(huì)略微有些不同,而且還要視tag處理類是否要與body交互的情況而定。
          如果要與body交互,那我們認(rèn)為tag處理類要可能要對(duì)body進(jìn)行操作。

          Tag處理類不與body交互

          如果tag處理類不與body交互,tag處理類應(yīng)該實(shí)現(xiàn)Tag接口或從TagSupport中派生,如果body要被計(jì)算,
          那么doStartTag方法應(yīng)返回 EVAL_BODY_INCLUDE,否則應(yīng)返回SKIP_BODY。

          如果tag處理類要對(duì)body反復(fù)運(yùn)算,則它應(yīng)該實(shí)現(xiàn)IterationTag或從TagSupport中派生。如果tag處理類
          認(rèn)為body還未計(jì)算完的話,那它的doStartTag方法和doAfterBody方法必須返回EVAL_BODY_AGAIN。

          Tag處理類與body交互

          如果tag處理類與body交互,那tag處理類應(yīng)實(shí)現(xiàn)BodyTag接口或從BodyTagSupport中派生。這種tag處理類
          一般要實(shí)現(xiàn)doInitBody和doAfterBody方法。

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

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

          doInitBody 方法

          此方法在body內(nèi)容已經(jīng)設(shè)好,但未被計(jì)算之前被調(diào)用。你可以根據(jù)不同的body內(nèi)容來(lái)制定初始化策略。

          doAfterBody方法

          此方法在body內(nèi)容已被計(jì)算后進(jìn)行調(diào)用。

          和doStartTag方法一樣,doAfterBody方法返回一個(gè)指示符指示是否要繼續(xù)計(jì)算body,如果要繼續(xù)計(jì)算,
          則doAfterBody應(yīng)返回EVAL_BODY_BUFFERED,否則,它應(yīng)返回SKIP_BODY。

          release 方法

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


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


          Public class QueryTag extends BodyTagSupport

          {

          public int doAfterBody() throws JspTagException

          {

          BodyContent bc = getBodyContent();

          //將body的內(nèi)容以字符串的格式提取出來(lái)

          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可能會(huì)有body,你必須用body-content元素來(lái)指定body內(nèi)容的類型:

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


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

          注意:實(shí)際上body-content的值并不影響tag處理類對(duì)body內(nèi)容的處理,它僅僅是被tag編輯工具
          用來(lái)描述此body的內(nèi)容。


          用tags定義腳本變量

          tag處理類


          tag處理類負(fù)責(zé)創(chuàng)建或設(shè)置頁(yè)面中定義的腳本變量,用pageContext.setAttribute(name,value,scope)
          或pageContext.setAttribute(name,value)方法來(lái)實(shí)現(xiàn)。一般來(lái)說(shuō),tag處理類通過(guò)腳本變量的名稱來(lái)
          獲取它,腳本變量的名稱一般可用get方法來(lái)獲得。

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

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

          對(duì)象的生存周期表

          名字
          可訪問(wèn)范圍
          生存周期

          page
          當(dāng)前頁(yè)面
          一直有效,除非頁(yè)面向客戶提交響應(yīng)或重定向到一個(gè)新頁(yè)面

          request
          當(dāng)前頁(yè)面或當(dāng)前頁(yè)面重定向到的頁(yè)面
          一直有效,除非頁(yè)面向客戶提交響應(yīng)

          session
          當(dāng)前頁(yè)面或在同一瀏覽器窗口中的頁(yè)面
          一直有效,除非關(guān)閉當(dāng)前瀏覽器、超時(shí)、網(wǎng)絡(luò)故障

          application
          整個(gè)web應(yīng)用程序的所有請(qǐng)求
          一直有效,除非發(fā)生網(wǎng)絡(luò)故障、服務(wù)器故障

          提供關(guān)于腳本變量的信息

          以下示例定義了一個(gè)名為“book”的腳本變量,用來(lái)訪問(wèn)程序中關(guān)于書的信息:

          <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>

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

          · 腳本變量名稱

          · 腳本變量所屬的類

          · 此腳本變量是否引用了一個(gè)新的或已存在的對(duì)象

          · 此腳本變量的有效性

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

          Variable元素

          Variable元素有如下子元素:

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

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

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

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

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

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

          腳本變量的有效范圍


          有效性
          方法

          NESTED
          在tag標(biāo)簽的開(kāi)始和結(jié)束之間
          如果tag處理類實(shí)現(xiàn)BodyTag接口,則在doInitBody和doAfterBody中調(diào)用,否則在doStartTag中調(diào)用

          AT_BEGIN
          從tag標(biāo)簽的開(kāi)始一直到頁(yè)面結(jié)束
          如果tag處理類實(shí)現(xiàn)BodyTag接口,則在doInitBody、doAfterBody和doEndTag中調(diào)用,
          否則在doStartTag和doEndTag中調(diào)用

          AT_END
          從tag標(biāo)簽的結(jié)束一直到頁(yè)面結(jié)束
          在doEndTag中調(diào)用

          以struts為例,它的bean:define標(biāo)簽的實(shí)現(xiàn)遵循JSP1.1規(guī)范,此規(guī)范要求使用額外tag信息類來(lái)定義腳本變量。
          Variable元素是JSP1.2規(guī)范中加入的。以bean:define標(biāo)簽為例,你可以定義如下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信息類

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

          · 變量名

          · 變量所屬類名

          · 此變量是否引用了一個(gè)新對(duì)象

          · 此變量的有效范圍

          jsp引擎將一個(gè)名為data的參數(shù)傳給getVariableInfo方法,data中包括tag標(biāo)簽中的所有“屬性名?D?D屬性值”對(duì)。
          它可以用來(lái)向VariableInfo對(duì)象提供腳本變量的名字和類名。

          以struts為例,它在bean:define標(biāo)簽中定義了一個(gè)名為DefineTei的額外tag信息類,用來(lái)向腳本變量提供信息。
          由于腳本變量的名稱(book)和類名(database.BookDetails)是通過(guò)tag標(biāo)簽的屬性來(lái)傳遞的,
          它們一般定義在VariableInfo的構(gòu)建代碼中,并且可用data.getAttributeString方法來(lái)得到這些信息。
          如果要允許book腳本變量能在從tag開(kāi)始直到整個(gè)JSP頁(yè)面結(jié)束的范圍內(nèi)都可用的話,那它的范圍應(yīng)設(shè)為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)

          };

          }

          }


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


          具有協(xié)作關(guān)系的tag


          tag通過(guò)共享對(duì)象來(lái)進(jìn)行協(xié)作,JSP技術(shù)支持2種方式的對(duì)象共享。

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

          第二各方式的共享是對(duì)于tag之間有嵌套關(guān)系而言的,外層的tag所創(chuàng)建的對(duì)象對(duì)于內(nèi)層的tag來(lái)說(shuō)是
          可以共用的。這種形式的共享的好處是減少了可能存在的重名沖突。

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

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


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

          此查詢標(biāo)簽在JSP頁(yè)面中的調(diào)用形式可以從以下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>

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

          <tag>

          ...

          <attribute>

          <name>connection</name>

          <required>false</required>

          </attribute>

          </tag>

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

          標(biāo)準(zhǔn)的JSP 標(biāo)記可以調(diào)用JavaBeans組件或者執(zhí)行客戶的請(qǐng)求,這大大降低了JSP開(kāi)發(fā)的復(fù)雜度和維護(hù)量。
          JSP技術(shù)也允許你自定義taglib,其實(shí)換句話說(shuō),taglib可以看成是對(duì)JSP標(biāo)記的一種擴(kuò)展,正如xml是對(duì)
          html的一種擴(kuò)展一樣。taglib通常定義在tag標(biāo)簽庫(kù)中,這種標(biāo)簽庫(kù)存放著你自己定義的tag標(biāo)簽。

          簡(jiǎn)而言之,如果使用taglib,那么你可以設(shè)計(jì)自己的JSP標(biāo)記!

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

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

          · 什么是自定義tag標(biāo)簽?

          · 怎么使用tag標(biāo)簽?

          o 聲明要使用的tag庫(kù)

          o 找到與之對(duì)應(yīng)的tag處理類

          o tag標(biāo)簽的類型

          · 自定義tag標(biāo)簽

          o tag處理類

          o tag庫(kù)描述

          o tag標(biāo)簽示例

          o 帶屬性的tag

          o 帶body的tag

          o 定義了腳本變量的tag

          o 具有協(xié)作關(guān)系的tag

          · 自定義tag標(biāo)簽

          o 一個(gè)迭代tag的例子

          o 一個(gè)模板tag庫(kù)

          o tag處理類到底是怎樣被調(diào)用的?


          什么是自定義的tag?

          一個(gè)自定義的tag標(biāo)簽是用戶定義的一種JSP標(biāo)記。當(dāng)一個(gè)含有自定義的tag標(biāo)簽的JSP頁(yè)面被jsp引擎編譯
          成servlet時(shí),tag標(biāo)簽被轉(zhuǎn)化成了對(duì)一個(gè)稱為tag處理類的對(duì)象進(jìn)行的操作。于是當(dāng)JSP頁(yè)面被jsp引擎轉(zhuǎn)
          化為servlet后,實(shí)際上tag標(biāo)簽被轉(zhuǎn)化成為了對(duì)tag處理類的操作。

          自定義tag標(biāo)簽有很多特色,諸如:

          · 可以在JSP頁(yè)面中自定義tag標(biāo)簽的屬性

          · 訪問(wèn)JSP頁(yè)面中的所有對(duì)象

          · 可以動(dòng)態(tài)地修改頁(yè)面輸出

          · 彼此這間可以相互通信。你可以先創(chuàng)建一個(gè)JavaBeans組件,然后在一個(gè)tag中調(diào)用此JavaBeans組件,
          同時(shí)可以在另一個(gè)tag中調(diào)用它。

          · tag允許相互嵌套,可以在一個(gè)JSP頁(yè)面中完成一些復(fù)雜的交互。


          使用tag標(biāo)簽


          本節(jié)主要描述怎樣在JSP頁(yè)面中使用tag標(biāo)簽,以及tag標(biāo)簽的不同類型。

          要使用tag標(biāo)簽,JSP程序員必須做2件事:

          · 聲明此tag標(biāo)簽的tag庫(kù)

          · 實(shí)現(xiàn)此tag標(biāo)簽

          聲明tag標(biāo)簽所在的tag庫(kù)

          如果要使用tag標(biāo)簽,則應(yīng)用JSP的taglib指示符來(lái)指定其tag庫(kù)(注意:taglib要在在使用此tag標(biāo)簽之前聲明)

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

          uri屬性定義了唯一的標(biāo)簽庫(kù)描述(以下簡(jiǎn)稱TLD),它可以是直接是tld文件名或一個(gè)獨(dú)一無(wú)二的名字。
          prefix是用來(lái)區(qū)別其它TLD中和本TLD中有重名的tag的一種手段。

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

          以下taglib指示符直接引用一個(gè)TLD:

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

          以下的taglib指示符通過(guò)一個(gè)邏輯名稱間接地引用一個(gè)TLD:

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

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

          <taglib>

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

          <taglib-location>

          /WEB-INF/tutorial-template.tld

          </taglib-location>

          </taglib>


          實(shí)現(xiàn)此tag標(biāo)簽


          為了實(shí)現(xiàn)tag標(biāo)簽,你有2種方法來(lái)存放tag處理類。一、讓tag處理類以.class的方式存放于當(dāng)前應(yīng)用
          的WEB-INF/class子目錄下,二、如果tag處理類是以JAR包的形式存在的話,那可以放在當(dāng)前應(yīng)用的
          WEB-INF/lib目錄下,如果tag處理類要在多個(gè)應(yīng)用中共享,那么它就應(yīng)放在jsp服務(wù)器上的common/lib
          目錄下,對(duì)于tomcat來(lái)說(shuō),就是tomcat/common/lib目錄下。


          tag標(biāo)簽類型


          自定義的tag標(biāo)簽遵循XML語(yǔ)法。它有一個(gè)開(kāi)始標(biāo)記和一個(gè)結(jié)束標(biāo)記,有的還有body(即文本節(jié)點(diǎn)):

          <tt:tag>

          body

          </tt:tag>


          一個(gè)不帶body的tag標(biāo)簽如下:

          <tt:tag />


          簡(jiǎn)單的tag標(biāo)簽

          一個(gè)沒(méi)有body和屬性的tag標(biāo)簽如下:

          <tt:simple />


          帶屬性的tag標(biāo)簽


          自定義標(biāo)簽可以有自己的屬性。屬性一般在開(kāi)始標(biāo)記中定義,語(yǔ)法為 attr=”value”。屬性的作用相當(dāng)
          于自定義標(biāo)簽的一個(gè)參數(shù),它影響著tag處理類的行為。你可以在TLD中詳細(xì)定義它。

          你可以用一個(gè)String常量給一個(gè)屬性賦值,也可以通過(guò)表達(dá)式給它賦值,如<%= ...%>。以struts為例,
          它的logic:present標(biāo)簽就是用的String常量來(lái)給屬性賦值:

          <loglic:present parameter = “Clear”>

          而另一個(gè)標(biāo)簽logic:iterate是用表達(dá)式來(lái)給屬性賦值:

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

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


          帶body的tag標(biāo)簽

          一個(gè)自定義標(biāo)簽可以包含其它自定義標(biāo)簽、腳本變量、HTML標(biāo)記或其它內(nèi)容。

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

          <logic:present parameter=”Clear”>

          <% cart.clear(); %>

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

          你選擇了清除購(gòu)物車!

          </strong></font>

          </logic:present>


          到底是用屬性還是用body來(lái)傳遞信息?

          如上所述,我們既可以通過(guò)屬性,也可以通過(guò)body來(lái)傳遞信息。但一般來(lái)說(shuō),比較簡(jiǎn)單的類型,如字符串
          或簡(jiǎn)單表達(dá)式最好采用屬性來(lái)傳遞信息。


          定義腳本變量的tag標(biāo)簽

          所謂腳本變量,是指JSP中可以調(diào)用的變量或?qū)ο?。它可由tag標(biāo)簽產(chǎn)生。以下示例闡述了一個(gè)tag標(biāo)簽定義
          了一個(gè)名為tx的由JNDI所定義的事務(wù)處理對(duì)象。腳本變量可以是ejb對(duì)象、事務(wù)、數(shù)據(jù)庫(kù)連接等等:

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

          <% tx.begin(); %>

          ...


          具有協(xié)作關(guān)系的tag標(biāo)簽

          自定義tag標(biāo)簽之間可以通過(guò)共享對(duì)象來(lái)實(shí)現(xiàn)協(xié)作。在下述例子中,標(biāo)簽tag1創(chuàng)建了一個(gè)名為obj1的對(duì)象,
          在標(biāo)簽tag2仍可以重復(fù)使用obj。

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

          <tt:tag2 attr1=”obj1” />

          在以下這個(gè)例子當(dāng)中,如果外層的tag標(biāo)簽創(chuàng)建了一個(gè)對(duì)象,那么其內(nèi)層的所有tag標(biāo)簽都可以使用這個(gè)對(duì)象。
          由于這樣產(chǎn)生的對(duì)象沒(méi)有一個(gè)指定的名字,那么就可以將少重名的沖突。這個(gè)例子闡述了一系列協(xié)作的嵌套對(duì)象。

          <tt:outerTag>

          <tt:innerTag />

          </tt:outerTag>

          Tag處理類


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

          當(dāng)JSP引擎看到自己的JSP頁(yè)面中包含有tag標(biāo)簽時(shí),它會(huì)調(diào)用doStartTag方法來(lái)處理tag標(biāo)簽的開(kāi)頭,
          調(diào)用doEndTag方法來(lái)處理tag標(biāo)簽的結(jié)束。

          下表說(shuō)明不同類型的tag所需要不同的處理過(guò)程:

          Tag處理類的方法

          Tag標(biāo)簽類型
          所調(diào)用的方法

          基本標(biāo)簽
          doStartTag, doEndTag, release

          帶屬性的標(biāo)簽
          doStartTag, doEndTag, set/getAttribute1...N, release

          帶內(nèi)容的標(biāo)簽
          doStartTag, doEndTag, release

          帶內(nèi)容的標(biāo)簽,且

          內(nèi)容重復(fù)循環(huán)
          doStartTag, doAfterBody, doEndTag, release

          帶內(nèi)容的標(biāo)簽,且內(nèi)容與JSP交互
          doStartTag, doEndTag, release, doInitBody, doAfterBody, release

          一個(gè)tag處理類可以通過(guò)javax.servlet.jsp.PageContext來(lái)與JSP交互,通過(guò)javax.servlet.jsp.PageContext類,
          tag處理類可以訪問(wèn)JSP中的request、session和application對(duì)像。

          如果tag標(biāo)簽是互相嵌套的,那內(nèi)層的tag處理類可以通過(guò)它的parent屬性來(lái)訪問(wèn)上層的tag處理類。

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


          Tag庫(kù)描述(簡(jiǎn)稱TLD)


          Tag庫(kù)是用xml語(yǔ)言描述的,TLD包括了tag庫(kù)中所有tag標(biāo)簽的描述,它一般用來(lái)被jsp服務(wù)器用來(lái)校驗(yàn)tag的語(yǔ)法
          正確性,或者被jsp開(kāi)發(fā)者用來(lái)開(kāi)發(fā)新的標(biāo)簽。

          TLD的文件擴(kuò)展名必須為.tld,而且必須放在當(dāng)前WEB應(yīng)用的WEB-INF目錄或其子目錄中。

          一個(gè)TLD的內(nèi)容的開(kāi)頭必須遵守標(biāo)準(zhǔn)的XML開(kāi)頭,用于描述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>來(lái)作為它的根元素,<taglib>的子元素如下表:


          <taglib>的子元素

          Element
          Description

          tlib-version
          Tag庫(kù)的版本

          jsp-version
          Tag庫(kù)所需要的jsp的版本

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

          uri
          用于確定一個(gè)唯一的tag庫(kù)

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

          small-icon
          被可視化工具(諸如Jbuilder)用來(lái)顯示的小圖標(biāo)(可選)

          large-icon
          被可視化工具(諸如Jbuilder)用來(lái)顯示的大圖標(biāo)(可選)

          description
          對(duì)tag庫(kù)的描述(可選)

          listener
          參見(jiàn)下面listener元素

          tag
          參見(jiàn)下面tag 元素

          Listener元素

          一個(gè)tag庫(kù)可能定義一些類做為它的事件偵聽(tīng)類,這些類在TLD中被稱為listener 元素,
          jsp服務(wù)器將會(huì)實(shí)例化這些偵聽(tīng)類,并且注冊(cè)它們。Listener元素中有一個(gè)叫l(wèi)istener-class的子元素,
          這個(gè)元素的值必須是該偵聽(tīng)類的完整類名。

          Tag元素

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

          每一個(gè)tag在TLD中對(duì)應(yīng)一個(gè)tag元素,下表是tag元素的子元素:

          Tag元素的子元素

          元素名稱
          描述

          name
          獨(dú)一無(wú)二的元素名

          tag-class
          Tag標(biāo)簽對(duì)應(yīng)的tag處理類

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

          body-content
          Tag標(biāo)簽body的類型

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

          small-icon
          被可視化工具(諸如Jbuilder)用來(lái)顯示的小圖標(biāo)(可選)

          large-icon
          被可視化工具(諸如Jbuilder)用來(lái)顯示的大圖標(biāo)(可選)

          description
          此tag標(biāo)簽的描述

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

          attribute
          Tag標(biāo)簽的屬性名

          以下章節(jié)介紹對(duì)于不同類型的tag,如何具體地實(shí)現(xiàn)它們。


          簡(jiǎn)單的tag


          tag處理類

          簡(jiǎn)單的tag處理類必須實(shí)現(xiàn)Tag接口的doStartTag和doEndTag方法。當(dāng)jsp引擎碰到tag標(biāo)簽的開(kāi)頭時(shí),
          doStartTag被調(diào)用,因?yàn)楹?jiǎn)單的tag沒(méi)有body,所以此方法將返回 SKIP_BODY。當(dāng)jsp引擎碰到tag標(biāo)簽的
          結(jié)尾時(shí),doEndTag被調(diào)用,如果余下的頁(yè)面還要被計(jì)算,那它將返回EVAL_PAGE,否則將會(huì)返回SKIP_PAGE。

          以下是例子:對(duì)于標(biāo)簽 <tt:simple /> ,它的tag處理類實(shí)現(xiàn)如下:


          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標(biāo)簽沒(méi)有內(nèi)容的話,那必須定義body-content元素為空,例如

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


          帶屬性的tag標(biāo)簽


          tag處理類

          對(duì)于tag標(biāo)簽的每個(gè)屬性,你必須依照J(rèn)avaBeans規(guī)范來(lái)定義其屬性,以及get和set方法。以struts的
          logic:present 標(biāo)簽為例,

          <logic:present parameter=”Clear”>

          與此相應(yīng),此tag處理類應(yīng)有如下方法和定義:


          protected String parameter = null;

          public String getParameter()

          {

          return this.parameter;

          }

          public void setParameter(String parameter)

          {

          this.parameter = parameter;

          }


          注意:如果你的屬性名為id,而且你的tag處理類是從TagSupport類繼承的,那你就不需要定義它的屬性
          和set和get方法,因?yàn)樗麄冊(cè)缫言赥agSupport被定義過(guò)了。

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

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

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

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

            搜索
            作用域 功能 快捷鍵
            全局 出現(xiàn)在文件中 Ctrl+Shift+U
            全局 打開(kāi)搜索對(duì)話框 Ctrl+H
            全局 工作區(qū)中的聲明 Ctrl+G
            全局 工作區(qū)中的引用 Ctrl+Shift+G

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

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

            項(xiàng)目
            作用域 功能 快捷鍵
            全局 全部構(gòu)建 Ctrl+B

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

            運(yùn)行
            作用域 功能 快捷鍵
            全局 單步返回 F7
            全局 單步跳過(guò) F6
            全局 單步跳入 F5
            全局 單步跳入選擇 Ctrl+F5
            全局 調(diào)試上次啟動(dòng) F11
            全局 繼續(xù) F8
            全局 使用過(guò)濾器單步執(zhí)行 Shift+F5
            全局 添加/去除斷點(diǎn) Ctrl+Shift+B
            全局 顯示 Ctrl+D
            全局 運(yùn)行上次啟動(dòng) Ctrl+F11
            全局 運(yùn)行至行 Ctrl+R
            全局 執(zhí)行 Ctrl+U

            重構(gòu)
            
          作用域 功能 快捷鍵
            全局 撤銷重構(gòu) Alt+Shift+Z
            全局 抽取方法 Alt+Shift+M
            全局 抽取局部變量 Alt+Shift+L
            全局 內(nèi)聯(lián) Alt+Shift+I
            全局 移動(dòng) Alt+Shift+V
            全局 重命名 Alt+Shift+R
            全局 重做 Alt+Shift+Y

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

          Eclipse快捷鍵指南

          ??? 本文檔從Eclipse軟件上整理,是列出了標(biāo)準(zhǔn)的快捷鍵,未列出Emacs快捷鍵。
          編輯

          posted @ 2007-08-14 12:07 jadmin 閱讀(81) | 評(píng)論 (0)編輯 收藏
           
          posted @ 2007-08-14 10:10 jadmin 閱讀(87) | 評(píng)論 (0)編輯 收藏
           
          posted @ 2007-08-14 10:10 jadmin 閱讀(74) | 評(píng)論 (0)編輯 收藏
           
          posted @ 2007-08-14 10:09 jadmin 閱讀(98) | 評(píng)論 (0)編輯 收藏
           
          posted @ 2007-08-14 10:08 jadmin 閱讀(63) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題
          共50頁(yè): First 上一頁(yè) 32 33 34 35 36 37 38 39 40 下一頁(yè) Last 
          主站蜘蛛池模板: 德安县| 遂宁市| 高唐县| 灌南县| 新乡县| 汉中市| 临桂县| 抚顺市| 榆中县| 长宁区| 博罗县| 津南区| 灵石县| 晋城| 武川县| 山东省| 锡林郭勒盟| 永州市| 晋宁县| 麦盖提县| 巴楚县| 咸阳市| 武汉市| 沙河市| 西盟| 阳朔县| 鸡西市| 花莲县| 重庆市| 襄樊市| 文水县| 新泰市| 广东省| 基隆市| 云南省| 应城市| 北碚区| 旅游| 杭锦旗| 东丰县| 吉安市|