<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
     
     
    posted @ 2007-08-14 10:07 jadmin 閱讀(76) | 評論 (0)編輯 收藏

    Struts 框架帶有幾個自定義標簽庫(有關 Struts 的更多信息的鏈接請參閱 參考資料 )。這些庫中的一個標簽可以創建一個支持改寫 URL 的鏈接并用 jsessionid 對改寫的連接編碼。

    不過有一個問題:如果希望傳遞一組請求參數(如查詢字符串),也許必須為此創建一個 Java scriptlet。真是亂!下面的清單 (search_results.jap) 展示了一個 JSP 頁,它被迫加入了這樣一個 scriptlet。

     <%@ taglib uri="struts-html" prefix="html" %> <jsp:useBean class="java.util.HashMap" id="deleteParams" /> <% deleteParams.put("id", cd.getId()); deleteParams.put("method","delete"); %> <!-- Pass the map named deleteParams to html:link to generate the request parameters--> <html:link action="/deleteCD" name="deleteParams">delete </html:link> </font></td> 

    search_results.jsp 創建一個 hashmap 并向這個 map 傳遞兩個屬性。在下面幾小節,我們將創建一個不用 Java 代碼完成這項工作的自定義標簽。我們的標簽將定義如下的一個 hashmap:

     <map:mapDefine id="deleteParams"> <map:mapEntry id="id" name="cd" property="id"/> <map:mapEntry id="method" value="delete"/> </map:mapDefine> <!-- Pass the map named deleteParams to html:link to generate the request parameters--> <html:link action="/deleteCD" name="deleteParams">delete </html:link> </font></td> 

    這將使我們可以容易地創建小型 map。

    這個例子將展示幾個關鍵概念,包括使用嵌套標簽和定義 scriplet 變量。首先我將解釋這個標簽是如何工作的。然后在以后的幾節中建立這些概念,并介紹如何編寫這個標簽的不同形式,使它們處理其正文并控制執行流程。

    posted @ 2007-08-14 10:07 jadmin 閱讀(69) | 評論 (0)編輯 收藏
     
    posted @ 2007-08-14 10:06 jadmin 閱讀(82) | 評論 (0)編輯 收藏
    一、基本概念:
    *************************************************************************************
    1.標簽(Tag):
    標簽是一種XML元素,通過標簽可以使JSP網頁變得簡潔并且易于維護,還可以方便地實現同一個JSP文件支持多種語言版本。由于標簽是XML元素,所以它的名稱和屬性都是大小寫敏感的

    2.標簽庫(Tag library):
    由一系列功能相似、邏輯上互相聯系的標簽構成的集合稱為標簽庫。

    3.標簽庫描述文件(Tag Library Descriptor):
    標簽庫描述文件是一個XML文件,這個文件提供了標簽庫中類和JSP中對標簽引用的映射關系。它是一個配置文件,和web.xml是類似的。

    4.標簽處理類(Tag Handle Class):
    標簽處理類是一個Java類,這個類繼承了TagSupport或者擴展了SimpleTag接口,通過這個類可以實現自定義JSP標簽的具體功能
    *************************************************************************************


    二、自定義JSP標簽的格式:
    *************************************************************************************
    1.<% @ taglib prefix=”someprefix” uri=”/sometaglib” %>
    ?? 為了使到JSP容器能夠使用標簽庫中的自定義行為,必須滿足以下兩個條件:
    ??? 1.從一個指定的標簽庫中識別出代表這種自定義行為的標簽
    ??? 2.找到實現這些自定義行為的具體類

    ??? 第一個必需條件-找出一個自定義行為屬于那個標簽庫-是由標簽指令的前綴(Taglib?? Directive's Prefix)屬性完成,所以在同一個頁面中使用相同前綴的元素都屬于這個標簽庫。每個標簽庫都定義了一個默認的前綴,用在標簽庫的文檔中或者頁面中插入自定義標簽。所以,你可以使用除了諸如jsp,jspx,java,servlet,sun,sunw(它們都是在JSP白皮書中指定的保留字)之類的前綴。
     
     uri屬性滿足了以上的第二個要求。為每個自定義行為找到對應的類。這個uri包含了一個字符串,容器用它來定位TLD文件。在TLD文件中可以找到標簽庫中所有標簽處理類的名稱

    2.<someprefix:sometag key=”somevalue”/>
     當web應用程序啟動時,容器從WEB-INF文件夾的目錄結構的META-INF搜索所有以.tld結尾的文件。也就是說它們會定位所有的TLD文件。對于每個TLD文件,容器會先獲取標簽庫的URI,然后為每個TLD文件和對應的URI創建映射關系。
    在JSP頁面中,我們僅需通過使用帶有URI屬性值的標簽庫指令來和具體的標簽庫匹配
    *************************************************************************************


    三、自定義JSP標簽的處理過程:
    *************************************************************************************
    1.在JSP中引入標簽庫:<% @ taglib prefix=”taglibprefix” uri=”tagliburi” %>
    2.在JSP中使用標簽庫標簽:<prefix : tagname attribute=”tagattribute”>
    3.Web容器根據第二個步驟中的prefix,獲得第一個步驟中聲明的taglib的uri屬性值
    4.Web容器根據uri屬性在web.xml找到對應的<taglib>元素
    5.從<taglib>元素中獲得對應的<taglib-location>元素的值
    6.Web容器根據<taglib-location>元素的值從WEB-INF/目錄下找到對應的.tld文件
    7.從.tld文件中找到與tagname對應的<tag>元素
    8.湊<tag>元素中獲得對應的<tag-class>元素的值
    9.Web容器根據<tag-class>元素的值創建相應的tag handle class的實例
    10. Web容器調用這個實例的doStartTag/doEndTag方法完成相應的處理
    *************************************************************************************


    四、創建和使用一個Tag Library的基本步驟:
    *************************************************************************************
    1.創建標簽的處理類(Tag Handler Class)
    2.創建標簽庫描述文件(Tag Library Descrptor File)
    3.在web.xml文件中配置<tag>元素
    4.在JSP文件中引人標簽庫
    *************************************************************************************


    五、TagSupport類簡介:
    *************************************************************************************
    1.處理標簽的類必須擴展javax.servlet.jsp.TagSupport.
    2.TagSupport類的主要屬性:

    A.parent屬性:代表嵌套了當前標簽的上層標簽的處理類
    B.pageContex屬性:代表Web應用中的javax.servlet.jsp.PageContext對象

    3.JSP容器在調用doStartTag或者doEndTag方法前,會先調用setPageContext和setParent方法,設置pageContext和parent。因此在標簽處理類中可以直接訪問pageContext變量

    4.在TagSupport的構造方法中不能訪問pageContext成員變量,因為此時JSP容器還沒有調用
    ?? setPageContext方法對pageContext進行初始化
    *************************************************************************************


    六、TagSupport處理標簽的方法:
    *************************************************************************************
    1.TagSupport類提供了兩個處理標簽的方法:
    ?? public int doStartTag() throws JspException
    ?? public int doEndTag()??? throws JspException

    2.doStartTag:但JSP容器遇到自定義標簽的起始標志,就會調用doStartTag()方法。????
    ?? doStartTag()方法返回一個整數值,用來決定程序的后續流程。
    ?? A.Tag.SKIP_BODY:表示<prefix:someTag>…</prefix:someTag>之間的內容被忽略
    ?? B.Tag.EVAL_BODY_INCLUDE:表示標簽之間的內容被正常執行

    3.doEndTag:但JSP容器遇到自定義標簽的結束標志,就會調用doEndTag()方法。doEndTag
    ?? ()方法也返回一個整數值,用來決定程序后續流程。
    ??? A.Tag.SKIP_PAGE:表示立刻停止執行網頁,網頁上未處理的靜態內容和JSP程序均被
    ????? 忽。略任何已有的輸出內容立刻返回到客戶的瀏覽器上。
    ??? B.Tag_EVAL_PAGE:表示按照正常的流程繼續執行JSP網頁
    *************************************************************************************


    七、用戶自定義的標簽屬性:
    *************************************************************************************
    如果在標簽中還包含了自定義的屬性,例如:
    <prefix:Mytag attribute1="value1">
    ???? ...
    </prefix:Mytag>
    那么在標簽處理類中應該將這個屬性作為成員變量,并且分別提供設置和讀取屬性的方法。
    *************************************************************************************


    八、創建標簽處理類的步驟:
    *************************************************************************************
    1.創建包含JSP網頁靜態文本的文件(即是要替換自定義JSP標簽的文本)
    2.在Web應用啟動時裝載靜態文本
    3.創建標簽處理類
    *************************************************************************************


    九、如何創建包含JSP網頁靜態文本的文件:????
    *************************************************************************************
    1.使用java.util.Properties類來存放要替換網頁中自定義JSP標簽的靜態文本
    2.Properties類代表了一系列屬性的集合,其實例既可以被保存到流中,也可以從流中加??
    ?? 載。這些文本以key/value的形式存放在WEB-INF目錄下,例如key=value,在屬性列表中
    ?? 這些key/value都是String類型的
    *************************************************************************************

    十、Properties類的常用API:
    *************************************************************************************
    1.setProperty(String key, String value):調用Hashtable類的put方法添加屬性
    2.getProperty(String key):獲取屬性列表中key對應的屬性值
    3.load(InputStream in):從輸入流對象InputStream中讀取屬性列表(Properties list)
    4.store(OutputStream out,String comment):使用適當的格式將屬性列表的屬性對寫入輸
    ?? 出流對象中,默認使用ISO-88590-1編碼格式,以行的方式處理輸入。屬性的key/value之
    ?? 間以”=、:”配對,以回車、換行分隔key/value對
    *************************************************************************************

    十一、ServletContext類的常用API:
    *************************************************************************************
    1.getContext(String uripath):返回服務器中uripath所代表的ServletContext對象
    2.getInitParameter(String name):返回ServletConfig對象中name參數的值
    3.getMineType(String file):返回file參數代表的文件的MIME類型
    4.getRequestDispatcher(String path):返回path代表的RequestDispacher對象
    5.getResourceAsStream(String path):以輸入流的形式返回path對應的資源,在輸入留中對象可以為任意形式的數據,path參數必須以“/”開始且相對于Context Root
    *************************************************************************************

    十二、如何使用ServletContxt讀取并保存屬性文件:
    *************************************************************************************
    1.創建java.util.Properties類對象
    2.獲取ServletContext對象
    3.將屬性文件以輸入流的形式讀入到某個輸入流對象中
    4.將輸入流對象加載到Properties對象中
    5.將Properties對象保存到ServletContext對象中
    *************************************************************************************

    十三、如何在Web應用啟動時裝載靜態文本:
    *************************************************************************************
    1.創建繼承了HttpServlet類的子類,在web.xml中配置這Servlet時設置load-on-startup屬性:
    <servlet>
    <servlet-name>someclass</servlet-name>
    <servlet-class>somepackage.SomeClass</servlet-clas
    <load-on-startup>1</load-on-startup>
    </servlet>
    2.在這個Servlet的init()方法中創建java.util.Properties類
    3.獲取當前Web應用的ServletContext對象
    4.將WEB-INF目錄下的屬性文件讀入到輸入流InputStream中:
    InputStream in = context.getResourceAsString("WEB-INF/someproperties.properties");
    5.將輸入流加載到屬性對象中
    ?????? ps.load(in);????????
    6.將屬性對象保存到上下文中。
    context.setAttribute("attributeName",ps);
    *************************************************************************************

    十四、如何創建標簽處理類:
    *************************************************************************************
    1.引入必需的資源:
    ?????? import javax.servlet.jsp.*;
    ???? import javax.servlet.http.*;
    ???? import java.util.*;
    ???? import java.io.*;
    2.繼承TagSupport類并覆蓋doStartTag()/doEndTag()方法
    3.從ServletContext對象中獲取java.util.Properties對象
    4.從Properties對象中獲取key對應的屬性值
    5.對獲取的屬性進行相應的處理并輸出結果
    *************************************************************************************

    十五、創建標簽庫描述文件(Tag Library Descriptor):
    *************************************************************************************
    1.標簽庫描述文件,簡稱TLD,采用XML文件格式,定義了用戶的標簽庫。TLD文件中的元素可以分成3類:
    ???? A.<taglib>:標簽庫元素
    ???? B.<tag>:標簽元素
    ???? C.<attribute>:標簽屬性元素

    2.標簽庫元素<taglib>用來設定標簽庫的相關信息,它的常用屬性有:
    ???? A.shortname:???? 指定Tag Library默認的前綴名(prefix)
    ???? B.uri:???????????? 設定Tag Library的惟一訪問表示符

    3.標簽元素<tag>用來定義一個標簽,它的常見屬性有:
    ???? A.name:???????? 設定Tag的名字
    ???? B.tagclass:???? 設定Tag的處理類
    ???? C.bodycontent:???? 設定標簽的主體(body)內容
    ???????????? 1).empty:表示標簽中沒有body
    ???????????? 2).JSP:表示標簽的body中可以加入JSP程序代碼
    ???????????? 3).tagdependent:表示標簽中的內容由標簽自己去處理

    4.標簽屬性元素<attribute>用來定義標簽的屬性,它的常見屬性有:
    ???? A.name:屬性名稱
    ???? B.required:屬性是否必需的,默認為false
    ???? C.rtexprvalue:屬性值是否可以為request-time表達式,也就是類似于<%=…%>的表達式
    *************************************************************************************

    十六、在Web應用中使用標簽:
    *************************************************************************************
    1.如果Web應用中用到了自定義JSP標簽,則必須在web.xml文件中加入<taglib>元素,它用于聲明所引用的標簽所在的標簽庫
    ???? <taglib>
    ???????? <taglib-uri>/sometaglib</taglib-uri>
    ???????? <taglib-location>/WEB-INF/someTLD.tld</taglib-location>
    ???? </taglib>

    2.<taglib-uri>:設定Tag Library的惟一標示符,在Web應用中將根據它來引用Tag Libray
    3.<taglib-location>:指定和Tag Library對應的TLD文件的位置
    4.在JSP文件中需要加入<% @ taglib% >指令來聲明對標簽庫的引用。例如:
    <% @ taglib prefix = “somePrefix” uri = "/someuri" %>

    5.prefix表示在JSP網頁中引用這個標簽庫的標簽時的前綴,uri用來指定Tag Library的標識符,它必須和web.xml中的<taglib-uri>屬性保持一致。
    *************************************************************************************
    posted @ 2007-08-14 10:05 jadmin 閱讀(70) | 評論 (0)編輯 收藏
     
    posted @ 2007-08-14 09:21 jadmin 閱讀(68) | 評論 (0)編輯 收藏

    JSP2.0中為了簡化標簽的復雜性,增加了制作Simple Tag的標簽類SimpleTagSupport類。
    SimpleTagSupport類是實現SimpleTag接口的。它只需要實現一個doTag()方法即可,而不需要一堆回傳值。

    舉例說明:
    例1:HelloSimpleTag標簽
    第一步:制作標簽處理類
    HelloSimpleTag.java

    package com.newould.taglib;

    import java.io.*;
    import javax.servlet.jsp.*;
    import javax.servlet.jsp.tagext.*;

    public class HelloSimpleTag extends SimpleTagSupport {

    public void doTag() throws JspException, IOException {
    ??
    ????? JspWriter out = getJspContext().getOut();
    ????? out.println("Hello Simple Tag");
    }
    }

    第二步:編寫標簽性質文件
    MyTaglib.tld

    <?xml version="1.0" encoding="UTF-8" ?>

    <taglib xmlns=" ?????? xmlns:xsi=" ?????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
    ?????? version="2.0">
    ????
    ?????? <description>My Taglib by JavaWorld.com.tw</description>
    ?????? <tlib-version>1.0</tlib-version>
    ?????? <jsp-version>2.0</jsp-version>
    ?????? <short-name>Mytaglib</short-name>
    ?????? <uri></uri>
    ......

    <tag>
    ???????? <description>Hello Simple Tag</description>
    ???????? <name>HelloSimpleTag</name>
    ???????? <tag-class>com.newould.taglib.HelloSimpleTag</tag-class>
    ???????? <body-content>empty</body-content>
    ?????? </tag>
    </taglib>

    第三步:編寫Jsp網頁
    HelloSimpleTag.jsp

    <%@ page contentType="text/html;charset=GB2312" %>
    <%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>

    <html>
    <head>
    <title>HelloSimpleTag.jsp</title>
    </head>
    <body>

    <h2>Simple Tag 標簽</h2>

    <h1><mytag:HelloSimpleTag /></h1>

    </body>
    </html>

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

    例2:AddSimpleTag標簽
    第一步:制作標簽處理類
    AddSimpleTag.java

    package com.newould.taglib;

    import java.io.*;
    import javax.servlet.jsp.*;
    import javax.servlet.jsp.tagext.*;

    public class AddSimpleTag extends SimpleTagSupport {

    private int num1 = 0;
    private int num2 = 0;

    public void setNum1(int num1) {
    ????? this.num1 = num1;
    }

    public void setNum2(int num2) {
    ????? this.num2 = num2;
    }

    public void doTag() throws JspException, IOException {

    ????? JspContext ctx = getJspContext();
    ????? JspWriter out = ctx.getOut();
    ???
    ????? int sum = num1 + num2;
    ????? ctx.setAttribute("sum", Integer.toString(sum));
    ??
    ????? out.println(num1 + " + " + num2 + " = " + sum);
    }
    }

    第二步:編寫標簽性質文件
    MyTaglib.tld

    <?xml version="1.0" encoding="UTF-8" ?>

    <taglib xmlns=" ?????? xmlns:xsi=" ?????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
    ?????? version="2.0">
    ????
    ?????? <description>My Taglib by JavaWorld.com.tw</description>
    ?????? <tlib-version>1.0</tlib-version>
    ?????? <jsp-version>2.0</jsp-version>
    ?????? <short-name>Mytaglib</short-name>
    ?????? <uri></uri>
    ......

    <tag>
    ???????? <description>Add Simple Tag</description>
    ???????? <name>Add</name>
    ???????? <tag-class>com.newould.taglib.AddSimpleTag</tag-class>
    ???????? <body-content>empty</body-content>
    ??????
    ???????? <attribute>
    ?????????? <name>num1</name>
    ?????????? <required>true</required>
    ?????????? <rtexprvalue>true</rtexprvalue>
    ???????? </attribute>

    ???????? <attribute>
    ?????????? <name>num2</name>
    ?????????? <required>true</required>
    ?????????? <rtexprvalue>true</rtexprvalue>
    ???????? </attribute>
    ????????????
    ?????? </tag>
    ???
    </taglib>

    第三步:編寫Jsp網頁
    AddSimpleTag.jsp

    %@ page contentType="text/html;charset=GB2312" %>
    <%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>

    <html>
    <head>
    <title>AddSimpleTag.jsp</title>
    </head>
    <body>

    <h2>AddSimpleTag 標簽</h2>

    <h1><mytag:Add num1="5" num2="9" /></h1>

    最后結果:${sum}

    </body>
    </html>

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

    例3 RepeatSimpleTag標簽
    RepeatSimpleTag標簽 主要是用來重復顯示某段文字。
    這個例子在處理上與前兩個例子有點不同

    第一步:制作標簽處理類
    RepeatSimpleTag.java

    package com.newould.taglib;

    import java.io.*;
    import javax.servlet.jsp.*;
    import javax.servlet.jsp.tagext.*;

    public class RepeatSimpleTag extends SimpleTagSupport {

    private int count = 0;//重復的次數
    private JspFragment fragment;//重復的內容

    public void setCount(int count) {
    ????? this.count = count;
    }

    public void setFragment(JspFragment fragment) {
    ????? this.fragment = fragment;
    }

    public void doTag() throws JspException, IOException {

    ????? JspContext ctx = getJspContext();
    ????? JspWriter out = ctx.getOut();
    ???
    ????? for(int i=0 ; i<count ; i++) {
    ?????? fragment.invoke(null);//表示將fragment的內容顯示出來
    ????? }
    }
    }

    第二步:編寫標簽性質文件
    MyTaglib.tld

    <?xml version="1.0" encoding="UTF-8" ?>

    <taglib xmlns=" ?????? xmlns:xsi=" ?????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
    ?????? version="2.0">
    ????
    ?????? <description>My Taglib by JavaWorld.com.tw</description>
    ?????? <tlib-version>1.0</tlib-version>
    ?????? <jsp-version>2.0</jsp-version>
    ?????? <short-name>Mytaglib</short-name>
    ?????? <uri></uri>
    ......

    <tag>
    ???????? <description>Repeate Simple Tag</description>
    ???????? <name>Repeat</name>
    ???????? <tag-class>com.newould.taglib.RepeatSimpleTag</tag-class>
    ???????? <body-content>empty</body-content>
    ??????
    ???????? <attribute>
    ?????????? <name>count</name>
    ?????????? <required>true</required>
    ?????????? <rtexprvalue>true</rtexprvalue>
    ???????? </attribute>

    ???????? <attribute>
    ?????????? <name>fragment</name>
    ?????????? <required>true</required>
    ?????????? <fragment>true</fragment>
    ???????? </attribute>
    ?????? </tag>????
    ???
    </taglib>

    注意:<fragment>true</fragment>,一定要這樣設定fragment屬性。

    第三步:編寫Jsp網頁
    RepeatSimpleTag.jsp

    <%@ page contentType="text/html;charset=GB2312" %>
    <%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>

    <html>
    <head>
    <title>RepeatSimpleTag.jsp</title>
    </head>
    <body>

    <h2>RepeatSimpleTag 標簽</h2>

    <mytag:Repeat count="5" >
    <jsp:attribute name="fragment">
    重復執行 ....<br>
    </jsp:attribute>
    </mytag:Repeat>
    </body>
    </html>

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

    DynamicAttributes接口
    只要制作的標簽實現了DynamicAttributes接口就有動態屬性的功能。
    例如:我們要做多個數的累加運算,則AddSimpleTag標簽就可以通過實現DynamicAttributes接口就可以實現了.

    實現DynamicAttributes接口,必須實現setDynamicAttributes()方法,此方法用來接收動態屬性.

    舉例:第一步:制作標簽處理類

    package com.newould.taglib;

    import java.io.*;
    import java.util.*;
    import javax.servlet.jsp.*;
    import javax.servlet.jsp.tagext.*;

    public class DynamicAdd extends SimpleTagSupport implements DynamicAttributes {

    //用來接收動態屬性
    private ArrayList keys = new ArrayList();
    private ArrayList values = new ArrayList();

    public void doTag() throws JspException, IOException {

    ????? JspContext ctx = getJspContext();
    ????? JspWriter out = ctx.getOut();
    ???
    ????? float num = 0;
    ????? float sum = Float.parseFloat((String)values.get(0));
    ????? out.print(sum);
    ???
    ????? for (int i = 1 ; i < keys.size() ; i++) {
    ?????? String temp = (String)values.get(i);
    ?????? num = Float.parseFloat(temp);
    ?????? sum = sum + num;
    ?????? out.print(" + " + num);
    ????? }
    ???
    ????? out.print(" = " + sum);
    ????? ctx.setAttribute("sum", Float.toString(sum));
    ???
    }

    public void setDynamicAttribute(String uri, String name, Object value) throws JspException {
    ????? keys.add(name);
    ????? values.add(value);
    }
    }

    第二步:編寫標簽性質文件
    <tag>
    ???????? <description>DynamicAttribute</description>
    ???????? <name>DynAdd</name>
    ???????? <tag-class>com.newould.taglib.DynamicAdd</tag-class>
    ???????? <body-content>empty</body-content>

    ???????? <dynamic-attributes>true</dynamic-attributes>
    ?????? </tag>????

    第三步:編寫Jsp網頁
    <%@ page contentType="text/html;charset=GB2312" %>
    <%@ taglib prefix="JSPBook" tagdir="/WEB-INF/tags/" %>
    <%@ taglib prefix="c" uri="

    <html>
    <head>
    <title>CH16 - DynAdd.jsp</title>
    </head>
    <body>

    <h2>Tag File 范例</h2>

    <JSPBook:DynAdd num1="111" num2="222" num3="444" >

    <jsp:attribute name="great">
    ????? <font color="red">SUM:${sum} ...</red>
    </jsp:attribute>
    <jsp:attribute name="less">
    ????? <font color="blue">SUM:${sum} ...</red>
    </jsp:attribute>
    </JSPBook:DynAdd>

    </body>
    </html>
    JSP2.0中為了簡化標簽的復雜性,增加了制作Simple Tag的標簽類SimpleTagSupport類。
    SimpleTagSupport類是實現SimpleTag接口的。它只需要實現一個doTag()方法即可,而不需要一堆回傳值。

    struts2.0簡單的例子

    今天在apache網站上無意中看到了struts項目2.0.1正式發布了,懷著欣喜的心情我下載了stuts2.0.1完整包。 Struts2.0.1是struts項目和WebWork2.2項目的合并版本,集成了兩大流行MVC框架的優點,對struts框架來說是一個大的提升,同時也更大程度地簡化了開發人員的開發過程。我簡單地研究了一下這個新版本,現在給大家介紹一個入門級的小例子,希望能對學習這個新版本的朋友有點幫助。
    這個例子完成了一次URL調用返回結果頁面的過程。
    首先,要從apache網站上下載struts2.0.1的完整包(可以從這里下載:http://struts.apache.org/downloads.html),解壓后需要找到下列幾個文件:
    commons-logging-1.0.4.jar
    freemarker-2.3.4.jar
    ognl-2.6.7.jar
    struts2-api-2.0.1.jar
    struts2-core-2.0.1.jar
    xwork-2.0-beta-1.jar
    然后,我們就開始做第一個例子,我們就使用經典的“HelloWorld”的名字吧!
    1. 制作目錄結構
    如下圖所示:
    stuts2是web應用的根目錄。
    2. 拷貝引用文件
    將上面列舉的jar文件拷貝到步驟1中制作的目錄struts2\WEB-INF\lib中。
    3. 制作jsp文件HelloWorld.jsp

    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
    <head>
    <title>Hello World!</title>
    </head>
    <body>
    <h2><s:property value="message" /></h2>
    </body>
    </html>

    將該文件拷貝到步驟1中制作的目錄struts2\example中。
    4.制作java文件HelloWorld.java

    package example;

    /** *//**
    * <code>Set welcome message.</code>
    */

    import com.opensymphony.xwork2.ActionSupport;
    public class HelloWorld extends ActionSupport ...{

    public static final String MESSAGE = "Struts is up and running ...";

    public String execute() throws Exception ...{
    setMessage(MESSAGE);
    return SUCCESS;
    }


    private String message;

    public void setMessage(String message)...{
    this.message = message;
    }


    public String getMessage() ...{
    return message;
    }

    }

    使用下面的命令編譯這個java文件:
    set CLASSPATH=yourdirectory\xwork-2.0-beta-1.jar
    javac HelloWorld.java
    將編譯后的HelloWorld.class文件拷貝到步驟1中制作的目錄struts2\WEB-INF\classes\example中。
    5.制作web應用的描述文件web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    ?????? xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
    ?????? xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    ?????? version
    ="2.4">

    <display-name>Struts Blank</display-name>

    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    </web-app>

    將該文件拷貝到步驟1中制作的目錄struts2\WEB-INF中。
    6.制作MANIFEST.MF文件(從其它地方隨便找一個即可)
    將該文件拷貝到步驟1中制作的目錄struts2\META-INF中。
    7.制作struts配置文件struts.xml和struts.properties
    struts.xml文件:

    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
    >
    <struts>
    <package name="abc" namespace="/example" extends="struts-default">
    <action name="HelloWorld" class="example.HelloWorld">
    <result>/example/HelloWorld.jsp</result>
    </action>
    <!-- Add your actions here -->
    </package>
    </struts>

    struts.properties文件:
    struts.devMode = true
    struts.enable.DynamicMethodInvocation = false
    將這兩個文件拷貝到步驟1中制作的目錄struts2\ WEB-INF\classes中。
    好了整個例子的文件我們都搞定了。
    最后,你可以將制作好的web應用struts2拷貝到tomcat下運行。
    訪問http://localhost:8080/struts2/example/HelloWorld.action如果能夠看到頁面上的“Struts is up and running ...”提示信息說明你的例子是正確的。

    Struts2與Struts1的對比

    (轉自:javaeye)

    Action 類:
    ? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。
    ? Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定制的服務成為可能。Struts2提供一個ActionSupport基類去實現 常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。

    線程模式:
    ? Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發時特別小心。Action資源必須是線程安全的或同步的。
    ? Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,并且不會導致性能和垃圾回收問題)

    Servlet 依賴:
    ? Struts1 Action 依賴于Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
    ? Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。

    可測性:
    ? 測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)。
    ? Struts 2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。

    捕獲輸入:
    ? Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經常創建多余的類捕獲輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有冗余的javabean)。
    ? Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用。

    表達式語言:
    ? Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。
    ? Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"Object Graph Notation Language" (OGNL).

    綁定值到頁面(view):
    ? Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。
    ? Struts 2 使用 "ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。
     
    類型轉換:
    ? Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。
    ? Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。

    校驗:
    ? Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。
    ? Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性

    本文轉自:http://blog.csdn.net/paulsen1980/archive/2007/05/18/1614643.aspx

    posted @ 2007-08-13 02:29 jadmin 閱讀(61) | 評論 (0)編輯 收藏
    1、web.xml文件
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee <display-name>
    struts2</display-name>
    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    </web-app>

    其中,綠底色的部分是通用的部分。

    2、struts.xml文件
    這個文件的配置是最為重要的,也是比較容易出問題的地方,初學者對其中很多的參數不太明白,導致調試時候經常出錯。下面先給出一個配置的代碼:
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "
    <struts>
    <include file="struts-default.xml"/>
    <package name="package1" extends="struts-default">
    <action name="Hello" class="tutorial.HelloWorld">
    <result>HelloWorld.jsp</result>
    </action>
    <action name="HelloWorld" class="package1.HelloWorld">
    <result>HelloWorld.jsp</result>
    </action>
    </package>
    </struts>
    1)對于<include file="struts-default.xml"/>這行代碼,可以要也可以不要。
    2)package的name是可以虛構的,并不一定要在classes目錄下要有一個與這個name名對應的包名;像上面的配置文件中的name="package1"可以隨便改成name="aaa"等是不影響結果的,只不過這個package名可以使得多個action聚合在一起,對大型的模塊設計的時候是很有幫助的。
    3)<action name="HelloWorld" class="package1.HelloWorld">中的HelloWorld這個name并不一定要與package1包中的類名相同,比如<action name="Hello" class="tutorial.HelloWorld">這樣兩個名字完全不一樣是可以的,但是"Hello"這個name必須與輸入的jsp頁面里面的action內容是一致的,如<s:form action="Hello">
    4)從上面的配置文件可以看出,在classes目錄下面有兩個包,一個是tutorial,一個是package1。

    3、struts.properties文件
    這個文件最簡單,它與struts.xml文件一樣,都是位于classes目錄下面。其內容為:
    struts.devMode = true
    struts.enable.DynamicMethodInvocation = false的

    4、建議初學者先看看為Struts 2.0做好準備這篇文章,這里每個步驟講的非常的詳細,但是有些細節作者沒有寫出來,讓很多初學者調試的時候出很多錯誤,比如The requested resource (/項目名/HelloWorld) is not available.,java.lang.NullPointerException等等。
    1)關于工具web tools platform,這是一個eclipse集成了很多web開發下所需工具的一個比較好的平臺,它在eclipse的網站下面
    http://www.eclipse.org/webtools/有下載。打開這個頁面的右邊download欄目下面有wtp的下載,點擊這個去下載,如果不行,就再仔細找找了。
    2)如果出現The requested resource (/項目名/HelloWorld) is not available.的話,就仔細找找看是不是輸入的時候把配置文件等等地方寫錯了,對于初學者最容易把其中的字母搞錯,比如struts是不寫成了其它的形式,反正出現這個錯誤就是說訪問的資源不存在,那就肯定要么是配置文件出錯了,要么是你的類文件沒有放在classes目錄下面,無外這兩種情況。錯了不要緊,沒有錯誤,哪會有進步呢。
    3)如果你真的發現什么錯誤都沒有,但就是盡管調試了半天還是調試不成功,那就考慮你的JDK版本是不是和你下載的wtp搭配了,建議把原來低版本的JDK卸載,裝上新去下載的JDK,寫這篇博客時,最新版本是jdk-1_5_0_10。如果還不行,你就把tomcat或者其它的web服務器換版本,總之要不怕錯誤和失敗,要勤于不斷的調試。
    posted @ 2007-08-13 01:41 jadmin 閱讀(49) | 評論 (0)編輯 收藏


    啟動服務:
    1通過控制面板里的服務選項
    2通過命令行
     net start mysql??? ->啟動數據庫
     net stop mysql???? ->關閉數據庫

    連接數據庫
    mysql -u用戶名 -p密碼

    查看服務器上當前存在什么數據庫
    show databases;

    創建數據庫
    create database 數據庫名;
    如我要創建一個名為gbook的數據庫 
    create database gbook;

    刪除數據庫
    drop database 數據庫名;
    如:
    drop database gbook;

    選擇要使用的數據庫
    use 要使用的數據庫名;
    如:
    use gbook;

    查看當前使用的數據庫中存在的表
    show tables;

    創建一個數據庫表
    create table person
    {
    ??? id varchar(32) not null primary key,
    ??? name varchar(20) not null,
    ??? password varchar(20) not null
    };

    顯示數據庫中某個表的結構
    describe 表名;

    導入數據庫創建腳本文件命令(如D:\mysql.sql)
    先建立一個空數據庫->選擇它->導入腳本命令 如:
    create database gbook;
    source d:/mysql.sql;

    刪除表
    drop table 表名;

    刪除數據庫中某表的全部記錄
    delete from 表名;
    如:
    delete from gbook;

    向表中插入數據(以前面的person表為例)
    insert into 表名 values(對應的數據值);
    如:
    insert into person values('LXH','李興華','moolee');

    更新表中的數據
    update person set password='zzzzz';

    查看當前數據庫服務器的版本
    select version();

    查看數據庫服務器上的所有用戶
    select user();

    查看當前日期時間
    select now();

    使用load命令向數據庫的表中插入數據
    load data local infile '路徑' into table 表名;
    如:
    load data local infile 'f:/person.txt' into table person;
    person.txt中則單純的列出了許多表中的對應數據,如:
    mldn???????? 陳華   1569
    god????????? 黃雨   123456
    admin??????? 陳天賜  admin888

    列出表中所有記錄
    select * from 表名;
    如:
    select * from person;

    從表中只選擇特定的行
    select * from person where id='lxh';
    select * from person where id='lxh' and name='李興華';

    選擇表中特定的列(可以是多列哦,記得以,分開)
    select name from person;

    用distinct檢索出每個唯一的輸出記錄
    select distinct name from person;

    計算總的記錄數
    select count(*) from person;
    count()函數是查詢數據庫中的指定表有多少列

    posted @ 2007-08-12 23:21 jadmin 閱讀(66) | 評論 (0)編輯 收藏
    JSTL是一個不斷完善的開放源代碼的JSP標簽庫,是由apache的jakarta小組來維護的。JSTL只能運行在支持JSP1.2和Servlet2.3規范的容器上,如tomcat 4.x。但是在即將推出的JSP 2.0中是作為標準支持的。

    JSTL 1.0 發布于 2002 年 6 月,由四個定制標記庫(core、format、xml 和 sql)和一對通用標記庫驗證器(ScriptFreeTLV 和 PermittedTaglibsTLV)組成。core 標記庫提供了定制操作,通過限制了作用域的變量管理數據,以及執行頁面內容的迭代和條件操作。它還提供了用來生成和操作 URL 的標記。顧名思義,format 標記庫定義了用來格式化數據(尤其是數字和日期)的操作。它還支持使用本地化資源束進行 JSP 頁面的國際化。xml 庫包含一些標記,這些標記用來操作通過 XML 表示的數據,而 sql 庫定義了用來查詢關系數據庫的操作。

    兩個 JSTL 標記庫驗證器允許開發人員在其 JSP 應用程序中強制使用編碼標準。可以配置 ScriptFreeTLV 驗證器以在 JSP 頁面中禁用各種類型的 JSP 腳本元素 — scriptlet、表達式和聲明。類似地,PermittedTaglibsTLV 驗證器可以用來限制可能由應用程序的 JSP 頁面訪問的定制標記庫集(包括 JSTL 標記庫)。

    盡管 JSTL 最終將會成為 J2EE 平臺的必需組件,但目前只有少數應用程序服務器包括它。JSTL 1.0 的參考實現可作為 Apache 軟件基金會(Apache Software Foundation)的 Jakarta Taglibs 項目(請參閱參考資料)的一部分而獲得。可以將該參考實現中的定制標記庫合并到任何支持 JSP 1.2 和 Servlet 2.3 規范的服務器,以添加對 JSTL 的支持。

    如果要使用JSTL,則必須將jstl.jar和 standard.jar文件放到classpath中,如果你還需要使用XML processing及Database access (SQL)標簽,還要將相關JAR文件放到classpath中,這些JAR文件全部存在于下載回來的zip文件中。這個zip文件可以從http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip下載

    JSTL的優點
    1、 在應用程序服務器之間提供了一致的接口,最大程序地提高了WEB應用在各應用服務器之間的移植。
    2、 簡化了JSP和WEB應用程序的開發。
    3、 以一種統一的方式減少了JSP中的scriptlet代碼數量,可以達到沒有任何scriptlet代碼的程序。在我們公司的項目中是不允許有任何的scriptlet代碼出現在JSP中。
    4、 允許JSP設計工具與WEB應用程序開發的進一步集成。相信不久就會有支持JSTL的IDE開發工具出現。
    posted @ 2007-08-09 17:20 jadmin 閱讀(46) | 評論 (0)編輯 收藏
    僅列出標題
    共50頁: First 上一頁 33 34 35 36 37 38 39 40 41 下一頁 Last 
    主站蜘蛛池模板: 国产成人亚洲精品青草天美| 亚洲中文字幕无码av永久| 99久久免费精品视频| 亚洲国产成人久久99精品| 最近中文字幕mv手机免费高清 | 精品亚洲麻豆1区2区3区| 无码中文字幕av免费放| 乱淫片免费影院观看| 亚洲嫩草影院久久精品| 日韩人妻无码免费视频一区二区三区| 一级女人18片毛片免费视频| 亚洲国产高清美女在线观看| 免费a级黄色毛片| 99热精品在线免费观看| 亚洲国产美女精品久久久| 国产亚洲精品a在线观看app| 成人免费视频77777| 一区二区免费电影| 亚洲videos| 久久国产亚洲电影天堂| 国产精品久免费的黄网站 | 四虎在线视频免费观看| a级成人毛片免费图片| 亚洲精品无码久久久久APP| 亚洲日韩精品一区二区三区无码| 久久久久国色AV免费看图片| 97在线视频免费公开视频| 亚洲av永久中文无码精品| 久久久久亚洲av无码专区喷水 | 国产成人亚洲精品影院| 在线观看免费a∨网站| 久别的草原电视剧免费观看| 日韩色视频一区二区三区亚洲| 亚洲综合在线视频| 中文字幕亚洲图片| 免费亚洲视频在线观看| 大陆一级毛片免费视频观看| 日本视频一区在线观看免费| 国产免费无码AV片在线观看不卡| 五月天婷婷免费视频| 日韩欧美亚洲国产精品字幕久久久|